Annotation of OpenXM_contrib/gmp/macos/configure, Revision 1.1.1.1
1.1 maekawa 1: # This is a simple configure script for MacOS and MPW.
2: # Note that this script can't be run directly from MPW perl
3: # because it has the wrong end-of-line characters. See README.
4:
5: # Copyright (C) 2000 Free Software Foundation, Inc.
6: #
7: # This file is part of the GNU MP Library.
8: #
9: # The GNU MP Library is free software; you can redistribute it and/or modify
10: # it under the terms of the GNU Lesser General Public License as published by
11: # the Free Software Foundation; either version 2.1 of the License, or (at your
12: # option) any later version.
13: #
14: # The GNU MP Library is distributed in the hope that it will be useful, but
15: # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16: # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17: # License for more details.
18: #
19: # You should have received a copy of the GNU Lesser General Public License
20: # along with the GNU MP Library; see the file COPYING.LIB. If not, write to
21: # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22: # MA 02111-1307, USA.
23:
24: # ***************************** NOTE **************************************
25: # This script try to figure out things about this release but has a hard
26: # time doing it. It reads some lines in "configure", "Makefile.am" and
27: # "mp*/Makefile.am" and try to guess things. With every new release
28: # this script has to be tested.
29: # ***************************** NOTE **************************************
30:
31: use strict;
32:
33: ###########################################################################
34: #
35: # Platform dependent
36: #
37: ###########################################################################
38:
39: $/ = "\012" # Input files use Unix end-of-line chars
40: if $^O eq 'MacOS';
41:
42: ###########################################################################
43: #
44: # Constants
45: #
46: ###########################################################################
47:
48: # Directories to create
49:
50: my @dirs =
51: (
52: 'MpfObj',
53: 'MpnObj',
54: 'MpqObj',
55: 'MpzObj',
56: 'CmnObj',
57: 'AsmObj',
58: 'Asm',
59: 'MpfBin',
60: 'MpqBin',
61: 'MpzBin',
62: );
63:
64: my $cfg; # Will point to %cfg_apple or %cfg_cw
65:
66: my %cfg_apple =
67: (
68: 'cc' => 'MrC',
69: 'coptions' => ['-ansi on -i : -i :: -i ::mpn:powerpc32 -i ::mpz',
70: '-opt speed -inline on -d random=rand -d srandom=srand'],
71: 'link' => 'PPCLink',
72: 'linkoptions' => '-sym on -xm library',
73: 'tooloptions' => "-t 'MPST' -c 'MPS'",
74: 'asm' => 'PPCAsm',
75: 'aoptions' => '-sym on',
76: 'syslibs' => [
77: '"{SharedLibraries}"StdCLib',
78: '"{SharedLibraries}"InterfaceLib',
79: '"{SharedLibraries}"MathLib',
80: '"{PPCLibraries}"StdCRuntime.o',
81: '"{PPCLibraries}"PPCCRuntime.o',
82: ],
83: );
84:
85: my %cfg_cw =
86: (
87: 'cc' => 'MWCPPC',
88: 'coptions' => [
89: '-opt all -w nounusedvar,noextended',
90: '-i :: -i ::mpn:powerpc32 -i ::mpz',
91: '-sym full -d random=rand -d srandom=srand',
92: ],
93: 'link' => 'MWLinkPPC',
94: 'linkoptions' => '-sym fullpath -library',
95: 'tooloptions' => '-mpwtool',
96: 'asm' => 'PPCAsm',
97: 'aoptions' => '-sym on',
98: 'syslibs' => [
99: '"{SharedLibraries}"InterfaceLib',
100: '"{MWPPCLibraries}MSL MPWCRuntime.Lib"',
101: '"{MWPPCLibraries}MSL C.PPC MPW(NL).Lib"',
102: '"{SharedLibraries}"MathLib',
103: ],
104: );
105:
106:
107: my $make_in = 'Makefile.in';
108: my $make = 'Makefile';
109: my $configure = mf("../configure");
110: my $configure_in = mf("../configure.in");
111: my $config_in = mf("../config.in");
112: my $mpn_asm_dir = "../mpn/powerpc32";
113: my $mpn_gen_dir = "../mpn/generic";
114: my $config_h = 'config.h';
115:
116: my $asm_start = "\ttoc"; # No dot, like ".dot"?
117:
118: ###########################################################################
119: #
120: # Read command line
121: #
122: ###########################################################################
123:
124: $cfg = \%cfg_apple; # Default
125:
126: if (@ARGV and $ARGV[0] =~ /^cw|co/) {
127: $cfg = \%cfg_cw;
128: $make .= '.cw';
129: }
130:
131: ###########################################################################
132: #
133: # Parse top configure file for mpn files
134: #
135: ###########################################################################
136:
137: my ($files,$optional,$package,$version) = parse_top_configure($configure);
138: my %mpn_objects = map {$_ => 1} (@$files,@$optional);
139: my %mpn_optional = map {$_ => 1} @$optional;
140:
141: ###########################################################################
142: #
143: # Create config.h from ../config.in
144: #
145: ###########################################################################
146:
147: my @asm_files;
148:
149: open(CONFIG_IN, $config_in)
150: or die "Can't open \"$config_in\"\n";
151: open(CONFIG_H, ">$config_h")
152: or die "Can't create \"$config_h\"\n";
153:
154: while (<CONFIG_IN>) {
155: chomp;
156:
157: if (/^\s*#\s*undef\s+HAVE_NATIVE_mpn_(\w+)/ and
158: -r mf("$mpn_asm_dir/$1.asm")) {
159:
160: if (defined delete $mpn_objects{$1}) {
161: push(@asm_files, $1);
162: print CONFIG_H "\#define HAVE_NATIVE_mpn_$1 1\n";
163: } else {
164: print STDERR "Warning: Found asm file \"$1\" but no corresponding C file - ignoring\n";
165: }
166:
167: } elsif (/^\s*#\s*undef\s+PACKAGE/) {
168: print CONFIG_H "\#define PACKAGE \"$package\"\n";
169: } elsif (/^\s*#\s*undef\s+VERSION/) {
170: print CONFIG_H "\#define VERSION \"$version\"\n";
171: } elsif (/^\s*#\s*undef\s+STDC_HEADERS/) {
172: print CONFIG_H "\#define STDC_HEADERS 1\n";
173: } else { # Blank line, leave it
174: print CONFIG_H "$_\n";
175: }
176: }
177:
178: close CONFIG_H;
179: close CONFIG_IN;
180:
181: ###########################################################################
182: #
183: # Create directories
184: #
185: ###########################################################################
186:
187: foreach (@dirs) {
188: -d $_ or mkdir $_, 0775
189: or die "Can't create directory \"$_\"\n";
190: }
191:
192: ###########################################################################
193: #
194: # Parse the *.asm files found and convert them to MPW format
195: #
196: ###########################################################################
197:
198: my $file;
199:
200: foreach $file (@asm_files) {
201: my $ifile = mf("$mpn_asm_dir/$file.asm");
202: my $ofile = mf("Asm/$file.s");
203:
204: open(ASM, $ifile)
205: or die "Can't read file \"$ifile\"\n";
206: open(NEW, ">$ofile")
207: or die "Can't create file \"$ofile\"\n";
208:
209: while (<ASM>) {
210: chomp; # Remove whatever ending it was
211:
212: s/\bdnl\b/;/ or s/\bC\b/;/; # Use ; comments
213:
214: s/include\s*\(.*?\)//; # Don't use include macro
215:
216: s/ASM_START\s*\(.*?\)/$asm_start/;
217:
218: s/PROLOGUE\s*\(\s*(.*?)\s*\)/asm_prologue($1)/e;
219:
220: s/EPILOGUE\s*\(\s*(.*?)\s*\)/asm_epilogue($1)/e;
221:
222: s/\n/\x0D/g;
223: print NEW "$_\x0D"; # Use MacOS end-of-line character
224: }
225:
226: close ASM;
227: close NEW;
228: }
229:
230:
231: ###########################################################################
232: #
233: # Parse the Makefile.in and produce the Makefile
234: #
235: ###########################################################################
236:
237: # Check if we have optional left in C directory
238:
239: foreach (keys %mpn_objects) {
240: delete $mpn_objects{$_}
241: if $mpn_optional{$_} and !-r mf("$mpn_gen_dir/$_.c");
242: }
243:
244: my $mpn_objects = join(' ', map {"{MpnObjDir}$_.o"} sort keys %mpn_objects);
245: $mpn_objects =~ s/(.{1,66})\s/$1 \xB6\x0D\t/g;
246:
247: my @asm_objects = @asm_files;
248: my @asm_sources = @asm_files;
249:
250: # Adjust configuration
251:
252: foreach (keys %{$cfg}) {
253: $$cfg{$_} = join(" \xB6\x0D\t\t", @{$$cfg{$_}})
254: if ref $$cfg{$_};
255: }
256:
257: my %config =
258: (
259: 'version' => $version,
260: 'package' => $package,
261: 'c' => "\xB6",
262: 'dep' => "\xC4",
263: 'wildcard'=> "\xC5",
264: 'asm_objects' =>
265: join(" \xB6\x0D\t",map {$_ = "{AsmObjDir}$_.o"} sort @asm_objects),
266: 'asm_sources' =>
267: join(" \xB6\x0D\t",map {$_ = "{AsmSrcDir}$_.s"} sort @asm_sources),
268: 'mpn_objects' => $mpn_objects,
269: 'mpz_objects' => what_objects("mpz","../mpz","{MpzObjDir}"),
270: 'mpf_objects' => what_objects("mpf","../mpf","{MpfObjDir}"),
271: 'mpq_objects' => what_objects("mpq","../mpq","{MpqObjDir}"),
272: 'gmp_objects' => what_objects("gmp","..", "{CmnObjDir}"),
273: %{$cfg},
274: );
275:
276:
277: open(IN, $make_in)
278: or die "Can't read file \"$make_in\"\n";
279: open(OUT, ">$make")
280: or die "Can't create file \"$make\"\n";
281:
282: while (<IN>) {
283: chomp; # Remove whatever ending it was
284:
285: # Do the variable substitution
286:
287: s/\@([^\@]+)\@/exists $config{$1} ? $config{$1} : ''/ge;
288:
289: print OUT "$_\x0D"; # Use MacOS end-of-line character
290: }
291:
292: close IN;
293: close OUT;
294:
295: ###########################################################################
296: #
297: # Parse the configure.in file to find the mpn files to compile and link
298: # Find package name and version
299: #
300: ###########################################################################
301:
302: sub parse_top_configure {
303: my $cfg = shift;
304:
305: open(CONFIGURE, $cfg)
306: or die "Can't open \"$cfg\"\n";
307: my $old_eol = $/;
308: undef $/;
309: my $text = <CONFIGURE>;
310: $/ = $old_eol;
311: close CONFIGURE;
312:
313: my ($package) = $text =~ /(?:\n|\r)PACKAGE\s*=\s*(\S+)/;
314: my ($version) = $text =~ /(?:\n|\r)VERSION\s*=\s*(\S+)/;
315:
316: my $files = join(' ',$text =~ /(?:\n|\r)gmp_mpn_functions\s*=\s*\"([^\"]+)/);
317: $files =~ s/\\/ /g;
318: $files =~ s/\$\{?\w*\}?//g;
319: my @files = sort split(' ',$files);
320:
321: $files = join(' ',$text =~ /(?:\n|\r)gmp_mpn_functions_optional\s*=\s*\"([^\"]+)/);
322: $files =~ s/\\/ /g;
323: $files =~ s/\$\{?\w*\}?//g;
324: my @optional = sort split(' ',$files);
325:
326: @files > 30 or die "Can't find mpn files in \"$cfg\"\n";
327: defined $package or die "Can't find package name in \"$cfg\"\n";
328: defined $version or die "Can't find version name in \"$cfg\"\n";
329: return (\@files,\@optional,$package,$version);
330: }
331:
332: ###########################################################################
333: #
334: # Find the C files for mpz, mpf .....
335: #
336: ###########################################################################
337:
338: sub what_objects {
339: my $part = shift;
340: my $srcdir = shift;
341: my $dstdir = shift;
342:
343: my $makefile_am = mf("$srcdir/Makefile.am");
344:
345: # We look in the Makefile.am file
346: open(MAKEFILE_AM, $makefile_am)
347: or die "Can't open file \"$makefile_am\"\n";
348:
349: # I had as short version of this using more advanced
350: # regular expressions on the whole file content but
351: # MacPerl freezes my Mac every time..... :-(
352:
353: my $line;
354: my $text = '';
355:
356: while (defined($line = <MAKEFILE_AM>) ) {
357: chomp $line;
358:
359: if ($line =~ s/^lib${part}_la_SOURCES\s*=//) {
360: do {
361: chomp $line;
362: if ($line =~ s/\\\s*$//) {
363: $text .= " $line";
364: } else {
365: $text .= " $line";
366: next;
367: }
368: } while (defined($line = <MAKEFILE_AM>));
369: }
370:
371: if ($line =~ s/^nodist_lib${part}_la_SOURCES\s*=//) {
372: do {
373: chomp $line;
374: if ($line =~ s/\\\s*$//) {
375: $text .= " $line";
376: } else {
377: $text .= " $line";
378: last;
379: }
380: } while (defined($line = <MAKEFILE_AM>));
381: }
382: }
383: close MAKEFILE_AM;
384:
385: my @ofiles = split(' ',$text);
386: @ofiles > 10 or die "Can't find $part files in \"$makefile_am\"\n";
387: my $ofiles = join(' ', map {/^(.+)\.c$/ and $_ = "$dstdir$1.o"} @ofiles);
388: $ofiles =~ s/(.{1,66})\s/$1 \xB6\x0D\t/g;
389:
390: return $ofiles;
391: }
392:
393: ###########################################################################
394: #
395: # Assembler
396: #
397: ###########################################################################
398:
399: sub asm_epilogue {
400: my $func = shift;
401: return "\tcsect .__g$func\[pr]";
402: }
403:
404: sub asm_prologue {
405: my $func = shift;
406:
407: my $asm = <<HERE;
408: EXPORT __g$func\[DS]
409: EXPORT .__g$func\[PR]
410:
411: TC __g$func\[TC], __g$func\[DS]
412:
413: CSECT __g$func\[DS]
414: DC.L .__g$func\[PR]
415: DC.L TOC[tc0]
416:
417: CSECT .__g$func\[PR]
418: FUNCTION .__g$func\[PR]
419: HERE
420: return $asm;
421: }
422:
423:
424: ###########################################################################
425: #
426: # Platform dependent filename conversion
427: #
428: ###########################################################################
429:
430: sub mf {
431: my $path = shift;
432:
433: return $path unless $^O eq 'MacOS';
434:
435: $path =~ /:/ and die "File name already converted to mac format: $path\n";
436:
437: if ($path =~ s&^/&&) {
438: # Absolute path
439: unless ($path =~ s&/&:&g) {
440: # This is a drive name
441: $path .= ':';
442: }
443: } else {
444: # Relative path
445: if ($path =~ s&/&:&g) {
446: # Contains slash
447: $path = ":$path";
448: $path =~ s&\.\.:&:&g;
449: } else {
450: # Plain file name, no directory part
451: }
452: }
453: return $path;
454: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>