Skip to content

Commit

Permalink
bootstrap-packages handle optional DIRDEPS
Browse files Browse the repository at this point in the history
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
  • Loading branch information
sgerraty committed Oct 14, 2024
1 parent ec7e7ee commit 2bdd404
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 12 deletions.
3 changes: 2 additions & 1 deletion targets/pseudo/bootstrap-packages/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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} && \
Expand Down
134 changes: 123 additions & 11 deletions targets/pseudo/bootstrap-packages/bootstrap-packages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
/*) ;;
Expand All @@ -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
Expand All @@ -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
Expand Down

0 comments on commit 2bdd404

Please sign in to comment.