xref: /aosp_15_r20/external/strace/xlat/gen.sh (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
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