The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

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*