xref: /netbsd-src/tools/host-mkdep/host-mkdep.in (revision 82ad575716605df31379cf04a2f3efbc97b8a6f5)
1#!@BSHELL@ -
2#
3#	$NetBSD: host-mkdep.in,v 1.21 2012/08/26 22:37:19 jmmv Exp $
4#
5# Copyright (c) 1991, 1993
6#	The Regents of the University of California.  All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12#    notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14#    notice, this list of conditions and the following disclaimer in the
15#    documentation and/or other materials provided with the distribution.
16# 3. All advertising materials mentioning features or use of this software
17#    must display the following acknowledgement:
18#	This product includes software developed by the University of
19#	California, Berkeley and its contributors.
20# 4. Neither the name of the University nor the names of its contributors
21#    may be used to endorse or promote products derived from this software
22#    without specific prior written permission.
23#
24# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34# SUCH DAMAGE.
35#
36#	@(#)mkdep.old.compiler	8.1 (Berkeley) 6/6/93
37#
38
39APPEND=false
40MERGE=false
41OPTIONAL=false
42AWK_OPTIONAL=
43QUIET=false
44CPPFLAGS=
45NEWEXT=.o
46PREFIX=
47OUTFILE=.depend
48SRCS=
49
50usage()
51{
52	echo "Usage: $0 [-adopq] [-s .suffixes] [-f .depend] -- [flags] file ..." >&2
53	exit 1
54}
55
56set_objlist()
57{
58	if [ -n "$NEWEXT" ]; then
59		oifs="$IFS"
60		IFS=" ,"
61		set -- $NEWEXT
62		IFS="$oifs"
63		objlist=
64		for suf in "$@"; do
65			objlist="$objlist${objlist:+ }$PREFIX$file$suf"
66		done
67	else
68		objlist="$PREFIX$file"
69	fi
70}
71
72# A getopt compatible command line parser in shell comands.
73# (don't trust the shell builtin getopts to be in a known state on error)
74while [ $# -gt 0 ]; do
75	option="${1#-}"
76	[ "$option" = "$1" -o -z "$option" ] && break
77	while
78		optarg="${option#?}"
79		option="${option%$optarg}"
80
81		case "-$option" in
82		-a)	APPEND=true;;
83		-d)	MERGE=true;;
84		-o)	OPTIONAL=true; AWK_OPTIONAL='print ".OPTIONAL:" $0';;
85		-p)	NEWEXT=;;
86		-q)	QUIET=true;;
87
88		-[fPs])	# Options with arguments
89			[ -z "$optarg" ] && {
90				[ $# = 1 ] && usage
91				shift
92				optarg="$1"
93			}
94			case "-$option" in
95			-f)	OUTFILE="$optarg";;
96			-P)	PREFIX="$optarg";;
97			-s)	NEWEXT="$optarg";;
98			esac
99			optarg=
100			;;
101
102		--)	[ -z "$optarg" ] && shift
103			break 2
104			;;
105
106		*)	$MERGE && usage
107			break 2;
108			;;
109		esac
110		[ -n "$optarg" ]
111	do
112		option="$optarg"
113	done
114	shift
115done
116
117[ $# = 0 ] && usage
118
119if $MERGE; then
120	SRCS="$*"
121else
122	#
123	# Process argument list.
124	# This is tricky, because arguments may contain spaces and other
125	# escapes characters.  The argument list is used like a tail queue.
126	# $cppargs has one x for each unprocessed argument, so when an
127	# argument is processed, it is shifted and the corresponding number
128	# of x's is removed.  The advantage to counting is that suffix removal
129	# works without fork.
130	#
131	cppargs=
132	for arg; do
133		cppargs="x$cppargs"
134	done
135	while [ -n "$cppargs" ]; do
136		case "$1" in
137		-L)			# takes an arg, but ignored
138				shift 2
139				cppargs=${cppargs%xx}
140				;;
141
142		-c|-[lLMOW]*)		# takes no extra args
143				shift
144				cppargs=${cppargs%x}
145				;;
146
147		-[IDU]*)
148				set -- "$@" "$1"
149				shift
150				cppargs=${cppargs%x}
151				;;
152
153		-[IDU]|-include|-isystem|-isysroot)
154				set -- "$@" "$1" "$2"
155				shift 2
156				cppargs=${cppargs%xx}
157				;;
158
159		-isystem-cxx|-cxx-isystem)
160				set -- "$@" "-isystem" "$2"
161				shift 2
162				cppargs=${cppargs%xx}
163				;;
164
165		-no-cpp-precomp)	# This is a Darwin-specific option.
166				set -- "$@" "$1"
167				shift
168				cppargs=${cppargs%x}
169				;;
170
171		-nostdinc*)	# This is a gcc/g++ ism; ignore if not gcc/g++
172				case "@CFLAGS@" in
173				*-O2*)	# Autoconf puts -O2 when gcc only
174					set -- "$@" "$1"
175					;;
176				esac
177				shift
178				cppargs=${cppargs%x}
179				;;
180
181		-*)
182				echo "$0: Unknown option: $1" 1>&2 # all other -options
183				exit 1
184				;;
185
186		*)
187				SRCS="$SRCS $1"	# source file
188				shift
189				cppargs=${cppargs%x}
190				;;
191		esac
192	done
193fi
194
195[ -z "$SRCS" ] && usage
196
197TMP=/tmp/mkdep$$
198rm -f $TMP
199
200trap 'rm -f $TMP; exit 1' 1 2 3 13 15
201
202if $MERGE; then
203	for f in $SRCS; do
204		if [ ! -f "$f" ]; then
205			if ! $QUIET; then echo "$0: Ignoring $f" >&2; fi
206			continue
207		fi
208		while IFS=':'; read target dependents; do
209			IFS=
210			t1="${target#* }"
211			file="${target%.o}"
212			if [ "$t1" = "$target" -a "$file" != "$target" ]; then
213				set_objlist $file
214				target="$objlist"
215			fi
216			echo "$target:$dependents"
217			if "$OPTIONAL"; then
218				echo ".OPTIONAL:$dependents"
219			fi
220		done <$f
221	done >$TMP
222else
223	for f in $SRCS; do
224		file=${f##*/}
225		file=${file%.*}
226		set_objlist $file
227
228		@CPP@ "$@" $f | @AWK@ '
229			/^#/ {
230				# Be as tolerant as possible.
231				sub(/^#(line)? [ 0-9]*\"?/, "")
232				sub(/^#(pragma).*/, "")
233				sub(/^<.*/, "")
234				sub(/\".*$/, "")
235				sub(/ [ 0-9]*$/, "")
236
237				if ($0 in seenfiles) next
238				if ($0 ~ /y.tab.c/) next
239
240				seenfiles[$0] = 1
241				print "'"$objlist"'" ": " $0
242				'"$AWK_OPTIONAL"'
243			}
244		' >> $TMP
245	done
246fi
247
248if $APPEND; then
249	cat $TMP >> $OUTFILE
250else
251	cat $TMP > $OUTFILE
252fi
253
254rm -f $TMP
255exit 0
256