# $NetBSD: sets.subr,v 1.186.2.1 2019/11/17 07:04:33 martin Exp $ # # # The following variables contain defaults for sets.subr functions and callers: # setsdir path to src/distrib/sets # nlists list of base sets # xlists list of x11 sets # extlists list of extsrc sets # obsolete controls if obsolete files are selected instead # module if != "no", enable MODULE sets # shlib shared library format (a.out, elf, or "") # stlib static library format (a.out, elf) # # The following variables are exported to the environment: # MACHINE # MACHINE_ARCH # MACHINE_CPU # HAVE_BINUTILS # HAVE_GCC # HAVE_GDB # HAVE_SSP # HAVE_OPENSSL # TOOLCHAIN_MISSING # OBJECT_FMT # as well as: # # # The following variables refer to tools that are used when building sets: # : ${AWK:=awk} : ${CKSUM:=cksum} : ${COMM:=comm} : ${DATE:=date} : ${DB:=db} : ${EGREP:=egrep} : ${ENV_CMD:=env} # ${ENV} is special to sh(1), ksh(1), etc. : ${FGREP:=fgrep} : ${FIND:=find} : ${GREP:=grep} : ${GZIP_CMD:=gzip} # ${GZIP} is special to gzip(1) : ${HOSTNAME_CMD:=hostname} # ${HOSTNAME} is special to bash(1) : ${HOST_SH:=sh} : ${IDENT:=ident} : ${JOIN:=join} : ${LS:=ls} : ${MAKE:=make} : ${MKTEMP:=mktemp} : ${MTREE:=mtree} : ${PASTE:=paste} : ${PAX:=pax} : ${PRINTF:=printf} : ${SED:=sed} : ${SORT:=sort} : ${STAT:=stat} : ${TSORT:=tsort} : ${UNAME:=uname} : ${WC:=wc} : ${XARGS:=xargs} # # If printf is a shell builtin command, then we can # implement cheaper versions of basename and dirname # that do not involve any fork/exec overhead. # If printf is not builtin, approximate it using echo, # and hope there are no weird file names that cause # some versions of echo to do the wrong thing. # (Converting to this version of dirname speeded up the # syspkgdeps script by an order of magnitude, from 68 # seconds to 6.3 seconds on one particular host.) # # Note that naive approximations for dirname # using ${foo%/*} do not do the right thing in cases # where the result should be "/" or ".". # case "$(type printf)" in *builtin*) basename () { local bn bn="${1##*/}" bn="${bn%$2}" printf "%s\n" "$bn" } dirname () { local dn case "$1" in ?*/*) dn="${1%/*}" ;; /*) dn=/ ;; *) dn=. ;; esac printf "%s\n" "$dn" } ;; *) basename () { local bn bn="${1##*/}" bn="${bn%$2}" echo "$bn" } dirname () { local dn case "$1" in ?*/*) dn="${1%/*}" ;; /*) dn=/ ;; *) dn=. ;; esac echo "$dn" } ;; esac ##### oIFS=$IFS IFS=" " for x in $( MAKEVERBOSE= ${MAKE} -B -f ${rundir}/mkvars.mk mkvars ); do eval export $x done IFS=$oIFS MKVARS="$( MAKEVERBOSE= ${MAKE} -B -f ${rundir}/mkvars.mk mkvars | ${SED} -e 's,=.*,,' | ${XARGS} )" ##### setsdir=${rundir} obsolete=0 if [ "${MKKMOD}" = "no" ]; then module=no # MODULEs are off. modset="" else module=yes modset="modules" fi if [ "${MKATF}" = "no" ]; then testset="" else testset="tests" fi if [ "${MKDEBUG}" = "no" -a "${MKDEBUGLIB}" = "no" ]; then debugset="" xdebugset="" else debugset="debug" xdebugset="xdebug" fi # Determine lib type. Do this first so stlib also gets set. if [ "${OBJECT_FMT}" = "ELF" ]; then shlib=elf else shlib=aout fi stlib=$shlib # Now check for MKPIC or specials and turn off shlib if need be. if [ "${MKPIC}" = "no" ]; then shlib=no fi nlists="base comp $debugset etc games man misc $modset rescue $testset text" xlists="xbase xcomp $xdebugset xetc xfont xserver" extlists="extbase extcomp extetc" OSRELEASE=$(${HOST_SH} ${NETBSDSRCDIR}/sys/conf/osrelease.sh -k) MODULEDIR="stand/${MACHINE}/${OSRELEASE}/modules" SUBST="s#@MODULEDIR@#${MODULEDIR}#g" SUBST="${SUBST};s#@OSRELEASE@#${OSRELEASE}#g" SUBST="${SUBST};s#@MACHINE@#${MACHINE}#g" # # list_set_files setfile [...] # # Produce a packing list for setfile(s). # In each file, a record consists of a path and a System Package name, # separated by whitespace. E.g., # # # $NetBSD: sets.subr,v 1.186.2.1 2019/11/17 07:04:33 martin Exp $ # . base-sys-root [keyword[,...]] # ./altroot base-sys-root # ./bin base-sys-root # ./bin/[ base-util-root # ./bin/cat base-util-root # [...] # # A # in the first column marks a comment. # # If ${obsolete} != 0, only entries with an "obsolete" keyword will # be printed. All other keywords must be present. # # The third field is an optional comma separated list of keywords to # control if a record is printed; every keyword listed must be enabled # for the record to be printed. The list of all avalaible make variables # that can be turned on or off can be found by running in this directory: # # make -f mkvars.mk mkvarsyesno # # These MK variables can be used as selectors in the sets as . # # The following extra keywords are also available, listed by: # # make -f mkvars.mk mkextravars # # These are: # 1. The HAVE_: # ssp ${HAVE_SSP} != no # libgcc_eh ${HAVE_LIBGCC_EH} != no # binutils= = value of ${HAVE_BINUTILS} # gcc= = value of ${HAVE_GCC} # gdb= = value of ${HAVE_GDB} # openssl= = value of ${HAVE_OPENSSL} # xorg_server_ver= = value of ${HAVE_XORG_SERVER_VER} # xorg_glamor ${HAVE_XORG_GLAMOR} != no # mesa_ver= = value of ${HAVE_MESA_VER} # # 2. The USE_: # use_inet6 ${USE_INET6} != no # use_kerberos ${USE_KERBEROS} != no # use_ldap ${USE_LDAP} != no # use_yp ${USE_YP} != no # # 3. Finally: # dummy dummy entry (ignored) # obsolete file is obsolete, and only printed if # ${obsolete} != 0 # # solaris ${MKDTRACE} != no or ${MKZFS} != no or ${MKCTF} != no # # # endian= = value of ${TARGET_ENDIANNESS} # # # .cat if ${MKMANZ} != "no" && ${MKCATPAGES} != "no" # automatically append ".gz" to the filename # # .man if ${MKMANZ} != "no" && ${MKMAN} != "no" # automatically append ".gz" to the filename # list_set_files() { if [ ${MAKEVERBOSE:-2} -lt 3 ]; then verbose=false else verbose=true fi print_set_lists "$@" | \ ${AWK} -v obsolete=${obsolete} ' BEGIN { if (obsolete) wanted["obsolete"] = 1 split("'"${MKVARS}"'", needvars) doingcompat = 0 doingcompattests = 0 ignoredkeywords["compatdir"] = 1 ignoredkeywords["compatfile"] = 1 ignoredkeywords["compattestdir"] = 1 ignoredkeywords["compattestfile"] = 1 ignoredkeywords["compatx11dir"] = 1 ignoredkeywords["compatx11file"] = 1 for (vi in needvars) { nv = needvars[vi] kw = tolower(nv) sub(/^mk/, "", kw) sub(/^have_/, "", kw) sub(/^target_endianness/, "endian", kw) if (nv != "HAVE_GCC" && nv != "HAVE_GDB" && ENVIRON[nv] != "no" && nv != "COMPATARCHDIRS" && nv != "KMODARCHDIRS") { wanted[kw] = 1 } } if ("compat" in wanted) { doingcompat = 1; split("'"${COMPATARCHDIRS}"'", compatarchdirs, ","); compatdirkeywords["compatdir"] = 1 compatfilekeywords["compatfile"] = 1 if (wanted["compattests"]) { doingcompattests = 1; compatdirkeywords["compattestdir"] = 1 compatfilekeywords["compattestfile"] = 1 } if (wanted["compatx11"]) { doingcompatx11 = 1; compatdirkeywords["compatx11dir"] = 1 compatfilekeywords["compatx11file"] = 1 } } if (("kmod" in wanted) && ("compatmodules" in wanted)) { split("'"${KMODARCHDIRS}"'", kmodarchdirs, ","); kmodpat = "./stand/" ENVIRON["MACHINE"] l_kmodpat = length(kmodpat) } if ("'"${TOOLCHAIN_MISSING}"'" != "yes") { if ("binutils" in wanted) wanted["binutils=" "'"${HAVE_BINUTILS}"'"] = 1 if ("gcc" in wanted) wanted["gcc=" "'"${HAVE_GCC}"'"] = 1 if ("gdb" in wanted) wanted["gdb=" "'"${HAVE_GDB}"'"] = 1 } if ("openssl" in wanted) { wanted["openssl=" "'"${HAVE_OPENSSL}"'"] = 1 } if ("xorg_server_ver" in wanted) { wanted["xorg_server_ver=" "'"${HAVE_XORG_SERVER_VER}"'"] = 1 } if ("mesa_ver" in wanted) { wanted["mesa_ver=" "'"${HAVE_MESA_VER}"'"] = 1 } if (("man" in wanted) && ("catpages" in wanted)) wanted[".cat"] = 1 if (("man" in wanted) && ("manpages" in wanted)) wanted[".man"] = 1 if ("endian" in wanted) wanted["endian=" "'"${TARGET_ENDIANNESS}"'"] = 1 if ("machine" in wanted) wanted["machine=" "'"${MACHINE}"'"] = 1 if ("machine_arch" in wanted) wanted["machine_arch=" "'"${MACHINE_ARCH}"'"] = 1 if ("machine_cpu" in wanted) wanted["machine_cpu=" "'"${MACHINE_CPU}"'"] = 1 } /^#/ { next; } /^-/ { notwanted[substr($1, 2)] = 1; delete list [substr($1, 2)]; next; } NF > 2 && $3 != "-" { if (notwanted[$1] != "") next; split($3, keywords, ",") show = 1 haveobs = 0 iscompatfile = 0 havekmod = 0 iscompatdir = 0 for (ki in keywords) { kw = keywords[ki] if (("manz" in wanted) && (kw == ".cat" || kw == ".man")) $1 = $1 ".gz" if (substr(kw, 1, 1) == "!") { kw = substr(kw, 2) if (kw in wanted) show = 0 } else if (kw in compatdirkeywords) { iscompatdir = 1 } else if (kw in compatfilekeywords) { iscompatfile = 1 } else if (kw == "nocompatmodules") { havekmod = -1 } else if (kw in ignoredkeywords) { # ignore } else if (! (kw in wanted)) { show = 0 } else if (kw == "kmod" && havekmod == 0) { havekmod = 1 } if (kw == "obsolete") haveobs = 1 } if (iscompatdir) { for (d in cpaths) { if (cpaths[d] == $1 "/") next } cpaths[ncpaths++] = $1 "/" } if (obsolete && ! haveobs) next if (!show) next list[$1] = $0 if (havekmod > 0 && substr($1,1,l_kmodpat) == kmodpat) { for (d in kmodarchdirs) { xd = "./stand/" kmodarchdirs[d] xfile = xd substr($1, l_kmodpat+1) tmp = xd substr($0, l_kmodpat+1) list[xfile] = tmp; } next } if (!doingcompat || !(iscompatfile || iscompatdir)) next if (iscompatfile) { emitcompat[$1] = 1; next } for (d in compatarchdirs) { tmp = $0 xfile = $1 "/" compatarchdirs[d] tmp = xfile substr(tmp, length($1) + 1) if (xfile in notwanted) continue; sub("compatdir","compat",tmp); sub("compattestdir","compat",tmp); list[xfile] = tmp } next } { if ($1 in notwanted) next; if (! obsolete) list[$1] = $0 } END { for (i in list) { print list[i] if (! (i in emitcompat)) continue; l_i = length(i) l = 0 for (j in cpaths) { lx = length(cpaths[j]) if (lx >= l_i || cpaths[j] != substr(i, 1, lx)) { continue; } if (lx > l) { l = lx; cpath = cpaths[j]; } } for (d in compatarchdirs) { tmp = list[i] extrapath = compatarchdirs[d] "/" xfile = cpath extrapath substr(i, l + 1) if (xfile in notwanted) continue; sub("compatfile","compat",tmp); sub("compattestfile","compat",tmp); tmp = xfile substr(tmp, l_i + 1) print tmp; } } }' } # # list_set_lists setname # # Print to stdout a list of files, one filename per line, which # concatenate to create the packing list for setname. E.g., # # .../lists/base/mi # .../lists/base/rescue.mi # .../lists/base/md.i386 # [...] # # For a given setname $set, the following files may be selected from # .../list/$set: # mi # mi.ext.* # ad.${MACHINE_ARCH} # (or) ad.${MACHINE_CPU} # ad.${MACHINE_CPU}.shl # md.${MACHINE}.${MACHINE_ARCH} # (or) md.${MACHINE} # stl.mi # stl.${stlib} # shl.mi # shl.mi.ext.* # shl.${shlib} # shl.${shlib}.ext.* # module.mi if ${module} != no # module.${MACHINE} if ${module} != no # module.ad.${MACHINE_ARCH} if ${module} != no # (or) module.ad.${MACHINE_CPU} if ${module} != no # rescue.shl # rescue.${MACHINE} # rescue.ad.${MACHINE_ARCH} # (or) rescue.ad.${MACHINE_CPU} # rescue.ad.${MACHINE_CPU}.shl # # Environment: # shlib # stlib # list_set_lists() { setname=$1 list_set_lists_mi $setname list_set_lists_ad $setname list_set_lists_md $setname list_set_lists_stl $setname list_set_lists_shl $setname list_set_lists_module $setname list_set_lists_rescue $setname return 0 } list_set_lists_mi() { setdir=$setsdir/lists/$1 # always exist! echo $setdir/mi } list_set_lists_ad() { setdir=$setsdir/lists/$1 [ "${MACHINE}" != "${MACHINE_ARCH}" ] && \ list_set_lists_common_ad $1 } list_set_lists_md() { setdir=$setsdir/lists/$1 echo_if_exist $setdir/md.${MACHINE}.${MACHINE_ARCH} || \ echo_if_exist $setdir/md.${MACHINE} } list_set_lists_stl() { setdir=$setsdir/lists/$1 echo_if_exist $setdir/stl.mi echo_if_exist $setdir/stl.${stlib} } list_set_lists_shl() { setdir=$setsdir/lists/$1 [ "$shlib" != "no" ] || return echo_if_exist $setdir/shl.mi echo_if_exist $setdir/shl.${shlib} } list_set_lists_module() { setdir=$setsdir/lists/$1 [ "$module" != "no" ] || return echo_if_exist $setdir/module.mi echo_if_exist $setdir/module.${MACHINE} # XXX module never has .shl [ "${MACHINE}" != "${MACHINE_ARCH}" ] && \ list_set_lists_common_ad $1 module } list_set_lists_rescue() { setdir=$setsdir/lists/$1 echo_if_exist $setdir/rescue.mi echo_if_exist $setdir/rescue.${MACHINE} [ "${MACHINE}" != "${MACHINE_ARCH}" ] && \ list_set_lists_common_ad $1 rescue } list_set_lists_common_ad() { setdir=$setsdir/lists/$1; _prefix=$2 [ -n "$_prefix" ] && prefix="$_prefix". # Prefer a .ad.${MACHINE_ARCH} over a # .ad.${MACHINE_CPU}, since the arch- # specific one will be more specific than the # cpu-specific one. echo_if_exist $setdir/${prefix}ad.${MACHINE_ARCH} || \ echo_if_exist $setdir/${prefix}ad.${MACHINE_CPU} [ "$shlib" != "no" ] && \ echo_if_exist $setdir/${prefix}ad.${MACHINE_CPU}.shl } echo_if_exist() { [ -f $1 ] && echo $1 return $? } echo_if_exist_foreach() { local _list=$1; shift for _suffix in $@; do echo_if_exist ${_list}.${_suffix} done } print_set_lists() { for setname; do list=$(list_set_lists $setname) for l in $list; do echo $l if $verbose; then echo >&2 "DEBUG: list_set_files: $l" fi done done | ${XARGS} ${SED} ${SUBST} } # arch_to_cpu mach # # Print the ${MACHINE_CPU} for ${MACHINE_ARCH}=mach, # as determined by . # arch_to_cpu() { MACHINE_ARCH=${1} MAKEFLAGS= \ ${MAKE} -m ${NETBSDSRCDIR}/share/mk \ -f ${NETBSDSRCDIR}/share/mk/bsd.own.mk \ -V '${MACHINE_CPU}' } # arch_to_endian mach # # Print the ${TARGET_ENDIANNESS} for ${MACHINE_ARCH}=mach, # as determined by . # arch_to_endian() { MACHINE_ARCH=${1} MAKEFLAGS= \ ${MAKE} -m ${NETBSDSRCDIR}/share/mk \ -f ${NETBSDSRCDIR}/share/mk/bsd.endian.mk \ -V '${TARGET_ENDIANNESS}' } ##### # print_mkvars print_mkvars() { for v in $MKVARS; do eval echo $v=\$$v done } # print_set_lists_{base,x,ext} # list_set_lists_{base,x,ext} # list_set_files_{base,x,ext} for func in print_set_lists list_set_lists list_set_files; do for x in base x ext; do if [ $x = base ]; then list=nlists else list=${x}lists fi eval ${func}_${x} \(\) \{ $func \$$list \; \} done done