1*cf84ac9aSAndroid Build Coastguard Worker#!/bin/sh -eu 2*cf84ac9aSAndroid Build Coastguard Worker# 3*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2014-2015 Mike Frysinger <[email protected]> 4*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2014-2015 Dmitry V. Levin <[email protected]> 5*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2014-2018 The strace developers. 6*cf84ac9aSAndroid Build Coastguard Worker# All rights reserved. 7*cf84ac9aSAndroid Build Coastguard Worker# 8*cf84ac9aSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 9*cf84ac9aSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions 10*cf84ac9aSAndroid Build Coastguard Worker# are met: 11*cf84ac9aSAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright 12*cf84ac9aSAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 13*cf84ac9aSAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright 14*cf84ac9aSAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer in the 15*cf84ac9aSAndroid Build Coastguard Worker# documentation and/or other materials provided with the distribution. 16*cf84ac9aSAndroid Build Coastguard Worker# 3. The name of the author may not be used to endorse or promote products 17*cf84ac9aSAndroid Build Coastguard Worker# derived from this software without specific prior written permission. 18*cf84ac9aSAndroid Build Coastguard Worker# 19*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20*cf84ac9aSAndroid Build Coastguard Worker# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21*cf84ac9aSAndroid Build Coastguard Worker# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22*cf84ac9aSAndroid Build Coastguard Worker# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23*cf84ac9aSAndroid Build Coastguard Worker# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24*cf84ac9aSAndroid Build Coastguard Worker# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25*cf84ac9aSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26*cf84ac9aSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27*cf84ac9aSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*cf84ac9aSAndroid Build Coastguard Worker 30*cf84ac9aSAndroid Build Coastguard Workerusage() 31*cf84ac9aSAndroid Build Coastguard Worker{ 32*cf84ac9aSAndroid Build Coastguard Worker cat <<EOF 33*cf84ac9aSAndroid Build Coastguard WorkerUsage: $0 <input> <output> 34*cf84ac9aSAndroid Build Coastguard Worker 35*cf84ac9aSAndroid Build Coastguard WorkerGenerate xlat header files from <input> (a file or dir of files) and write 36*cf84ac9aSAndroid Build Coastguard Workerthe generated headers to <output>. 37*cf84ac9aSAndroid Build Coastguard WorkerEOF 38*cf84ac9aSAndroid Build Coastguard Worker exit 1 39*cf84ac9aSAndroid Build Coastguard Worker} 40*cf84ac9aSAndroid Build Coastguard Worker 41*cf84ac9aSAndroid Build Coastguard Workercond_def() 42*cf84ac9aSAndroid Build Coastguard Worker{ 43*cf84ac9aSAndroid Build Coastguard Worker local line 44*cf84ac9aSAndroid Build Coastguard Worker line="$1"; shift 45*cf84ac9aSAndroid Build Coastguard Worker 46*cf84ac9aSAndroid Build Coastguard Worker local val 47*cf84ac9aSAndroid Build Coastguard Worker val="$(printf %s "$line" | 48*cf84ac9aSAndroid Build Coastguard Worker LC_ALL=C sed -r -n 's/^([[:alpha:]_][[:alnum:]_]*).*$/\1/p')" 49*cf84ac9aSAndroid Build Coastguard Worker 50*cf84ac9aSAndroid Build Coastguard Worker local def 51*cf84ac9aSAndroid Build Coastguard Worker def="$(printf %s "${line}" | 52*cf84ac9aSAndroid Build Coastguard Worker sed -r -n 's/^[^[:space:]]+[[:space:]]+([^[:space:]].*)$/\1/p')" 53*cf84ac9aSAndroid Build Coastguard Worker 54*cf84ac9aSAndroid Build Coastguard Worker if [ -n "$def" ]; then 55*cf84ac9aSAndroid Build Coastguard Worker cat <<-EOF 56*cf84ac9aSAndroid Build Coastguard Worker #if defined($val) || (defined(HAVE_DECL_$val) && HAVE_DECL_$val) 57*cf84ac9aSAndroid Build Coastguard Worker DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE 58*cf84ac9aSAndroid Build Coastguard Worker static_assert(($val) == ($def), "$val != $def"); 59*cf84ac9aSAndroid Build Coastguard Worker DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE 60*cf84ac9aSAndroid Build Coastguard Worker #else 61*cf84ac9aSAndroid Build Coastguard Worker # define $val $def 62*cf84ac9aSAndroid Build Coastguard Worker #endif 63*cf84ac9aSAndroid Build Coastguard Worker EOF 64*cf84ac9aSAndroid Build Coastguard Worker fi 65*cf84ac9aSAndroid Build Coastguard Worker} 66*cf84ac9aSAndroid Build Coastguard Worker 67*cf84ac9aSAndroid Build Coastguard Workerprint_xlat() 68*cf84ac9aSAndroid Build Coastguard Worker{ 69*cf84ac9aSAndroid Build Coastguard Worker local val 70*cf84ac9aSAndroid Build Coastguard Worker val="$1"; shift 71*cf84ac9aSAndroid Build Coastguard Worker 72*cf84ac9aSAndroid Build Coastguard Worker [ 1 = "$value_indexed" ] && printf " [%s] =" "${val}" 73*cf84ac9aSAndroid Build Coastguard Worker if [ -z "${val_type-}" ]; then 74*cf84ac9aSAndroid Build Coastguard Worker echo " XLAT(${val})," 75*cf84ac9aSAndroid Build Coastguard Worker else 76*cf84ac9aSAndroid Build Coastguard Worker echo " XLAT_TYPE(${val_type}, ${val})," 77*cf84ac9aSAndroid Build Coastguard Worker fi 78*cf84ac9aSAndroid Build Coastguard Worker} 79*cf84ac9aSAndroid Build Coastguard Worker 80*cf84ac9aSAndroid Build Coastguard Workerprint_xlat_pair() 81*cf84ac9aSAndroid Build Coastguard Worker{ 82*cf84ac9aSAndroid Build Coastguard Worker local val str 83*cf84ac9aSAndroid Build Coastguard Worker val="$1"; shift 84*cf84ac9aSAndroid Build Coastguard Worker str="$1"; shift 85*cf84ac9aSAndroid Build Coastguard Worker 86*cf84ac9aSAndroid Build Coastguard Worker [ 1 = "$value_indexed" ] && printf " [%s] =" "${val}" 87*cf84ac9aSAndroid Build Coastguard Worker if [ -z "${val_type-}" ]; then 88*cf84ac9aSAndroid Build Coastguard Worker echo " XLAT_PAIR(${val}, \"${str}\")," 89*cf84ac9aSAndroid Build Coastguard Worker else 90*cf84ac9aSAndroid Build Coastguard Worker echo " XLAT_TYPE_PAIR(${val_type}, ${val}, \"${str}\")," 91*cf84ac9aSAndroid Build Coastguard Worker fi 92*cf84ac9aSAndroid Build Coastguard Worker} 93*cf84ac9aSAndroid Build Coastguard Worker 94*cf84ac9aSAndroid Build Coastguard Workercond_xlat() 95*cf84ac9aSAndroid Build Coastguard Worker{ 96*cf84ac9aSAndroid Build Coastguard Worker local line val m def xlat 97*cf84ac9aSAndroid Build Coastguard Worker line="$1"; shift 98*cf84ac9aSAndroid Build Coastguard Worker 99*cf84ac9aSAndroid Build Coastguard Worker val="$(printf %s "${line}" | sed -r -n 's/^([^[:space:]]+).*$/\1/p')" 100*cf84ac9aSAndroid Build Coastguard Worker m="${val%%|*}" 101*cf84ac9aSAndroid Build Coastguard Worker def="$(printf %s "${line}" | 102*cf84ac9aSAndroid Build Coastguard Worker sed -r -n 's/^[^[:space:]]+[[:space:]]+([^[:space:]].*)$/\1/p')" 103*cf84ac9aSAndroid Build Coastguard Worker 104*cf84ac9aSAndroid Build Coastguard Worker if [ "${m}" = "${m#1<<}" ]; then 105*cf84ac9aSAndroid Build Coastguard Worker xlat="$(print_xlat "${val}")" 106*cf84ac9aSAndroid Build Coastguard Worker else 107*cf84ac9aSAndroid Build Coastguard Worker xlat="$(print_xlat_pair "1ULL<<${val#1<<}" "${val}")" 108*cf84ac9aSAndroid Build Coastguard Worker m="${m#1<<}" 109*cf84ac9aSAndroid Build Coastguard Worker fi 110*cf84ac9aSAndroid Build Coastguard Worker 111*cf84ac9aSAndroid Build Coastguard Worker if [ -z "${def}" ]; then 112*cf84ac9aSAndroid Build Coastguard Worker cat <<-EOF 113*cf84ac9aSAndroid Build Coastguard Worker #if defined(${m}) || (defined(HAVE_DECL_${m}) && HAVE_DECL_${m}) 114*cf84ac9aSAndroid Build Coastguard Worker ${xlat} 115*cf84ac9aSAndroid Build Coastguard Worker #endif 116*cf84ac9aSAndroid Build Coastguard Worker EOF 117*cf84ac9aSAndroid Build Coastguard Worker else 118*cf84ac9aSAndroid Build Coastguard Worker echo "$xlat" 119*cf84ac9aSAndroid Build Coastguard Worker fi 120*cf84ac9aSAndroid Build Coastguard Worker} 121*cf84ac9aSAndroid Build Coastguard Worker 122*cf84ac9aSAndroid Build Coastguard Workergen_header() 123*cf84ac9aSAndroid Build Coastguard Worker{ 124*cf84ac9aSAndroid Build Coastguard Worker local input="$1" output="$2" name="$3" 125*cf84ac9aSAndroid Build Coastguard Worker echo "generating ${output}" 126*cf84ac9aSAndroid Build Coastguard Worker ( 127*cf84ac9aSAndroid Build Coastguard Worker local defs="${0%/*}/../defs.h" 128*cf84ac9aSAndroid Build Coastguard Worker local mpers="${0%/*}/../mpers_xlat.h" 129*cf84ac9aSAndroid Build Coastguard Worker local decl="extern const struct xlat ${name}[];" 130*cf84ac9aSAndroid Build Coastguard Worker local in_defs= in_mpers= 131*cf84ac9aSAndroid Build Coastguard Worker 132*cf84ac9aSAndroid Build Coastguard Worker value_indexed=0 133*cf84ac9aSAndroid Build Coastguard Worker 134*cf84ac9aSAndroid Build Coastguard Worker if grep -F -x "$decl" "$defs" > /dev/null; then 135*cf84ac9aSAndroid Build Coastguard Worker in_defs=1 136*cf84ac9aSAndroid Build Coastguard Worker elif grep -F -x "$decl" "$mpers" > /dev/null; then 137*cf84ac9aSAndroid Build Coastguard Worker in_mpers=1 138*cf84ac9aSAndroid Build Coastguard Worker fi 139*cf84ac9aSAndroid Build Coastguard Worker 140*cf84ac9aSAndroid Build Coastguard Worker cat <<-EOF 141*cf84ac9aSAndroid Build Coastguard Worker /* Generated by $0 from $1; do not edit. */ 142*cf84ac9aSAndroid Build Coastguard Worker 143*cf84ac9aSAndroid Build Coastguard Worker #include "gcc_compat.h" 144*cf84ac9aSAndroid Build Coastguard Worker #include "static_assert.h" 145*cf84ac9aSAndroid Build Coastguard Worker 146*cf84ac9aSAndroid Build Coastguard Worker EOF 147*cf84ac9aSAndroid Build Coastguard Worker 148*cf84ac9aSAndroid Build Coastguard Worker local unconditional= line 149*cf84ac9aSAndroid Build Coastguard Worker # 1st pass: output directives. 150*cf84ac9aSAndroid Build Coastguard Worker while read line; do 151*cf84ac9aSAndroid Build Coastguard Worker LC_COLLATE=C 152*cf84ac9aSAndroid Build Coastguard Worker line=$(printf "%s" "$line" | \ 153*cf84ac9aSAndroid Build Coastguard Worker sed "s|[[:space:]]*/\*.*\*/[[:space:]]*||") 154*cf84ac9aSAndroid Build Coastguard Worker 155*cf84ac9aSAndroid Build Coastguard Worker case $line in 156*cf84ac9aSAndroid Build Coastguard Worker '#stop') 157*cf84ac9aSAndroid Build Coastguard Worker exit 0 158*cf84ac9aSAndroid Build Coastguard Worker ;; 159*cf84ac9aSAndroid Build Coastguard Worker '#conditional') 160*cf84ac9aSAndroid Build Coastguard Worker unconditional= 161*cf84ac9aSAndroid Build Coastguard Worker ;; 162*cf84ac9aSAndroid Build Coastguard Worker '#unconditional') 163*cf84ac9aSAndroid Build Coastguard Worker unconditional=1 164*cf84ac9aSAndroid Build Coastguard Worker ;; 165*cf84ac9aSAndroid Build Coastguard Worker '#val_type '*) 166*cf84ac9aSAndroid Build Coastguard Worker # to be processed during 2nd pass 167*cf84ac9aSAndroid Build Coastguard Worker ;; 168*cf84ac9aSAndroid Build Coastguard Worker '#value_indexed') 169*cf84ac9aSAndroid Build Coastguard Worker value_indexed=1 170*cf84ac9aSAndroid Build Coastguard Worker ;; 171*cf84ac9aSAndroid Build Coastguard Worker '#'*) 172*cf84ac9aSAndroid Build Coastguard Worker echo "${line}" 173*cf84ac9aSAndroid Build Coastguard Worker ;; 174*cf84ac9aSAndroid Build Coastguard Worker [A-Z_]*) 175*cf84ac9aSAndroid Build Coastguard Worker [ -n "$unconditional" ] || 176*cf84ac9aSAndroid Build Coastguard Worker cond_def "$line" 177*cf84ac9aSAndroid Build Coastguard Worker ;; 178*cf84ac9aSAndroid Build Coastguard Worker esac 179*cf84ac9aSAndroid Build Coastguard Worker done < "$input" 180*cf84ac9aSAndroid Build Coastguard Worker 181*cf84ac9aSAndroid Build Coastguard Worker cat <<-EOF 182*cf84ac9aSAndroid Build Coastguard Worker 183*cf84ac9aSAndroid Build Coastguard Worker #ifndef XLAT_MACROS_ONLY 184*cf84ac9aSAndroid Build Coastguard Worker 185*cf84ac9aSAndroid Build Coastguard Worker EOF 186*cf84ac9aSAndroid Build Coastguard Worker 187*cf84ac9aSAndroid Build Coastguard Worker if [ -n "$in_defs" ]; then 188*cf84ac9aSAndroid Build Coastguard Worker cat <<-EOF 189*cf84ac9aSAndroid Build Coastguard Worker # ifndef IN_MPERS 190*cf84ac9aSAndroid Build Coastguard Worker 191*cf84ac9aSAndroid Build Coastguard Worker EOF 192*cf84ac9aSAndroid Build Coastguard Worker elif [ -n "$in_mpers" ]; then 193*cf84ac9aSAndroid Build Coastguard Worker cat <<-EOF 194*cf84ac9aSAndroid Build Coastguard Worker # ifdef IN_MPERS 195*cf84ac9aSAndroid Build Coastguard Worker 196*cf84ac9aSAndroid Build Coastguard Worker ${decl} 197*cf84ac9aSAndroid Build Coastguard Worker 198*cf84ac9aSAndroid Build Coastguard Worker # else 199*cf84ac9aSAndroid Build Coastguard Worker 200*cf84ac9aSAndroid Build Coastguard Worker # if !(defined HAVE_M32_MPERS || defined HAVE_MX32_MPERS) 201*cf84ac9aSAndroid Build Coastguard Worker static 202*cf84ac9aSAndroid Build Coastguard Worker # endif 203*cf84ac9aSAndroid Build Coastguard Worker EOF 204*cf84ac9aSAndroid Build Coastguard Worker else 205*cf84ac9aSAndroid Build Coastguard Worker cat <<-EOF 206*cf84ac9aSAndroid Build Coastguard Worker # ifdef IN_MPERS 207*cf84ac9aSAndroid Build Coastguard Worker 208*cf84ac9aSAndroid Build Coastguard Worker # error static const struct xlat ${name} in mpers mode 209*cf84ac9aSAndroid Build Coastguard Worker 210*cf84ac9aSAndroid Build Coastguard Worker # else 211*cf84ac9aSAndroid Build Coastguard Worker 212*cf84ac9aSAndroid Build Coastguard Worker static 213*cf84ac9aSAndroid Build Coastguard Worker EOF 214*cf84ac9aSAndroid Build Coastguard Worker fi 215*cf84ac9aSAndroid Build Coastguard Worker 216*cf84ac9aSAndroid Build Coastguard Worker echo "const struct xlat ${name}[] = {" 217*cf84ac9aSAndroid Build Coastguard Worker 218*cf84ac9aSAndroid Build Coastguard Worker unconditional= val_type= 219*cf84ac9aSAndroid Build Coastguard Worker # 2nd pass: output everything. 220*cf84ac9aSAndroid Build Coastguard Worker while read line; do 221*cf84ac9aSAndroid Build Coastguard Worker LC_COLLATE=C 222*cf84ac9aSAndroid Build Coastguard Worker line=$(printf "%s" "$line" | \ 223*cf84ac9aSAndroid Build Coastguard Worker sed "s|[[:space:]]*/\*.*\*/[[:space:]]*||") 224*cf84ac9aSAndroid Build Coastguard Worker 225*cf84ac9aSAndroid Build Coastguard Worker case ${line} in 226*cf84ac9aSAndroid Build Coastguard Worker '#conditional') 227*cf84ac9aSAndroid Build Coastguard Worker unconditional= 228*cf84ac9aSAndroid Build Coastguard Worker ;; 229*cf84ac9aSAndroid Build Coastguard Worker '#unconditional') 230*cf84ac9aSAndroid Build Coastguard Worker unconditional=1 231*cf84ac9aSAndroid Build Coastguard Worker ;; 232*cf84ac9aSAndroid Build Coastguard Worker '#value_indexed') 233*cf84ac9aSAndroid Build Coastguard Worker ;; 234*cf84ac9aSAndroid Build Coastguard Worker '#val_type '*) 235*cf84ac9aSAndroid Build Coastguard Worker val_type="${line#\#val_type }" 236*cf84ac9aSAndroid Build Coastguard Worker ;; 237*cf84ac9aSAndroid Build Coastguard Worker [A-Z_]*) # symbolic constants 238*cf84ac9aSAndroid Build Coastguard Worker if [ -n "${unconditional}" ]; then 239*cf84ac9aSAndroid Build Coastguard Worker print_xlat "${line}" 240*cf84ac9aSAndroid Build Coastguard Worker else 241*cf84ac9aSAndroid Build Coastguard Worker cond_xlat "${line}" 242*cf84ac9aSAndroid Build Coastguard Worker fi 243*cf84ac9aSAndroid Build Coastguard Worker ;; 244*cf84ac9aSAndroid Build Coastguard Worker '1<<'[A-Z_]*) # symbolic constants with shift 245*cf84ac9aSAndroid Build Coastguard Worker if [ -n "${unconditional}" ]; then 246*cf84ac9aSAndroid Build Coastguard Worker print_xlat_pair "1ULL<<${line#1<<}" "${line}" 247*cf84ac9aSAndroid Build Coastguard Worker else 248*cf84ac9aSAndroid Build Coastguard Worker cond_xlat "${line}" 249*cf84ac9aSAndroid Build Coastguard Worker fi 250*cf84ac9aSAndroid Build Coastguard Worker ;; 251*cf84ac9aSAndroid Build Coastguard Worker [0-9]*) # numeric constants 252*cf84ac9aSAndroid Build Coastguard Worker print_xlat "${line}" 253*cf84ac9aSAndroid Build Coastguard Worker ;; 254*cf84ac9aSAndroid Build Coastguard Worker *) # verbatim lines 255*cf84ac9aSAndroid Build Coastguard Worker echo "${line}" 256*cf84ac9aSAndroid Build Coastguard Worker ;; 257*cf84ac9aSAndroid Build Coastguard Worker esac 258*cf84ac9aSAndroid Build Coastguard Worker done < "${input}" 259*cf84ac9aSAndroid Build Coastguard Worker echo ' XLAT_END' 260*cf84ac9aSAndroid Build Coastguard Worker 261*cf84ac9aSAndroid Build Coastguard Worker cat <<-EOF 262*cf84ac9aSAndroid Build Coastguard Worker }; 263*cf84ac9aSAndroid Build Coastguard Worker 264*cf84ac9aSAndroid Build Coastguard Worker # endif /* !IN_MPERS */ 265*cf84ac9aSAndroid Build Coastguard Worker 266*cf84ac9aSAndroid Build Coastguard Worker #endif /* !XLAT_MACROS_ONLY */ 267*cf84ac9aSAndroid Build Coastguard Worker EOF 268*cf84ac9aSAndroid Build Coastguard Worker ) >"${output}" 269*cf84ac9aSAndroid Build Coastguard Worker} 270*cf84ac9aSAndroid Build Coastguard Worker 271*cf84ac9aSAndroid Build Coastguard Workergen_make() 272*cf84ac9aSAndroid Build Coastguard Worker{ 273*cf84ac9aSAndroid Build Coastguard Worker local output="$1" 274*cf84ac9aSAndroid Build Coastguard Worker local name 275*cf84ac9aSAndroid Build Coastguard Worker shift 276*cf84ac9aSAndroid Build Coastguard Worker echo "generating ${output}" 277*cf84ac9aSAndroid Build Coastguard Worker ( 278*cf84ac9aSAndroid Build Coastguard Worker printf "XLAT_INPUT_FILES = " 279*cf84ac9aSAndroid Build Coastguard Worker printf 'xlat/%s.in ' "$@" 280*cf84ac9aSAndroid Build Coastguard Worker echo 281*cf84ac9aSAndroid Build Coastguard Worker printf "XLAT_HEADER_FILES = " 282*cf84ac9aSAndroid Build Coastguard Worker printf 'xlat/%s.h ' "$@" 283*cf84ac9aSAndroid Build Coastguard Worker echo 284*cf84ac9aSAndroid Build Coastguard Worker for name; do 285*cf84ac9aSAndroid Build Coastguard Worker printf '$(top_srcdir)/xlat/%s.h: $(top_srcdir)/xlat/%s.in $(top_srcdir)/xlat/gen.sh\n' \ 286*cf84ac9aSAndroid Build Coastguard Worker "${name}" "${name}" 287*cf84ac9aSAndroid Build Coastguard Worker echo ' $(AM_V_GEN)$(top_srcdir)/xlat/gen.sh $< $@' 288*cf84ac9aSAndroid Build Coastguard Worker done 289*cf84ac9aSAndroid Build Coastguard Worker ) >"${output}" 290*cf84ac9aSAndroid Build Coastguard Worker} 291*cf84ac9aSAndroid Build Coastguard Worker 292*cf84ac9aSAndroid Build Coastguard Workergen_git() 293*cf84ac9aSAndroid Build Coastguard Worker{ 294*cf84ac9aSAndroid Build Coastguard Worker local output="$1" 295*cf84ac9aSAndroid Build Coastguard Worker shift 296*cf84ac9aSAndroid Build Coastguard Worker echo "generating ${output}" 297*cf84ac9aSAndroid Build Coastguard Worker ( 298*cf84ac9aSAndroid Build Coastguard Worker printf '/%s\n' .gitignore Makemodule.am 299*cf84ac9aSAndroid Build Coastguard Worker printf '/%s.h\n' "$@" 300*cf84ac9aSAndroid Build Coastguard Worker ) >"${output}" 301*cf84ac9aSAndroid Build Coastguard Worker} 302*cf84ac9aSAndroid Build Coastguard Worker 303*cf84ac9aSAndroid Build Coastguard Workermain() 304*cf84ac9aSAndroid Build Coastguard Worker{ 305*cf84ac9aSAndroid Build Coastguard Worker case $# in 306*cf84ac9aSAndroid Build Coastguard Worker 0) set -- "${0%/*}" "${0%/*}" ;; 307*cf84ac9aSAndroid Build Coastguard Worker 2) ;; 308*cf84ac9aSAndroid Build Coastguard Worker *) usage ;; 309*cf84ac9aSAndroid Build Coastguard Worker esac 310*cf84ac9aSAndroid Build Coastguard Worker 311*cf84ac9aSAndroid Build Coastguard Worker local input="$1" 312*cf84ac9aSAndroid Build Coastguard Worker local output="$2" 313*cf84ac9aSAndroid Build Coastguard Worker local name 314*cf84ac9aSAndroid Build Coastguard Worker local jobs=0 315*cf84ac9aSAndroid Build Coastguard Worker local ncpus="$(getconf _NPROCESSORS_ONLN)" 316*cf84ac9aSAndroid Build Coastguard Worker local pids= 317*cf84ac9aSAndroid Build Coastguard Worker [ "${ncpus}" -ge 1 ] || 318*cf84ac9aSAndroid Build Coastguard Worker ncpus=1 319*cf84ac9aSAndroid Build Coastguard Worker 320*cf84ac9aSAndroid Build Coastguard Worker if [ -d "${input}" ]; then 321*cf84ac9aSAndroid Build Coastguard Worker local f names= 322*cf84ac9aSAndroid Build Coastguard Worker for f in "${input}"/*.in; do 323*cf84ac9aSAndroid Build Coastguard Worker [ -f "${f}" ] || continue 324*cf84ac9aSAndroid Build Coastguard Worker name=${f##*/} 325*cf84ac9aSAndroid Build Coastguard Worker name=${name%.in} 326*cf84ac9aSAndroid Build Coastguard Worker gen_header "${f}" "${output}/${name}.h" "${name}" & 327*cf84ac9aSAndroid Build Coastguard Worker pids="$pids $!" 328*cf84ac9aSAndroid Build Coastguard Worker names="${names} ${name}" 329*cf84ac9aSAndroid Build Coastguard Worker : $(( jobs += 1 )) 330*cf84ac9aSAndroid Build Coastguard Worker if [ "${jobs}" -gt "$(( ncpus * 2 ))" ]; then 331*cf84ac9aSAndroid Build Coastguard Worker read wait_pid rest 332*cf84ac9aSAndroid Build Coastguard Worker pids="$rest" 333*cf84ac9aSAndroid Build Coastguard Worker wait -n 2>/dev/null || wait "$wait_pid" 334*cf84ac9aSAndroid Build Coastguard Worker : $(( jobs -= 1 )) 335*cf84ac9aSAndroid Build Coastguard Worker fi <<- EOF 336*cf84ac9aSAndroid Build Coastguard Worker $pids 337*cf84ac9aSAndroid Build Coastguard Worker EOF 338*cf84ac9aSAndroid Build Coastguard Worker done 339*cf84ac9aSAndroid Build Coastguard Worker gen_git "${output}/.gitignore" ${names} & 340*cf84ac9aSAndroid Build Coastguard Worker gen_make "${output}/Makemodule.am" ${names} & 341*cf84ac9aSAndroid Build Coastguard Worker wait 342*cf84ac9aSAndroid Build Coastguard Worker else 343*cf84ac9aSAndroid Build Coastguard Worker name=${input##*/} 344*cf84ac9aSAndroid Build Coastguard Worker name=${name%.in} 345*cf84ac9aSAndroid Build Coastguard Worker gen_header "${input}" "${output}" "${name}" 346*cf84ac9aSAndroid Build Coastguard Worker fi 347*cf84ac9aSAndroid Build Coastguard Worker} 348*cf84ac9aSAndroid Build Coastguard Worker 349*cf84ac9aSAndroid Build Coastguard Workermain "$@" 350