1#! perl -w 2 3use File::Spec; 4my $perl; 5BEGIN { 6 $perl = File::Spec->rel2abs($^X); 7 $perl = qq{"$perl"}; # So it doesn't fail when there are spaces. 8} 9 10use strict; 11use Test::More; 12BEGIN { 13 if ($^O eq 'VMS') { 14 # So we can get the return value of system() 15 require vmsish; 16 import vmsish; 17 } 18} 19 20plan tests => 7; 21 22require_ok "ExtUtils::CBuilder"; 23 24my $b = eval { ExtUtils::CBuilder->new(quiet => 1) }; 25ok( $b, "got CBuilder object" ) or diag $@; 26 27# test missing compiler 28{ 29 30 my $b1 = ExtUtils::CBuilder->new(quiet => 1); 31 32 configure_fake_missing_compilers($b1); 33 34 # This will fork a child that will print 35 # 'Can't exec "djaadjfkadjkfajdf"' 36 # or similar on STDERR; so make sure fd2 is temporarily redirected to 37 # oblivion before the fork 38 open(OLDERR, ">&STDERR") or die "Can't dup STDERR: $!"; 39 open(STDERR, ">", File::Spec->devnull()) or die "Can't redirect STDERR: $!"; 40 my $res = $b1->have_compiler; 41 open(STDERR, ">&OLDERR") or die "Can't restore STDERR: $!"; 42 close(OLDERR); 43 44 is($res, 0, "have_compiler: fake missing cc" ); 45} 46{ 47 my $b2 = ExtUtils::CBuilder->new(quiet => 1); 48 configure_fake_missing_compilers($b2); 49 50 open(OLDERR, ">&STDERR") or die "Can't dup STDERR: $!"; 51 open(STDERR, ">", File::Spec->devnull()) or die "Can't redirect STDERR: $!"; 52 my $res = $b2->have_cplusplus; 53 open(STDERR, ">&OLDERR") or die "Can't restore STDERR: $!"; 54 close(OLDERR); 55 56 is($res, 0, "have_cplusplus: fake missing c++" ); 57} 58 59# test found compiler 60{ 61my $b3 = ExtUtils::CBuilder->new(quiet => 1); 62configure_fake_present_compilers($b3); 63is( $b3->have_compiler, 1, "have_compiler: fake present cc" ); 64} 65{ 66my $b4 = ExtUtils::CBuilder->new(quiet => 1); 67configure_fake_present_compilers($b4); 68is( $b4->have_cplusplus, 1, "have_cpp_compiler: fake present c++" ); 69} 70 71# test missing cpp compiler 72 73# test one non-exported subroutine 74{ 75 my $type = ExtUtils::CBuilder::os_type(); 76 if ($type) { 77 pass( "OS type $type located for $^O" ); 78 } 79 else { 80 pass( "OS type not yet listed for $^O" ); 81 } 82} 83 84sub configure_fake_missing_compilers { 85 my $b = shift; 86 my $bogus_path = 'djaadjfkadjkfajdf'; 87 $b->{config}{cc} = $bogus_path; 88 $b->{config}{ld} = $bogus_path; 89 $b->{have_cc} = undef; 90 $b->{have_cxx} = undef; 91} 92 93sub configure_fake_present_compilers { 94 my $b = shift; 95 my $run_perl = "$perl -e1 --"; 96 $b->{config}{cc} = $run_perl; 97 $b->{config}{ld} = $run_perl; 98 $b->{config}{cxx} = $run_perl; 99 $b->{have_cc} = undef; 100 $b->{have_cxx} = undef; 101} 102