use strict; use Config qw(%Config); use ExtUtils::MakeMaker; my @extra = (); my @define = (); #@extra = (DEFINE => "@define") if @define = defines(); WriteMakefile( 'NAME' => 'IO::Dirent', 'VERSION_FROM' => 'Dirent.pm', # finds $VERSION @extra, 'dist' => {COMPRESS => 'gzip', SUFFIX => 'gz'}, ); sub defines { my %tests = (); my @results = (); $| = 1; open TEST, ">t.c" or die "$!"; print TEST <<_CODE_; close TEST; #include #include int main() { struct dirent *dent; DIR *dir = opendir("."); if( !dir ) return -1; while( dent = readdir(dir) ) { if( dent->d_name[0] == '.' && dent->d_name[1] == '.' && dent->d_name[2] == 0 ) { fprintf(stderr, "Type directory: %d\n", dent->d_type); } else { continue; } } closedir (dir); } _CODE_ push @results, ( compile_run() ? '-DHAS_D_TYPE' : () ); return @results; } sub compile_run { my $cc_cmd = "$Config{cc} $Config{ccflags} -I$Config{archlibexp}/CORE"; my $exe = "_t_phony$Config{_exe}"; if ($^O eq 'MSWin32') { $cc_cmd .= ' -DWIN32IO_IS_STDIO'; } else { $cc_cmd .= " -o $exe"; } my $rc = system("$cc_cmd $Config{ldflags} t.c $Config{libs} > /dev/null 2>&1"); if ($rc) { unlink("t.c", $exe, "t$Config{_o}"); return; } $rc = system("./$exe 2>&1 > /dev/null"); unlink("t.c", $exe, "t$Config{_o}"); return ( $rc ? 0 : 1 ); }