busybox/scripts/gen_build_files.sh
Mike Frysinger f718e3a0db gen_build_files.sh: rewrite with sed
The shell parsing of files is incredibly slow on many systems.  With
one report, the process was taking a minute or two which made people
thing the build was hung.  So rewrite the craziness with sed and proper
shell functions.  On an idle system, this cut the runtime by half.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2010-11-16 09:01:54 -05:00

91 lines
2.2 KiB
Bash
Executable File

#!/bin/sh
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" "$@"; }
generate()
{
local src="$1" dst="$2" header="$3" insert="$4"
#chk "${dst}"
(
echo "${header}"
if grep -qs '^INSERT$' "${src}"; then
sed -n '1,/^INSERT$/p' "${src}"
echo "${insert}"
sed -n '/^INSERT$/,$p' "${src}"
else
if [ -n "${insert}" ]; then
echo "ERROR: INSERT line missing in: ${src}" 1>&2
fi
cat "${src}"
fi
) | sed '/^INSERT$/d' > "${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
s=`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 */" \
"${s}"
# (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
# (note: we need to use \\\\ because of ``)
s=`sed -n -e 's@^//usage:\([ \t].*\)$@\1 \\\\@p' -e 's@^//usage:\([^ \t].*\)$@\n\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 */" \
"${s}"
# (Re)generate */Kbuild and */Config.in
{ cd -- "$srctree" && find . -type d; } | 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
s=`sed -n 's@^//kbuild:@@p' -- "$srctree/$d"/*.c`
generate \
"${src}" "${dst}" \
"# DO NOT EDIT. This file is generated from Kbuild.src" \
"${s}"
fi
src="$srctree/$d/Config.src"
dst="$d/Config.in"
if test -f "$src"; then
mkdir -p -- "$d" 2>/dev/null
s=`sed -n 's@^//config:@@p' -- "$srctree/$d"/*.c`
generate \
"${src}" "${dst}" \
"# DO NOT EDIT. This file is generated from Config.src" \
"${s}"
fi
done
exit 0