| #!/bin/sh | |
| . ./.config || exit 1 | |
| target="$1" | |
| custom_loc="$2" | |
| applet_loc="$3" | |
| test "$target" || exit 1 | |
| test "$SED" || SED=sed | |
| test "$DD" || DD=dd | |
| if [ x"$CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS" != x"y" ] | |
| then | |
| printf '#define NUM_SCRIPTS 0\n' >"$target" | |
| exit 0 | |
| fi | |
| # Some people were bitten by their system lacking a (proper) od | |
| od -v -b </dev/null >/dev/null | |
| if test $? != 0; then | |
| echo 'od tool is not installed or cannot accept "-v -b" options' | |
| exit 1 | |
| fi | |
| custom_scripts="" | |
| if [ -d "$custom_loc" ] | |
| then | |
| custom_scripts=$(cd $custom_loc; ls * 2>/dev/null) | |
| fi | |
| all_scripts=$($srctree/applets/busybox.mkscripts) | |
| # all_scripts includes applet scripts and custom scripts, sort them out | |
| applet_scripts="" | |
| for i in $all_scripts | |
| do | |
| found=0 | |
| for j in $custom_scripts | |
| do | |
| if [ "$i" = "$j" ] | |
| then | |
| found=1 | |
| break; | |
| fi | |
| done | |
| if [ $found -eq 0 ] | |
| then | |
| # anything that isn't a custom script is an applet script | |
| applet_scripts="$applet_scripts $i" | |
| fi | |
| done | |
| # we know the custom scripts are present but applet scripts might have | |
| # become detached from their configuration | |
| for i in $applet_scripts | |
| do | |
| #if [ ! -f "$applet_loc/$i" -a ! -f "$custom_loc/$i" ] | |
| if [ ! -f "$applet_loc/$i" ] | |
| then | |
| echo "missing applet script $i" | |
| exit 1 | |
| fi | |
| done | |
| n=$(echo $custom_scripts $applet_scripts | wc -w) | |
| nall=$(echo $all_scripts | wc -w) | |
| if [ $n -ne $nall ] | |
| then | |
| echo "script mismatch $n != $nall" | |
| exit 1 | |
| fi | |
| concatenate_scripts() { | |
| for i in $custom_scripts | |
| do | |
| cat $custom_loc/$i | |
| printf '\000' | |
| done | |
| for i in $applet_scripts | |
| do | |
| cat $applet_loc/$i | |
| printf '\000' | |
| done | |
| } | |
| exec >"$target.$$" | |
| if [ $n -ne 0 ] | |
| then | |
| printf '#ifdef DEFINE_SCRIPT_DATA\n' | |
| printf 'const uint16_t applet_numbers[] = {\n' | |
| for i in $custom_scripts $applet_scripts | |
| do | |
| # TODO support applets with names including invalid characters | |
| printf '\tAPPLET_NO_%s,\n' $i | |
| done | |
| printf '};\n' | |
| printf '#else\n' | |
| printf 'extern const uint16_t applet_numbers[];\n' | |
| printf '#endif\n' | |
| fi | |
| printf "\n" | |
| printf '#define NUM_SCRIPTS %d\n' $n | |
| printf "\n" | |
| if [ $n -ne 0 ] | |
| then | |
| printf '#define UNPACKED_SCRIPTS_LENGTH ' | |
| concatenate_scripts | wc -c | |
| printf '#define PACKED_SCRIPTS \\\n' | |
| concatenate_scripts | bzip2 -1 | $DD bs=2 skip=1 2>/dev/null | \ | |
| od -v -b \ | |
| | grep -v '^ ' \ | |
| | $SED -e 's/^[^ ]*//' \ | |
| -e 's/ //g' \ | |
| -e '/^$/d' \ | |
| -e 's/\(...\)/0\1,/g' \ | |
| -e 's/$/ \\/' | |
| printf '\n' | |
| fi | |
| mv -- "$target.$$" "$target" |