Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/targets/pseudo/bootstrap-packages/bootstrap-packages.sh
39478 views
1
#!/bin/sh
2
3
# SPDX-License-Identifier: BSD-2-Clause
4
5
# Our input is the output of something like:
6
#
7
# (cd ${SRCTOP} &&
8
# find *bin etc lib* -name Makefile |
9
# xargs grep '^PACKAGE[[:space:]]*=' )
10
#
11
# With some cleanup and looks like:
12
#
13
# usr.bin/ofed/libibverbs/Makefile:PACKAGE=FreeBSD-rdma
14
# usr.bin/last/Makefile:PACKAGE=acct
15
# usr.bin/lastcomm/Makefile:PACKAGE=acct
16
# usr.bin/users/Makefile:PACKAGE=acct
17
# usr.bin/who/Makefile:PACKAGE=acct
18
# usr.sbin/ac/Makefile:PACKAGE=acct
19
# usr.sbin/accton/Makefile:PACKAGE=acct
20
# usr.sbin/lastlogin/Makefile:PACKAGE=acct
21
# ..
22
#
23
# which we use to populate $PACKAGES/*/Makefile.depend
24
# and $PACKAGES/Makefile.depend to make it easier to keep
25
# Makefile.depend files throughout the tree up-to-date.
26
#
27
# We attempt to handle MK_* knobs that impact DIRDEPS, by
28
# identifying the intermediate *bin and *lib Makefiles and
29
# checking if they had a subdir for the current reldir via a construct
30
# like:
31
#
32
# SUBDIR.${MK_OPT}+= sub
33
#
34
# in which case we extract the option OPT and add the reldir
35
# to a Makefile.depend.options file in targets/packages/sub/
36
#
37
# Of course the above is only *one* way optional SUBDIRs are handled
38
# in the tree. We also attempt to handle:
39
#
40
# .if ${MK_OPT} == "yes"
41
# SUBDIR+= sub
42
# .endif
43
#
44
45
Mydir=`dirname $0`
46
47
SKIP_LOG=return
48
49
while :
50
do
51
case "$1" in
52
*=*) eval "$1"; shift;;
53
-v) SKIP_LOG=:; shift;;
54
*) break;;
55
esac
56
done
57
58
to_reldir() {
59
sed "s,$SRCTOP/,,"
60
}
61
62
SRCTOP=${SRCTOP:-$(realpath $Mydir/../../..)}
63
. ${SRCTOP}/libexec/rc/debug.sh
64
DebugOn bootstrap-packages
65
66
PACKAGES=${PACKAGES:-$(realpath $Mydir/../..)}
67
case "$PACKAGES" in
68
/*) ;;
69
*) PACKAGES=$SRCTOP/$PACKAGES;;
70
esac
71
72
script_name=$(realpath $0 | to_reldir)
73
74
log() {
75
$SKIP_LOG 0
76
echo $1 | to_reldir >&2
77
}
78
79
start_depend() {
80
depfile=$1
81
82
log $1
83
mkdir -p ${depfile%/*}
84
cat <<EOF > $depfile
85
# Generated by $script_name
86
87
DIRDEPS= \\
88
EOF
89
}
90
91
end_depend() {
92
end_options $1.options
93
cat <<EOF >> $1
94
95
.include <dirdeps.mk>
96
EOF
97
}
98
99
start_options() {
100
ofile=$1
101
102
log $1
103
mkdir -p ${ofile%/*}
104
opts=$opt
105
eq==
106
cat <<EOF > $ofile
107
# Generated by $script_name
108
109
DIRDEPS_OPTIONS= $opt
110
EOF
111
}
112
113
end_options() {
114
test -s $1 || return
115
cat <<EOF >> $1
116
117
.include <dirdeps-options.mk>
118
EOF
119
}
120
121
no_plus() {
122
case "$1" in
123
*+*) echo "$1" | sed 's,+,\\\\+,g';;
124
*) echo "$1";;
125
esac
126
}
127
128
find_opt() {
129
mf=$1
130
sub="`no_plus $2`"
131
shift 2
132
egrep "$@" "^[^#].*[[:space:]]$sub([[:space:]]|\$)" $mf |
133
tr '{' '\n' |
134
sed -n 's,^MK_\([^}]*\).*,\1,p' |
135
tr '\n' ' '
136
}
137
138
start_depend $PACKAGES/Makefile.depend || exit 1
139
sort -t= -k2 "$@" | sed 's,/Makefile:PACKAGE=, ,' |
140
(
141
lpackage=
142
while read reldir package
143
do
144
# use these below
145
dname=${reldir%/*}
146
bname=${reldir##*/}
147
# check parent does not have it commented out
148
# otherwise we should ignore it.
149
# if the parent makefile does not exist, we will skip it.
150
pmf=$SRCTOP/$dname/Makefile
151
egrep -q "^[^#].*[[:space:]]`no_plus $bname`([[:space:]]|\$)" $pmf 2> /dev/null || continue
152
: reldir=$reldir
153
case "$reldir" in
154
*lib/*) sub=${reldir#*lib/};;
155
*bin/*) sub=${reldir#*bin/};;
156
*libexec/*) sub=${reldir#*libexec/};;
157
*) opt= sub=;;
158
esac
159
if [ -n "$sub" ]; then
160
smf=${SRCTOP}/${reldir%/$sub}/Makefile
161
# now we need just the immediate subdir
162
sub=${sub%%/*}
163
# SUBDIR.${MK_OPT}+= sub
164
opt=`find_opt $smf $sub`
165
# .if ${MK_OPT} == "yes"
166
# SUBDIR+= sub
167
opt=${opt:-`find_opt $smf $sub -B2`}
168
fi
169
case "$reldir" in
170
*/tests|*/tests/*) opt=${opt:-TESTS};;
171
esac
172
# PACKAGES is set to either a simple string like 'runtime'
173
# or for some libraries 'lib${LIB}'
174
# or even 'lib${LIB:tl}' when LIB contains upper case
175
# the majority of libs in FreeBSD use lib${LIB} for their dirname
176
# but we allow for just ${LIB} too.
177
: package=$package
178
case "$package" in \
179
lib?{LIB*) package=`echo lib${bname#lib} | tr 'A-Z' 'a-z'`;;
180
esac
181
if test "$package" != "$lpackage"; then \
182
test -z "$lpackage" || end_depend $ddeps
183
target=$PACKAGES/$package
184
ddeps=$target/Makefile.depend
185
odeps=$ddeps.options
186
rm -f $odeps
187
start_depend $ddeps
188
lpackage=$package
189
echo " $target \\"
190
fi
191
if [ -n "$opt" ]; then
192
[ -s $odeps ] || start_options $odeps
193
{
194
case " $opts " in
195
*" $opt "*) ;;
196
*) echo DIRDEPS_OPTIONS+= $opt
197
opts="$opts $opt"
198
eq==
199
;;
200
esac
201
for o in $opt
202
do
203
echo DIRDEPS.$o.yes$eq $reldir
204
done
205
eq=+=
206
} >> $odeps
207
else
208
echo " $reldir \\" >> $ddeps
209
fi
210
done
211
end_depend $ddeps
212
) | to_reldir >> $PACKAGES/Makefile.depend
213
end_depend $PACKAGES/Makefile.depend
214
215