From 2bdd404abe2cdf9f52ddc45202afbde637f97292 Mon Sep 17 00:00:00 2001 From: "Simon J. Gerraty" Date: Mon, 14 Oct 2024 14:58:12 -0700 Subject: [PATCH] bootstrap-packages handle optional DIRDEPS Add logic to bootstrap-packages.sh to handle constructs like: SUBDIR.${MK_OPT}+= sub and: .if ${MK_OPT} == "yes" SUBDIR+= sub .endif there are other methods used in various makefiles so this will be better than nothing, but not complete coverage. In either case a reldir will be added to targets/packages/$package/Makefile.depend.options rather than targets/packages/$package/Makefile.depend It does not matter that in many cases the Makefile.depend will end up with no DIRDEPS. Also check that parent Makefile does not have a subdir commented out, before including it. If BOOTSTRAP_PACKAGES_FLAGS is -v we report each Makefile.depend[.options] we create. Reviewed by: stevek --- targets/pseudo/bootstrap-packages/Makefile | 3 +- .../bootstrap-packages/bootstrap-packages.sh | 134 ++++++++++++++++-- 2 files changed, 125 insertions(+), 12 deletions(-) diff --git a/targets/pseudo/bootstrap-packages/Makefile b/targets/pseudo/bootstrap-packages/Makefile index 6523e88f84db..d3385fb1e7e0 100644 --- a/targets/pseudo/bootstrap-packages/Makefile +++ b/targets/pseudo/bootstrap-packages/Makefile @@ -13,7 +13,8 @@ all: packages PACKAGES?= ${.CURDIR:H:H}/packages packages: package-makefile.list - @${.CURDIR}/bootstrap-packages.sh PACKAGES=${PACKAGES} ${.ALLSRC} + @${.CURDIR}/bootstrap-packages.sh ${BOOTSTRAP_PACKAGES_FLAGS} \ + PACKAGES=${PACKAGES} ${.ALLSRC} package-makefile.list: @(cd ${SRCTOP} && \ diff --git a/targets/pseudo/bootstrap-packages/bootstrap-packages.sh b/targets/pseudo/bootstrap-packages/bootstrap-packages.sh index a2fe250d68a3..58b2843a9422 100755 --- a/targets/pseudo/bootstrap-packages/bootstrap-packages.sh +++ b/targets/pseudo/bootstrap-packages/bootstrap-packages.sh @@ -24,16 +24,33 @@ # and $PACKAGES/Makefile.depend to make it easier to keep # Makefile.depend files throughout the tree up-to-date. # -# The result is not ideal, as we do not (yet) take into account all -# the MK_* knobs that can impact DIRDEPS. +# We attempt to handle MK_* knobs that impact DIRDEPS, by +# identifying the intermediate *bin and *lib Makefiles and +# checking if they had a subdir for the current reldir via a construct +# like: +# +# SUBDIR.${MK_OPT}+= sub +# +# in which case we extract the option OPT and add the reldir +# to a Makefile.depend.options file in targets/packages/sub/ +# +# Of course the above is only *one* way optional SUBDIRs are handled +# in the tree. We also attempt to handle: +# +# .if ${MK_OPT} == "yes" +# SUBDIR+= sub +# .endif # Mydir=`dirname $0` +SKIP_LOG=return + while : do case "$1" in *=*) eval "$1"; shift;; + -v) SKIP_LOG=:; shift;; *) break;; esac done @@ -43,6 +60,9 @@ to_reldir() { } SRCTOP=${SRCTOP:-$(realpath $Mydir/../../..)} +. ${SRCTOP}/libexec/rc/debug.sh +DebugOn bootstrap-packages + PACKAGES=${PACKAGES:-$(realpath $Mydir/../..)} case "$PACKAGES" in /*) ;; @@ -51,9 +71,15 @@ esac script_name=$(realpath $0 | to_reldir) +log() { + $SKIP_LOG 0 + echo $1 | to_reldir >&2 +} + start_depend() { depfile=$1 + log $1 mkdir -p ${depfile%/*} cat < $depfile # Generated by $script_name @@ -63,33 +89,119 @@ EOF } end_depend() { - depfile=$1 - - cat <> $depfile + end_options $1.options + cat <> $1 .include EOF } +start_options() { + ofile=$1 + + log $1 + mkdir -p ${ofile%/*} + opts=$opt + eq== + cat < $ofile +# Generated by $script_name + +DIRDEPS_OPTIONS= $opt +EOF +} + +end_options() { + test -s $1 || return + cat <> $1 + +.include +EOF +} + +find_opt() { + mf=$1 + sub=$2 + shift 2 + case "$sub" in + *+*) sub=`echo "$sub" | sed 's,+,\\\\+,g'`;; + esac + egrep "$@" "^[^#].*[[:space:]]$sub([[:space:]]|\$)" $mf | + tr '{' '\n' | + sed -n 's,^MK_\([^}]*\).*,\1,p' | + tr '\n' ' ' +} + start_depend $PACKAGES/Makefile.depend || exit 1 sort -t= -k2 "$@" | sed 's,/Makefile:PACKAGE=, ,' | ( lpackage= while read reldir package do - case "$package" in \ - lib?{LIB}) package=${reldir##*/};; - lib?{LIB:tl}) package=`echo ${reldir##*/} | tr 'A-Z' 'a-z'`;; + # use these below + dname=${reldir%/*} + bname=${reldir##*/} + # check parent does not have it commented out + # otherwise we should ignore it. + pmf=$SRCTOP/$dname/Makefile + egrep -q "^[^#].*[[:space:]]$bname([[:space:]]|\$)" $pmf || continue + : reldir=$reldir + case "$reldir" in + *lib/*) sub=${reldir#*lib/};; + *bin/*) sub=${reldir#*bin/};; + *libexec/*) sub=${reldir#*libexec/};; + *) opt= sub=;; + esac + if [ -n "$sub" ]; then + smf=${SRCTOP}/${reldir%/$sub}/Makefile + # now we need just the immediate subdir + sub=${sub%%/*} + # SUBDIR.${MK_OPT}+= sub + opt=`find_opt $smf $sub` + # .if ${MK_OPT} == "yes" + # SUBDIR+= sub + opt=${opt:-`find_opt $smf $sub -B2`} + fi + case "$reldir" in + */tests|*/tests/*) opt=${opt:-TESTS};; + esac + # PACKAGES is set to either a simple string like 'runtime' + # or for some libraries 'lib${LIB}' + # or even 'lib${LIB:tl}' when LIB contains upper case + # the majority of libs in FreeBSD use lib${LIB} for their dirname + # but we allow for just ${LIB} too. + : package=$package + case "$package" in \ + lib?{LIB*) package=`echo lib${bname#lib} | tr 'A-Z' 'a-z'`;; esac if test "$package" != "$lpackage"; then \ test -z "$lpackage" || end_depend $ddeps target=$PACKAGES/$package - ddeps=$target/Makefile.depend - start_depend $ddeps + ddeps=$target/Makefile.depend + odeps=$ddeps.options + rm -f $odeps + start_depend $ddeps lpackage=$package echo " $target \\" fi - echo " $reldir \\" >> $ddeps + if [ -n "$opt" ]; then + [ -s $odeps ] || start_options $odeps + { + case " $opts " in + *" $opt "*) ;; + *) echo DIRDEPS_OPTIONS+= $opt + opts="$opts $opt" + eq== + ;; + esac + for o in $opt + do + echo DIRDEPS.$o.yes$eq $reldir + done + eq=+= + } >> $odeps + else + echo " $reldir \\" >> $ddeps + fi done end_depend $ddeps ) | to_reldir >> $PACKAGES/Makefile.depend