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
This commit is contained in:
Simon J. Gerraty 2024-10-14 14:58:12 -07:00
parent ec7e7ee868
commit 2bdd404abe
2 changed files with 125 additions and 12 deletions

View File

@ -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} && \

View File

@ -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 <<EOF > $depfile
# Generated by $script_name
@ -63,33 +89,119 @@ EOF
}
end_depend() {
depfile=$1
cat <<EOF >> $depfile
end_options $1.options
cat <<EOF >> $1
.include <dirdeps.mk>
EOF
}
start_options() {
ofile=$1
log $1
mkdir -p ${ofile%/*}
opts=$opt
eq==
cat <<EOF > $ofile
# Generated by $script_name
DIRDEPS_OPTIONS= $opt
EOF
}
end_options() {
test -s $1 || return
cat <<EOF >> $1
.include <dirdeps-options.mk>
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