2010-05-17 05:29:16 +05:30
|
|
|
#!/bin/sh
|
2010-05-09 07:52:48 +05:30
|
|
|
|
2011-04-16 21:29:34 +05:30
|
|
|
# Note: was using sed OPTS CMD -- FILES
|
|
|
|
# but users complain that many sed implementations
|
|
|
|
# are misinterpreting --.
|
|
|
|
|
gen_build_files: Use C locale when calling sed on globbed files
When include/applets.h is re-generated
it generates code macros in include/applets.h e.g.
IF_XZCAT(APPLET_ODDNAME(xzcat, unxz, BB_DIR_USR_BIN, BB_SUID_DROP, xzcat))
...
IF_CHVT(APPLET_NOEXEC(chvt, chvt, BB_DIR_USR_BIN, BB_SUID_DROP, chvt))
...
sed is used to process source files like below to feed into this header
generation
sed -n 's@^//applet:@@p' "$srctree"/*/*.c "$srctree"/*/*/*.c
this means we let shell decide the order of .c files being fed into sed
tool, applets.h has code snippets thats generated out of code fragments
from these .c files and the order of the generated code depends on the
order of .c files being fed to sed and then piped to generate tool, even
though the generated code is logically same, it does result in re-odered
code in applets.h based on which shell was used during build on exact busybox
sources since sort order is different based on chosen locale and also default shell
being bash or dash
This sets the environment variable LC_ALL to the value C, which will
enforce bytewise sorting, irrespective of the shell
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-05-13 01:31:35 +05:30
|
|
|
export LC_ALL=C
|
|
|
|
|
2010-05-09 19:50:52 +05:30
|
|
|
test $# -ge 2 || { echo "Syntax: $0 SRCTREE OBJTREE"; exit 1; }
|
2010-05-09 07:52:48 +05:30
|
|
|
|
|
|
|
# cd to objtree
|
2010-05-10 14:30:11 +05:30
|
|
|
cd -- "$2" || { echo "Syntax: $0 SRCTREE OBJTREE"; exit 1; }
|
2010-07-09 04:55:36 +05:30
|
|
|
# In separate objtree build, include/ might not exist yet
|
|
|
|
mkdir include 2>/dev/null
|
2010-05-09 07:52:48 +05:30
|
|
|
|
|
|
|
srctree="$1"
|
|
|
|
|
2010-11-16 17:59:12 +05:30
|
|
|
status() { printf ' %-8s%s\n' "$1" "$2"; }
|
|
|
|
gen() { status "GEN" "$@"; }
|
|
|
|
chk() { status "CHK" "$@"; }
|
|
|
|
|
2018-11-17 23:18:14 +05:30
|
|
|
# scripts in the 'embed' directory are treated as fake applets
|
|
|
|
custom_scripts()
|
|
|
|
{
|
|
|
|
custom_loc="$1"
|
|
|
|
if [ -d "$custom_loc" ]
|
|
|
|
then
|
2018-11-21 15:41:01 +05:30
|
|
|
for i in $(cd "$custom_loc"; ls * 2>/dev/null)
|
2018-11-17 23:18:14 +05:30
|
|
|
do
|
2018-11-27 20:04:25 +05:30
|
|
|
printf "IF_FEATURE_SH_EMBEDDED_SCRIPTS(APPLET_SCRIPTED(%s, scripted, BB_DIR_USR_BIN, BB_SUID_DROP, scripted))\n" $i;
|
2018-11-17 23:18:14 +05:30
|
|
|
done
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2010-11-16 17:59:12 +05:30
|
|
|
generate()
|
|
|
|
{
|
2011-10-19 21:24:42 +05:30
|
|
|
# NB: data to be inserted at INSERT line is coming on stdin
|
2017-01-25 01:22:42 +05:30
|
|
|
src="$1"
|
|
|
|
dst="$2"
|
|
|
|
header="$3"
|
2018-11-17 23:18:14 +05:30
|
|
|
loc="$4"
|
2010-11-16 17:59:12 +05:30
|
|
|
#chk "${dst}"
|
2011-10-19 21:24:42 +05:30
|
|
|
{
|
2010-11-25 11:25:18 +05:30
|
|
|
# Need to use printf: different shells have inconsistent
|
2011-10-19 21:24:42 +05:30
|
|
|
# rules re handling of "\n" in echo params.
|
2010-11-24 19:36:49 +05:30
|
|
|
printf "%s\n" "${header}"
|
2011-10-19 21:24:42 +05:30
|
|
|
# print everything up to INSERT line
|
2011-10-20 00:47:20 +05:30
|
|
|
sed -n '/^INSERT$/ q; p' "${src}"
|
2011-10-19 21:24:42 +05:30
|
|
|
# copy stdin to stdout
|
|
|
|
cat
|
2018-11-17 23:18:14 +05:30
|
|
|
if [ -n "$loc" ]
|
|
|
|
then
|
|
|
|
custom_scripts "$loc"
|
|
|
|
fi
|
2011-10-19 21:24:42 +05:30
|
|
|
# print everything after INSERT line
|
2014-01-10 16:24:37 +05:30
|
|
|
sed -n '/^INSERT$/ {
|
|
|
|
:l
|
|
|
|
n
|
|
|
|
p
|
|
|
|
bl
|
|
|
|
}' "${src}"
|
2011-10-19 21:24:42 +05:30
|
|
|
} >"${dst}.tmp"
|
2010-11-16 17:59:12 +05:30
|
|
|
if ! cmp -s "${dst}" "${dst}.tmp"; then
|
|
|
|
gen "${dst}"
|
|
|
|
mv "${dst}.tmp" "${dst}"
|
|
|
|
else
|
|
|
|
rm -f "${dst}.tmp"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2010-06-06 04:23:45 +05:30
|
|
|
# (Re)generate include/applets.h
|
2011-10-19 21:24:42 +05:30
|
|
|
sed -n 's@^//applet:@@p' "$srctree"/*/*.c "$srctree"/*/*/*.c \
|
|
|
|
| generate \
|
2010-11-16 17:59:12 +05:30
|
|
|
"$srctree/include/applets.src.h" \
|
|
|
|
"include/applets.h" \
|
2018-11-17 23:18:14 +05:30
|
|
|
"/* DO NOT EDIT. This file is generated from applets.src.h */" \
|
|
|
|
"$srctree/embed"
|
2010-06-06 04:23:45 +05:30
|
|
|
|
2010-06-06 05:23:38 +05:30
|
|
|
# (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
|
2014-01-10 16:24:37 +05:30
|
|
|
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' \
|
2012-01-30 07:04:56 +05:30
|
|
|
"$srctree"/*/*.c "$srctree"/*/*/*.c \
|
2011-10-19 21:24:42 +05:30
|
|
|
| generate \
|
2010-11-16 17:59:12 +05:30
|
|
|
"$srctree/include/usage.src.h" \
|
|
|
|
"include/usage.h" \
|
2011-10-19 21:24:42 +05:30
|
|
|
"/* DO NOT EDIT. This file is generated from usage.src.h */"
|
2010-06-06 05:23:38 +05:30
|
|
|
|
2010-06-06 04:23:45 +05:30
|
|
|
# (Re)generate */Kbuild and */Config.in
|
2012-01-30 07:04:56 +05:30
|
|
|
# We skip .dotdirs - makes git/svn/etc users happier
|
2014-03-16 16:35:58 +05:30
|
|
|
{ cd -- "$srctree" && find . -type d ! '(' -name '.?*' -prune ')'; } \
|
2012-01-30 07:04:56 +05:30
|
|
|
| while read -r d; do
|
2010-05-27 06:03:31 +05:30
|
|
|
d="${d#./}"
|
2010-07-09 04:55:36 +05:30
|
|
|
|
2010-05-10 14:30:11 +05:30
|
|
|
src="$srctree/$d/Kbuild.src"
|
|
|
|
dst="$d/Kbuild"
|
|
|
|
if test -f "$src"; then
|
2010-07-15 20:09:24 +05:30
|
|
|
mkdir -p -- "$d" 2>/dev/null
|
2010-05-10 14:30:11 +05:30
|
|
|
|
2011-10-19 21:24:42 +05:30
|
|
|
sed -n 's@^//kbuild:@@p' "$srctree/$d"/*.c \
|
|
|
|
| generate \
|
2010-11-16 17:59:12 +05:30
|
|
|
"${src}" "${dst}" \
|
2011-10-19 21:24:42 +05:30
|
|
|
"# DO NOT EDIT. This file is generated from Kbuild.src"
|
2010-05-09 07:52:48 +05:30
|
|
|
fi
|
2010-05-10 14:30:11 +05:30
|
|
|
|
|
|
|
src="$srctree/$d/Config.src"
|
|
|
|
dst="$d/Config.in"
|
|
|
|
if test -f "$src"; then
|
2010-07-15 20:09:24 +05:30
|
|
|
mkdir -p -- "$d" 2>/dev/null
|
2010-05-10 14:30:11 +05:30
|
|
|
|
2011-10-19 21:24:42 +05:30
|
|
|
sed -n 's@^//config:@@p' "$srctree/$d"/*.c \
|
|
|
|
| generate \
|
2010-11-16 17:59:12 +05:30
|
|
|
"${src}" "${dst}" \
|
2011-10-19 21:24:42 +05:30
|
|
|
"# DO NOT EDIT. This file is generated from Config.src"
|
2010-05-09 07:52:48 +05:30
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2010-11-22 02:40:07 +05:30
|
|
|
# Last read failed. This is normal. Don't exit with its error code:
|
2010-05-09 07:52:48 +05:30
|
|
|
exit 0
|