MS Windows needs patch to inc/ (Math-GSL-0.25_04) #30

sisyphus opened this Issue Aug 31, 2011 · 1 comment


None yet

3 participants


It's actually 2 separate issues here.

Firstly, on Windows, it's by no means guaranteed that my gcc compiler will be called 'gcc'. In fact, my x64 compiler is called 'x86_64-w64-mingw32-gcc'.
And on some builds of ActivePerl where gcc is being used, $Config{cc} will be set to /full/path/to/gcc.
The below patch caters for these possibilities.
Note that this first issue pre-dates Math-GSL-0.25. It's not something that has just now sprung up.

Secondly, in inc/ with Math-GSL-0.25_04 we have this line of code:
$file_base =~ s!swig/!!g;
which assumes (incorrectly) that the path separator is a forward slash. On windows, it can be either a forward slash or a backslash. The below patch also accommodates this ... though it doesn't cater for the more general (and rarer) case where the path separator is neither a forward slash nor a backslash.

--- inc/GSLBuilder.pm_orig Wed Aug 31 14:25:25 2011
+++ inc/ Wed Aug 31 15:22:07 2011
@@ -112,6 +112,7 @@
my ($self, $main_swig_file, $ver) = @_;

 (my $file_base = $main_swig_file) =~ s/\.[^.]+$//;
  • $file_base =~ s!!/!g;
    $file_base =~ s!swig/!!g;
    my $c_file = catfile('xs',"${file_base}_wrap.$ver.c");

@@ -215,14 +216,21 @@
unless ($self->up_to_date([$obj_file, @$objects], $lib_file)) {
my @linker_flags = $self->split_like_shell($p->{extra_linker_flags});

  • push @linker_flags, $Config{archlib} . '/CORE/' . $Config{libperl} if (is_windows() or is_darwin());
  • if(is_windows() or is_darwin()) {
  •  if(is_windows() && $] eq '5.010000' && $Config{archname} =~ /x64/) {
  •     push @linker_flags, $Config{bin} . '/' . $Config{libperl};
  •  }
  •  else {
  •    push @linker_flags, $Config{archlib} . '/CORE/' . $Config{libperl};
  •  }
  • }

my @lddlflags = $self->split_like_shell($cf->{lddlflags});
my @shrp = $self->split_like_shell($cf->{shrpenv});

  • my @ld = $self->split_like_shell($cf->{ld}) || "gcc";
  • my @ld = $self->split_like_shell($cf->{ld}) || "$Config{cc}";

Strip binaries if we are compiling on windows

  • push @ld, "-s" if (is_windows() && $Config{cc} eq 'gcc');
  • push @ld, "-s" if (is_windows() && $Config{cc} =~ /\bgcc\b/i);

$self->do_system(@shrp, @ld, @lddlflags, '-o', $lib_file,
$obj_file, @$objects, @linker_flags)
@@ -272,7 +280,7 @@
my @flags = (@include_dirs, @cccdlflags, '-c', @ccflags, @extra_compiler_flags, );

my @cc = $self->split_like_shell($cf->{cc});

$self->do_system(@cc, @flags, '-o', $obj_file, $file)
or die "error building $Config{_o} file from '$file'";


tadam commented Aug 31, 2011

I've temporarily created gist that contains your patch:
But it will be more usable if you will create pull request with this patch.

I can't say anything about compiler options on Windows.
But the second problem with
$file_base =~ s!swig/!!g;
is my mistake.

It is more safe to change it to the following line:
(undef, undef, $file_base) = splitpath($file_base);

@leto leto closed this in dc26b32 Sep 10, 2011
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment