host-mkdep.in revision 1.21.2.3 1 #!@BSHELL@ -
2 #
3 # $NetBSD: host-mkdep.in,v 1.21.2.3 2014/08/20 00:04:54 tls 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
39 APPEND=false
40 MERGE=false
41 OPTIONAL=false
42 AWK_OPTIONAL=
43 QUIET=false
44 CPPFLAGS=
45 NEWEXT=.o
46 PREFIX=
47 OUTFILE=.depend
48 SRCS=
49
50 usage()
51 {
52 echo "Usage: $0 [-adopq] [-s .suffixes] [-f .depend] -- [flags] file ..." >&2
53 exit 1
54 }
55
56 set_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)
74 while [ $# -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 -[iv]) ;;
88
89 -[fPs]) # Options with arguments
90 [ -z "$optarg" ] && {
91 [ $# = 1 ] && usage
92 shift
93 optarg="$1"
94 }
95 case "-$option" in
96 -f) OUTFILE="$optarg";;
97 -P) PREFIX="$optarg";;
98 -s) NEWEXT="$optarg";;
99 esac
100 optarg=
101 ;;
102
103 --) [ -z "$optarg" ] && shift
104 break 2
105 ;;
106
107 *) $MERGE && usage
108 break 2;
109 ;;
110 esac
111 [ -n "$optarg" ]
112 do
113 option="$optarg"
114 done
115 shift
116 done
117
118 [ $# = 0 ] && usage
119
120 if $MERGE; then
121 SRCS="$*"
122 else
123 #
124 # Process argument list.
125 # This is tricky, because arguments may contain spaces and other
126 # escapes characters. The argument list is used like a tail queue.
127 # $cppargs has one x for each unprocessed argument, so when an
128 # argument is processed, it is shifted and the corresponding number
129 # of x's is removed. The advantage to counting is that suffix removal
130 # works without fork.
131 #
132 cppargs=
133 for arg; do
134 cppargs="x$cppargs"
135 done
136 while [ -n "$cppargs" ]; do
137 case "$1" in
138 -L) # takes an arg, but ignored
139 shift 2
140 cppargs=${cppargs%xx}
141 ;;
142
143 -c|-[lLMOW]*) # takes no extra args
144 shift
145 cppargs=${cppargs%x}
146 ;;
147
148 -[IDU]*)
149 set -- "$@" "$1"
150 shift
151 cppargs=${cppargs%x}
152 ;;
153
154 -[IDU]|-include|-isystem|-isysroot)
155 set -- "$@" "$1" "$2"
156 shift 2
157 cppargs=${cppargs%xx}
158 ;;
159
160 -isystem-cxx|-cxx-isystem)
161 set -- "$@" "-isystem" "$2"
162 shift 2
163 cppargs=${cppargs%xx}
164 ;;
165 -std=*)
166 set -- "$@" "$1"
167 shift
168 cppargs=${cppargs%x}
169 ;;
170
171 -no-cpp-precomp) # This is a Darwin-specific option.
172 set -- "$@" "$1"
173 shift
174 cppargs=${cppargs%x}
175 ;;
176
177 -nostdinc*) # This is a gcc/g++ ism; ignore if not gcc/g++
178 case "@CFLAGS@" in
179 *-O2*) # Autoconf puts -O2 when gcc only
180 set -- "$@" "$1"
181 ;;
182 esac
183 shift
184 cppargs=${cppargs%x}
185 ;;
186 --sysroot*)
187 shift
188 ;;
189 -[iv])
190 shift
191 ;;
192 -*)
193 echo "$0: Unknown option: $1" 1>&2 # all other -options
194 exit 1
195 ;;
196
197 *)
198 SRCS="$SRCS $1" # source file
199 shift
200 cppargs=${cppargs%x}
201 ;;
202 esac
203 done
204 fi
205
206 [ -z "$SRCS" ] && usage
207
208 TMP=/tmp/mkdep$$
209 rm -f $TMP
210
211 trap 'rm -f $TMP; exit 1' 1 2 3 13 15
212
213 if $MERGE; then
214 for f in $SRCS; do
215 if [ ! -f "$f" ]; then
216 if ! $QUIET; then echo "$0: Ignoring $f" >&2; fi
217 continue
218 fi
219 while IFS=':'; read target dependents; do
220 IFS=
221 t1="${target#* }"
222 file="${target%.o}"
223 if [ "$t1" = "$target" -a "$file" != "$target" ]; then
224 set_objlist $file
225 target="$objlist"
226 fi
227 echo "$target:$dependents"
228 if "$OPTIONAL"; then
229 echo ".OPTIONAL:$dependents"
230 fi
231 done <$f
232 done >$TMP
233 else
234 for f in $SRCS; do
235 file=${f##*/}
236 file=${file%.*}
237 set_objlist $file
238
239 ( (@CPP@ "$@" $f; echo $? >&3) | @AWK@ '
240 /^#/ {
241 # Be as tolerant as possible.
242 sub(/^#(line)? [ 0-9]*\"?/, "")
243 sub(/^#(pragma).*/, "")
244 sub(/^<.*/, "")
245 sub(/\".*$/, "")
246 sub(/ [ 0-9]*$/, "")
247
248 if ($0 in seenfiles) next
249 if ($0 ~ /y.tab.c/) next
250
251 seenfiles[$0] = 1
252 print "'"$objlist"'" ": " $0
253 '"$AWK_OPTIONAL"'
254 }
255 ' >> $TMP) 3>&1 | (read a; exit $a)
256 done
257 fi
258
259 if $APPEND; then
260 cat $TMP >> $OUTFILE
261 else
262 cat $TMP > $OUTFILE
263 fi
264
265 rm -f $TMP
266 exit 0
267