Make ExtUtils::CBuilder reset ccflags on compile for VMS.
authorCraig A. Berry <craigberry@mac.com>
Thu, 31 Mar 2011 22:09:31 +0000 (17:09 -0500)
committerCraig A. Berry <craigberry@mac.com>
Mon, 4 Apr 2011 09:15:51 +0000 (04:15 -0500)
On VMS only, the /DEFINE and /INCLUDE qualifiers are parsed off the
local copy of $Config{ccflags} and consumed in the process.  This is
necessary because you're only allowed one of each of these clauses
in the compile command, so to add whatever has been requested for a
specific compile, we have to combine them with whatever Perl was
built with.

But since they are consumed, multiple compiles on the same EU::CB
object were only using the correct flags for the first one.  Even
calling the have_compiler() check before compile() would make the
latter miss the defines and includes that were used to build Perl.

The solution is add a platform override that resets the local copy
of $Config{ccflags} from its original in %Config every time a
compiler operation is initiated.

Fixes smoke failures in ExtUtils::ParseXS.

dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/VMS.pm

index 4f6a36c..92f17c0 100644 (file)
@@ -8,6 +8,7 @@ $VERSION = '0.280202';
 @ISA = qw(ExtUtils::CBuilder::Base);
 
 use File::Spec::Functions qw(catfile catdir);
+use Config;
 
 # We do prelink, but don't want the parent to redo it.
 
@@ -47,6 +48,20 @@ sub arg_include_dirs {
   return ('/include=(' . join(',', @dirs) . ')');
 }
 
+# We override the compile method because we consume the includes and defines
+# parts of ccflags in the process of compiling but don't save those parts
+# anywhere, so $self->{config}{ccflags} needs to be reset for each compile
+# operation.  
+
+sub compile {
+  my ($self, %args) = @_;
+
+  $self->{config}{ccflags} = $Config{ccflags};
+  $self->{config}{ccflags} = $ENV{CFLAGS} if defined $ENV{CFLAGS};
+
+  return $self->SUPER::compile(%args);
+}
+
 sub _do_link {
   my ($self, $type, %args) = @_;