]> git.vpit.fr Git - perl/modules/autovivification.git/commitdiff
Force linking against the perl dll when using gcc 3.4 on Windows
authorVincent Pit <vince@profvince.com>
Wed, 29 Dec 2010 23:25:59 +0000 (00:25 +0100)
committerVincent Pit <vince@profvince.com>
Wed, 29 Dec 2010 23:31:42 +0000 (00:31 +0100)
When a Windows perl links an XS shared object to an import library using
gcc/g++ version 3.4.x, strange breakage happens at load time because the
mutex-related symbols seems not to be reachable. This situation happens
especially for AS perl and the default compiler suite it installs.

We fix this by forcing g++ to link against the dll instead, which should
be in the same directory as the perl executable (at least for AS perl).

This change is the integration of commit 14f8af2 from Variable::Magic's
repository.

Makefile.PL

index 3c510a82b90fc9325639337739b662a6c6eefba6..d05fd2d12e5f6833d0ae7b78a70477f9be7cf7a0 100644 (file)
@@ -4,7 +4,34 @@ use strict;
 use warnings;
 use ExtUtils::MakeMaker;
 
+BEGIN {
+ local $@;
+ eval { require Config };
+ die 'OS unsupported' if $@;
+ Config->import(qw/%Config/);
+}
+
 my @DEFINES;
+my %macro;
+
+my $is_gcc_34 = 0;
+print "Checking if this is gcc 3.4 on Windows trying to link against an import library... ";
+if ($^O eq 'MSWin32' and not grep /^LD[A-Z]*=/, @ARGV) {
+ my ($libperl, $gccversion) = map $_ || '', @Config{qw/libperl gccversion/};
+ if ($gccversion =~ /^3\.4\.[0-9]+/ and $libperl =~ s/\.lib$//) {
+  $is_gcc_34 = 1;
+  my ($lddlflags, $ldflags) = @Config{qw/lddlflags ldflags/};
+  $_ ||= '', s/-L(?:".*?"|\S+)//g for $lddlflags, $ldflags;
+  $libperl = "-l$libperl";
+  my $libdirs = join ' ',
+                 map { s/(?<!\\)((?:\\\\)*")/\\$1/g; qq[-L"$_"] }
+                  @Config{qw/bin sitebin/};
+  $macro{LDDLFLAGS}    = "$lddlflags $libdirs $libperl";
+  $macro{LDFLAGS}      = "$ldflags $libdirs $libperl";
+  $macro{PERL_ARCHIVE} = '',
+ }
+}
+print $is_gcc_34 ? "yes\n" : "no\n";
 
 # Threads, Windows and 5.8.x don't seem to be best friends
 if ($^O eq 'MSWin32' && $^V lt v5.9.0) {
@@ -17,6 +44,7 @@ if ($^O eq 'MSWin32' && $^V lt v5.10.1) {
 }
 
 @DEFINES = (DEFINE => join ' ', @DEFINES) if @DEFINES;
+%macro   = (macro  => { %macro })         if %macro; # Beware of the circle
 
 my $dist = 'autovivification';
 
@@ -65,4 +93,5 @@ WriteMakefile(
  clean            => {
   FILES => "$dist-* *.gcov *.gcda *.gcno cover_db Debian_CPANTS.txt"
  },
+ %macro,
 );