1#!/bin/sh 2 3# Note: was using sed OPTS CMD -- FILES 4# but users complain that many sed implementations 5# are misinterpreting --. 6 7test $# -ge 2 || { echo "Syntax: $0 SRCTREE OBJTREE"; exit 1; } 8 9# cd to objtree 10cd -- "$2" || { echo "Syntax: $0 SRCTREE OBJTREE"; exit 1; } 11# In separate objtree build, include/ might not exist yet 12mkdir include 2>/dev/null 13 14srctree="$1" 15 16status() { printf ' %-8s%s\n' "$1" "$2"; } 17gen() { status "GEN" "$@"; } 18chk() { status "CHK" "$@"; } 19 20# scripts in the 'embed' directory are treated as fake applets 21custom_scripts() 22{ 23 custom_loc="$1" 24 if [ -d "$custom_loc" ] 25 then 26 for i in $(cd "$custom_loc"; ls * 2>/dev/null) 27 do 28 printf "IF_FEATURE_SH_EMBEDDED_SCRIPTS(APPLET_SCRIPTED(%s, scripted, BB_DIR_USR_BIN, BB_SUID_DROP, scripted))\n" $i; 29 done 30 fi 31} 32 33generate() 34{ 35 # NB: data to be inserted at INSERT line is coming on stdin 36 src="$1" 37 dst="$2" 38 header="$3" 39 loc="$4" 40 #chk "${dst}" 41 { 42 # Need to use printf: different shells have inconsistent 43 # rules re handling of "\n" in echo params. 44 printf "%s\n" "${header}" 45 # print everything up to INSERT line 46 sed -n '/^INSERT$/ q; p' "${src}" 47 # copy stdin to stdout 48 cat 49 if [ -n "$loc" ] 50 then 51 custom_scripts "$loc" 52 fi 53 # print everything after INSERT line 54 sed -n '/^INSERT$/ { 55 :l 56 n 57 p 58 bl 59 }' "${src}" 60 } >"${dst}.tmp" 61 if ! cmp -s "${dst}" "${dst}.tmp"; then 62 gen "${dst}" 63 mv "${dst}.tmp" "${dst}" 64 else 65 rm -f "${dst}.tmp" 66 fi 67} 68 69# (Re)generate include/applets.h 70sed -n 's@^//applet:@@p' "$srctree"/*/*.c "$srctree"/*/*/*.c \ 71| generate \ 72 "$srctree/include/applets.src.h" \ 73 "include/applets.h" \ 74 "/* DO NOT EDIT. This file is generated from applets.src.h */" \ 75 "$srctree/embed" 76 77# (Re)generate include/usage.h 78# We add line continuation backslash after each line, 79# and insert empty line before each line which doesn't start 80# with space or tab 81TAB="$(printf '\tX')" 82TAB="${TAB%X}" 83LF="$(printf '\nX')" 84LF="${LF%X}" 85sed -n -e 's@^//usage:\([ '"$TAB"'].*\)$@\1 \\@p' \ 86 -e 's@^//usage:\([^ '"$TAB"'].*\)$@\'"$LF"'\1 \\@p' \ 87 "$srctree"/*/*.c "$srctree"/*/*/*.c \ 88| generate \ 89 "$srctree/include/usage.src.h" \ 90 "include/usage.h" \ 91 "/* DO NOT EDIT. This file is generated from usage.src.h */" 92 93# (Re)generate */Kbuild and */Config.in 94# We skip .dotdirs - makes git/svn/etc users happier 95{ cd -- "$srctree" && find . -type d ! '(' -name '.?*' -prune ')'; } \ 96| while read -r d; do 97 d="${d#./}" 98 99 src="$srctree/$d/Kbuild.src" 100 dst="$d/Kbuild" 101 if test -f "$src"; then 102 mkdir -p -- "$d" 2>/dev/null 103 104 sed -n 's@^//kbuild:@@p' "$srctree/$d"/*.c \ 105 | generate \ 106 "${src}" "${dst}" \ 107 "# DO NOT EDIT. This file is generated from Kbuild.src" 108 fi 109 110 src="$srctree/$d/Config.src" 111 dst="$d/Config.in" 112 if test -f "$src"; then 113 mkdir -p -- "$d" 2>/dev/null 114 115 sed -n 's@^//config:@@p' "$srctree/$d"/*.c \ 116 | generate \ 117 "${src}" "${dst}" \ 118 "# DO NOT EDIT. This file is generated from Config.src" 119 fi 120done 121 122# Last read failed. This is normal. Don't exit with its error code: 123exit 0 124