Author: dagolden
Date: Mon Aug 31 14:58:42 2009
New Revision: 13244

Modified:
   Module-Build/trunk/lib/Module/Build/Base.pm

Log:
Refactor automatic requirement checks

Adds a new method to centralize automatic requirements
checks.  Also makes CBuilder detection a little more
user-friendly by making it a build_requires if needed.

Needs more testing and documentation


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 Mon Aug 31 14:58:42 2009
@@ -36,6 +36,7 @@
     if $self->{action} && $self->{action} ne 'Build_PL';
 
   $self->check_manifest;
+  $self->auto_require;
   $self->check_prereq;
   $self->check_autofeatures;
 
@@ -911,6 +912,7 @@
   magic_number
   mb_version
   module_name
+  needs_compiler
   orig_dir
   perl
   pm_files
@@ -1205,6 +1207,41 @@
   $self->log_warn("\n") unless $self->quiet;
 }
 
+# Automatically detect and add prerequisites based on configuration
+sub auto_require {
+  my ($self) = @_;
+  my $p = $self->{properties};
+
+  # add current Module::Build to configure_requires if there 
+  # isn't one already specified (but not ourself, so we're not circular)
+  if ( $self->dist_name ne 'Module-Build' 
+    && $self->auto_configure_requires
+    && ! exists $p->{configure_requires}{'Module::Build'}
+  ) {
+    (my $ver = $VERSION) =~ s/^(\d+\.\d\d).*$/$1/; # last major release only
+    $self->_add_prereq('configure_requires', 'Module::Build', $ver);
+  }
+
+  # If needs_compiler is not explictly set, automatically set it
+  # If set, we need ExtUtils::CBuilder (and a compiler)
+  my $xs_files = $self->find_xs_files;
+  if ( ! defined $p->{needs_compiler} ) {
+    $self->needs_compiler( keys %$xs_files || defined $self->c_source );
+  }
+  if ($self->needs_compiler) {
+    $self->_add_prereq('build_requires', 'ExtUtils::CBuilder', 0);
+    # XXX check have_compiler here
+  }
+
+  return;
+}
+
+sub _add_prereq {
+  my ($self, $prereq_type, $module, $version) = @_;
+  $self->log_info("Adding to $prereq_type\: $module => $version\n");
+  $self->{properties}{$prereq_type}{$module} = $version;
+}
+  
 sub prereq_failures {
   my ($self, $info) = @_;
 
@@ -1255,14 +1292,6 @@
 sub check_prereq {
   my $self = shift;
 
-  # If we have XS files, make sure we can process them.
-  my $xs_files = $self->find_xs_files;
-  if (keys %$xs_files && !$self->_mb_feature('C_support')) {
-    $self->log_warn("Warning: this distribution contains XS files, ".
-                   "but Module::Build is not configured with C_support.  ".
-                   "Please install ExtUtils::CBuilder to enable C_support.\n");
-  }
-
   # Check to see if there are any prereqs to check
   my $info = $self->_enum_prereqs;
   return 1 unless $info;
@@ -3939,16 +3968,6 @@
     }
   }
 
-  # add current Module::Build to configure_requires if there 
-  # isn't one already specified (but not ourself, so we're not circular)
-  if ( $self->dist_name ne 'Module-Build' 
-    && $self->auto_configure_requires
-    && ! exists $prereq_types{'configure_requires'}{'Module::Build'}
-  ) {
-    (my $ver = $VERSION) =~ s/^(\d+\.\d\d).*$/$1/; # last major release only
-    $prereq_types{configure_requires}{'Module::Build'} = $ver;
-  }
-
   for my $t ( keys %prereq_types ) {
       $add_node->($t, $prereq_types{$t});
   }

Reply via email to