blob: 4ebd5b3a2f2d689de95251c9424e2763aa159de5 [file] [log] [blame]
The Android Open Source Project893912b2009-03-03 19:30:05 -08001#! /bin/sh
2# depcomp - compile a program generating dependencies as side-effects
3
Sireesh Tripurarib478e662014-05-09 15:15:10 +05304scriptversion=2013-05-30.07; # UTC
The Android Open Source Project893912b2009-03-03 19:30:05 -08005
Sireesh Tripurarib478e662014-05-09 15:15:10 +05306# Copyright (C) 1999-2013 Free Software Foundation, Inc.
The Android Open Source Project893912b2009-03-03 19:30:05 -08007
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2, or (at your option)
11# any later version.
12
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17
18# You should have received a copy of the GNU General Public License
Patrick Scott5f6bd842010-06-28 16:55:16 -040019# along with this program. If not, see <http://www.gnu.org/licenses/>.
The Android Open Source Project893912b2009-03-03 19:30:05 -080020
21# As a special exception to the GNU General Public License, if you
22# distribute this file as part of a program that contains a
23# configuration script generated by Autoconf, you may include it under
24# the same distribution terms that you use for the rest of that program.
25
26# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
27
28case $1 in
29 '')
Chris Craikb50c2172013-07-29 15:28:30 -070030 echo "$0: No command. Try '$0 --help' for more information." 1>&2
31 exit 1;
32 ;;
The Android Open Source Project893912b2009-03-03 19:30:05 -080033 -h | --h*)
34 cat <<\EOF
35Usage: depcomp [--help] [--version] PROGRAM [ARGS]
36
37Run PROGRAMS ARGS to compile a file, generating dependencies
38as side-effects.
39
40Environment variables:
41 depmode Dependency tracking mode.
Chris Craikb50c2172013-07-29 15:28:30 -070042 source Source file read by 'PROGRAMS ARGS'.
43 object Object file output by 'PROGRAMS ARGS'.
The Android Open Source Project893912b2009-03-03 19:30:05 -080044 DEPDIR directory where to store dependencies.
45 depfile Dependency file to output.
Chris Craikb50c2172013-07-29 15:28:30 -070046 tmpdepfile Temporary file to use when outputting dependencies.
The Android Open Source Project893912b2009-03-03 19:30:05 -080047 libtool Whether libtool is used (yes/no).
48
49Report bugs to <bug-automake@gnu.org>.
50EOF
51 exit $?
52 ;;
53 -v | --v*)
54 echo "depcomp $scriptversion"
55 exit $?
56 ;;
57esac
58
Chris Craikb50c2172013-07-29 15:28:30 -070059# Get the directory component of the given path, and save it in the
60# global variables '$dir'. Note that this directory component will
61# be either empty or ending with a '/' character. This is deliberate.
62set_dir_from ()
63{
64 case $1 in
65 */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
66 *) dir=;;
67 esac
68}
69
70# Get the suffix-stripped basename of the given path, and save it the
71# global variable '$base'.
72set_base_from ()
73{
74 base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
75}
76
77# If no dependency file was actually created by the compiler invocation,
78# we still have to create a dummy depfile, to avoid errors with the
79# Makefile "include basename.Plo" scheme.
80make_dummy_depfile ()
81{
82 echo "#dummy" > "$depfile"
83}
84
85# Factor out some common post-processing of the generated depfile.
86# Requires the auxiliary global variable '$tmpdepfile' to be set.
87aix_post_process_depfile ()
88{
89 # If the compiler actually managed to produce a dependency file,
90 # post-process it.
91 if test -f "$tmpdepfile"; then
92 # Each line is of the form 'foo.o: dependency.h'.
93 # Do two passes, one to just change these to
94 # $object: dependency.h
95 # and one to simply output
96 # dependency.h:
97 # which is needed to avoid the deleted-header problem.
98 { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
99 sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
100 } > "$depfile"
101 rm -f "$tmpdepfile"
102 else
103 make_dummy_depfile
104 fi
105}
106
107# A tabulation character.
108tab=' '
109# A newline character.
110nl='
111'
112# Character ranges might be problematic outside the C locale.
113# These definitions help.
114upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
115lower=abcdefghijklmnopqrstuvwxyz
116digits=0123456789
117alpha=${upper}${lower}
118
The Android Open Source Project893912b2009-03-03 19:30:05 -0800119if test -z "$depmode" || test -z "$source" || test -z "$object"; then
120 echo "depcomp: Variables source, object and depmode must be set" 1>&2
121 exit 1
122fi
123
124# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
125depfile=${depfile-`echo "$object" |
126 sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
127tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
128
129rm -f "$tmpdepfile"
130
Chris Craikb50c2172013-07-29 15:28:30 -0700131# Avoid interferences from the environment.
132gccflag= dashmflag=
133
The Android Open Source Project893912b2009-03-03 19:30:05 -0800134# Some modes work just like other modes, but use different flags. We
135# parameterize here, but still list the modes in the big case below,
136# to make depend.m4 easier to write. Note that we *cannot* use a case
137# here, because this file can only contain one case statement.
138if test "$depmode" = hp; then
139 # HP compiler uses -M and no extra arg.
140 gccflag=-M
141 depmode=gcc
142fi
143
144if test "$depmode" = dashXmstdout; then
Chris Craikb50c2172013-07-29 15:28:30 -0700145 # This is just like dashmstdout with a different argument.
146 dashmflag=-xM
147 depmode=dashmstdout
The Android Open Source Project893912b2009-03-03 19:30:05 -0800148fi
149
Patrick Scott5f6bd842010-06-28 16:55:16 -0400150cygpath_u="cygpath -u -f -"
151if test "$depmode" = msvcmsys; then
Chris Craikb50c2172013-07-29 15:28:30 -0700152 # This is just like msvisualcpp but w/o cygpath translation.
153 # Just convert the backslash-escaped backslashes to single forward
154 # slashes to satisfy depend.m4
155 cygpath_u='sed s,\\\\,/,g'
156 depmode=msvisualcpp
157fi
158
159if test "$depmode" = msvc7msys; then
160 # This is just like msvc7 but w/o cygpath translation.
161 # Just convert the backslash-escaped backslashes to single forward
162 # slashes to satisfy depend.m4
163 cygpath_u='sed s,\\\\,/,g'
164 depmode=msvc7
165fi
166
167if test "$depmode" = xlc; then
168 # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
169 gccflag=-qmakedep=gcc,-MF
170 depmode=gcc
Patrick Scott5f6bd842010-06-28 16:55:16 -0400171fi
172
The Android Open Source Project893912b2009-03-03 19:30:05 -0800173case "$depmode" in
174gcc3)
175## gcc 3 implements dependency tracking that does exactly what
176## we want. Yay! Note: for some reason libtool 1.4 doesn't like
177## it if -MD -MP comes after the -MF stuff. Hmm.
178## Unfortunately, FreeBSD c89 acceptance of flags depends upon
179## the command line argument order; so add the flags where they
180## appear in depend2.am. Note that the slowdown incurred here
181## affects only configure: in makefiles, %FASTDEP% shortcuts this.
182 for arg
183 do
184 case $arg in
185 -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
186 *) set fnord "$@" "$arg" ;;
187 esac
188 shift # fnord
189 shift # $arg
190 done
191 "$@"
192 stat=$?
Chris Craikb50c2172013-07-29 15:28:30 -0700193 if test $stat -ne 0; then
The Android Open Source Project893912b2009-03-03 19:30:05 -0800194 rm -f "$tmpdepfile"
195 exit $stat
196 fi
197 mv "$tmpdepfile" "$depfile"
198 ;;
199
200gcc)
Chris Craikb50c2172013-07-29 15:28:30 -0700201## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
202## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
203## (see the conditional assignment to $gccflag above).
The Android Open Source Project893912b2009-03-03 19:30:05 -0800204## There are various ways to get dependency output from gcc. Here's
205## why we pick this rather obscure method:
206## - Don't want to use -MD because we'd like the dependencies to end
207## up in a subdir. Having to rename by hand is ugly.
208## (We might end up doing this anyway to support other compilers.)
209## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
Chris Craikb50c2172013-07-29 15:28:30 -0700210## -MM, not -M (despite what the docs say). Also, it might not be
211## supported by the other compilers which use the 'gcc' depmode.
The Android Open Source Project893912b2009-03-03 19:30:05 -0800212## - Using -M directly means running the compiler twice (even worse
213## than renaming).
214 if test -z "$gccflag"; then
215 gccflag=-MD,
216 fi
217 "$@" -Wp,"$gccflag$tmpdepfile"
218 stat=$?
Chris Craikb50c2172013-07-29 15:28:30 -0700219 if test $stat -ne 0; then
The Android Open Source Project893912b2009-03-03 19:30:05 -0800220 rm -f "$tmpdepfile"
221 exit $stat
222 fi
223 rm -f "$depfile"
224 echo "$object : \\" > "$depfile"
Chris Craikb50c2172013-07-29 15:28:30 -0700225 # The second -e expression handles DOS-style file names with drive
226 # letters.
The Android Open Source Project893912b2009-03-03 19:30:05 -0800227 sed -e 's/^[^:]*: / /' \
228 -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
Chris Craikb50c2172013-07-29 15:28:30 -0700229## This next piece of magic avoids the "deleted header file" problem.
The Android Open Source Project893912b2009-03-03 19:30:05 -0800230## The problem is that when a header file which appears in a .P file
231## is deleted, the dependency causes make to die (because there is
232## typically no way to rebuild the header). We avoid this by adding
233## dummy dependencies for each header file. Too bad gcc doesn't do
234## this for us directly.
Chris Craikb50c2172013-07-29 15:28:30 -0700235## Some versions of gcc put a space before the ':'. On the theory
The Android Open Source Project893912b2009-03-03 19:30:05 -0800236## that the space means something, we add a space to the output as
Chris Craikb50c2172013-07-29 15:28:30 -0700237## well. hp depmode also adds that space, but also prefixes the VPATH
238## to the object. Take care to not repeat it in the output.
The Android Open Source Project893912b2009-03-03 19:30:05 -0800239## Some versions of the HPUX 10.20 sed can't process this invocation
240## correctly. Breaking it into two sed invocations is a workaround.
Chris Craikb50c2172013-07-29 15:28:30 -0700241 tr ' ' "$nl" < "$tmpdepfile" \
242 | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
243 | sed -e 's/$/ :/' >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800244 rm -f "$tmpdepfile"
245 ;;
246
247hp)
248 # This case exists only to let depend.m4 do its work. It works by
249 # looking at the text of this script. This case will never be run,
250 # since it is checked for above.
251 exit 1
252 ;;
253
254sgi)
255 if test "$libtool" = yes; then
256 "$@" "-Wp,-MDupdate,$tmpdepfile"
257 else
258 "$@" -MDupdate "$tmpdepfile"
259 fi
260 stat=$?
Chris Craikb50c2172013-07-29 15:28:30 -0700261 if test $stat -ne 0; then
The Android Open Source Project893912b2009-03-03 19:30:05 -0800262 rm -f "$tmpdepfile"
263 exit $stat
264 fi
265 rm -f "$depfile"
266
267 if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
268 echo "$object : \\" > "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800269 # Clip off the initial element (the dependent). Don't try to be
270 # clever and replace this with sed code, as IRIX sed won't handle
271 # lines with more than a fixed number of characters (4096 in
272 # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
Chris Craikb50c2172013-07-29 15:28:30 -0700273 # the IRIX cc adds comments like '#:fec' to the end of the
The Android Open Source Project893912b2009-03-03 19:30:05 -0800274 # dependency line.
Chris Craikb50c2172013-07-29 15:28:30 -0700275 tr ' ' "$nl" < "$tmpdepfile" \
276 | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
277 | tr "$nl" ' ' >> "$depfile"
Patrick Scott5f6bd842010-06-28 16:55:16 -0400278 echo >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800279 # The second pass generates a dummy entry for each header file.
Chris Craikb50c2172013-07-29 15:28:30 -0700280 tr ' ' "$nl" < "$tmpdepfile" \
281 | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
282 >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800283 else
Chris Craikb50c2172013-07-29 15:28:30 -0700284 make_dummy_depfile
The Android Open Source Project893912b2009-03-03 19:30:05 -0800285 fi
286 rm -f "$tmpdepfile"
287 ;;
288
Chris Craikb50c2172013-07-29 15:28:30 -0700289xlc)
290 # This case exists only to let depend.m4 do its work. It works by
291 # looking at the text of this script. This case will never be run,
292 # since it is checked for above.
293 exit 1
294 ;;
295
The Android Open Source Project893912b2009-03-03 19:30:05 -0800296aix)
297 # The C for AIX Compiler uses -M and outputs the dependencies
298 # in a .u file. In older versions, this file always lives in the
Chris Craikb50c2172013-07-29 15:28:30 -0700299 # current directory. Also, the AIX compiler puts '$object:' at the
The Android Open Source Project893912b2009-03-03 19:30:05 -0800300 # start of each line; $object doesn't have directory information.
301 # Version 6 uses the directory in both cases.
Chris Craikb50c2172013-07-29 15:28:30 -0700302 set_dir_from "$object"
303 set_base_from "$object"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800304 if test "$libtool" = yes; then
305 tmpdepfile1=$dir$base.u
306 tmpdepfile2=$base.u
307 tmpdepfile3=$dir.libs/$base.u
308 "$@" -Wc,-M
309 else
310 tmpdepfile1=$dir$base.u
311 tmpdepfile2=$dir$base.u
312 tmpdepfile3=$dir$base.u
313 "$@" -M
314 fi
315 stat=$?
Chris Craikb50c2172013-07-29 15:28:30 -0700316 if test $stat -ne 0; then
The Android Open Source Project893912b2009-03-03 19:30:05 -0800317 rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
318 exit $stat
319 fi
320
321 for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
322 do
323 test -f "$tmpdepfile" && break
324 done
Chris Craikb50c2172013-07-29 15:28:30 -0700325 aix_post_process_depfile
326 ;;
327
328tcc)
329 # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
330 # FIXME: That version still under development at the moment of writing.
331 # Make that this statement remains true also for stable, released
332 # versions.
333 # It will wrap lines (doesn't matter whether long or short) with a
334 # trailing '\', as in:
335 #
336 # foo.o : \
337 # foo.c \
338 # foo.h \
339 #
340 # It will put a trailing '\' even on the last line, and will use leading
341 # spaces rather than leading tabs (at least since its commit 0394caf7
342 # "Emit spaces for -MD").
343 "$@" -MD -MF "$tmpdepfile"
344 stat=$?
345 if test $stat -ne 0; then
346 rm -f "$tmpdepfile"
347 exit $stat
The Android Open Source Project893912b2009-03-03 19:30:05 -0800348 fi
Chris Craikb50c2172013-07-29 15:28:30 -0700349 rm -f "$depfile"
350 # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
351 # We have to change lines of the first kind to '$object: \'.
352 sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
353 # And for each line of the second kind, we have to emit a 'dep.h:'
354 # dummy dependency, to avoid the deleted-header problem.
355 sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800356 rm -f "$tmpdepfile"
357 ;;
358
Chris Craikb50c2172013-07-29 15:28:30 -0700359## The order of this option in the case statement is important, since the
360## shell code in configure will try each of these formats in the order
361## listed in this file. A plain '-MD' option would be understood by many
362## compilers, so we must ensure this comes after the gcc and icc options.
363pgcc)
364 # Portland's C compiler understands '-MD'.
365 # Will always output deps to 'file.d' where file is the root name of the
366 # source file under compilation, even if file resides in a subdirectory.
367 # The object file name does not affect the name of the '.d' file.
368 # pgcc 10.2 will output
The Android Open Source Project893912b2009-03-03 19:30:05 -0800369 # foo.o: sub/foo.c sub/foo.h
Chris Craikb50c2172013-07-29 15:28:30 -0700370 # and will wrap long lines using '\' :
The Android Open Source Project893912b2009-03-03 19:30:05 -0800371 # foo.o: sub/foo.c ... \
372 # sub/foo.h ... \
373 # ...
Chris Craikb50c2172013-07-29 15:28:30 -0700374 set_dir_from "$object"
375 # Use the source, not the object, to determine the base name, since
376 # that's sadly what pgcc will do too.
377 set_base_from "$source"
378 tmpdepfile=$base.d
The Android Open Source Project893912b2009-03-03 19:30:05 -0800379
Chris Craikb50c2172013-07-29 15:28:30 -0700380 # For projects that build the same source file twice into different object
381 # files, the pgcc approach of using the *source* file root name can cause
382 # problems in parallel builds. Use a locking strategy to avoid stomping on
383 # the same $tmpdepfile.
384 lockdir=$base.d-lock
385 trap "
386 echo '$0: caught signal, cleaning up...' >&2
387 rmdir '$lockdir'
388 exit 1
389 " 1 2 13 15
390 numtries=100
391 i=$numtries
392 while test $i -gt 0; do
393 # mkdir is a portable test-and-set.
394 if mkdir "$lockdir" 2>/dev/null; then
395 # This process acquired the lock.
396 "$@" -MD
397 stat=$?
398 # Release the lock.
399 rmdir "$lockdir"
400 break
401 else
402 # If the lock is being held by a different process, wait
403 # until the winning process is done or we timeout.
404 while test -d "$lockdir" && test $i -gt 0; do
405 sleep 1
406 i=`expr $i - 1`
407 done
408 fi
409 i=`expr $i - 1`
410 done
411 trap - 1 2 13 15
412 if test $i -le 0; then
413 echo "$0: failed to acquire lock after $numtries attempts" >&2
414 echo "$0: check lockdir '$lockdir'" >&2
415 exit 1
416 fi
417
418 if test $stat -ne 0; then
The Android Open Source Project893912b2009-03-03 19:30:05 -0800419 rm -f "$tmpdepfile"
420 exit $stat
421 fi
422 rm -f "$depfile"
423 # Each line is of the form `foo.o: dependent.h',
424 # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
425 # Do two passes, one to just change these to
426 # `$object: dependent.h' and one to simply `dependent.h:'.
427 sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
428 # Some versions of the HPUX 10.20 sed can't process this invocation
429 # correctly. Breaking it into two sed invocations is a workaround.
Chris Craikb50c2172013-07-29 15:28:30 -0700430 sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
431 | sed -e 's/$/ :/' >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800432 rm -f "$tmpdepfile"
433 ;;
434
435hp2)
436 # The "hp" stanza above does not work with aCC (C++) and HP's ia64
437 # compilers, which have integrated preprocessors. The correct option
438 # to use with these is +Maked; it writes dependencies to a file named
439 # 'foo.d', which lands next to the object file, wherever that
440 # happens to be.
441 # Much of this is similar to the tru64 case; see comments there.
Chris Craikb50c2172013-07-29 15:28:30 -0700442 set_dir_from "$object"
443 set_base_from "$object"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800444 if test "$libtool" = yes; then
445 tmpdepfile1=$dir$base.d
446 tmpdepfile2=$dir.libs/$base.d
447 "$@" -Wc,+Maked
448 else
449 tmpdepfile1=$dir$base.d
450 tmpdepfile2=$dir$base.d
451 "$@" +Maked
452 fi
453 stat=$?
Chris Craikb50c2172013-07-29 15:28:30 -0700454 if test $stat -ne 0; then
The Android Open Source Project893912b2009-03-03 19:30:05 -0800455 rm -f "$tmpdepfile1" "$tmpdepfile2"
456 exit $stat
457 fi
458
459 for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
460 do
461 test -f "$tmpdepfile" && break
462 done
463 if test -f "$tmpdepfile"; then
Chris Craikb50c2172013-07-29 15:28:30 -0700464 sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
465 # Add 'dependent.h:' lines.
Patrick Scott5f6bd842010-06-28 16:55:16 -0400466 sed -ne '2,${
Chris Craikb50c2172013-07-29 15:28:30 -0700467 s/^ *//
468 s/ \\*$//
469 s/$/:/
470 p
471 }' "$tmpdepfile" >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800472 else
Chris Craikb50c2172013-07-29 15:28:30 -0700473 make_dummy_depfile
The Android Open Source Project893912b2009-03-03 19:30:05 -0800474 fi
475 rm -f "$tmpdepfile" "$tmpdepfile2"
476 ;;
477
478tru64)
Chris Craikb50c2172013-07-29 15:28:30 -0700479 # The Tru64 compiler uses -MD to generate dependencies as a side
480 # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
481 # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
482 # dependencies in 'foo.d' instead, so we check for that too.
483 # Subdirectories are respected.
484 set_dir_from "$object"
485 set_base_from "$object"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800486
Chris Craikb50c2172013-07-29 15:28:30 -0700487 if test "$libtool" = yes; then
488 # Libtool generates 2 separate objects for the 2 libraries. These
489 # two compilations output dependencies in $dir.libs/$base.o.d and
490 # in $dir$base.o.d. We have to check for both files, because
491 # one of the two compilations can be disabled. We should prefer
492 # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
493 # automatically cleaned when .libs/ is deleted, while ignoring
494 # the former would cause a distcleancheck panic.
495 tmpdepfile1=$dir$base.o.d # libtool 1.5
496 tmpdepfile2=$dir.libs/$base.o.d # Likewise.
497 tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
498 "$@" -Wc,-MD
499 else
500 tmpdepfile1=$dir$base.d
501 tmpdepfile2=$dir$base.d
502 tmpdepfile3=$dir$base.d
503 "$@" -MD
504 fi
The Android Open Source Project893912b2009-03-03 19:30:05 -0800505
Chris Craikb50c2172013-07-29 15:28:30 -0700506 stat=$?
507 if test $stat -ne 0; then
508 rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
509 exit $stat
510 fi
The Android Open Source Project893912b2009-03-03 19:30:05 -0800511
Chris Craikb50c2172013-07-29 15:28:30 -0700512 for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
513 do
514 test -f "$tmpdepfile" && break
515 done
516 # Same post-processing that is required for AIX mode.
517 aix_post_process_depfile
518 ;;
519
520msvc7)
521 if test "$libtool" = yes; then
522 showIncludes=-Wc,-showIncludes
523 else
524 showIncludes=-showIncludes
525 fi
526 "$@" $showIncludes > "$tmpdepfile"
527 stat=$?
528 grep -v '^Note: including file: ' "$tmpdepfile"
529 if test $stat -ne 0; then
530 rm -f "$tmpdepfile"
531 exit $stat
532 fi
533 rm -f "$depfile"
534 echo "$object : \\" > "$depfile"
535 # The first sed program below extracts the file names and escapes
536 # backslashes for cygpath. The second sed program outputs the file
537 # name when reading, but also accumulates all include files in the
538 # hold buffer in order to output them again at the end. This only
539 # works with sed implementations that can handle large buffers.
540 sed < "$tmpdepfile" -n '
541/^Note: including file: *\(.*\)/ {
542 s//\1/
543 s/\\/\\\\/g
544 p
545}' | $cygpath_u | sort -u | sed -n '
546s/ /\\ /g
547s/\(.*\)/'"$tab"'\1 \\/p
548s/.\(.*\) \\/\1:/
549H
550$ {
551 s/.*/'"$tab"'/
552 G
553 p
554}' >> "$depfile"
Sireesh Tripurarib478e662014-05-09 15:15:10 +0530555 echo >> "$depfile" # make sure the fragment doesn't end with a backslash
Chris Craikb50c2172013-07-29 15:28:30 -0700556 rm -f "$tmpdepfile"
557 ;;
558
559msvc7msys)
560 # This case exists only to let depend.m4 do its work. It works by
561 # looking at the text of this script. This case will never be run,
562 # since it is checked for above.
563 exit 1
564 ;;
The Android Open Source Project893912b2009-03-03 19:30:05 -0800565
566#nosideeffect)
567 # This comment above is used by automake to tell side-effect
568 # dependency tracking mechanisms from slower ones.
569
570dashmstdout)
571 # Important note: in order to support this mode, a compiler *must*
572 # always write the preprocessed file to stdout, regardless of -o.
573 "$@" || exit $?
574
575 # Remove the call to Libtool.
576 if test "$libtool" = yes; then
Patrick Scott5f6bd842010-06-28 16:55:16 -0400577 while test "X$1" != 'X--mode=compile'; do
The Android Open Source Project893912b2009-03-03 19:30:05 -0800578 shift
579 done
580 shift
581 fi
582
Chris Craikb50c2172013-07-29 15:28:30 -0700583 # Remove '-o $object'.
The Android Open Source Project893912b2009-03-03 19:30:05 -0800584 IFS=" "
585 for arg
586 do
587 case $arg in
588 -o)
589 shift
590 ;;
591 $object)
592 shift
593 ;;
594 *)
595 set fnord "$@" "$arg"
596 shift # fnord
597 shift # $arg
598 ;;
599 esac
600 done
601
602 test -z "$dashmflag" && dashmflag=-M
Chris Craikb50c2172013-07-29 15:28:30 -0700603 # Require at least two characters before searching for ':'
The Android Open Source Project893912b2009-03-03 19:30:05 -0800604 # in the target name. This is to cope with DOS-style filenames:
Chris Craikb50c2172013-07-29 15:28:30 -0700605 # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
The Android Open Source Project893912b2009-03-03 19:30:05 -0800606 "$@" $dashmflag |
Chris Craikb50c2172013-07-29 15:28:30 -0700607 sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800608 rm -f "$depfile"
609 cat < "$tmpdepfile" > "$depfile"
Chris Craikb50c2172013-07-29 15:28:30 -0700610 # Some versions of the HPUX 10.20 sed can't process this sed invocation
611 # correctly. Breaking it into two sed invocations is a workaround.
612 tr ' ' "$nl" < "$tmpdepfile" \
613 | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
614 | sed -e 's/$/ :/' >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800615 rm -f "$tmpdepfile"
616 ;;
617
618dashXmstdout)
619 # This case only exists to satisfy depend.m4. It is never actually
620 # run, as this mode is specially recognized in the preamble.
621 exit 1
622 ;;
623
624makedepend)
625 "$@" || exit $?
626 # Remove any Libtool call
627 if test "$libtool" = yes; then
Patrick Scott5f6bd842010-06-28 16:55:16 -0400628 while test "X$1" != 'X--mode=compile'; do
The Android Open Source Project893912b2009-03-03 19:30:05 -0800629 shift
630 done
631 shift
632 fi
633 # X makedepend
634 shift
Patrick Scott5f6bd842010-06-28 16:55:16 -0400635 cleared=no eat=no
636 for arg
637 do
The Android Open Source Project893912b2009-03-03 19:30:05 -0800638 case $cleared in
639 no)
640 set ""; shift
641 cleared=yes ;;
642 esac
Patrick Scott5f6bd842010-06-28 16:55:16 -0400643 if test $eat = yes; then
644 eat=no
645 continue
646 fi
The Android Open Source Project893912b2009-03-03 19:30:05 -0800647 case "$arg" in
648 -D*|-I*)
649 set fnord "$@" "$arg"; shift ;;
650 # Strip any option that makedepend may not understand. Remove
651 # the object too, otherwise makedepend will parse it as a source file.
Patrick Scott5f6bd842010-06-28 16:55:16 -0400652 -arch)
653 eat=yes ;;
The Android Open Source Project893912b2009-03-03 19:30:05 -0800654 -*|$object)
655 ;;
656 *)
657 set fnord "$@" "$arg"; shift ;;
658 esac
659 done
Patrick Scott5f6bd842010-06-28 16:55:16 -0400660 obj_suffix=`echo "$object" | sed 's/^.*\././'`
The Android Open Source Project893912b2009-03-03 19:30:05 -0800661 touch "$tmpdepfile"
662 ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
663 rm -f "$depfile"
Chris Craikb50c2172013-07-29 15:28:30 -0700664 # makedepend may prepend the VPATH from the source file name to the object.
665 # No need to regex-escape $object, excess matching of '.' is harmless.
666 sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
667 # Some versions of the HPUX 10.20 sed can't process the last invocation
668 # correctly. Breaking it into two sed invocations is a workaround.
669 sed '1,2d' "$tmpdepfile" \
670 | tr ' ' "$nl" \
671 | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
672 | sed -e 's/$/ :/' >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800673 rm -f "$tmpdepfile" "$tmpdepfile".bak
674 ;;
675
676cpp)
677 # Important note: in order to support this mode, a compiler *must*
678 # always write the preprocessed file to stdout.
679 "$@" || exit $?
680
681 # Remove the call to Libtool.
682 if test "$libtool" = yes; then
Patrick Scott5f6bd842010-06-28 16:55:16 -0400683 while test "X$1" != 'X--mode=compile'; do
The Android Open Source Project893912b2009-03-03 19:30:05 -0800684 shift
685 done
686 shift
687 fi
688
Chris Craikb50c2172013-07-29 15:28:30 -0700689 # Remove '-o $object'.
The Android Open Source Project893912b2009-03-03 19:30:05 -0800690 IFS=" "
691 for arg
692 do
693 case $arg in
694 -o)
695 shift
696 ;;
697 $object)
698 shift
699 ;;
700 *)
701 set fnord "$@" "$arg"
702 shift # fnord
703 shift # $arg
704 ;;
705 esac
706 done
707
Chris Craikb50c2172013-07-29 15:28:30 -0700708 "$@" -E \
709 | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
710 -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
711 | sed '$ s: \\$::' > "$tmpdepfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800712 rm -f "$depfile"
713 echo "$object : \\" > "$depfile"
714 cat < "$tmpdepfile" >> "$depfile"
715 sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
716 rm -f "$tmpdepfile"
717 ;;
718
719msvisualcpp)
720 # Important note: in order to support this mode, a compiler *must*
Patrick Scott5f6bd842010-06-28 16:55:16 -0400721 # always write the preprocessed file to stdout.
The Android Open Source Project893912b2009-03-03 19:30:05 -0800722 "$@" || exit $?
Patrick Scott5f6bd842010-06-28 16:55:16 -0400723
724 # Remove the call to Libtool.
725 if test "$libtool" = yes; then
726 while test "X$1" != 'X--mode=compile'; do
727 shift
728 done
729 shift
730 fi
731
The Android Open Source Project893912b2009-03-03 19:30:05 -0800732 IFS=" "
733 for arg
734 do
735 case "$arg" in
Patrick Scott5f6bd842010-06-28 16:55:16 -0400736 -o)
737 shift
738 ;;
739 $object)
740 shift
741 ;;
The Android Open Source Project893912b2009-03-03 19:30:05 -0800742 "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
Chris Craikb50c2172013-07-29 15:28:30 -0700743 set fnord "$@"
744 shift
745 shift
746 ;;
The Android Open Source Project893912b2009-03-03 19:30:05 -0800747 *)
Chris Craikb50c2172013-07-29 15:28:30 -0700748 set fnord "$@" "$arg"
749 shift
750 shift
751 ;;
The Android Open Source Project893912b2009-03-03 19:30:05 -0800752 esac
753 done
Patrick Scott5f6bd842010-06-28 16:55:16 -0400754 "$@" -E 2>/dev/null |
755 sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800756 rm -f "$depfile"
757 echo "$object : \\" > "$depfile"
Chris Craikb50c2172013-07-29 15:28:30 -0700758 sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
759 echo "$tab" >> "$depfile"
Patrick Scott5f6bd842010-06-28 16:55:16 -0400760 sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800761 rm -f "$tmpdepfile"
762 ;;
763
Patrick Scott5f6bd842010-06-28 16:55:16 -0400764msvcmsys)
765 # This case exists only to let depend.m4 do its work. It works by
766 # looking at the text of this script. This case will never be run,
767 # since it is checked for above.
768 exit 1
769 ;;
770
The Android Open Source Project893912b2009-03-03 19:30:05 -0800771none)
772 exec "$@"
773 ;;
774
775*)
776 echo "Unknown depmode $depmode" 1>&2
777 exit 1
778 ;;
779esac
780
781exit 0
782
783# Local Variables:
784# mode: shell-script
785# sh-indentation: 2
786# eval: (add-hook 'write-file-hooks 'time-stamp)
787# time-stamp-start: "scriptversion="
788# time-stamp-format: "%:y-%02m-%02d.%02H"
Patrick Scott5f6bd842010-06-28 16:55:16 -0400789# time-stamp-time-zone: "UTC"
790# time-stamp-end: "; # UTC"
The Android Open Source Project893912b2009-03-03 19:30:05 -0800791# End: