mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-26 20:12:44 +00:00
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:
parent
ec7e7ee868
commit
2bdd404abe
@ -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} && \
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user