summaryrefslogtreecommitdiff
path: root/plan9/mkfile
blob: ce2dab04e4df48978df2c51480507bed98c5cf59 (plain)
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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
APE=/sys/src/ape
< $APE/config
<plan9/buildinfo
archname = plan9_$objtype
privroot = /sys/lib/perl
privlib  = $privroot/$p9pvers
archroot = /$objtype/lib/perl
archlib  = $archroot/$p9pvers
sitelib  = $privlib/site_perl
sitearch = $archlib/site_perl
corelib  = $archlib/CORE
arpalib  = $corelib/arpa

pwd=`{pwd}
cpanlib=`{cd cpan; ls -ld * | grep '^d' | awk '{ print $10 }' | grep -v '^\.'}
icpanlib=`{echo $pwd^/cpan/^$cpanlib^/lib}
distlib=`{cd dist; ls -ld * | grep '^d' | awk '{ print $10 }' | grep -v '^\.'}
idistlib=`{echo $pwd^/dist/^$distlib $pwd^/dist/^$distlib^/lib }
extlib=`{cd ext; ls -ld * | grep '^d' | awk '{ print $10 }' | grep -v '^\.'}
iextlib=`{echo $pwd^/ext/^$extlib $pwd^/ext/^$extlib/lib }

buildlibs=`{echo -I$pwd^/^(lib archlib privlib) -I^$icpanlib -I^$idistlib -I^$iextlib }
miniperl=`{echo $pwd/miniperl $buildlibs }
perl=`{echo $pwd/perl $buildlibs }
xscmd=`{echo $pwd/dist/ExtUtils-ParseXS/lib/ExtUtils/xsubpp -noprototypes -typemap $pwd/dist/ExtUtils-ParseXS/t/typemap}
miniperlxs=`{echo $miniperl $xscmd}
perlxs=`{echo $perl $xscmd}

BASECFLAGS=-B -D_SUSV2_SOURCE -D_POSIX_SOURCE -D_BSD_EXTENSION
PERLCFLAGS =-DPERL_CORE $BASECFLAGS
CFLAGS=-DPERL_IS_MINIPERL $PERLCFLAGS

CCCMD = $CC  -c $CFLAGS
PERLCCCMD= $CC -c $PERLCFLAGS
XSCCCMD= $CC -c $BASECFLAGS

perllib = archlib/CORE/libperl.a

perlshr = archlib/CORE/libperlshr.a

installman1dir = /sys/man/1
installman3dir = /sys/man/2

podnames = perl perlbook perldata perldebtut perldiag perldsc perlform perlfunc perlipc perllexwarn perllol perlmod perlmodlib perlmodinstall perlnewmod perlop perlootut perlopentut perlpacktut perlpod perlport perlrequick perlretut perlref perlreftut perlrequick perlrun perlsec perlstyle perlsub perlsyn perltie perltrap perlutil perlunifaq perluniintro perlvar
faqpodnames = perlfaq perlfaq1 perlfaq2 perlfaq3 perlfaq4 perlfaq5 perlfaq6 perlfaq7 perlfaq8 perlfaq9
advpodnames = perlapi perlapio perlcall perlclib perlcompile perldebguts perldbmfilter perldebug perldelta perldiag perlebcdic perlembed perlfilter perlfork perlguts perlhack perlintern perliol perllocale perlnumber perlobj perlpodspec perlre perlthrtut perltodo perlunicode perlunicook perlxs perlxs perlxstut
archpodnames = perlaix perlamiga perlbeos perlbs2000 perlce perlcygwin perldgux perlfreebsd perlhpux perlhurd perlirix perlmacosx perlmpeix perlos2 perlos390 perlos400 perlplan9 perlqnx perlsolaris perltru64 perlvms perlvos perlwin32
histpodnames = perl5004delta perl5005delta perl561delta perl56delta perl570delta perl571delta perl572delta perl573delta perl58delta perlhist

libpods = ${podnames:%=pod/%.pod}

perlpods = $libpods

extensions = File::Glob IO Opcode DynaLoader Fcntl POSIX Cwd re B Devel::Peek attributes Hash::Util Hash::Util::FieldHash mro Storable Time::HiRes Unicode::Normalize List::Util
ext_xs = Glob.xs IO.xs Opcode.xs  dl_none.xs Fcntl.xs POSIX.xs Cwd.xs re.xs B.xs Peek.xs attributes.xs Util.xs FieldHash.xs mro.xs Storable.xs HiRes.xs Normalize.xs ListUtil.xs
ext_c = ${ext_xs:%.xs=%.c}
ext_obj = ${ext_xs:%.xs=%.$O} bsd_glob.$O poll.$O re_comp.$O re_exec.$O

# Socket requires a full version of Perl (one with IO to build).
more_extensions = Socket Data::Dumper
more_ext_xs = Socket.xs Dumper.xs
more_ext_c = ${more_ext_xs:%.xs=%.c}
more_ext_obj = ${more_ext_xs:%.xs=%.$O}

obj = av.$O caretx.$O deb.$O doio.$O doop.$O dquote.$O dump.$O globals.$O gv.$O hv.$O keywords.$O locale.$O malloc.$O mathoms.$O mg.$O mro_core.$O numeric.$O op.$O pad.$O perlapi.$O perlio.$O perly.$O pp.$O pp_ctl.$O pp_hot.$O pp_pack.$O pp_sort.$O pp_sys.$O reentr.$O regcomp.$O regexec.$O run.$O scope.$O sv.$O taint.$O time64.$O toke.$O universal.$O utf8.$O util.$O

OBJS = perl.$O plan9.$O $obj

# TODO: what's this used for?
testlist = `{cd t; echo base/*.t comp/*.t cmd/*.t run/*.t io/*.t re/*.t opbasic/*.t op/*.t uni/*.t perf/*.t}

install:V:	perl preplibrary 
		cp perl /$objtype/bin/perl-$p9pvers
		cp plan9/aperl /rc/bin/Perl-$p9pvers
		
		if (test ! -d $privroot) mkdir $privroot
		if (test ! -d $privlib) mkdir $privlib
		if (test ! -d $privlib/auto) mkdir $privlib/auto
		if (test ! -d $sitelib) mkdir $sitelib
		if (test ! -d $archroot) mkdir $archroot
		if (test ! -d $archlib) mkdir $archlib
		if (test ! -d $sitearch) mkdir $sitearch
		if (test ! -d $corelib) mkdir $corelib
		if (test ! -d $arpalib) mkdir $arpalib
		cp *.h plan9/*.h  $corelib
		cp plan9/arpa/*.h  $arpalib
		
		# Populate library directories
		{cd privlib ; tar c . } | {cd $privlib ; tar x }
		{cd lib ; tar c . } | {cd $privlib ; tar x }
		{cd archlib ; tar c . } | {cd $archlib ; tar x }
		# mk man # don't make man pages now--resolve multiversion
		
perl:	perlnosocket more_extensions
		$LD $PERLCFLAGS -o perl perlmain.$O perl.$O $perllib $perlshr $more_ext_obj

perlnosocket:		config.h miniperlmain.$O miniperl archlib/Config.pm perlmain.$O $perlshr
		$LD $PERLCFLAGS -o perl perlmain.$O perl.$O $perllib $perlshr
		
miniperl:	config.h $perllib miniperlmain.$O 
		$LD  $CFLAGS -o miniperl miniperlmain.$O  $perllib 

preplibrary:V:	miniperl archlib/Config.pm
			mkdir -p privlib/auto
			for (file in lib/*.pm lib/*/*.pm archlib/Config.pm) $miniperl -e 'use AutoSplit; autosplit(@ARGV)' $file privlib/auto
	
$perllib(%):N:	%
$perllib: ${OBJS:%=$perllib(%)}
		mkdir -p archlib/CORE
		ar rv $perllib $OBJS
		$RANLIB $perllib
			
miniperlmain.$O:	config.h uudmap.h
				$CCCMD miniperlmain.c

perlmain.$O:	config.h perlmain.c
			$PERLCCCMD perl.c
			$PERLCCCMD perlmain.c

malloc.$O: malloc.c
			# Does the PTRDIFF_MAX need to be set per architecture?
			$CCCMD -DPTRDIFF_MAX^'='^9223372036854775807L malloc.c

perlmain.c:	miniperl extensions archlib/Config.pm
			$miniperl -MExtUtils::Miniperl -e 'writemain(\q{perlmain.c}, @ARGV)' $extensions

config.h:		plan9/fndvers
			plan9/fndvers 
			mkdir -p archlib/CORE
			cp config.h archlib/CORE

$perlshr(%):N:	%
$perlshr:  ${ext_obj:%=$perlshr(%)}
		ar rv $perlshr $ext_obj
		$RANLIB $perlshr

uudmap.h:	generate_uudmap.c
			$CCCMD generate_uudmap.c
			# This is currently a show-stopper for cross-compilation: find the true $objtype by looking at kernel?
			$LD $CFLAGS -o generate_uudmap generate_uudmap.$O
			chmod +x generate_uudmap
			./generate_uudmap uudmap.h bitcount.h mg_data.h

extensions:V: miniperl archlib/Config.pm $ext_c dist/XSLoader/XSLoader.pm

more_extensions:V: perlnosocket $more_ext_c $more_ext_obj
			ext_obj=`{echo $ext_obj $more_ext_obj}

Socket.$O: Socket.c
			$XSCCCMD -I plan9 Socket.c

attributes.$O: attributes.c
			$XSCCCMD -I plan9 attributes.c

mro.$O: mro.c
			$XSCCCMD -I plan9 mro.c

B.$O: B.c
			$XSCCCMD -I plan9 B.c

Peek.$O: Peek.c
			$XSCCCMD -I plan9 Peek.c

Util.$O: Util.c
			$XSCCCMD -I plan9 Util.c

FieldHash.$O: FieldHash.c
			$XSCCCMD -I plan9 FieldHash.c

re.$O: re.c
			$XSCCCMD -DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT -I plan9 re.c

re_comp.$O: re_comp.c
			$XSCCCMD -DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT -I plan9 re_comp.c

re_exec.$O: re_exec.c
			$XSCCCMD -DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT -I plan9 re_exec.c

Cwd.$O: Cwd.c IO.c
			cp dist/IO/ppport.h dist/PathTools
			$XSCCCMD -DDOUBLE_SLASHES_SPECIAL^'='^0 -I plan9 Cwd.c

IO.$O: extensions
			$XSCCCMD -I plan9 IO.c

poll.$O: extensions
			$XSCCCMD -I plan9 poll.c

POSIX.$O: extensions
			$XSCCCMD -I plan9 POSIX.c

Glob.$O: extensions
			$XSCCCMD -I plan9 Glob.c

bsd_glob.$O: extensions
			$XSCCCMD -I plan9 -I. bsd_glob.c

Normalize.$O:	extensions
			$XSCCCMD -I plan9 -I. Normalize.c

Dumper.$O:	Dumper.c
			$XSCCCMD -I plan9 -I. Dumper.c

HiRes.$O:	extensions
			$XSCCCMD -I plan9 -I. HiRes.c

Storable.$O:	extensions
			$XSCCCMD -I plan9 -I. Storable.c

ListUtil.$O:	extensions
			$XSCCCMD -I plan9 -I. ListUtil.c

Opcode.$O: extensions
			$XSCCCMD -I plan9 Opcode.c

Fcntl.$O: extensions
			$XSCCCMD -I plan9 Fcntl.c

dl_none.$O: extensions
			$XSCCCMD -I plan9 dl_none.c

Glob.c:		archlib/Config.pm	ext/File-Glob/Glob.xs
			cd ext/File-Glob
			$miniperl Makefile.PL # to write constants	
			cd $pwd
			$miniperlxs ext/File-Glob/Glob.xs > $target
			cp ext/File-Glob/bsd_glob.^(c h) $pwd
			mkdir -p archlib/File
			cp ext/File-Glob/Glob.pm archlib/File/Glob.pm

ppport.h:   archlib/Config.pm
			if (test ! -f /bin/sh) bind -a /386/bin/ape /bin
			# specify the list, otherwise suicide
			$miniperl mkppport --list mkppport.lst

Cwd.c:		archlib/Config.pm dist/PathTools/Cwd.xs
			$miniperlxs dist/PathTools/Cwd.xs > $target
			cp dist/PathTools/Cwd.pm archlib
			{ cd dist/PathTools/lib; tar c . } | { mkdir -p archlib; cd archlib; tar x }

IO.c:		archlib/Config.pm dist/IO/IO.xs ppport.h
			$miniperlxs dist/IO/IO.xs > $target
			cp dist/IO/poll.^(c h) $pwd
			cp dist/IO/IO.pm archlib
			{ cd dist/IO/lib; tar c . } | { mkdir -p archlib; cd archlib; tar x }

dist/XSLoader/XSLoader.pm:  archlib/Config.pm
			cd dist/XSLoader
			$miniperl XSLoader_pm.PL
			cp XSLoader.pm $pwd/archlib

ext/Errno/Errno.pm: perlnosocket	
			cd ext/Errno
			$perl Makefile.PL
			$perl Errno_pm.PL arch.txt
			cp Errno.pm $pwd/archlib
		
Socket.c:		perlnosocket cpan/Socket/Socket.xs ext/Errno/Errno.pm
			cd cpan/Socket
			$perl Makefile.PL # to write const-xs.inc
			cd $pwd
			$perlxs cpan/Socket/Socket.xs > $target
			cp cpan/Socket/Socket.pm archlib

uni.data:	archlib/Config.pm lib/unicore/mktables
			$miniperl lib/unicore/mktables -C lib/unicore -makelist -p

Normalize.c:		archlib/Config.pm dist/Unicode-Normalize/Normalize.xs uni.data
			$miniperl dist/Unicode-Normalize/mkheader
			$miniperlxs dist/Unicode-Normalize/Normalize.xs > $target
			mkdir -p archlib/Unicode
			cp dist/Unicode-Normalize/Normalize.pm archlib/Unicode

Dumper.c:		perlnosocket dist/Data-Dumper/Dumper.xs
			$perlxs dist/Data-Dumper/Dumper.xs > $target
			mkdir -p archlib/Data
			cp dist/Data-Dumper/Dumper.pm archlib/Data

HiRes.c:		archlib/Config.pm dist/Time-HiRes/HiRes.xs
			cd dist/Time-HiRes
			$miniperl Makefile.PL # to write const-xs.inc
			cd $pwd
			$miniperlxs dist/Time-HiRes/HiRes.xs > $target
			mkdir -p archlib/Time
			cp dist/Time-HiRes/HiRes.pm archlib/Time

ListUtil.c:		archlib/Config.pm cpan/Scalar-List-Utils/ListUtil.xs
			cp cpan/Scalar-List-Utils/multicall.h $pwd
			$miniperlxs cpan/Scalar-List-Utils/ListUtil.xs > $target
			{ cd cpan/Scalar-List-Utils/lib; tar c . } | { mkdir -p archlib; cd archlib; tar x }

Storable.c:		archlib/Config.pm dist/Storable/Storable.xs
			$miniperlxs dist/Storable/Storable.xs > $target
			cp dist/Storable/Storable.pm archlib

Opcode.c:		archlib/Config.pm ext/Opcode/Opcode.xs
			$miniperlxs ext/Opcode/Opcode.xs > $target
			cp ext/Opcode/^(Opcode ops)^.pm archlib

Fcntl.c:		archlib/Config.pm ext/Fcntl/Fcntl.xs
			cd ext/Fcntl
			$miniperl Makefile.PL # to write const-xs.inc
			cd $pwd
			$miniperlxs ext/Fcntl/Fcntl.xs > $target
			cp ext/Fcntl/Fcntl.pm archlib

POSIX.c:		archlib/Config.pm ext/POSIX/POSIX.xs
			cd ext/POSIX
			$miniperl Makefile.PL # to write const-xs.inc
			cd $pwd
			$miniperlxs ext/POSIX/POSIX.xs > $target
			cp ext/POSIX/lib/POSIX.pm archlib

B.c:		archlib/Config.pm ext/B/B.xs
			cd ext/B
			$miniperl Makefile.PL PERL_CORE^'='^1 # to write const-xs.inc
			cd $pwd
			$miniperlxs ext/B/B.xs > $target
			cp ext/B/^(B O)^.pm archlib

Peek.c:		archlib/Config.pm ext/Devel-Peek/Peek.xs
			$miniperlxs ext/Devel-Peek/Peek.xs > $target
			cp ext/Devel-Peek/Peek.pm archlib

attributes.c:	archlib/Config.pm ext/attributes/attributes.xs
			$miniperlxs ext/attributes/attributes.xs > $target
			cp ext/attributes/attributes.pm archlib

mro.c:	archlib/Config.pm ext/mro/mro.xs
			$miniperlxs ext/mro/mro.xs > $target
			cp ext/mro/mro.pm archlib

Util.c:	archlib/Config.pm ext/Hash-Util/Util.xs
			$miniperlxs ext/Hash-Util/Util.xs > $target
			{ cd ext/Hash-Util/lib; tar c . } | { cd archlib; tar x }

FieldHash.c:	archlib/Config.pm ext/Hash-Util-FieldHash/FieldHash.xs
			$miniperlxs ext/Hash-Util-FieldHash/FieldHash.xs > $target
			{ cd ext/Hash-Util-FieldHash/lib; tar c . } | { cd archlib; tar x }
	
re.c:	archlib/Config.pm ext/re/re.xs
			$miniperlxs ext/re/re.xs > $target
			cp ext/re/re_^(comp top)^.h $pwd
			cp ext/re/re.pm archlib

re_comp.c:	miniperl re.c regcomp.c
			cp regcomp.c $target

re_exec.c:	miniperl re.c regexec.c
			cp regexec.c $target

dl_none.c:	archlib/Config.pm ext/DynaLoader/dl_none.xs
			cd ext/DynaLoader;
			$miniperl DynaLoader_pm.PL
			cd $pwd
			$miniperlxs ext/DynaLoader/dl_none.xs > $target
			cp ext/DynaLoader/DynaLoader.pm archlib

preptest:Q: perl
			# Bind the crap out of everything, as different tests expect different INCs
			cp perl t/perl
			cd t
			mntpt=/$objtype/lib/perl
			if (test ! -d $mntpt ) {
				mkdir $mntpt
				rmdir=1
			}
			ramfs -m $mntpt
			mkdir -p $mntpt/5.32.0/site_perl
			echo -n Binding directories
			for (l in $pwd/lib $pwd/archlib $icpanlib $idistlib $iextlib ) {
				if (test -d $l ) {
					if (! ~ `{grep $l <{ns} >[1]/dev/null; echo $status} '') bind -a $l $mntpt/5.32.0/site_perl
					echo -n .
				}
			}
			bind $mntpt/5.32.0/site_perl $pwd/lib
			echo done
			echo Binding sh
			if (! ~ `{grep /$objtype/bin/ape <{ns} >[1]/dev/null; echo $status} '') bind -a /$objtype/bin/ape /bin

minitest:V: preptest
			cd t
			perl TEST $testlist
			unmount $pwd/lib
			unmount $mntpt
			if (~ $rmdir 1) rm $mntpt
			rm t/perl

test:V: preptest
			cd t
			perl TEST `{ ls */*.t | comm -23 - ../plan9/exclude }
			unmount $pwd/lib
			unmount $mntpt
			if (~ $rmdir 1) rm $mntpt
			rm t/perl

plan9.$O:	config.h plan9/plan9.c
			cp plan9/plan9.c plan9.c
			$CCCMD plan9.c

%.$O:	config.h %.c
		$CCCMD $stem.c

archlib/Config.pm:		config.sh
				$miniperl make_patchnum.pl
				$miniperl configpm
				cp lib/Config.pm archlib/Config.pm
				cp lib/Config_heavy.pl archlib/Config_heavy.pl
				cp lib/Config_git.pl archlib/Config_git.pl


config.sh:	miniperl
		miniperl plan9/genconfig.pl $extensions $more_extensions

installall:V:	
			for (386 68000 68020 arm arm amd64 mips power power64 sparc sparc64 spim) mk install

man:V:		$perlpods pod/pod2man.PL perl
			perl pod/pod2man.PL
			for (i in $podnames) pod/pod2man pod/$i.pod > $installman3dir/$i
			for (i in $faqpodnames) pod/pod2man pod/$i.pod > $installman3dir/$i
			for (i in $advpodnames) pod/pod2man pod/$i.pod > $installman3dir/$i
			for (i in $archpodnames) pod/pod2man pod/$i.pod > $installman3dir/$i
			for (i in $histpodnames) pod/pod2man pod/$i.pod > $installman3dir/$i
			
nuke clean:V:	
		rm -f *.$O config.sh $perllib config.h $perlshr perlmain.c perl miniperl git_version.h $ext_c $more_ext_c generate_uudmap uudmap.h bitcount.h mg_data.h plan9.c plan9ish.h math.h bsd_glob.^(c h) poll.^(c h) re_*.^(c h) uni.data multicall.h
		rm -rf privlib archlib

deleteman:V:
			rm -f $installman1dir/perl* $installman3dir/perl*