From: Vincent Pit Date: Mon, 3 Jan 2011 14:46:33 +0000 (+0100) Subject: Force linking against the perl dll when using gcc 3.4 on Windows X-Git-Tag: v0.10~5 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FLexical-Types.git;a=commitdiff_plain;h=48bb92f016120656801f1920c9ef680201afe0a9 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 8a8a746..68fc792 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 = 'Lexical-Types'; @@ -66,5 +94,6 @@ WriteMakefile( }, clean => { FILES => "$dist-* *.gcov *.gcda *.gcno cover_db Debian_CPANTS.txt" - } + }, + %macro, );