From: Vincent Pit Date: Wed, 29 Dec 2010 23:25:59 +0000 (+0100) Subject: Force linking against the perl dll when using gcc 3.4 on Windows X-Git-Tag: v0.07~9 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Fautovivification.git;a=commitdiff_plain;h=d8cb0a8822a5de6b81f2f8ad890d179f1ee50484 Force linking against the perl dll when using gcc 3.4 on Windows 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. --- diff --git a/Makefile.PL b/Makefile.PL index 3c510a8..d05fd2d 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -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/(? 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, );