Author: dagolden
Date: Tue Sep  1 14:22:26 2009
New Revision: 13252

Modified:
   Module-Build/trunk/Changes
   Module-Build/trunk/lib/Module/Build/Base.pm
   Module-Build/trunk/t/properties/needs_compiler.t

Log:
warn/fail if we need a compiler and don't have one

Modified: Module-Build/trunk/Changes
==============================================================================
--- Module-Build/trunk/Changes  (original)
+++ Module-Build/trunk/Changes  Tue Sep  1 14:22:26 2009
@@ -7,6 +7,11 @@
    exist.  If true, ExtUtils::CBuilder is also added to build_requires.
    [David Golden]
 
+ Bug fixes:
+ - Failure to detect a compiler will now warn during Build.PL and be a
+   fatal error when trying to compile during Build. (RT#48918) [David
+   Golden]
+
 0.35_01 - Mon Aug 31 12:11:10 EDT 2009
 
  Enhancements:

Modified: Module-Build/trunk/lib/Module/Build/Base.pm
==============================================================================
--- Module-Build/trunk/lib/Module/Build/Base.pm (original)
+++ Module-Build/trunk/lib/Module/Build/Base.pm Tue Sep  1 14:22:26 2009
@@ -1233,7 +1233,13 @@
   }
   if ($self->needs_compiler) {
     $self->_add_prereq('build_requires', 'ExtUtils::CBuilder', 0);
-    # XXX check have_compiler here
+    if ( ! $self->have_c_compiler ) {
+      $self->log_warn(<<'EOM');
+Warning: ExtUtils::CBuilder not installed or no compiler detected
+Proceeding with configuration, but compilation may fail during Build
+
+EOM
+    }
   }
 
   return;
@@ -4545,19 +4551,23 @@
   my ($self) = @_;
   
   my $p = $self->{properties};
-  return $p->{have_compiler} if defined $p->{have_compiler};
+  return $p->{_have_c_compiler} if defined $p->{_have_c_compiler};
   
   $self->log_verbose("Checking if compiler tools configured... ");
   my $b = eval { $self->cbuilder };
-  my $have = $b && $b->have_compiler;
+  my $have = $b && eval { $b->have_compiler };
   $self->log_verbose($have ? "ok.\n" : "failed.\n");
-  return $p->{have_compiler} = $have;
+  return $p->{_have_c_compiler} = $have;
 }
 
 sub compile_c {
   my ($self, $file, %args) = @_;
-  my $b = $self->cbuilder;
 
+  if ( ! $self->have_c_compiler ) {
+    die "Error: no compiler detected to compile '$file'.  Aborting\n";
+  }
+
+  my $b = $self->cbuilder;
   my $obj_file = $b->object_file($file);
   $self->add_to_cleanup($obj_file);
   return $obj_file if $self->up_to_date($file, $obj_file);

Modified: Module-Build/trunk/t/properties/needs_compiler.t
==============================================================================
--- Module-Build/trunk/t/properties/needs_compiler.t    (original)
+++ Module-Build/trunk/t/properties/needs_compiler.t    Tue Sep  1 14:22:26 2009
@@ -5,7 +5,7 @@
 use MBTest;
 use DistGen;
 
-plan tests => 16;
+plan tests => 19;
 
 # Ensure any Module::Build modules are loaded from correct directory
 blib_load('Module::Build');
@@ -102,4 +102,21 @@
   "build_requires for ExtUtils::CBuilder is correct version" 
 );
 
+#--------------------------------------------------------------------------#
+# falsify compiler and test error handling
+#--------------------------------------------------------------------------#
+
+my $err = stderr_of( sub { 
+    $mb = $dist->new_from_context( config => { cc => "adfasdfadjdjk" } )
+});
+ok( $mb, "Build.PL while hiding compiler" );
+like( $err, qr/no compiler detected/,
+  "hidden compiler resulted in warning message during Build.PL"
+);
+eval { $mb->dispatch('build') };
+like( $@, qr/no compiler detected/,
+  "hidden compiler resulted in fatal message during Build"
+);
+
+
 # vim:ts=2:sw=2:et:sta:sts=2

Reply via email to