-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile.PL
255 lines (210 loc) · 9.34 KB
/
Makefile.PL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# $Id: Makefile.PL,v 1.1 1995/01/23 04:46:12 ilya Exp $
use ExtUtils::MakeMaker;
use Config '%Config';
BEGIN {unshift @INC, 'utils'}
use Math::PariBuild;
# Uncomment and change this line if I fail to find it
# $paridir = "..";
unless (-t STDOUT) { # Better reports if run with redirections
my $odef = select STDERR;
$| = 1;
select STDOUT;
$| = 1;
select $odef;
}
chmod 0400, 'typemap' if $^O =~ /cygwin/ and -f 'typemap' and not -r 'typemap'; # bug in some installations of cygwin???
my $ok23 = 0;
grep {/^machine=(.*)$/i and $common::machine = $1} @ARGV;
grep {/^configure$/i and $common::do_configure = 1} @ARGV;
grep {/^paridir=(.*?)[\/\\]?$/i and $paridir = $1} @ARGV;
grep {/^pari_tgz=(.*?)[\/\\]?$/i and $parisrc = $1} @ARGV;
grep {/^force_download$/i and $force_download = 1} @ARGV;
grep {/^parilib=(.*)$/i and $common::parilib = $1} @ARGV;
grep {/^version23_ok=(.*)$/i and $ok23 = $1} @ARGV;
# The REx should anchored-match versions to skip
$common::skip_versions = $ok23 ? '2\.(?:[4-9]|\d\d+)\.' : '2\.(?:[3-9]|\d\d+)\.';
@ARGV = grep !/^((machine|paridir|pari_tgz|parilib|version23_ok)=.*|configure|force_download)$/i, @ARGV;
$paridir = find_pari_dir() unless defined $paridir or $parisrc or $force_download;
($paridir, my @patch_rc) = download_and_patch_pari($parisrc, $force_download)
if !$paridir or $force_download;
my %patchrc = (patchrc => $patch_rc[0]) if @patch_rc;
die <<EOD unless $paridir;
Could not find GP/PARI build directory, please run Makefile.PL
with paridir=/directory option.
EOD
my $gcc_version
= defined($Config{gccversion}) ? ", gccversion=$Config{gccversion}" : "";
print <<EOP;
Setting up Math::Pari with Perl $] on $^O version $Config{osvers};
cc=$Config{cc}$gcc_version, cccdlflags='$Config{cccdlflags}',
ccflags='$Config{ccflags}',
optimize='$Config{optimize}',
ld=$Config{ld}, ldflags='$Config{ldflags}'.
EOP
if ($common::parilib) {
$pari_version = '2001007'; # XXXX How to get a correct one?
$define = '-DNO_HIGHLEVEL_PARI';
print <<EOP;
Trying to use existing PARI library (at $common::parilib)
(FAKE integer-formatted version $pari_version).
EOP
} else {
$define = '';
$pari_version = pari_formatted_version($paridir);
print <<EOP;
Found GP/PARI build directory in $paridir
(integer-formatted version $pari_version).
EOP
print <<EOP if $pari_version =~ /^2003/;
### Math::Pari support of GP/PARI library version 2.3.* is not fully
### finished. For non-PS plotting functions, one must downgrade to 2.1.7.
### Moreover, the test t/55_intnum.t takes significant time to complete.
EOP
print <<EOP if $pari_version =~ /^2001/;
### GP/PARI library version 2.1.* has many problems fixed in versions 2.3.*.
### Especially important are the problems with symbols `hiremainder' and
### `overflow' - if your build fails and error messages contain these
### words, updating to 2.3.* might allow your use of fast processor-specific
### assembler code.)
### Switching to 2.3.* should be as simple as giving Makefile.PL an option
### version23_ok=1
### (if you or Makefile.PL already downloaded-and-extracted version-2.1.*
### distribution, give an extra option, force_download).
### Alternatively, give option
### paridir=DIRECTORY-of-extracted-distribution
### However, keep in mind: v.2.3.* supports only plotting to PostScript.
EOP
$common::pari_version = $pari_version;
$common::main_paridir = $paridir;
*MY::postamble = \&xMY::postamble;
}
$os = $Config{osname};
$define .= " -DPARI_VERSION_EXP=$pari_version -DDEBUG_PARI";
$define .= " -DUSE_SLOW_ARRAY_ACCESS -DUSE_SLOW_NARGS_ACCESS" if $] >= 5.009;
$libs = "-lm";
$libs .= " $common::parilib" if $common::parilib;
$noexp2 = ''; # Should be used for generation of paricfg.h
if ($os eq "solaris") {
# Some older versions needed -lsunmath to import exp2(). This is
# probably not needed anymore (though can speed things up).
# Below -R specifies the path to search for this file when the
# program will run, -L the path to search when the program is linked
# @sc_dirs = '/opt/SUNWspro/lib' if -d '/opt/SUNWspro/lib';
# @sc_dirs = </opt/SUNWspro/SC*/lib> unless @sc_dirs;
# if (@sc_dirs) {
# $libs .= " -R$sc_dirs[-1] -L$sc_dirs[-1] -lsunmath -lm";
# } else {
# #warn "Cannot find SUNWspro dirs, needed for -lsunmath, using NOEXP2.\n";
$noexp2 = 1;
# }
} elsif ($os eq "os2") {
$noexp2 = 1;
$define .= " -DMALLOC_PROCS";
} elsif ($os eq 'linux') {
$noexp2 = 1;
}
my %opts;
unless ($common::parilib) {
build_tests $paridir; # Convert the test suite
make_pod 'libPARI.pod', '-to_pod', $paridir; # Now the docs
make_pod 'libPARI.dumb.pod', '-to_dumb_pod', $paridir;
# ... and paricfg.h
%opts = build_paricfg($paridir, $common::do_configure, $pari_version);
if ($ENV{MATH_PARI_REPORT_CODES}) {
# Check the correspondence between string interfaces and numeric interfaces
my %codes;
my %names;
ep_in_version($pari_version);
ep_codes_from_file("$paridir/src/language/init.c", %codes, %names);
ep_codes_from_file("$paridir/src/gp/highlvl.c", %codes, %names);
# EpValence reworked in 2.2.7; when exactly was it redone??? XXXX
unless ($pari_version > 2002006 or ep_hash_report(%codes)) {
print STDERR "Problems with numeric interface codes noted:\n";
ep_hash_report(%codes, %names, \*STDERR);
}
}
}
# We want to find the offset of the least significant byte
# of SV.flags inside an SV.
# It is enough to find the offset of the least significant byte inside a U32.
# (Needed for recognizing Perl code supplied to lisseq and lisexpr.)
$offset = index($Config{byteorder}, "1");
$offset = 3 if $offset > 3; # SvFLAGS is actually I32
$define .= " -DLSB_in_U32=$offset";
my $longsize = length(eval { pack 'l!', 1 } or pack 'l', 1);
my $perl_int_size = $Config{'ivsize'} || $Config{'intsize'}
or die "Can't deduce Perl int size";
$define .= ' -DLONG_SHORTER_THAN_IV' if $perl_int_size > $longsize;
$define .= ' -Derr=pari_err'; # On linux it can get a wrong dynamic loading
$define .= ' -DHAVE_LADD' if $opts{have_ladd};
$define .= ' -DGCC_INLINE' if $Config{gccversion} and not $Config{optimize} =~ /-g\b/;
$define .= ' -DHAVE_PARIPRIV' if -f "$paridir/src/headers/paripriv.h";
#$define .= ' -DNO_GRAPHICS_PARI' unless -f "$paridir/src/graph/plotgnuplot.c";
# XXXX otherwise segfaults trying to install highlevel functions???
# XXXX because functions_hash = NULL???
# $define .= ' -DNO_HIGHLEVEL_PARI' if $pari_version >= 2003000;
$define .= ' -DNO_GRAPHICS_PARI' if $pari_version >= 2003000;
# This is done in Makefile in GP/PARI, and in paricfg.h without do_configure
$define .= ' -DDL_DFLT_NAME=NULL' if $common::do_configure;
my $extra_inc = extra_includes($paridir);
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile being created.
&WriteMakefile(
LIBS => $libs,
INC => $extra_inc . ' -I $(PARI_DIR)/src/headers -I $(PARI_DIR)/src -I ./libPARI',
NAME => 'Math::Pari',
($common::parilib ? () :
(MYEXTLIB => 'libPARI/libPARI$(LIB_EXT)')),
VERSION_FROM => 'Pari.pm',
($] >= 5.005 ? ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'Pari.pm', # retrieve abstract from module
AUTHOR => 'Ilya Zakharevich <ilyaz@cpan.org>') : ()),
DEFINE => $define,
dist => {COMPRESS=>'gzip -9f', SUFFIX=>'gz'},
clean => { FILES => 'pari.ps test_eng/ex.t- libPARI.dumb.pod libPARI.pod t/55_*.t ftp-cmd' },
macro => { %patchrc,
PARI_DIR => $paridir,
},
);
if (not $common::patches_run or @common::patches_fail) {
my @patches_needed = patches_for($pari_version);
my $msg = $common::patches_run ? "failed when applied" : "were not applied";
push @common::patches_fail, @patches_needed unless $common::patches_run;
warn "\nThe following patches were judged to be beneficial, but $msg:\n\t@common::patches_fail\n";
}
# Remake POD if the source changed.
# Go to a subdirectory to build the headers and the library.
# XXX With -j4 goes twice to a subdir in parallel, both times without -j4...
sub xMY::postamble {
'
AUTOGEN_HEADERS = libPARI/pariinl.h
Pari$(OBJ_EXT) : $(AUTOGEN_HEADERS)
$(AUTOGEN_HEADERS): $(MYEXTLIB)
$(MYEXTLIB): libPARI/Makefile FORCE
cd libPARI && $(MAKE) $(PASTHRU)
libPARI.pod: $(PARI_DIR)/doc/usersch3.tex libPARI/gphelp
$(PERL) libPARI/gphelp -to_pod $(PARI_DIR)/doc/usersch3.tex > pod_tmp && mv pod_tmp $@
libPARI.dumb.pod: $(PARI_DIR)/doc/usersch3.tex libPARI/gphelp
$(PERL) libPARI/gphelp -to_dumb_pod $(PARI_DIR)/doc/usersch3.tex > pod_tmp && mv pod_tmp $@
build_tests:
-$(RM_F) test_eng/ex.t-
$(FULLPERL) -Iutils -MMath::PariBuild -e "build_tests shift" $(PARI_DIR)
';
}
# Rewrite pic option to PIC in CCCDLFLAGS,
# Some voodoo with LD* with PERL_OBJECT (why not in makemaker?)
sub MY::const_config
{
my $self = shift;
my $flags = $self->{'CCCDLFLAGS'}; # Tmp var needed with Perl4 !
$flags =~ s/(-[fK]?\s*)pic\b/${1}PIC/;
$flags =~ s/-KPIC/-K PIC/; # Apparently (was?) needed on Solaris...
$self->{'CCCDLFLAGS'} = $flags;
if ($^O eq 'MSWin32' && $Config{'ccflags'} =~ /-DPERL_OBJECT/)
{
$self->{'LDFLAGS'} =~ s/-(debug|pdb:\w+)\s+//g;
$self->{'LDDLFLAGS'} =~ s/-(debug|pdb:\w+)\s+//g;
}
$self->{PERL_ARCHIVE} =~ s((?<=/)cygperl5_1\d\.dll)(libperl.dll.a) if $^O =~ /\bcygwin\b/; # bug with v5.10?
return $self->MM::const_config;
}