depcomp revision 9d0ccd10
17914d74bSmrg#! /bin/sh 27914d74bSmrg# depcomp - compile a program generating dependencies as side-effects 37914d74bSmrg 49d0ccd10Smrgscriptversion=2013-05-30.07; # UTC 57914d74bSmrg 69d0ccd10Smrg# Copyright (C) 1999-2014 Free Software Foundation, Inc. 77914d74bSmrg 87914d74bSmrg# This program is free software; you can redistribute it and/or modify 97914d74bSmrg# it under the terms of the GNU General Public License as published by 107914d74bSmrg# the Free Software Foundation; either version 2, or (at your option) 117914d74bSmrg# any later version. 127914d74bSmrg 137914d74bSmrg# This program is distributed in the hope that it will be useful, 147914d74bSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 157914d74bSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 167914d74bSmrg# GNU General Public License for more details. 177914d74bSmrg 187914d74bSmrg# You should have received a copy of the GNU General Public License 19e8ead290Smrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 207914d74bSmrg 217914d74bSmrg# As a special exception to the GNU General Public License, if you 227914d74bSmrg# distribute this file as part of a program that contains a 237914d74bSmrg# configuration script generated by Autoconf, you may include it under 247914d74bSmrg# the same distribution terms that you use for the rest of that program. 257914d74bSmrg 267914d74bSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 277914d74bSmrg 287914d74bSmrgcase $1 in 297914d74bSmrg '') 30e6d5e4e0Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31e6d5e4e0Smrg exit 1; 32e6d5e4e0Smrg ;; 337914d74bSmrg -h | --h*) 347914d74bSmrg cat <<\EOF 357914d74bSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 367914d74bSmrg 377914d74bSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 387914d74bSmrgas side-effects. 397914d74bSmrg 407914d74bSmrgEnvironment variables: 417914d74bSmrg depmode Dependency tracking mode. 42e6d5e4e0Smrg source Source file read by 'PROGRAMS ARGS'. 43e6d5e4e0Smrg object Object file output by 'PROGRAMS ARGS'. 447914d74bSmrg DEPDIR directory where to store dependencies. 457914d74bSmrg depfile Dependency file to output. 46e6d5e4e0Smrg tmpdepfile Temporary file to use when outputting dependencies. 477914d74bSmrg libtool Whether libtool is used (yes/no). 487914d74bSmrg 497914d74bSmrgReport bugs to <bug-automake@gnu.org>. 507914d74bSmrgEOF 517914d74bSmrg exit $? 527914d74bSmrg ;; 537914d74bSmrg -v | --v*) 547914d74bSmrg echo "depcomp $scriptversion" 557914d74bSmrg exit $? 567914d74bSmrg ;; 577914d74bSmrgesac 587914d74bSmrg 59e6d5e4e0Smrg# Get the directory component of the given path, and save it in the 60e6d5e4e0Smrg# global variables '$dir'. Note that this directory component will 61e6d5e4e0Smrg# be either empty or ending with a '/' character. This is deliberate. 62e6d5e4e0Smrgset_dir_from () 63e6d5e4e0Smrg{ 64e6d5e4e0Smrg case $1 in 65e6d5e4e0Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66e6d5e4e0Smrg *) dir=;; 67e6d5e4e0Smrg esac 68e6d5e4e0Smrg} 69e6d5e4e0Smrg 70e6d5e4e0Smrg# Get the suffix-stripped basename of the given path, and save it the 71e6d5e4e0Smrg# global variable '$base'. 72e6d5e4e0Smrgset_base_from () 73e6d5e4e0Smrg{ 74e6d5e4e0Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75e6d5e4e0Smrg} 76e6d5e4e0Smrg 77e6d5e4e0Smrg# If no dependency file was actually created by the compiler invocation, 78e6d5e4e0Smrg# we still have to create a dummy depfile, to avoid errors with the 79e6d5e4e0Smrg# Makefile "include basename.Plo" scheme. 80e6d5e4e0Smrgmake_dummy_depfile () 81e6d5e4e0Smrg{ 82e6d5e4e0Smrg echo "#dummy" > "$depfile" 83e6d5e4e0Smrg} 84e6d5e4e0Smrg 85e6d5e4e0Smrg# Factor out some common post-processing of the generated depfile. 86e6d5e4e0Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87e6d5e4e0Smrgaix_post_process_depfile () 88e6d5e4e0Smrg{ 89e6d5e4e0Smrg # If the compiler actually managed to produce a dependency file, 90e6d5e4e0Smrg # post-process it. 91e6d5e4e0Smrg if test -f "$tmpdepfile"; then 92e6d5e4e0Smrg # Each line is of the form 'foo.o: dependency.h'. 93e6d5e4e0Smrg # Do two passes, one to just change these to 94e6d5e4e0Smrg # $object: dependency.h 95e6d5e4e0Smrg # and one to simply output 96e6d5e4e0Smrg # dependency.h: 97e6d5e4e0Smrg # which is needed to avoid the deleted-header problem. 98e6d5e4e0Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99e6d5e4e0Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100e6d5e4e0Smrg } > "$depfile" 101e6d5e4e0Smrg rm -f "$tmpdepfile" 102e6d5e4e0Smrg else 103e6d5e4e0Smrg make_dummy_depfile 104e6d5e4e0Smrg fi 105e6d5e4e0Smrg} 106e6d5e4e0Smrg 107e6d5e4e0Smrg# A tabulation character. 108e6d5e4e0Smrgtab=' ' 109e6d5e4e0Smrg# A newline character. 110e6d5e4e0Smrgnl=' 111e6d5e4e0Smrg' 112e6d5e4e0Smrg# Character ranges might be problematic outside the C locale. 113e6d5e4e0Smrg# These definitions help. 114e6d5e4e0Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115e6d5e4e0Smrglower=abcdefghijklmnopqrstuvwxyz 116e6d5e4e0Smrgdigits=0123456789 117e6d5e4e0Smrgalpha=${upper}${lower} 118e6d5e4e0Smrg 1197914d74bSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1207914d74bSmrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1217914d74bSmrg exit 1 1227914d74bSmrgfi 1237914d74bSmrg 1247914d74bSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1257914d74bSmrgdepfile=${depfile-`echo "$object" | 1267914d74bSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1277914d74bSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1287914d74bSmrg 1297914d74bSmrgrm -f "$tmpdepfile" 1307914d74bSmrg 131e6d5e4e0Smrg# Avoid interferences from the environment. 132e6d5e4e0Smrggccflag= dashmflag= 133e6d5e4e0Smrg 1347914d74bSmrg# Some modes work just like other modes, but use different flags. We 1357914d74bSmrg# parameterize here, but still list the modes in the big case below, 1367914d74bSmrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1377914d74bSmrg# here, because this file can only contain one case statement. 1387914d74bSmrgif test "$depmode" = hp; then 1397914d74bSmrg # HP compiler uses -M and no extra arg. 1407914d74bSmrg gccflag=-M 1417914d74bSmrg depmode=gcc 1427914d74bSmrgfi 1437914d74bSmrg 1447914d74bSmrgif test "$depmode" = dashXmstdout; then 145e6d5e4e0Smrg # This is just like dashmstdout with a different argument. 146e6d5e4e0Smrg dashmflag=-xM 147e6d5e4e0Smrg depmode=dashmstdout 1487914d74bSmrgfi 1497914d74bSmrg 150e8ead290Smrgcygpath_u="cygpath -u -f -" 151e8ead290Smrgif test "$depmode" = msvcmsys; then 152e6d5e4e0Smrg # This is just like msvisualcpp but w/o cygpath translation. 153e6d5e4e0Smrg # Just convert the backslash-escaped backslashes to single forward 154e6d5e4e0Smrg # slashes to satisfy depend.m4 155e6d5e4e0Smrg cygpath_u='sed s,\\\\,/,g' 156e6d5e4e0Smrg depmode=msvisualcpp 157e6d5e4e0Smrgfi 158e6d5e4e0Smrg 159e6d5e4e0Smrgif test "$depmode" = msvc7msys; then 160e6d5e4e0Smrg # This is just like msvc7 but w/o cygpath translation. 161e6d5e4e0Smrg # Just convert the backslash-escaped backslashes to single forward 162e6d5e4e0Smrg # slashes to satisfy depend.m4 163e6d5e4e0Smrg cygpath_u='sed s,\\\\,/,g' 164e6d5e4e0Smrg depmode=msvc7 165e6d5e4e0Smrgfi 166e6d5e4e0Smrg 167e6d5e4e0Smrgif test "$depmode" = xlc; then 168e6d5e4e0Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169e6d5e4e0Smrg gccflag=-qmakedep=gcc,-MF 170e6d5e4e0Smrg depmode=gcc 171e8ead290Smrgfi 172e8ead290Smrg 1737914d74bSmrgcase "$depmode" in 1747914d74bSmrggcc3) 1757914d74bSmrg## gcc 3 implements dependency tracking that does exactly what 1767914d74bSmrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1777914d74bSmrg## it if -MD -MP comes after the -MF stuff. Hmm. 1787914d74bSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1797914d74bSmrg## the command line argument order; so add the flags where they 1807914d74bSmrg## appear in depend2.am. Note that the slowdown incurred here 1817914d74bSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1827914d74bSmrg for arg 1837914d74bSmrg do 1847914d74bSmrg case $arg in 1857914d74bSmrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1867914d74bSmrg *) set fnord "$@" "$arg" ;; 1877914d74bSmrg esac 1887914d74bSmrg shift # fnord 1897914d74bSmrg shift # $arg 1907914d74bSmrg done 1917914d74bSmrg "$@" 1927914d74bSmrg stat=$? 193e6d5e4e0Smrg if test $stat -ne 0; then 1947914d74bSmrg rm -f "$tmpdepfile" 1957914d74bSmrg exit $stat 1967914d74bSmrg fi 1977914d74bSmrg mv "$tmpdepfile" "$depfile" 1987914d74bSmrg ;; 1997914d74bSmrg 2007914d74bSmrggcc) 201e6d5e4e0Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202e6d5e4e0Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203e6d5e4e0Smrg## (see the conditional assignment to $gccflag above). 2047914d74bSmrg## There are various ways to get dependency output from gcc. Here's 2057914d74bSmrg## why we pick this rather obscure method: 2067914d74bSmrg## - Don't want to use -MD because we'd like the dependencies to end 2077914d74bSmrg## up in a subdir. Having to rename by hand is ugly. 2087914d74bSmrg## (We might end up doing this anyway to support other compilers.) 2097914d74bSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210e6d5e4e0Smrg## -MM, not -M (despite what the docs say). Also, it might not be 211e6d5e4e0Smrg## supported by the other compilers which use the 'gcc' depmode. 2127914d74bSmrg## - Using -M directly means running the compiler twice (even worse 2137914d74bSmrg## than renaming). 2147914d74bSmrg if test -z "$gccflag"; then 2157914d74bSmrg gccflag=-MD, 2167914d74bSmrg fi 2177914d74bSmrg "$@" -Wp,"$gccflag$tmpdepfile" 2187914d74bSmrg stat=$? 219e6d5e4e0Smrg if test $stat -ne 0; then 2207914d74bSmrg rm -f "$tmpdepfile" 2217914d74bSmrg exit $stat 2227914d74bSmrg fi 2237914d74bSmrg rm -f "$depfile" 2247914d74bSmrg echo "$object : \\" > "$depfile" 225e6d5e4e0Smrg # The second -e expression handles DOS-style file names with drive 226e6d5e4e0Smrg # letters. 2277914d74bSmrg sed -e 's/^[^:]*: / /' \ 2287914d74bSmrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229e6d5e4e0Smrg## This next piece of magic avoids the "deleted header file" problem. 2307914d74bSmrg## The problem is that when a header file which appears in a .P file 2317914d74bSmrg## is deleted, the dependency causes make to die (because there is 2327914d74bSmrg## typically no way to rebuild the header). We avoid this by adding 2337914d74bSmrg## dummy dependencies for each header file. Too bad gcc doesn't do 2347914d74bSmrg## this for us directly. 235e6d5e4e0Smrg## Some versions of gcc put a space before the ':'. On the theory 2367914d74bSmrg## that the space means something, we add a space to the output as 237e6d5e4e0Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 238e6d5e4e0Smrg## to the object. Take care to not repeat it in the output. 2397914d74bSmrg## Some versions of the HPUX 10.20 sed can't process this invocation 2407914d74bSmrg## correctly. Breaking it into two sed invocations is a workaround. 241e6d5e4e0Smrg tr ' ' "$nl" < "$tmpdepfile" \ 242e6d5e4e0Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243e6d5e4e0Smrg | sed -e 's/$/ :/' >> "$depfile" 2447914d74bSmrg rm -f "$tmpdepfile" 2457914d74bSmrg ;; 2467914d74bSmrg 2477914d74bSmrghp) 2487914d74bSmrg # This case exists only to let depend.m4 do its work. It works by 2497914d74bSmrg # looking at the text of this script. This case will never be run, 2507914d74bSmrg # since it is checked for above. 2517914d74bSmrg exit 1 2527914d74bSmrg ;; 2537914d74bSmrg 2547914d74bSmrgsgi) 2557914d74bSmrg if test "$libtool" = yes; then 2567914d74bSmrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2577914d74bSmrg else 2587914d74bSmrg "$@" -MDupdate "$tmpdepfile" 2597914d74bSmrg fi 2607914d74bSmrg stat=$? 261e6d5e4e0Smrg if test $stat -ne 0; then 2627914d74bSmrg rm -f "$tmpdepfile" 2637914d74bSmrg exit $stat 2647914d74bSmrg fi 2657914d74bSmrg rm -f "$depfile" 2667914d74bSmrg 2677914d74bSmrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2687914d74bSmrg echo "$object : \\" > "$depfile" 2697914d74bSmrg # Clip off the initial element (the dependent). Don't try to be 2707914d74bSmrg # clever and replace this with sed code, as IRIX sed won't handle 2717914d74bSmrg # lines with more than a fixed number of characters (4096 in 2727914d74bSmrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273e6d5e4e0Smrg # the IRIX cc adds comments like '#:fec' to the end of the 2747914d74bSmrg # dependency line. 275e6d5e4e0Smrg tr ' ' "$nl" < "$tmpdepfile" \ 276e6d5e4e0Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277e6d5e4e0Smrg | tr "$nl" ' ' >> "$depfile" 278e8ead290Smrg echo >> "$depfile" 2797914d74bSmrg # The second pass generates a dummy entry for each header file. 280e6d5e4e0Smrg tr ' ' "$nl" < "$tmpdepfile" \ 281e6d5e4e0Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282e6d5e4e0Smrg >> "$depfile" 2837914d74bSmrg else 284e6d5e4e0Smrg make_dummy_depfile 2857914d74bSmrg fi 2867914d74bSmrg rm -f "$tmpdepfile" 2877914d74bSmrg ;; 2887914d74bSmrg 289e6d5e4e0Smrgxlc) 290e6d5e4e0Smrg # This case exists only to let depend.m4 do its work. It works by 291e6d5e4e0Smrg # looking at the text of this script. This case will never be run, 292e6d5e4e0Smrg # since it is checked for above. 293e6d5e4e0Smrg exit 1 294e6d5e4e0Smrg ;; 295e6d5e4e0Smrg 2967914d74bSmrgaix) 2977914d74bSmrg # The C for AIX Compiler uses -M and outputs the dependencies 2987914d74bSmrg # in a .u file. In older versions, this file always lives in the 299e6d5e4e0Smrg # current directory. Also, the AIX compiler puts '$object:' at the 3007914d74bSmrg # start of each line; $object doesn't have directory information. 3017914d74bSmrg # Version 6 uses the directory in both cases. 302e6d5e4e0Smrg set_dir_from "$object" 303e6d5e4e0Smrg set_base_from "$object" 3047914d74bSmrg if test "$libtool" = yes; then 305e169010aSmrg tmpdepfile1=$dir$base.u 306e169010aSmrg tmpdepfile2=$base.u 307e169010aSmrg tmpdepfile3=$dir.libs/$base.u 3087914d74bSmrg "$@" -Wc,-M 3097914d74bSmrg else 310e169010aSmrg tmpdepfile1=$dir$base.u 311e169010aSmrg tmpdepfile2=$dir$base.u 312e169010aSmrg tmpdepfile3=$dir$base.u 3137914d74bSmrg "$@" -M 3147914d74bSmrg fi 3157914d74bSmrg stat=$? 316e6d5e4e0Smrg if test $stat -ne 0; then 317e169010aSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3187914d74bSmrg exit $stat 3197914d74bSmrg fi 3207914d74bSmrg 321e169010aSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322e169010aSmrg do 323e169010aSmrg test -f "$tmpdepfile" && break 324e169010aSmrg done 325e6d5e4e0Smrg aix_post_process_depfile 326e6d5e4e0Smrg ;; 327e6d5e4e0Smrg 328e6d5e4e0Smrgtcc) 329e6d5e4e0Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330e6d5e4e0Smrg # FIXME: That version still under development at the moment of writing. 331e6d5e4e0Smrg # Make that this statement remains true also for stable, released 332e6d5e4e0Smrg # versions. 333e6d5e4e0Smrg # It will wrap lines (doesn't matter whether long or short) with a 334e6d5e4e0Smrg # trailing '\', as in: 335e6d5e4e0Smrg # 336e6d5e4e0Smrg # foo.o : \ 337e6d5e4e0Smrg # foo.c \ 338e6d5e4e0Smrg # foo.h \ 339e6d5e4e0Smrg # 340e6d5e4e0Smrg # It will put a trailing '\' even on the last line, and will use leading 341e6d5e4e0Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 342e6d5e4e0Smrg # "Emit spaces for -MD"). 343e6d5e4e0Smrg "$@" -MD -MF "$tmpdepfile" 344e6d5e4e0Smrg stat=$? 345e6d5e4e0Smrg if test $stat -ne 0; then 346e6d5e4e0Smrg rm -f "$tmpdepfile" 347e6d5e4e0Smrg exit $stat 3487914d74bSmrg fi 349e6d5e4e0Smrg rm -f "$depfile" 350e6d5e4e0Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351e6d5e4e0Smrg # We have to change lines of the first kind to '$object: \'. 352e6d5e4e0Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353e6d5e4e0Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 354e6d5e4e0Smrg # dummy dependency, to avoid the deleted-header problem. 355e6d5e4e0Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3567914d74bSmrg rm -f "$tmpdepfile" 3577914d74bSmrg ;; 3587914d74bSmrg 359e6d5e4e0Smrg## The order of this option in the case statement is important, since the 360e6d5e4e0Smrg## shell code in configure will try each of these formats in the order 361e6d5e4e0Smrg## listed in this file. A plain '-MD' option would be understood by many 362e6d5e4e0Smrg## compilers, so we must ensure this comes after the gcc and icc options. 363e6d5e4e0Smrgpgcc) 364e6d5e4e0Smrg # Portland's C compiler understands '-MD'. 365e6d5e4e0Smrg # Will always output deps to 'file.d' where file is the root name of the 366e6d5e4e0Smrg # source file under compilation, even if file resides in a subdirectory. 367e6d5e4e0Smrg # The object file name does not affect the name of the '.d' file. 368e6d5e4e0Smrg # pgcc 10.2 will output 3697914d74bSmrg # foo.o: sub/foo.c sub/foo.h 370e6d5e4e0Smrg # and will wrap long lines using '\' : 3717914d74bSmrg # foo.o: sub/foo.c ... \ 3727914d74bSmrg # sub/foo.h ... \ 3737914d74bSmrg # ... 374e6d5e4e0Smrg set_dir_from "$object" 375e6d5e4e0Smrg # Use the source, not the object, to determine the base name, since 376e6d5e4e0Smrg # that's sadly what pgcc will do too. 377e6d5e4e0Smrg set_base_from "$source" 378e6d5e4e0Smrg tmpdepfile=$base.d 379e6d5e4e0Smrg 380e6d5e4e0Smrg # For projects that build the same source file twice into different object 381e6d5e4e0Smrg # files, the pgcc approach of using the *source* file root name can cause 382e6d5e4e0Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383e6d5e4e0Smrg # the same $tmpdepfile. 384e6d5e4e0Smrg lockdir=$base.d-lock 385e6d5e4e0Smrg trap " 386e6d5e4e0Smrg echo '$0: caught signal, cleaning up...' >&2 387e6d5e4e0Smrg rmdir '$lockdir' 388e6d5e4e0Smrg exit 1 389e6d5e4e0Smrg " 1 2 13 15 390e6d5e4e0Smrg numtries=100 391e6d5e4e0Smrg i=$numtries 392e6d5e4e0Smrg while test $i -gt 0; do 393e6d5e4e0Smrg # mkdir is a portable test-and-set. 394e6d5e4e0Smrg if mkdir "$lockdir" 2>/dev/null; then 395e6d5e4e0Smrg # This process acquired the lock. 396e6d5e4e0Smrg "$@" -MD 397e6d5e4e0Smrg stat=$? 398e6d5e4e0Smrg # Release the lock. 399e6d5e4e0Smrg rmdir "$lockdir" 400e6d5e4e0Smrg break 401e6d5e4e0Smrg else 402e6d5e4e0Smrg # If the lock is being held by a different process, wait 403e6d5e4e0Smrg # until the winning process is done or we timeout. 404e6d5e4e0Smrg while test -d "$lockdir" && test $i -gt 0; do 405e6d5e4e0Smrg sleep 1 406e6d5e4e0Smrg i=`expr $i - 1` 407e6d5e4e0Smrg done 408e6d5e4e0Smrg fi 409e6d5e4e0Smrg i=`expr $i - 1` 410e6d5e4e0Smrg done 411e6d5e4e0Smrg trap - 1 2 13 15 412e6d5e4e0Smrg if test $i -le 0; then 413e6d5e4e0Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414e6d5e4e0Smrg echo "$0: check lockdir '$lockdir'" >&2 415e6d5e4e0Smrg exit 1 416e6d5e4e0Smrg fi 4177914d74bSmrg 418e6d5e4e0Smrg if test $stat -ne 0; then 4197914d74bSmrg rm -f "$tmpdepfile" 4207914d74bSmrg exit $stat 4217914d74bSmrg fi 4227914d74bSmrg rm -f "$depfile" 4237914d74bSmrg # Each line is of the form `foo.o: dependent.h', 4247914d74bSmrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4257914d74bSmrg # Do two passes, one to just change these to 4267914d74bSmrg # `$object: dependent.h' and one to simply `dependent.h:'. 4277914d74bSmrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4287914d74bSmrg # Some versions of the HPUX 10.20 sed can't process this invocation 4297914d74bSmrg # correctly. Breaking it into two sed invocations is a workaround. 430e6d5e4e0Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431e6d5e4e0Smrg | sed -e 's/$/ :/' >> "$depfile" 4327914d74bSmrg rm -f "$tmpdepfile" 4337914d74bSmrg ;; 4347914d74bSmrg 4357914d74bSmrghp2) 4367914d74bSmrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4377914d74bSmrg # compilers, which have integrated preprocessors. The correct option 4387914d74bSmrg # to use with these is +Maked; it writes dependencies to a file named 4397914d74bSmrg # 'foo.d', which lands next to the object file, wherever that 4407914d74bSmrg # happens to be. 4417914d74bSmrg # Much of this is similar to the tru64 case; see comments there. 442e6d5e4e0Smrg set_dir_from "$object" 443e6d5e4e0Smrg set_base_from "$object" 4447914d74bSmrg if test "$libtool" = yes; then 4457914d74bSmrg tmpdepfile1=$dir$base.d 4467914d74bSmrg tmpdepfile2=$dir.libs/$base.d 4477914d74bSmrg "$@" -Wc,+Maked 4487914d74bSmrg else 4497914d74bSmrg tmpdepfile1=$dir$base.d 4507914d74bSmrg tmpdepfile2=$dir$base.d 4517914d74bSmrg "$@" +Maked 4527914d74bSmrg fi 4537914d74bSmrg stat=$? 454e6d5e4e0Smrg if test $stat -ne 0; then 4557914d74bSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4567914d74bSmrg exit $stat 4577914d74bSmrg fi 4587914d74bSmrg 4597914d74bSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4607914d74bSmrg do 4617914d74bSmrg test -f "$tmpdepfile" && break 4627914d74bSmrg done 4637914d74bSmrg if test -f "$tmpdepfile"; then 464e6d5e4e0Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465e6d5e4e0Smrg # Add 'dependent.h:' lines. 466e8ead290Smrg sed -ne '2,${ 467e6d5e4e0Smrg s/^ *// 468e6d5e4e0Smrg s/ \\*$// 469e6d5e4e0Smrg s/$/:/ 470e6d5e4e0Smrg p 471e6d5e4e0Smrg }' "$tmpdepfile" >> "$depfile" 4727914d74bSmrg else 473e6d5e4e0Smrg make_dummy_depfile 4747914d74bSmrg fi 4757914d74bSmrg rm -f "$tmpdepfile" "$tmpdepfile2" 4767914d74bSmrg ;; 4777914d74bSmrg 4787914d74bSmrgtru64) 479e6d5e4e0Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 480e6d5e4e0Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481e6d5e4e0Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482e6d5e4e0Smrg # dependencies in 'foo.d' instead, so we check for that too. 483e6d5e4e0Smrg # Subdirectories are respected. 484e6d5e4e0Smrg set_dir_from "$object" 485e6d5e4e0Smrg set_base_from "$object" 486e6d5e4e0Smrg 487e6d5e4e0Smrg if test "$libtool" = yes; then 488e6d5e4e0Smrg # Libtool generates 2 separate objects for the 2 libraries. These 489e6d5e4e0Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 490e6d5e4e0Smrg # in $dir$base.o.d. We have to check for both files, because 491e6d5e4e0Smrg # one of the two compilations can be disabled. We should prefer 492e6d5e4e0Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493e6d5e4e0Smrg # automatically cleaned when .libs/ is deleted, while ignoring 494e6d5e4e0Smrg # the former would cause a distcleancheck panic. 495e6d5e4e0Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496e6d5e4e0Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497e6d5e4e0Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498e6d5e4e0Smrg "$@" -Wc,-MD 499e6d5e4e0Smrg else 500e6d5e4e0Smrg tmpdepfile1=$dir$base.d 501e6d5e4e0Smrg tmpdepfile2=$dir$base.d 502e6d5e4e0Smrg tmpdepfile3=$dir$base.d 503e6d5e4e0Smrg "$@" -MD 504e6d5e4e0Smrg fi 505e6d5e4e0Smrg 506e6d5e4e0Smrg stat=$? 507e6d5e4e0Smrg if test $stat -ne 0; then 508e6d5e4e0Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509e6d5e4e0Smrg exit $stat 510e6d5e4e0Smrg fi 511e6d5e4e0Smrg 512e6d5e4e0Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513e6d5e4e0Smrg do 514e6d5e4e0Smrg test -f "$tmpdepfile" && break 515e6d5e4e0Smrg done 516e6d5e4e0Smrg # Same post-processing that is required for AIX mode. 517e6d5e4e0Smrg aix_post_process_depfile 518e6d5e4e0Smrg ;; 519e6d5e4e0Smrg 520e6d5e4e0Smrgmsvc7) 521e6d5e4e0Smrg if test "$libtool" = yes; then 522e6d5e4e0Smrg showIncludes=-Wc,-showIncludes 523e6d5e4e0Smrg else 524e6d5e4e0Smrg showIncludes=-showIncludes 525e6d5e4e0Smrg fi 526e6d5e4e0Smrg "$@" $showIncludes > "$tmpdepfile" 527e6d5e4e0Smrg stat=$? 528e6d5e4e0Smrg grep -v '^Note: including file: ' "$tmpdepfile" 529e6d5e4e0Smrg if test $stat -ne 0; then 530e6d5e4e0Smrg rm -f "$tmpdepfile" 531e6d5e4e0Smrg exit $stat 532e6d5e4e0Smrg fi 533e6d5e4e0Smrg rm -f "$depfile" 534e6d5e4e0Smrg echo "$object : \\" > "$depfile" 535e6d5e4e0Smrg # The first sed program below extracts the file names and escapes 536e6d5e4e0Smrg # backslashes for cygpath. The second sed program outputs the file 537e6d5e4e0Smrg # name when reading, but also accumulates all include files in the 538e6d5e4e0Smrg # hold buffer in order to output them again at the end. This only 539e6d5e4e0Smrg # works with sed implementations that can handle large buffers. 540e6d5e4e0Smrg sed < "$tmpdepfile" -n ' 541e6d5e4e0Smrg/^Note: including file: *\(.*\)/ { 542e6d5e4e0Smrg s//\1/ 543e6d5e4e0Smrg s/\\/\\\\/g 544e6d5e4e0Smrg p 545e6d5e4e0Smrg}' | $cygpath_u | sort -u | sed -n ' 546e6d5e4e0Smrgs/ /\\ /g 547e6d5e4e0Smrgs/\(.*\)/'"$tab"'\1 \\/p 548e6d5e4e0Smrgs/.\(.*\) \\/\1:/ 549e6d5e4e0SmrgH 550e6d5e4e0Smrg$ { 551e6d5e4e0Smrg s/.*/'"$tab"'/ 552e6d5e4e0Smrg G 553e6d5e4e0Smrg p 554e6d5e4e0Smrg}' >> "$depfile" 5559d0ccd10Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556e6d5e4e0Smrg rm -f "$tmpdepfile" 557e6d5e4e0Smrg ;; 558e6d5e4e0Smrg 559e6d5e4e0Smrgmsvc7msys) 560e6d5e4e0Smrg # This case exists only to let depend.m4 do its work. It works by 561e6d5e4e0Smrg # looking at the text of this script. This case will never be run, 562e6d5e4e0Smrg # since it is checked for above. 563e6d5e4e0Smrg exit 1 564e6d5e4e0Smrg ;; 5657914d74bSmrg 5667914d74bSmrg#nosideeffect) 5677914d74bSmrg # This comment above is used by automake to tell side-effect 5687914d74bSmrg # dependency tracking mechanisms from slower ones. 5697914d74bSmrg 5707914d74bSmrgdashmstdout) 5717914d74bSmrg # Important note: in order to support this mode, a compiler *must* 5727914d74bSmrg # always write the preprocessed file to stdout, regardless of -o. 5737914d74bSmrg "$@" || exit $? 5747914d74bSmrg 5757914d74bSmrg # Remove the call to Libtool. 5767914d74bSmrg if test "$libtool" = yes; then 577e8ead290Smrg while test "X$1" != 'X--mode=compile'; do 5787914d74bSmrg shift 5797914d74bSmrg done 5807914d74bSmrg shift 5817914d74bSmrg fi 5827914d74bSmrg 583e6d5e4e0Smrg # Remove '-o $object'. 5847914d74bSmrg IFS=" " 5857914d74bSmrg for arg 5867914d74bSmrg do 5877914d74bSmrg case $arg in 5887914d74bSmrg -o) 5897914d74bSmrg shift 5907914d74bSmrg ;; 5917914d74bSmrg $object) 5927914d74bSmrg shift 5937914d74bSmrg ;; 5947914d74bSmrg *) 5957914d74bSmrg set fnord "$@" "$arg" 5967914d74bSmrg shift # fnord 5977914d74bSmrg shift # $arg 5987914d74bSmrg ;; 5997914d74bSmrg esac 6007914d74bSmrg done 6017914d74bSmrg 6027914d74bSmrg test -z "$dashmflag" && dashmflag=-M 603e6d5e4e0Smrg # Require at least two characters before searching for ':' 6047914d74bSmrg # in the target name. This is to cope with DOS-style filenames: 605e6d5e4e0Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6067914d74bSmrg "$@" $dashmflag | 607e6d5e4e0Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6087914d74bSmrg rm -f "$depfile" 6097914d74bSmrg cat < "$tmpdepfile" > "$depfile" 610e6d5e4e0Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611e6d5e4e0Smrg # correctly. Breaking it into two sed invocations is a workaround. 612e6d5e4e0Smrg tr ' ' "$nl" < "$tmpdepfile" \ 613e6d5e4e0Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614e6d5e4e0Smrg | sed -e 's/$/ :/' >> "$depfile" 6157914d74bSmrg rm -f "$tmpdepfile" 6167914d74bSmrg ;; 6177914d74bSmrg 6187914d74bSmrgdashXmstdout) 6197914d74bSmrg # This case only exists to satisfy depend.m4. It is never actually 6207914d74bSmrg # run, as this mode is specially recognized in the preamble. 6217914d74bSmrg exit 1 6227914d74bSmrg ;; 6237914d74bSmrg 6247914d74bSmrgmakedepend) 6257914d74bSmrg "$@" || exit $? 6267914d74bSmrg # Remove any Libtool call 6277914d74bSmrg if test "$libtool" = yes; then 628e8ead290Smrg while test "X$1" != 'X--mode=compile'; do 6297914d74bSmrg shift 6307914d74bSmrg done 6317914d74bSmrg shift 6327914d74bSmrg fi 6337914d74bSmrg # X makedepend 6347914d74bSmrg shift 635e8ead290Smrg cleared=no eat=no 636e8ead290Smrg for arg 637e8ead290Smrg do 6387914d74bSmrg case $cleared in 6397914d74bSmrg no) 6407914d74bSmrg set ""; shift 6417914d74bSmrg cleared=yes ;; 6427914d74bSmrg esac 643e8ead290Smrg if test $eat = yes; then 644e8ead290Smrg eat=no 645e8ead290Smrg continue 646e8ead290Smrg fi 6477914d74bSmrg case "$arg" in 6487914d74bSmrg -D*|-I*) 6497914d74bSmrg set fnord "$@" "$arg"; shift ;; 6507914d74bSmrg # Strip any option that makedepend may not understand. Remove 6517914d74bSmrg # the object too, otherwise makedepend will parse it as a source file. 652e8ead290Smrg -arch) 653e8ead290Smrg eat=yes ;; 6547914d74bSmrg -*|$object) 6557914d74bSmrg ;; 6567914d74bSmrg *) 6577914d74bSmrg set fnord "$@" "$arg"; shift ;; 6587914d74bSmrg esac 6597914d74bSmrg done 660e8ead290Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6617914d74bSmrg touch "$tmpdepfile" 6627914d74bSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6637914d74bSmrg rm -f "$depfile" 664e6d5e4e0Smrg # makedepend may prepend the VPATH from the source file name to the object. 665e6d5e4e0Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 666e6d5e4e0Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667e6d5e4e0Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668e6d5e4e0Smrg # correctly. Breaking it into two sed invocations is a workaround. 669e6d5e4e0Smrg sed '1,2d' "$tmpdepfile" \ 670e6d5e4e0Smrg | tr ' ' "$nl" \ 671e6d5e4e0Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672e6d5e4e0Smrg | sed -e 's/$/ :/' >> "$depfile" 6737914d74bSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6747914d74bSmrg ;; 6757914d74bSmrg 6767914d74bSmrgcpp) 6777914d74bSmrg # Important note: in order to support this mode, a compiler *must* 6787914d74bSmrg # always write the preprocessed file to stdout. 6797914d74bSmrg "$@" || exit $? 6807914d74bSmrg 6817914d74bSmrg # Remove the call to Libtool. 6827914d74bSmrg if test "$libtool" = yes; then 683e8ead290Smrg while test "X$1" != 'X--mode=compile'; do 6847914d74bSmrg shift 6857914d74bSmrg done 6867914d74bSmrg shift 6877914d74bSmrg fi 6887914d74bSmrg 689e6d5e4e0Smrg # Remove '-o $object'. 6907914d74bSmrg IFS=" " 6917914d74bSmrg for arg 6927914d74bSmrg do 6937914d74bSmrg case $arg in 6947914d74bSmrg -o) 6957914d74bSmrg shift 6967914d74bSmrg ;; 6977914d74bSmrg $object) 6987914d74bSmrg shift 6997914d74bSmrg ;; 7007914d74bSmrg *) 7017914d74bSmrg set fnord "$@" "$arg" 7027914d74bSmrg shift # fnord 7037914d74bSmrg shift # $arg 7047914d74bSmrg ;; 7057914d74bSmrg esac 7067914d74bSmrg done 7077914d74bSmrg 708e6d5e4e0Smrg "$@" -E \ 709e6d5e4e0Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710e6d5e4e0Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711e6d5e4e0Smrg | sed '$ s: \\$::' > "$tmpdepfile" 7127914d74bSmrg rm -f "$depfile" 7137914d74bSmrg echo "$object : \\" > "$depfile" 7147914d74bSmrg cat < "$tmpdepfile" >> "$depfile" 7157914d74bSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7167914d74bSmrg rm -f "$tmpdepfile" 7177914d74bSmrg ;; 7187914d74bSmrg 7197914d74bSmrgmsvisualcpp) 7207914d74bSmrg # Important note: in order to support this mode, a compiler *must* 721e8ead290Smrg # always write the preprocessed file to stdout. 7227914d74bSmrg "$@" || exit $? 723e8ead290Smrg 724e8ead290Smrg # Remove the call to Libtool. 725e8ead290Smrg if test "$libtool" = yes; then 726e8ead290Smrg while test "X$1" != 'X--mode=compile'; do 727e8ead290Smrg shift 728e8ead290Smrg done 729e8ead290Smrg shift 730e8ead290Smrg fi 731e8ead290Smrg 7327914d74bSmrg IFS=" " 7337914d74bSmrg for arg 7347914d74bSmrg do 7357914d74bSmrg case "$arg" in 736e8ead290Smrg -o) 737e8ead290Smrg shift 738e8ead290Smrg ;; 739e8ead290Smrg $object) 740e8ead290Smrg shift 741e8ead290Smrg ;; 7427914d74bSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743e6d5e4e0Smrg set fnord "$@" 744e6d5e4e0Smrg shift 745e6d5e4e0Smrg shift 746e6d5e4e0Smrg ;; 7477914d74bSmrg *) 748e6d5e4e0Smrg set fnord "$@" "$arg" 749e6d5e4e0Smrg shift 750e6d5e4e0Smrg shift 751e6d5e4e0Smrg ;; 7527914d74bSmrg esac 7537914d74bSmrg done 754e8ead290Smrg "$@" -E 2>/dev/null | 755e8ead290Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7567914d74bSmrg rm -f "$depfile" 7577914d74bSmrg echo "$object : \\" > "$depfile" 758e6d5e4e0Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759e6d5e4e0Smrg echo "$tab" >> "$depfile" 760e8ead290Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7617914d74bSmrg rm -f "$tmpdepfile" 7627914d74bSmrg ;; 7637914d74bSmrg 764e8ead290Smrgmsvcmsys) 765e8ead290Smrg # This case exists only to let depend.m4 do its work. It works by 766e8ead290Smrg # looking at the text of this script. This case will never be run, 767e8ead290Smrg # since it is checked for above. 768e8ead290Smrg exit 1 769e8ead290Smrg ;; 770e8ead290Smrg 7717914d74bSmrgnone) 7727914d74bSmrg exec "$@" 7737914d74bSmrg ;; 7747914d74bSmrg 7757914d74bSmrg*) 7767914d74bSmrg echo "Unknown depmode $depmode" 1>&2 7777914d74bSmrg exit 1 7787914d74bSmrg ;; 7797914d74bSmrgesac 7807914d74bSmrg 7817914d74bSmrgexit 0 7827914d74bSmrg 7837914d74bSmrg# Local Variables: 7847914d74bSmrg# mode: shell-script 7857914d74bSmrg# sh-indentation: 2 7867914d74bSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 7877914d74bSmrg# time-stamp-start: "scriptversion=" 7887914d74bSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789e8ead290Smrg# time-stamp-time-zone: "UTC" 790e8ead290Smrg# time-stamp-end: "; # UTC" 7917914d74bSmrg# End: 792