Comment out some more free() calls, which need to be turned on per-subsystem to weed...
[Math-GSL.git] / Build.PL
blobea5a97092b5513a8c2a0ba2c9b9e0d962fa51509
1 #!/usr/bin/perl -w
2 # This has been heavily modified from the Device::Cdio Build.PL
3 # Jonathan Leto <jonathan@leto.net>
5 # Copyright (C) 2006 Rocky Bernstein <rocky@cpan.org>
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 use strict;
21 use warnings;
22 use Config;
23 use Data::Dumper;
24 use Module::Build;
25 use lib 'inc';
26 use GSLBuilder;
27 use File::Spec::Functions qw/:ALL/;
29 BEGIN {
30 eval { require ExtUtils::PkgConfig };
31 if ($@) {
32 print "\nI see that you are a CPANTester, you really should install ExtUtils::PkgConfig !\n"
33 if $ENV{AUTOMATED_TESTING};
34 print <<EXIT;
35 ExtUtils::PkgConfig is currently needed to find GSL for the compilation of this module.
36 It may be bundled with Math::GSL in the future.
37 EXIT
38 exit 0;
44 sub try_compile {
45 my ($c, %args) = @_;
47 my $ok = 0;
48 my $tmp = "tmp$$";
49 local(*TMPC);
51 my $obj_ext = $Config{_o} || ".o";
52 unlink("$tmp.c", "$tmp$obj_ext");
54 if (open(TMPC, ">", "$tmp.c")) {
55 print TMPC $c;
56 close(TMPC);
58 my $cccmd = $args{cccmd};
59 my $errornull;
60 my $ccflags = $Config{'ccflags'};
61 $ccflags .= " $args{ccflags}" if $args{ccflags};
63 if ($args{silent} ) {
64 $errornull = "2>/dev/null" unless defined $errornull;
65 } else {
66 $errornull = '';
69 $cccmd = "$Config{'cc'} -o $tmp $ccflags $tmp.c $errornull"
70 unless defined $cccmd;
72 printf "cccmd = $cccmd\n" if $args{verbose};
73 my $res = system($cccmd);
74 $ok = defined($res) && $res == 0;
76 if ( !$ok ) {
77 my $errno = $? >> 8;
78 local $! = $errno;
79 print "
81 *** The test compile of '$tmp.c' failed: status $?
82 *** (the status means: errno = $errno or '$!')
83 *** DO NOT PANIC: this just means that you may get some innocuous
84 *** compiler warnings.
87 unlink("$tmp.c");
90 return $ok;
93 sub try_cflags ($) {
94 my ($ccflags) = @_;
95 my $c_prog = "int main () { return 0; }\n";
96 print "Checking if $Config{cc} supports \"$ccflags\"...";
97 my $result = try_compile($c_prog, ccflags=>$ccflags);
98 if ($result) {
99 print "yes\n";
100 return " $ccflags";
102 print "no\n";
103 return '';
107 print "Checking for GSL..";
108 my %gsl_pkgcfg = ExtUtils::PkgConfig->find ('gsl');
110 my $MIN_GSL_VERSION = "1.8";
111 my $gv = $gsl_pkgcfg{'modversion'};
112 my $current_minor_version;
114 my $path_system = File::Spec->catfile('swig', 'system.i');
115 open my $fh, ">", "$path_system" or die "Could not create system.i : $!";
117 if (defined $gv) {
118 if ($gv =~ m{\A(\d+(?:\.\d+)+)}) {
119 my @current= split /\./, $1;
120 print $fh "#define GSL_MAJOR_VERSION $current[0]\n";
121 print $fh "#define GSL_MINOR_VERSION $current[1]\n";
123 my @min= split /\./, $MIN_GSL_VERSION;
124 $current_minor_version = $current[1];
125 unless ($current[0] >= $min[0] && $current[1] >= $min[1]) {
126 printf "
127 ***
128 *** You need to have GSL %s or greater installed. (You have $gv).
129 *** Get GSL at http://www.gnu.org/software/gsl\n", $MIN_GSL_VERSION;
130 exit 1;
131 } else {
132 print "Found GSL version $gv\n";
135 } else {
136 print "
137 ***
138 *** Can't parse GSL version $gv.
139 *** Will continue and keep my fingers crossed for luck.
142 } else {
143 print "
144 ***
145 *** Can't find GSL configuration info. Is GSL installed?
146 *** Get GSL at http://www.gnu.org/software/gsl
148 exit 1;
151 close $fh;
153 my $ccflags = $gsl_pkgcfg{cflags};
154 # In case GSL in installed in the system-wide directory, $ccflags is
155 # empty (because pkg-config remove -I/usr/include), but swig needs it
157 my $swig_flags = '';
158 if ($ccflags =~ /^\s*$/ ) {
159 $swig_flags =' -I/usr/include';
162 ## Swig produces a number of GCC warnings. Turn them off if we can.
163 $ccflags .= try_cflags("-Wall");
164 #$ccflags .= try_cflags("-Wno-strict-aliasing");
165 $ccflags .= try_cflags("-Wno-unused-function");
166 $ccflags .= try_cflags("-Wno-unused-value");
167 $ccflags .= try_cflags("-Wno-unused-function");
168 $ccflags .= try_cflags("-Wno-unused-variable");
169 $ccflags .= try_cflags("-g");
172 my $ldflags = "$gsl_pkgcfg{libs} -gsl";
173 $swig_flags = "$gsl_pkgcfg{cflags} $swig_flags";
175 if ( $^O eq 'cygwin' && $Config{shrpenv} =~ m{\Aenv LD_RUN_PATH=(.*)\Z} ) {
176 $ldflags .= " -L$1 -lperl";
177 # Should we check the 32-ness?
178 $swig_flags = '-DNEED_LONG';
179 } elsif ( $^O eq 'darwin' ) {
180 $ldflags .= ' -bundle -flat_namespace ';
183 if ($Config{archname} =~ /x86_64|amd64/ ) {
184 $ldflags .= ' -fPIC -fno-omit-frame-pointer ';
185 $ccflags .= ' -fPIC -fno-omit-frame-pointer ';
188 my @Subsystems = grep { ! /^Test$/ } GSLBuilder::subsystems;
190 # BSplines appeared in 1.9
191 if ($current_minor_version < 9 ) {
192 @Subsystems = grep { ! /BSpline/ } @Subsystems;
194 my $cleanup = qq{
195 xs/*_wrap.c core *.core swig/system.i
196 swig/*.o Makefile Math-GSL-* tmp* pod2ht*.tmp _build
197 lib/Math/GSL/[A-z]+/* blib *.so *.orig
198 } . join " ", map { catfile( (qw( lib Math GSL ), "$_.pm") ) } @Subsystems;
200 my $builder = GSLBuilder->new(
201 module_name => 'Math::GSL',
202 add_to_cleanup => [ $cleanup ],
203 create_makefile_pl => 'passthrough',
204 dist_abstract => 'Interface to the GNU Scientific Library using SWIG',
205 dist_author => 'Jonathan Leto <jonathan@leto.net>',
206 dist_version_from => 'lib/Math/GSL.pm',
207 include_dirs => [],
208 extra_linker_flags => '-shared ' . $ldflags,
209 extra_compiler_flags=> "$ccflags " . ($ENV{CC_FLAGS}||''),
210 swig_flags => $swig_flags,
211 license => 'gpl',
212 requires => {
213 'ExtUtils::PkgConfig' => '1.03',
214 'Scalar::Util' => 0,
215 'Test::More' => 0,
216 'Test::Exception' => 0.21,
217 'Test::Class' => 0.12,
218 version => 0,
219 perl => '5.8.0',
221 sign => 0,
222 configure_requires => {
223 'ExtUtils::PkgConfig' => '1.03',
225 swig_source => [
226 map { [ "swig/$_.i", "pod/$_.pod" ] } @Subsystems ,
229 $builder->add_build_element('swig');
230 $builder->create_build_script();
231 print "Have a great day!\n";