From f044fa2607c58e39661d605a50957331d2e7a5f0 Mon Sep 17 00:00:00 2001 From: Martijn Dekker Date: Thu, 11 Jan 2024 02:45:13 +0000 Subject: [PATCH] INIT/Mamfile: consolidate generated MAPLIB code into script This refactors and consolidates the shell code generated by the former nmake MAPLIB rule into a new script, mkreq-maplib, that is called from the Mamfile instead. It generates .req files that map system library dependencies. src/cmd/INIT/mkreq-maplib.sh: - Added. src/cmd/INIT/Mamfile: - Replace old MAPLIB generated code with mkreq-maplib invocations. - Also port Glenn Fowler's comments/rants from the original nmake Makefile, as they are informative as well as funny. --- src/cmd/INIT/Mamfile | 257 +++++++++-------------------------- src/cmd/INIT/mkreq-maplib.sh | 93 +++++++++++++ 2 files changed, 160 insertions(+), 190 deletions(-) create mode 100644 src/cmd/INIT/mkreq-maplib.sh diff --git a/src/cmd/INIT/Mamfile b/src/cmd/INIT/Mamfile index 4d0acde16375..20f987b9e0fe 100644 --- a/src/cmd/INIT/Mamfile +++ b/src/cmd/INIT/Mamfile @@ -15,6 +15,9 @@ setv CCFLAGS ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${mam_cc_OPTIMIZE}? setv CCLDFLAGS ${-strip-symbols?1?${mam_cc_LD_STRIP}??} setv COTEMP $$ setv LDFLAGS +note * +note * initialization for all packages +note * make install make iffe prev iffe.sh @@ -56,6 +59,11 @@ make install exec - ${STDCP} mkreq.sh mkreq exec - test -w mkreq -a -x mkreq || ${STDCHMOD} u+w,+x mkreq done mkreq generated + make mkreq-maplib + prev mkreq-maplib.sh + exec - ${STDCP} mkreq-maplib.sh mkreq-maplib + exec - test -w mkreq-maplib -a -x mkreq-maplib || ${STDCHMOD} u+w,+x mkreq-maplib + done mkreq-maplib generated make mprobe prev mprobe.sh exec - ${STDCP} mprobe.sh mprobe @@ -122,6 +130,11 @@ make install exec - ${STDCMP} 2>/dev/null -s $src $dst || { ${STDMV} $dst $dst.old 2>/dev/null || true; ${STDCP} $src $dst ;} exec - test -w $dst && test -x $dst || ${STDCHMOD} u+w,+x $dst done __proto_stub dontcare virtual + note * + note * ksh93 function search on PATH + note * ksh93 builtin command library -lcmd + note * ksh93 ld library path search on PATH + note * make ${INSTALLROOT}/bin/.paths exec - if test ! -f ${INSTALLROOT}/bin/.paths -o -w ${INSTALLROOT}/bin/.paths exec - then N=' @@ -271,6 +284,9 @@ make install exec - esac exec - fi done ${INSTALLROOT}/bin/.paths generated + note * + note * probe initialization + note * make ${INSTALLROOT}/lib/probe/C exec - if test ! -d ${INSTALLROOT}/lib/probe/C exec - then mkdir -p ${INSTALLROOT}/lib/probe/C @@ -319,62 +335,32 @@ make install exec - then mkdir -p ${INSTALLROOT}/lib/lib exec - fi done ${INSTALLROOT}/lib/lib generated + note * + note * check if -ldl is required + note * + note * NOTE: this works around the sgi botch: + note * (1) irix 5.* made -ldl optional but warned + note * (2) irix 6.* has no -ldl + note * (3) dynamic progs built on irix 5.* and using -ldl fail + note * at runtime on irix 6.* because -ldl is not there + note * make ${INSTALLROOT}/lib/lib/dl prev ${INSTALLROOT}/lib/lib make dl.req prev dl.c - exec - set +v +x - exec - r='-' - exec - for i in dl.c - exec - do if ${CC} -c $i > /dev/null - exec - then g= - exec - for p in dl - - exec - do case $p in - exec - -) if ${CC} -o dl.exe $i $g > /dev/null 2>&1 - exec - then ${CC} -o dl.exe $i > /dev/null 2>&1 || { - exec - r="$g" - exec - break 2 - exec - } - exec - fi - exec - g= - exec - ;; - exec - *) g="$g -l$p" - exec - ;; - exec - esac - exec - done - exec - fi - exec - done 2>/dev/null - exec - echo " $r" > dl.req - exec - ${STDRM} -f dl.exe dl + prev mkreq-maplib + exec - mkreq-maplib ${CC} : dl : dl.c : dl done dl.req generated exec - ${STDCMP} 2>/dev/null -s dl.req ${INSTALLROOT}/lib/lib/dl || { ${STDMV} ${INSTALLROOT}/lib/lib/dl ${INSTALLROOT}/lib/lib/dl.old 2>/dev/null || true; ${STDCP} dl.req ${INSTALLROOT}/lib/lib/dl ;} done ${INSTALLROOT}/lib/lib/dl generated + note * + note * requiring these is a botch + note * make ${INSTALLROOT}/lib/lib/iconv make iconv.req prev iconv.c - exec - set +v +x - exec - r='-' - exec - for i in iconv.c - exec - do if ${CC} -c $i > /dev/null - exec - then g= - exec - for p in iconv - - exec - do case $p in - exec - -) if ${CC} -o iconv.exe $i $g > /dev/null 2>&1 - exec - then ${CC} -o iconv.exe $i > /dev/null 2>&1 || { - exec - r="$g" - exec - break 2 - exec - } - exec - fi - exec - g= - exec - ;; - exec - *) g="$g -l$p" - exec - ;; - exec - esac - exec - done - exec - fi - exec - done 2>/dev/null - exec - echo " $r" > iconv.req - exec - ${STDRM} -f iconv.exe iconv + prev mkreq-maplib + exec - mkreq-maplib ${CC} : iconv : iconv.c : iconv done iconv.req generated exec - ${STDCMP} 2>/dev/null -s iconv.req ${INSTALLROOT}/lib/lib/iconv || { ${STDMV} ${INSTALLROOT}/lib/lib/iconv ${INSTALLROOT}/lib/lib/iconv.old 2>/dev/null || true; ${STDCP} iconv.req ${INSTALLROOT}/lib/lib/iconv ;} done ${INSTALLROOT}/lib/lib/iconv generated @@ -382,58 +368,19 @@ make install make w.req prev w.c prev w2.c - exec - set +v +x - exec - r='-' - exec - for i in w.c w2.c - exec - do if ${CC} -c $i > /dev/null - exec - then g= - exec - for p in w - - exec - do case $p in - exec - -) if ${CC} -o w.exe $i $g > /dev/null 2>&1 - exec - then ${CC} -o w.exe $i > /dev/null 2>&1 || { - exec - r="$g" - exec - break 2 - exec - } - exec - fi - exec - g= - exec - ;; - exec - *) g="$g -l$p" - exec - ;; - exec - esac - exec - done - exec - fi - exec - done 2>/dev/null - exec - echo " $r" > w.req - exec - ${STDRM} -f w.exe w w2 + prev mkreq-maplib + exec - mkreq-maplib ${CC} : w : w.c w2.c : w done w.req generated exec - ${STDCMP} 2>/dev/null -s w.req ${INSTALLROOT}/lib/lib/w || { ${STDMV} ${INSTALLROOT}/lib/lib/w ${INSTALLROOT}/lib/lib/w.old 2>/dev/null || true; ${STDCP} w.req ${INSTALLROOT}/lib/lib/w ;} done ${INSTALLROOT}/lib/lib/w generated + note * + note * miscellaneous -l* checks + note * make ${INSTALLROOT}/lib/lib/intl make intl.req prev intl.c - exec - set +v +x - exec - r='-' - exec - for i in intl.c - exec - do if ${CC} -c $i > /dev/null - exec - then g= - exec - for p in intl - - exec - do case $p in - exec - -) if ${CC} -o intl.exe $i $g > /dev/null 2>&1 - exec - then ${CC} -o intl.exe $i > /dev/null 2>&1 || { - exec - r="$g" - exec - break 2 - exec - } - exec - fi - exec - g= - exec - ;; - exec - *) g="$g -l$p" - exec - ;; - exec - esac - exec - done - exec - fi - exec - done 2>/dev/null - exec - echo " $r" > intl.req - exec - ${STDRM} -f intl.exe intl + prev mkreq-maplib + exec - mkreq-maplib ${CC} : intl : intl.c : intl done intl.req generated exec - ${STDCMP} 2>/dev/null -s intl.req ${INSTALLROOT}/lib/lib/intl || { ${STDMV} ${INSTALLROOT}/lib/lib/intl ${INSTALLROOT}/lib/lib/intl.old 2>/dev/null || true; ${STDCP} intl.req ${INSTALLROOT}/lib/lib/intl ;} done ${INSTALLROOT}/lib/lib/intl generated @@ -445,124 +392,54 @@ make install prev m4.c prev m5.c prev m6.c - exec - set +v +x - exec - r='-' - exec - for i in m.c m2.c m3.c m4.c m5.c m6.c - exec - do if ${CC} -c $i > /dev/null - exec - then g= - exec - for p in m - - exec - do case $p in - exec - -) if ${CC} -o m.exe $i $g > /dev/null 2>&1 - exec - then ${CC} -o m.exe $i > /dev/null 2>&1 || { - exec - r="$g" - exec - break 2 - exec - } - exec - fi - exec - g= - exec - ;; - exec - *) g="$g -l$p" - exec - ;; - exec - esac - exec - done - exec - fi - exec - done 2>/dev/null - exec - echo " $r" > m.req - exec - ${STDRM} -f m.exe m m2 m3 m4 m5 m6 + prev mkreq-maplib + exec - mkreq-maplib ${CC} : m : m.c m2.c m3.c m4.c m5.c m6.c : m done m.req generated exec - ${STDCMP} 2>/dev/null -s m.req ${INSTALLROOT}/lib/lib/m || { ${STDMV} ${INSTALLROOT}/lib/lib/m ${INSTALLROOT}/lib/lib/m.old 2>/dev/null || true; ${STDCP} m.req ${INSTALLROOT}/lib/lib/m ;} done ${INSTALLROOT}/lib/lib/m generated make ${INSTALLROOT}/lib/lib/nsl make nsl.req prev nsl.c - exec - set +v +x - exec - r='-' - exec - for i in nsl.c - exec - do if ${CC} -c $i > /dev/null - exec - then g= - exec - for p in nsl - - exec - do case $p in - exec - -) if ${CC} -o nsl.exe $i $g > /dev/null 2>&1 - exec - then ${CC} -o nsl.exe $i > /dev/null 2>&1 || { - exec - r="$g" - exec - break 2 - exec - } - exec - fi - exec - g= - exec - ;; - exec - *) g="$g -l$p" - exec - ;; - exec - esac - exec - done - exec - fi - exec - done 2>/dev/null - exec - echo " $r" > nsl.req - exec - ${STDRM} -f nsl.exe nsl + prev mkreq-maplib + exec - mkreq-maplib ${CC} : nsl : nsl.c : nsl done nsl.req generated exec - ${STDCMP} 2>/dev/null -s nsl.req ${INSTALLROOT}/lib/lib/nsl || { ${STDMV} ${INSTALLROOT}/lib/lib/nsl ${INSTALLROOT}/lib/lib/nsl.old 2>/dev/null || true; ${STDCP} nsl.req ${INSTALLROOT}/lib/lib/nsl ;} done ${INSTALLROOT}/lib/lib/nsl generated + note * + note * what was sco smoking + note * almost all of gethost* are in -lnsl except gethostbyname which + note * is in -lsocket which isn't needed to resolve socket() but seems + note * to do the -lnsl job + note * make ${INSTALLROOT}/lib/lib/socket make socket.req prev socket.c prev nsl.c - exec - set +v +x - exec - r='-' - exec - for i in socket.c nsl.c - exec - do if ${CC} -c $i > /dev/null - exec - then g= - exec - for p in socket - - exec - do case $p in - exec - -) if ${CC} -o socket.exe $i $g > /dev/null 2>&1 - exec - then ${CC} -o socket.exe $i > /dev/null 2>&1 || { - exec - r="$g" - exec - break 2 - exec - } - exec - fi - exec - g= - exec - ;; - exec - *) g="$g -l$p" - exec - ;; - exec - esac - exec - done - exec - fi - exec - done 2>/dev/null - exec - echo " $r" > socket.req - exec - ${STDRM} -f socket.exe socket nsl + prev mkreq-maplib + exec - mkreq-maplib ${CC} : socket : socket.c nsl.c : socket done socket.req generated exec - ${STDCMP} 2>/dev/null -s socket.req ${INSTALLROOT}/lib/lib/socket || { ${STDMV} ${INSTALLROOT}/lib/lib/socket ${INSTALLROOT}/lib/lib/socket.old 2>/dev/null || true; ${STDCP} socket.req ${INSTALLROOT}/lib/lib/socket ;} done ${INSTALLROOT}/lib/lib/socket generated + note * + note * more substance abuse + note * gdbm's ndbm "compatibility" doesn't supply , instead supplies + note * which provides K&R prototypes *and* it requires -lgdbm + note * some implementations use -lndbm, others -ldbm, still others -lc + note * this is why unix is starting to look like windows + note * this map allows makefiles to use -ldbm on all systems + note * + note * and this just in: sometimes its and possibly -lgdbm_compat + note * + note * at least the -l* buck stops here + note * make ${INSTALLROOT}/lib/lib/dbm make dbm.req prev db.c prev gdbm.c - make gdbm1.c - prev gdbm-ndbm.h implicit dontcare virtual - done gdbm1.c - make gdbm2.c - prev ndbm.h implicit dontcare virtual - done gdbm2.c - exec - set +v +x - exec - r='-' - exec - for i in db.c gdbm.c gdbm1.c gdbm2.c - exec - do if ${CC} -c $i > /dev/null - exec - then g= - exec - for p in db - gdbm_compat - gdbm - ndbm - dbm - - exec - do case $p in - exec - -) if ${CC} -o dbm.exe $i $g > /dev/null 2>&1 - exec - then ${CC} -o dbm.exe $i > /dev/null 2>&1 || { - exec - r="$g" - exec - break 2 - exec - } - exec - fi - exec - g= - exec - ;; - exec - *) g="$g -l$p" - exec - ;; - exec - esac - exec - done - exec - fi - exec - done 2>/dev/null - exec - echo " $r" > dbm.req - exec - ${STDRM} -f dbm.exe db gdbm gdbm1 gdbm2 + prev gdbm1.c + prev gdbm2.c + prev mkreq-maplib + exec - mkreq-maplib ${CC} : dbm : db.c gdbm.c gdbm1.c gdbm2.c : db gdbm_compat gdbm ndbm dbm done dbm.req generated exec - ${STDCMP} 2>/dev/null -s dbm.req ${INSTALLROOT}/lib/lib/dbm || { ${STDMV} ${INSTALLROOT}/lib/lib/dbm ${INSTALLROOT}/lib/lib/dbm.old 2>/dev/null || true; ${STDCP} dbm.req ${INSTALLROOT}/lib/lib/dbm ;} done ${INSTALLROOT}/lib/lib/dbm generated diff --git a/src/cmd/INIT/mkreq-maplib.sh b/src/cmd/INIT/mkreq-maplib.sh new file mode 100644 index 000000000000..dc297129b232 --- /dev/null +++ b/src/cmd/INIT/mkreq-maplib.sh @@ -0,0 +1,93 @@ +######################################################################## +# # +# This file is part of the ksh 93u+m package # +# Copyright (c) 1984-2012 AT&T Intellectual Property # +# Copyright (c) 2020-2024 Contributors to ksh 93u+m # +# and is licensed under the # +# Eclipse Public License, Version 2.0 # +# # +# A copy of the License is available at # +# https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html # +# (with md5 checksum 84283fa8859daf213bdda5a9f8d1be1d) # +# # +# Glenn Fowler # +# Martijn Dekker # +# # +######################################################################## + +# Generator for INIT's *.req library dependency files. +# This script is designed to be called from src/cmd/INIT/Mamfile only. +# It is based on the the code generated by the nmake MAPLIB +# rule from src/cmd/INIT/MAPLIB.mk, and replaces the latter. + +# Set options. +case ${ZSH_VERSION+z} in +z) emulate ksh ;; +*) (command set -o posix) 2>/dev/null && set -o posix ;; +esac +set -o noglob -o nounset +: $INSTALLROOT # error out early + +# Get colon-separated compiler invocation from arguments. +# Like this whole build system, we assume arguments do not contain +# spaces, or if they do, that they are meant to be field-split. +allcc= +while test "$#" -gt 0 && test "$1" != ":" +do allcc=$allcc${allcc:+ }$1 + shift +done +test "${1-}" = ":" || { echo "$0: bad arguments" >&2; exit 1; } +shift + +# Get the .req basename. +req=$1 +shift +test "${1-}" = ":" || { echo "$0: bad arguments" >&2; exit 1; } +shift + +# Get the source file names. +src= +while test "$#" -gt 0 && test "$1" != ":" +do src=$src${src:+ }$1 + shift +done +test "${1-}" = ":" || { echo "$0: bad arguments" >&2; exit 1; } +shift + +# Get the libraries to test. +libs= +while test "$#" -gt 0 +do # for each lib name also add '-' + libs="$libs${libs:+ }$1 -" + shift +done + +# Setup. +set -o noglob +trap 'set +o noglob; rm -rf "$req".exe*' 0 + +######### Main ########## +# Generate .req file. # +######################### +r='-' +for i in $src +do if $allcc -c $i >/dev/null 2>&1 + then rm $(basename $i .c).o & + g= + for p in $libs + do case $p in + -) if $allcc -o $req.exe $i $g >/dev/null 2>&1 + then if ! $allcc -o $req.exe $i >/dev/null 2>&1 + then r=$g + break 2 + fi + fi + g= + ;; + *) g="$g -l$p" + ;; + esac + done + fi +done +echo " $r" > $req.req