71df2d3589
Embedded scripts require a shell to be present in the BusyBox binary. Allow either ash or hush to be used for this purpose. If both are enabled ash takes precedence. The size of the binary is unchanged in the default configuration: both ash and hush are present but support for embedded scripts isn't compiled into hush. Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
124 lines
3.0 KiB
Bash
Executable File
124 lines
3.0 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Note: was using sed OPTS CMD -- FILES
|
|
# but users complain that many sed implementations
|
|
# are misinterpreting --.
|
|
|
|
test $# -ge 2 || { echo "Syntax: $0 SRCTREE OBJTREE"; exit 1; }
|
|
|
|
# cd to objtree
|
|
cd -- "$2" || { echo "Syntax: $0 SRCTREE OBJTREE"; exit 1; }
|
|
# In separate objtree build, include/ might not exist yet
|
|
mkdir include 2>/dev/null
|
|
|
|
srctree="$1"
|
|
|
|
status() { printf ' %-8s%s\n' "$1" "$2"; }
|
|
gen() { status "GEN" "$@"; }
|
|
chk() { status "CHK" "$@"; }
|
|
|
|
# scripts in the 'embed' directory are treated as fake applets
|
|
custom_scripts()
|
|
{
|
|
custom_loc="$1"
|
|
if [ -d "$custom_loc" ]
|
|
then
|
|
for i in $(cd "$custom_loc"; ls * 2>/dev/null)
|
|
do
|
|
printf "IF_FEATURE_SH_EMBEDDED_SCRIPTS(APPLET_SCRIPTED(%s, scripted, BB_DIR_USR_BIN, BB_SUID_DROP, scripted))\n" $i;
|
|
done
|
|
fi
|
|
}
|
|
|
|
generate()
|
|
{
|
|
# NB: data to be inserted at INSERT line is coming on stdin
|
|
src="$1"
|
|
dst="$2"
|
|
header="$3"
|
|
loc="$4"
|
|
#chk "${dst}"
|
|
{
|
|
# Need to use printf: different shells have inconsistent
|
|
# rules re handling of "\n" in echo params.
|
|
printf "%s\n" "${header}"
|
|
# print everything up to INSERT line
|
|
sed -n '/^INSERT$/ q; p' "${src}"
|
|
# copy stdin to stdout
|
|
cat
|
|
if [ -n "$loc" ]
|
|
then
|
|
custom_scripts "$loc"
|
|
fi
|
|
# print everything after INSERT line
|
|
sed -n '/^INSERT$/ {
|
|
:l
|
|
n
|
|
p
|
|
bl
|
|
}' "${src}"
|
|
} >"${dst}.tmp"
|
|
if ! cmp -s "${dst}" "${dst}.tmp"; then
|
|
gen "${dst}"
|
|
mv "${dst}.tmp" "${dst}"
|
|
else
|
|
rm -f "${dst}.tmp"
|
|
fi
|
|
}
|
|
|
|
# (Re)generate include/applets.h
|
|
sed -n 's@^//applet:@@p' "$srctree"/*/*.c "$srctree"/*/*/*.c \
|
|
| generate \
|
|
"$srctree/include/applets.src.h" \
|
|
"include/applets.h" \
|
|
"/* DO NOT EDIT. This file is generated from applets.src.h */" \
|
|
"$srctree/embed"
|
|
|
|
# (Re)generate include/usage.h
|
|
# We add line continuation backslash after each line,
|
|
# and insert empty line before each line which doesn't start
|
|
# with space or tab
|
|
TAB="$(printf '\tX')"
|
|
TAB="${TAB%X}"
|
|
LF="$(printf '\nX')"
|
|
LF="${LF%X}"
|
|
sed -n -e 's@^//usage:\([ '"$TAB"'].*\)$@\1 \\@p' \
|
|
-e 's@^//usage:\([^ '"$TAB"'].*\)$@\'"$LF"'\1 \\@p' \
|
|
"$srctree"/*/*.c "$srctree"/*/*/*.c \
|
|
| generate \
|
|
"$srctree/include/usage.src.h" \
|
|
"include/usage.h" \
|
|
"/* DO NOT EDIT. This file is generated from usage.src.h */"
|
|
|
|
# (Re)generate */Kbuild and */Config.in
|
|
# We skip .dotdirs - makes git/svn/etc users happier
|
|
{ cd -- "$srctree" && find . -type d ! '(' -name '.?*' -prune ')'; } \
|
|
| while read -r d; do
|
|
d="${d#./}"
|
|
|
|
src="$srctree/$d/Kbuild.src"
|
|
dst="$d/Kbuild"
|
|
if test -f "$src"; then
|
|
mkdir -p -- "$d" 2>/dev/null
|
|
|
|
sed -n 's@^//kbuild:@@p' "$srctree/$d"/*.c \
|
|
| generate \
|
|
"${src}" "${dst}" \
|
|
"# DO NOT EDIT. This file is generated from Kbuild.src"
|
|
fi
|
|
|
|
src="$srctree/$d/Config.src"
|
|
dst="$d/Config.in"
|
|
if test -f "$src"; then
|
|
mkdir -p -- "$d" 2>/dev/null
|
|
|
|
sed -n 's@^//config:@@p' "$srctree/$d"/*.c \
|
|
| generate \
|
|
"${src}" "${dst}" \
|
|
"# DO NOT EDIT. This file is generated from Config.src"
|
|
fi
|
|
done
|
|
|
|
# Last read failed. This is normal. Don't exit with its error code:
|
|
exit 0
|