1#!/bin/sh 2 3usage() { 4 cat <<EOF 5Usage: $0 <input> <output> 6 7Generate xlat header files from <input> (a file or dir of files) and write 8the generated headers to <output>. 9EOF 10 exit 1 11} 12 13gen_header() { 14 local input="$1" output="$2" name="$3" 15 echo "generating ${output}" 16 ( 17 local defs="${0%/*}/../defs.h" 18 local prefix 19 if grep -x "extern const struct xlat ${name}\\[\\];" "${defs}" > /dev/null; then 20 prefix= 21 else 22 prefix='static ' 23 fi 24 25 cat <<-EOF 26 /* Generated by $0 from $1; do not edit. */ 27 28 ${prefix}const struct xlat ${name}[] = { 29 EOF 30 local unconditional= unterminated= line 31 while read line; do 32 LC_COLLATE=C 33 case ${line} in 34 '#unconditional') 35 unconditional=1 36 ;; 37 '#unterminated') 38 unterminated=1 39 ;; 40 [A-Z_]*) # symbolic constants 41 local m="${line%%|*}" 42 [ -n "${unconditional}" ] || 43 echo "#if defined(${m}) || (defined(HAVE_DECL_${m}) && HAVE_DECL_${m})" 44 echo " XLAT(${line})," 45 [ -n "${unconditional}" ] || 46 echo "#endif" 47 ;; 48 '1<<'[A-Z_]*) # symbolic constants with shift 49 local m="${line#1<<}" 50 [ -n "${unconditional}" ] || 51 echo "#if defined(${m}) || (defined(HAVE_DECL_${m}) && HAVE_DECL_${m})" 52 echo " { ${line}, \"${m}\" }," 53 [ -n "${unconditional}" ] || 54 echo "#endif" 55 ;; 56 [0-9]*) # numeric constants 57 echo " XLAT(${line})," 58 ;; 59 *) # verbatim lines 60 echo "${line}" 61 ;; 62 esac 63 done < "${input}" 64 if [ -n "${unterminated}" ]; then 65 echo " /* this array should remain not NULL-terminated */" 66 else 67 echo " XLAT_END" 68 fi 69 echo "};" 70 ) >"${output}" 71} 72 73gen_make() { 74 local output="$1" 75 local name 76 shift 77 echo "generating ${output}" 78 ( 79 printf "XLAT_INPUT_FILES = " 80 printf 'xlat/%s.in ' "$@" 81 echo 82 printf "XLAT_HEADER_FILES = " 83 printf 'xlat/%s.h ' "$@" 84 echo 85 for name; do 86 printf '$(top_srcdir)/xlat/%s.h: $(top_srcdir)/xlat/%s.in $(top_srcdir)/xlat/gen.sh\n' \ 87 "${name}" "${name}" 88 echo ' $(AM_V_GEN)$(top_srcdir)/xlat/gen.sh $< $@' 89 done 90 ) >"${output}" 91} 92 93gen_git() { 94 local output="$1" 95 shift 96 echo "generating ${output}" 97 ( 98 printf '/%s\n' .gitignore Makemodule.am 99 printf '/%s.h\n' "$@" 100 ) >"${output}" 101} 102 103main() { 104 case $# in 105 0) set -- "${0%/*}" "${0%/*}" ;; 106 2) ;; 107 *) usage ;; 108 esac 109 110 local input="$1" 111 local output="$2" 112 local name 113 114 if [ -d "${input}" ]; then 115 local f names= 116 for f in "${input}"/*.in; do 117 [ -f "${f}" ] || continue 118 name=${f##*/} 119 name=${name%.in} 120 gen_header "${f}" "${output}/${name}.h" "${name}" & 121 names="${names} ${name}" 122 done 123 gen_git "${output}/.gitignore" ${names} 124 gen_make "${output}/Makemodule.am" ${names} 125 wait 126 else 127 name=${input##*/} 128 name=${name%.in} 129 gen_header "${input}" "${output}" "${name}" 130 fi 131} 132 133main "$@" 134