depcomp revision d9dcd5ae
1191cded7Smrg#! /bin/sh 2191cded7Smrg# depcomp - compile a program generating dependencies as side-effects 3191cded7Smrg 4d9dcd5aeSmrgscriptversion=2012-10-18.11; # UTC 5191cded7Smrg 6d9dcd5aeSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc. 7191cded7Smrg 8191cded7Smrg# This program is free software; you can redistribute it and/or modify 9191cded7Smrg# it under the terms of the GNU General Public License as published by 10191cded7Smrg# the Free Software Foundation; either version 2, or (at your option) 11191cded7Smrg# any later version. 12191cded7Smrg 13191cded7Smrg# This program is distributed in the hope that it will be useful, 14191cded7Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15191cded7Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16191cded7Smrg# GNU General Public License for more details. 17191cded7Smrg 18191cded7Smrg# You should have received a copy of the GNU General Public License 19ba064abeSmrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 20191cded7Smrg 21191cded7Smrg# As a special exception to the GNU General Public License, if you 22191cded7Smrg# distribute this file as part of a program that contains a 23191cded7Smrg# configuration script generated by Autoconf, you may include it under 24191cded7Smrg# the same distribution terms that you use for the rest of that program. 25191cded7Smrg 26191cded7Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27191cded7Smrg 28191cded7Smrgcase $1 in 29191cded7Smrg '') 30d9dcd5aeSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31d9dcd5aeSmrg exit 1; 32d9dcd5aeSmrg ;; 33191cded7Smrg -h | --h*) 34191cded7Smrg cat <<\EOF 35191cded7SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36191cded7Smrg 37191cded7SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38191cded7Smrgas side-effects. 39191cded7Smrg 40191cded7SmrgEnvironment variables: 41191cded7Smrg depmode Dependency tracking mode. 42d9dcd5aeSmrg source Source file read by 'PROGRAMS ARGS'. 43d9dcd5aeSmrg object Object file output by 'PROGRAMS ARGS'. 44191cded7Smrg DEPDIR directory where to store dependencies. 45191cded7Smrg depfile Dependency file to output. 46d9dcd5aeSmrg tmpdepfile Temporary file to use when outputting dependencies. 47191cded7Smrg libtool Whether libtool is used (yes/no). 48191cded7Smrg 49191cded7SmrgReport bugs to <bug-automake@gnu.org>. 50191cded7SmrgEOF 51191cded7Smrg exit $? 52191cded7Smrg ;; 53191cded7Smrg -v | --v*) 54191cded7Smrg echo "depcomp $scriptversion" 55191cded7Smrg exit $? 56191cded7Smrg ;; 57191cded7Smrgesac 58191cded7Smrg 59d9dcd5aeSmrg# Get the directory component of the given path, and save it in the 60d9dcd5aeSmrg# global variables '$dir'. Note that this directory component will 61d9dcd5aeSmrg# be either empty or ending with a '/' character. This is deliberate. 62d9dcd5aeSmrgset_dir_from () 63d9dcd5aeSmrg{ 64d9dcd5aeSmrg case $1 in 65d9dcd5aeSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66d9dcd5aeSmrg *) dir=;; 67d9dcd5aeSmrg esac 68d9dcd5aeSmrg} 69d9dcd5aeSmrg 70d9dcd5aeSmrg# Get the suffix-stripped basename of the given path, and save it the 71d9dcd5aeSmrg# global variable '$base'. 72d9dcd5aeSmrgset_base_from () 73d9dcd5aeSmrg{ 74d9dcd5aeSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75d9dcd5aeSmrg} 76d9dcd5aeSmrg 77d9dcd5aeSmrg# If no dependency file was actually created by the compiler invocation, 78d9dcd5aeSmrg# we still have to create a dummy depfile, to avoid errors with the 79d9dcd5aeSmrg# Makefile "include basename.Plo" scheme. 80d9dcd5aeSmrgmake_dummy_depfile () 81d9dcd5aeSmrg{ 82d9dcd5aeSmrg echo "#dummy" > "$depfile" 83d9dcd5aeSmrg} 84d9dcd5aeSmrg 85d9dcd5aeSmrg# Factor out some common post-processing of the generated depfile. 86d9dcd5aeSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87d9dcd5aeSmrgaix_post_process_depfile () 88d9dcd5aeSmrg{ 89d9dcd5aeSmrg # If the compiler actually managed to produce a dependency file, 90d9dcd5aeSmrg # post-process it. 91d9dcd5aeSmrg if test -f "$tmpdepfile"; then 92d9dcd5aeSmrg # Each line is of the form 'foo.o: dependency.h'. 93d9dcd5aeSmrg # Do two passes, one to just change these to 94d9dcd5aeSmrg # $object: dependency.h 95d9dcd5aeSmrg # and one to simply output 96d9dcd5aeSmrg # dependency.h: 97d9dcd5aeSmrg # which is needed to avoid the deleted-header problem. 98d9dcd5aeSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99d9dcd5aeSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100d9dcd5aeSmrg } > "$depfile" 101d9dcd5aeSmrg rm -f "$tmpdepfile" 102d9dcd5aeSmrg else 103d9dcd5aeSmrg make_dummy_depfile 104d9dcd5aeSmrg fi 105d9dcd5aeSmrg} 106d9dcd5aeSmrg 107d9dcd5aeSmrg# A tabulation character. 108d9dcd5aeSmrgtab=' ' 109d9dcd5aeSmrg# A newline character. 110d9dcd5aeSmrgnl=' 111d9dcd5aeSmrg' 112d9dcd5aeSmrg# Character ranges might be problematic outside the C locale. 113d9dcd5aeSmrg# These definitions help. 114d9dcd5aeSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115d9dcd5aeSmrglower=abcdefghijklmnopqrstuvwxyz 116d9dcd5aeSmrgdigits=0123456789 117d9dcd5aeSmrgalpha=${upper}${lower} 118d9dcd5aeSmrg 119191cded7Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120191cded7Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 121191cded7Smrg exit 1 122191cded7Smrgfi 123191cded7Smrg 124191cded7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125191cded7Smrgdepfile=${depfile-`echo "$object" | 126191cded7Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127191cded7Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128191cded7Smrg 129191cded7Smrgrm -f "$tmpdepfile" 130191cded7Smrg 131d9dcd5aeSmrg# Avoid interferences from the environment. 132d9dcd5aeSmrggccflag= dashmflag= 133d9dcd5aeSmrg 134191cded7Smrg# Some modes work just like other modes, but use different flags. We 135191cded7Smrg# parameterize here, but still list the modes in the big case below, 136191cded7Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 137191cded7Smrg# here, because this file can only contain one case statement. 138191cded7Smrgif test "$depmode" = hp; then 139191cded7Smrg # HP compiler uses -M and no extra arg. 140191cded7Smrg gccflag=-M 141191cded7Smrg depmode=gcc 142191cded7Smrgfi 143191cded7Smrg 144191cded7Smrgif test "$depmode" = dashXmstdout; then 145d9dcd5aeSmrg # This is just like dashmstdout with a different argument. 146d9dcd5aeSmrg dashmflag=-xM 147d9dcd5aeSmrg depmode=dashmstdout 148191cded7Smrgfi 149191cded7Smrg 150ba064abeSmrgcygpath_u="cygpath -u -f -" 151ba064abeSmrgif test "$depmode" = msvcmsys; then 152d9dcd5aeSmrg # This is just like msvisualcpp but w/o cygpath translation. 153d9dcd5aeSmrg # Just convert the backslash-escaped backslashes to single forward 154d9dcd5aeSmrg # slashes to satisfy depend.m4 155d9dcd5aeSmrg cygpath_u='sed s,\\\\,/,g' 156d9dcd5aeSmrg depmode=msvisualcpp 157d9dcd5aeSmrgfi 158d9dcd5aeSmrg 159d9dcd5aeSmrgif test "$depmode" = msvc7msys; then 160d9dcd5aeSmrg # This is just like msvc7 but w/o cygpath translation. 161d9dcd5aeSmrg # Just convert the backslash-escaped backslashes to single forward 162d9dcd5aeSmrg # slashes to satisfy depend.m4 163d9dcd5aeSmrg cygpath_u='sed s,\\\\,/,g' 164d9dcd5aeSmrg depmode=msvc7 165d9dcd5aeSmrgfi 166d9dcd5aeSmrg 167d9dcd5aeSmrgif test "$depmode" = xlc; then 168d9dcd5aeSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169d9dcd5aeSmrg gccflag=-qmakedep=gcc,-MF 170d9dcd5aeSmrg depmode=gcc 171ba064abeSmrgfi 172ba064abeSmrg 173191cded7Smrgcase "$depmode" in 174191cded7Smrggcc3) 175191cded7Smrg## gcc 3 implements dependency tracking that does exactly what 176191cded7Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177191cded7Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 178b290cf36Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179b290cf36Smrg## the command line argument order; so add the flags where they 180b290cf36Smrg## appear in depend2.am. Note that the slowdown incurred here 181b290cf36Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182b290cf36Smrg for arg 183b290cf36Smrg do 184b290cf36Smrg case $arg in 185b290cf36Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186b290cf36Smrg *) set fnord "$@" "$arg" ;; 187b290cf36Smrg esac 188b290cf36Smrg shift # fnord 189b290cf36Smrg shift # $arg 190b290cf36Smrg done 191b290cf36Smrg "$@" 192191cded7Smrg stat=$? 193d9dcd5aeSmrg if test $stat -ne 0; then 194191cded7Smrg rm -f "$tmpdepfile" 195191cded7Smrg exit $stat 196191cded7Smrg fi 197191cded7Smrg mv "$tmpdepfile" "$depfile" 198191cded7Smrg ;; 199191cded7Smrg 200191cded7Smrggcc) 201d9dcd5aeSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202d9dcd5aeSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203d9dcd5aeSmrg## (see the conditional assignment to $gccflag above). 204191cded7Smrg## There are various ways to get dependency output from gcc. Here's 205191cded7Smrg## why we pick this rather obscure method: 206191cded7Smrg## - Don't want to use -MD because we'd like the dependencies to end 207191cded7Smrg## up in a subdir. Having to rename by hand is ugly. 208191cded7Smrg## (We might end up doing this anyway to support other compilers.) 209191cded7Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210d9dcd5aeSmrg## -MM, not -M (despite what the docs say). Also, it might not be 211d9dcd5aeSmrg## supported by the other compilers which use the 'gcc' depmode. 212191cded7Smrg## - Using -M directly means running the compiler twice (even worse 213191cded7Smrg## than renaming). 214191cded7Smrg if test -z "$gccflag"; then 215191cded7Smrg gccflag=-MD, 216191cded7Smrg fi 217191cded7Smrg "$@" -Wp,"$gccflag$tmpdepfile" 218191cded7Smrg stat=$? 219d9dcd5aeSmrg if test $stat -ne 0; then 220191cded7Smrg rm -f "$tmpdepfile" 221191cded7Smrg exit $stat 222191cded7Smrg fi 223191cded7Smrg rm -f "$depfile" 224191cded7Smrg echo "$object : \\" > "$depfile" 225d9dcd5aeSmrg # The second -e expression handles DOS-style file names with drive 226d9dcd5aeSmrg # letters. 227191cded7Smrg sed -e 's/^[^:]*: / /' \ 228191cded7Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229d9dcd5aeSmrg## This next piece of magic avoids the "deleted header file" problem. 230191cded7Smrg## The problem is that when a header file which appears in a .P file 231191cded7Smrg## is deleted, the dependency causes make to die (because there is 232191cded7Smrg## typically no way to rebuild the header). We avoid this by adding 233191cded7Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 234191cded7Smrg## this for us directly. 235d9dcd5aeSmrg## Some versions of gcc put a space before the ':'. On the theory 236191cded7Smrg## that the space means something, we add a space to the output as 237d9dcd5aeSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 238d9dcd5aeSmrg## to the object. Take care to not repeat it in the output. 239191cded7Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 240191cded7Smrg## correctly. Breaking it into two sed invocations is a workaround. 241d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 242d9dcd5aeSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 244191cded7Smrg rm -f "$tmpdepfile" 245191cded7Smrg ;; 246191cded7Smrg 247191cded7Smrghp) 248191cded7Smrg # This case exists only to let depend.m4 do its work. It works by 249191cded7Smrg # looking at the text of this script. This case will never be run, 250191cded7Smrg # since it is checked for above. 251191cded7Smrg exit 1 252191cded7Smrg ;; 253191cded7Smrg 254191cded7Smrgsgi) 255191cded7Smrg if test "$libtool" = yes; then 256191cded7Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 257191cded7Smrg else 258191cded7Smrg "$@" -MDupdate "$tmpdepfile" 259191cded7Smrg fi 260191cded7Smrg stat=$? 261d9dcd5aeSmrg if test $stat -ne 0; then 262191cded7Smrg rm -f "$tmpdepfile" 263191cded7Smrg exit $stat 264191cded7Smrg fi 265191cded7Smrg rm -f "$depfile" 266191cded7Smrg 267191cded7Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268191cded7Smrg echo "$object : \\" > "$depfile" 269191cded7Smrg # Clip off the initial element (the dependent). Don't try to be 270191cded7Smrg # clever and replace this with sed code, as IRIX sed won't handle 271191cded7Smrg # lines with more than a fixed number of characters (4096 in 272191cded7Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273d9dcd5aeSmrg # the IRIX cc adds comments like '#:fec' to the end of the 274191cded7Smrg # dependency line. 275d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 276d9dcd5aeSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277d9dcd5aeSmrg | tr "$nl" ' ' >> "$depfile" 278ba064abeSmrg echo >> "$depfile" 279191cded7Smrg # The second pass generates a dummy entry for each header file. 280d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 281d9dcd5aeSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282d9dcd5aeSmrg >> "$depfile" 283191cded7Smrg else 284d9dcd5aeSmrg make_dummy_depfile 285191cded7Smrg fi 286191cded7Smrg rm -f "$tmpdepfile" 287191cded7Smrg ;; 288191cded7Smrg 289d9dcd5aeSmrgxlc) 290d9dcd5aeSmrg # This case exists only to let depend.m4 do its work. It works by 291d9dcd5aeSmrg # looking at the text of this script. This case will never be run, 292d9dcd5aeSmrg # since it is checked for above. 293d9dcd5aeSmrg exit 1 294d9dcd5aeSmrg ;; 295d9dcd5aeSmrg 296191cded7Smrgaix) 297191cded7Smrg # The C for AIX Compiler uses -M and outputs the dependencies 298191cded7Smrg # in a .u file. In older versions, this file always lives in the 299d9dcd5aeSmrg # current directory. Also, the AIX compiler puts '$object:' at the 300191cded7Smrg # start of each line; $object doesn't have directory information. 301191cded7Smrg # Version 6 uses the directory in both cases. 302d9dcd5aeSmrg set_dir_from "$object" 303d9dcd5aeSmrg set_base_from "$object" 304191cded7Smrg if test "$libtool" = yes; then 305b290cf36Smrg tmpdepfile1=$dir$base.u 306b290cf36Smrg tmpdepfile2=$base.u 307b290cf36Smrg tmpdepfile3=$dir.libs/$base.u 308191cded7Smrg "$@" -Wc,-M 309191cded7Smrg else 310b290cf36Smrg tmpdepfile1=$dir$base.u 311b290cf36Smrg tmpdepfile2=$dir$base.u 312b290cf36Smrg tmpdepfile3=$dir$base.u 313191cded7Smrg "$@" -M 314191cded7Smrg fi 315191cded7Smrg stat=$? 316d9dcd5aeSmrg if test $stat -ne 0; then 317b290cf36Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318191cded7Smrg exit $stat 319191cded7Smrg fi 320191cded7Smrg 321b290cf36Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322b290cf36Smrg do 323b290cf36Smrg test -f "$tmpdepfile" && break 324b290cf36Smrg done 325d9dcd5aeSmrg aix_post_process_depfile 326d9dcd5aeSmrg ;; 327d9dcd5aeSmrg 328d9dcd5aeSmrgtcc) 329d9dcd5aeSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330d9dcd5aeSmrg # FIXME: That version still under development at the moment of writing. 331d9dcd5aeSmrg # Make that this statement remains true also for stable, released 332d9dcd5aeSmrg # versions. 333d9dcd5aeSmrg # It will wrap lines (doesn't matter whether long or short) with a 334d9dcd5aeSmrg # trailing '\', as in: 335d9dcd5aeSmrg # 336d9dcd5aeSmrg # foo.o : \ 337d9dcd5aeSmrg # foo.c \ 338d9dcd5aeSmrg # foo.h \ 339d9dcd5aeSmrg # 340d9dcd5aeSmrg # It will put a trailing '\' even on the last line, and will use leading 341d9dcd5aeSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 342d9dcd5aeSmrg # "Emit spaces for -MD"). 343d9dcd5aeSmrg "$@" -MD -MF "$tmpdepfile" 344d9dcd5aeSmrg stat=$? 345d9dcd5aeSmrg if test $stat -ne 0; then 346d9dcd5aeSmrg rm -f "$tmpdepfile" 347d9dcd5aeSmrg exit $stat 348191cded7Smrg fi 349d9dcd5aeSmrg rm -f "$depfile" 350d9dcd5aeSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351d9dcd5aeSmrg # We have to change lines of the first kind to '$object: \'. 352d9dcd5aeSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353d9dcd5aeSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 354d9dcd5aeSmrg # dummy dependency, to avoid the deleted-header problem. 355d9dcd5aeSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356191cded7Smrg rm -f "$tmpdepfile" 357191cded7Smrg ;; 358191cded7Smrg 359d9dcd5aeSmrg## The order of this option in the case statement is important, since the 360d9dcd5aeSmrg## shell code in configure will try each of these formats in the order 361d9dcd5aeSmrg## listed in this file. A plain '-MD' option would be understood by many 362d9dcd5aeSmrg## compilers, so we must ensure this comes after the gcc and icc options. 363d9dcd5aeSmrgpgcc) 364d9dcd5aeSmrg # Portland's C compiler understands '-MD'. 365d9dcd5aeSmrg # Will always output deps to 'file.d' where file is the root name of the 366d9dcd5aeSmrg # source file under compilation, even if file resides in a subdirectory. 367d9dcd5aeSmrg # The object file name does not affect the name of the '.d' file. 368d9dcd5aeSmrg # pgcc 10.2 will output 369191cded7Smrg # foo.o: sub/foo.c sub/foo.h 370d9dcd5aeSmrg # and will wrap long lines using '\' : 371191cded7Smrg # foo.o: sub/foo.c ... \ 372191cded7Smrg # sub/foo.h ... \ 373191cded7Smrg # ... 374d9dcd5aeSmrg set_dir_from "$object" 375d9dcd5aeSmrg # Use the source, not the object, to determine the base name, since 376d9dcd5aeSmrg # that's sadly what pgcc will do too. 377d9dcd5aeSmrg set_base_from "$source" 378d9dcd5aeSmrg tmpdepfile=$base.d 379d9dcd5aeSmrg 380d9dcd5aeSmrg # For projects that build the same source file twice into different object 381d9dcd5aeSmrg # files, the pgcc approach of using the *source* file root name can cause 382d9dcd5aeSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383d9dcd5aeSmrg # the same $tmpdepfile. 384d9dcd5aeSmrg lockdir=$base.d-lock 385d9dcd5aeSmrg trap " 386d9dcd5aeSmrg echo '$0: caught signal, cleaning up...' >&2 387d9dcd5aeSmrg rmdir '$lockdir' 388d9dcd5aeSmrg exit 1 389d9dcd5aeSmrg " 1 2 13 15 390d9dcd5aeSmrg numtries=100 391d9dcd5aeSmrg i=$numtries 392d9dcd5aeSmrg while test $i -gt 0; do 393d9dcd5aeSmrg # mkdir is a portable test-and-set. 394d9dcd5aeSmrg if mkdir "$lockdir" 2>/dev/null; then 395d9dcd5aeSmrg # This process acquired the lock. 396d9dcd5aeSmrg "$@" -MD 397d9dcd5aeSmrg stat=$? 398d9dcd5aeSmrg # Release the lock. 399d9dcd5aeSmrg rmdir "$lockdir" 400d9dcd5aeSmrg break 401d9dcd5aeSmrg else 402d9dcd5aeSmrg # If the lock is being held by a different process, wait 403d9dcd5aeSmrg # until the winning process is done or we timeout. 404d9dcd5aeSmrg while test -d "$lockdir" && test $i -gt 0; do 405d9dcd5aeSmrg sleep 1 406d9dcd5aeSmrg i=`expr $i - 1` 407d9dcd5aeSmrg done 408d9dcd5aeSmrg fi 409d9dcd5aeSmrg i=`expr $i - 1` 410d9dcd5aeSmrg done 411d9dcd5aeSmrg trap - 1 2 13 15 412d9dcd5aeSmrg if test $i -le 0; then 413d9dcd5aeSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414d9dcd5aeSmrg echo "$0: check lockdir '$lockdir'" >&2 415d9dcd5aeSmrg exit 1 416d9dcd5aeSmrg fi 417191cded7Smrg 418d9dcd5aeSmrg if test $stat -ne 0; then 419191cded7Smrg rm -f "$tmpdepfile" 420191cded7Smrg exit $stat 421191cded7Smrg fi 422191cded7Smrg rm -f "$depfile" 423191cded7Smrg # Each line is of the form `foo.o: dependent.h', 424191cded7Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425191cded7Smrg # Do two passes, one to just change these to 426191cded7Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 427191cded7Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428191cded7Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 429191cded7Smrg # correctly. Breaking it into two sed invocations is a workaround. 430d9dcd5aeSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 432191cded7Smrg rm -f "$tmpdepfile" 433191cded7Smrg ;; 434191cded7Smrg 435b290cf36Smrghp2) 436b290cf36Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437b290cf36Smrg # compilers, which have integrated preprocessors. The correct option 438b290cf36Smrg # to use with these is +Maked; it writes dependencies to a file named 439b290cf36Smrg # 'foo.d', which lands next to the object file, wherever that 440b290cf36Smrg # happens to be. 441b290cf36Smrg # Much of this is similar to the tru64 case; see comments there. 442d9dcd5aeSmrg set_dir_from "$object" 443d9dcd5aeSmrg set_base_from "$object" 444b290cf36Smrg if test "$libtool" = yes; then 445b290cf36Smrg tmpdepfile1=$dir$base.d 446b290cf36Smrg tmpdepfile2=$dir.libs/$base.d 447b290cf36Smrg "$@" -Wc,+Maked 448b290cf36Smrg else 449b290cf36Smrg tmpdepfile1=$dir$base.d 450b290cf36Smrg tmpdepfile2=$dir$base.d 451b290cf36Smrg "$@" +Maked 452b290cf36Smrg fi 453b290cf36Smrg stat=$? 454d9dcd5aeSmrg if test $stat -ne 0; then 455b290cf36Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456b290cf36Smrg exit $stat 457b290cf36Smrg fi 458b290cf36Smrg 459b290cf36Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460b290cf36Smrg do 461b290cf36Smrg test -f "$tmpdepfile" && break 462b290cf36Smrg done 463b290cf36Smrg if test -f "$tmpdepfile"; then 464d9dcd5aeSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465d9dcd5aeSmrg # Add 'dependent.h:' lines. 466ba064abeSmrg sed -ne '2,${ 467d9dcd5aeSmrg s/^ *// 468d9dcd5aeSmrg s/ \\*$// 469d9dcd5aeSmrg s/$/:/ 470d9dcd5aeSmrg p 471d9dcd5aeSmrg }' "$tmpdepfile" >> "$depfile" 472b290cf36Smrg else 473d9dcd5aeSmrg make_dummy_depfile 474b290cf36Smrg fi 475b290cf36Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 476b290cf36Smrg ;; 477b290cf36Smrg 478191cded7Smrgtru64) 479d9dcd5aeSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 480d9dcd5aeSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481d9dcd5aeSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482d9dcd5aeSmrg # dependencies in 'foo.d' instead, so we check for that too. 483d9dcd5aeSmrg # Subdirectories are respected. 484d9dcd5aeSmrg set_dir_from "$object" 485d9dcd5aeSmrg set_base_from "$object" 486d9dcd5aeSmrg 487d9dcd5aeSmrg if test "$libtool" = yes; then 488d9dcd5aeSmrg # Libtool generates 2 separate objects for the 2 libraries. These 489d9dcd5aeSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 490d9dcd5aeSmrg # in $dir$base.o.d. We have to check for both files, because 491d9dcd5aeSmrg # one of the two compilations can be disabled. We should prefer 492d9dcd5aeSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493d9dcd5aeSmrg # automatically cleaned when .libs/ is deleted, while ignoring 494d9dcd5aeSmrg # the former would cause a distcleancheck panic. 495d9dcd5aeSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496d9dcd5aeSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497d9dcd5aeSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498d9dcd5aeSmrg "$@" -Wc,-MD 499d9dcd5aeSmrg else 500d9dcd5aeSmrg tmpdepfile1=$dir$base.d 501d9dcd5aeSmrg tmpdepfile2=$dir$base.d 502d9dcd5aeSmrg tmpdepfile3=$dir$base.d 503d9dcd5aeSmrg "$@" -MD 504d9dcd5aeSmrg fi 505d9dcd5aeSmrg 506d9dcd5aeSmrg stat=$? 507d9dcd5aeSmrg if test $stat -ne 0; then 508d9dcd5aeSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509d9dcd5aeSmrg exit $stat 510d9dcd5aeSmrg fi 511d9dcd5aeSmrg 512d9dcd5aeSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513d9dcd5aeSmrg do 514d9dcd5aeSmrg test -f "$tmpdepfile" && break 515d9dcd5aeSmrg done 516d9dcd5aeSmrg # Same post-processing that is required for AIX mode. 517d9dcd5aeSmrg aix_post_process_depfile 518d9dcd5aeSmrg ;; 519d9dcd5aeSmrg 520d9dcd5aeSmrgmsvc7) 521d9dcd5aeSmrg if test "$libtool" = yes; then 522d9dcd5aeSmrg showIncludes=-Wc,-showIncludes 523d9dcd5aeSmrg else 524d9dcd5aeSmrg showIncludes=-showIncludes 525d9dcd5aeSmrg fi 526d9dcd5aeSmrg "$@" $showIncludes > "$tmpdepfile" 527d9dcd5aeSmrg stat=$? 528d9dcd5aeSmrg grep -v '^Note: including file: ' "$tmpdepfile" 529d9dcd5aeSmrg if test $stat -ne 0; then 530d9dcd5aeSmrg rm -f "$tmpdepfile" 531d9dcd5aeSmrg exit $stat 532d9dcd5aeSmrg fi 533d9dcd5aeSmrg rm -f "$depfile" 534d9dcd5aeSmrg echo "$object : \\" > "$depfile" 535d9dcd5aeSmrg # The first sed program below extracts the file names and escapes 536d9dcd5aeSmrg # backslashes for cygpath. The second sed program outputs the file 537d9dcd5aeSmrg # name when reading, but also accumulates all include files in the 538d9dcd5aeSmrg # hold buffer in order to output them again at the end. This only 539d9dcd5aeSmrg # works with sed implementations that can handle large buffers. 540d9dcd5aeSmrg sed < "$tmpdepfile" -n ' 541d9dcd5aeSmrg/^Note: including file: *\(.*\)/ { 542d9dcd5aeSmrg s//\1/ 543d9dcd5aeSmrg s/\\/\\\\/g 544d9dcd5aeSmrg p 545d9dcd5aeSmrg}' | $cygpath_u | sort -u | sed -n ' 546d9dcd5aeSmrgs/ /\\ /g 547d9dcd5aeSmrgs/\(.*\)/'"$tab"'\1 \\/p 548d9dcd5aeSmrgs/.\(.*\) \\/\1:/ 549d9dcd5aeSmrgH 550d9dcd5aeSmrg$ { 551d9dcd5aeSmrg s/.*/'"$tab"'/ 552d9dcd5aeSmrg G 553d9dcd5aeSmrg p 554d9dcd5aeSmrg}' >> "$depfile" 555d9dcd5aeSmrg rm -f "$tmpdepfile" 556d9dcd5aeSmrg ;; 557d9dcd5aeSmrg 558d9dcd5aeSmrgmsvc7msys) 559d9dcd5aeSmrg # This case exists only to let depend.m4 do its work. It works by 560d9dcd5aeSmrg # looking at the text of this script. This case will never be run, 561d9dcd5aeSmrg # since it is checked for above. 562d9dcd5aeSmrg exit 1 563d9dcd5aeSmrg ;; 564191cded7Smrg 565191cded7Smrg#nosideeffect) 566191cded7Smrg # This comment above is used by automake to tell side-effect 567191cded7Smrg # dependency tracking mechanisms from slower ones. 568191cded7Smrg 569191cded7Smrgdashmstdout) 570191cded7Smrg # Important note: in order to support this mode, a compiler *must* 571191cded7Smrg # always write the preprocessed file to stdout, regardless of -o. 572191cded7Smrg "$@" || exit $? 573191cded7Smrg 574191cded7Smrg # Remove the call to Libtool. 575191cded7Smrg if test "$libtool" = yes; then 576ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 577191cded7Smrg shift 578191cded7Smrg done 579191cded7Smrg shift 580191cded7Smrg fi 581191cded7Smrg 582d9dcd5aeSmrg # Remove '-o $object'. 583191cded7Smrg IFS=" " 584191cded7Smrg for arg 585191cded7Smrg do 586191cded7Smrg case $arg in 587191cded7Smrg -o) 588191cded7Smrg shift 589191cded7Smrg ;; 590191cded7Smrg $object) 591191cded7Smrg shift 592191cded7Smrg ;; 593191cded7Smrg *) 594191cded7Smrg set fnord "$@" "$arg" 595191cded7Smrg shift # fnord 596191cded7Smrg shift # $arg 597191cded7Smrg ;; 598191cded7Smrg esac 599191cded7Smrg done 600191cded7Smrg 601191cded7Smrg test -z "$dashmflag" && dashmflag=-M 602d9dcd5aeSmrg # Require at least two characters before searching for ':' 603191cded7Smrg # in the target name. This is to cope with DOS-style filenames: 604d9dcd5aeSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 605191cded7Smrg "$@" $dashmflag | 606d9dcd5aeSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 607191cded7Smrg rm -f "$depfile" 608191cded7Smrg cat < "$tmpdepfile" > "$depfile" 609d9dcd5aeSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 610d9dcd5aeSmrg # correctly. Breaking it into two sed invocations is a workaround. 611d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 612d9dcd5aeSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 613d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 614191cded7Smrg rm -f "$tmpdepfile" 615191cded7Smrg ;; 616191cded7Smrg 617191cded7SmrgdashXmstdout) 618191cded7Smrg # This case only exists to satisfy depend.m4. It is never actually 619191cded7Smrg # run, as this mode is specially recognized in the preamble. 620191cded7Smrg exit 1 621191cded7Smrg ;; 622191cded7Smrg 623191cded7Smrgmakedepend) 624191cded7Smrg "$@" || exit $? 625191cded7Smrg # Remove any Libtool call 626191cded7Smrg if test "$libtool" = yes; then 627ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 628191cded7Smrg shift 629191cded7Smrg done 630191cded7Smrg shift 631191cded7Smrg fi 632191cded7Smrg # X makedepend 633191cded7Smrg shift 634ba064abeSmrg cleared=no eat=no 635ba064abeSmrg for arg 636ba064abeSmrg do 637191cded7Smrg case $cleared in 638191cded7Smrg no) 639191cded7Smrg set ""; shift 640191cded7Smrg cleared=yes ;; 641191cded7Smrg esac 642ba064abeSmrg if test $eat = yes; then 643ba064abeSmrg eat=no 644ba064abeSmrg continue 645ba064abeSmrg fi 646191cded7Smrg case "$arg" in 647191cded7Smrg -D*|-I*) 648191cded7Smrg set fnord "$@" "$arg"; shift ;; 649191cded7Smrg # Strip any option that makedepend may not understand. Remove 650191cded7Smrg # the object too, otherwise makedepend will parse it as a source file. 651ba064abeSmrg -arch) 652ba064abeSmrg eat=yes ;; 653191cded7Smrg -*|$object) 654191cded7Smrg ;; 655191cded7Smrg *) 656191cded7Smrg set fnord "$@" "$arg"; shift ;; 657191cded7Smrg esac 658191cded7Smrg done 659ba064abeSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 660191cded7Smrg touch "$tmpdepfile" 661191cded7Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 662191cded7Smrg rm -f "$depfile" 663d9dcd5aeSmrg # makedepend may prepend the VPATH from the source file name to the object. 664d9dcd5aeSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 665d9dcd5aeSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 666d9dcd5aeSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 667d9dcd5aeSmrg # correctly. Breaking it into two sed invocations is a workaround. 668d9dcd5aeSmrg sed '1,2d' "$tmpdepfile" \ 669d9dcd5aeSmrg | tr ' ' "$nl" \ 670d9dcd5aeSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 671d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 672191cded7Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 673191cded7Smrg ;; 674191cded7Smrg 675191cded7Smrgcpp) 676191cded7Smrg # Important note: in order to support this mode, a compiler *must* 677191cded7Smrg # always write the preprocessed file to stdout. 678191cded7Smrg "$@" || exit $? 679191cded7Smrg 680191cded7Smrg # Remove the call to Libtool. 681191cded7Smrg if test "$libtool" = yes; then 682ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 683191cded7Smrg shift 684191cded7Smrg done 685191cded7Smrg shift 686191cded7Smrg fi 687191cded7Smrg 688d9dcd5aeSmrg # Remove '-o $object'. 689191cded7Smrg IFS=" " 690191cded7Smrg for arg 691191cded7Smrg do 692191cded7Smrg case $arg in 693191cded7Smrg -o) 694191cded7Smrg shift 695191cded7Smrg ;; 696191cded7Smrg $object) 697191cded7Smrg shift 698191cded7Smrg ;; 699191cded7Smrg *) 700191cded7Smrg set fnord "$@" "$arg" 701191cded7Smrg shift # fnord 702191cded7Smrg shift # $arg 703191cded7Smrg ;; 704191cded7Smrg esac 705191cded7Smrg done 706191cded7Smrg 707d9dcd5aeSmrg "$@" -E \ 708d9dcd5aeSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 709d9dcd5aeSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710d9dcd5aeSmrg | sed '$ s: \\$::' > "$tmpdepfile" 711191cded7Smrg rm -f "$depfile" 712191cded7Smrg echo "$object : \\" > "$depfile" 713191cded7Smrg cat < "$tmpdepfile" >> "$depfile" 714191cded7Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 715191cded7Smrg rm -f "$tmpdepfile" 716191cded7Smrg ;; 717191cded7Smrg 718191cded7Smrgmsvisualcpp) 719191cded7Smrg # Important note: in order to support this mode, a compiler *must* 720ba064abeSmrg # always write the preprocessed file to stdout. 721191cded7Smrg "$@" || exit $? 722ba064abeSmrg 723ba064abeSmrg # Remove the call to Libtool. 724ba064abeSmrg if test "$libtool" = yes; then 725ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 726ba064abeSmrg shift 727ba064abeSmrg done 728ba064abeSmrg shift 729ba064abeSmrg fi 730ba064abeSmrg 731191cded7Smrg IFS=" " 732191cded7Smrg for arg 733191cded7Smrg do 734191cded7Smrg case "$arg" in 735ba064abeSmrg -o) 736ba064abeSmrg shift 737ba064abeSmrg ;; 738ba064abeSmrg $object) 739ba064abeSmrg shift 740ba064abeSmrg ;; 741191cded7Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 742d9dcd5aeSmrg set fnord "$@" 743d9dcd5aeSmrg shift 744d9dcd5aeSmrg shift 745d9dcd5aeSmrg ;; 746191cded7Smrg *) 747d9dcd5aeSmrg set fnord "$@" "$arg" 748d9dcd5aeSmrg shift 749d9dcd5aeSmrg shift 750d9dcd5aeSmrg ;; 751191cded7Smrg esac 752191cded7Smrg done 753ba064abeSmrg "$@" -E 2>/dev/null | 754ba064abeSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 755191cded7Smrg rm -f "$depfile" 756191cded7Smrg echo "$object : \\" > "$depfile" 757d9dcd5aeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 758d9dcd5aeSmrg echo "$tab" >> "$depfile" 759ba064abeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 760191cded7Smrg rm -f "$tmpdepfile" 761191cded7Smrg ;; 762191cded7Smrg 763ba064abeSmrgmsvcmsys) 764ba064abeSmrg # This case exists only to let depend.m4 do its work. It works by 765ba064abeSmrg # looking at the text of this script. This case will never be run, 766ba064abeSmrg # since it is checked for above. 767ba064abeSmrg exit 1 768ba064abeSmrg ;; 769ba064abeSmrg 770191cded7Smrgnone) 771191cded7Smrg exec "$@" 772191cded7Smrg ;; 773191cded7Smrg 774191cded7Smrg*) 775191cded7Smrg echo "Unknown depmode $depmode" 1>&2 776191cded7Smrg exit 1 777191cded7Smrg ;; 778191cded7Smrgesac 779191cded7Smrg 780191cded7Smrgexit 0 781191cded7Smrg 782191cded7Smrg# Local Variables: 783191cded7Smrg# mode: shell-script 784191cded7Smrg# sh-indentation: 2 785191cded7Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 786191cded7Smrg# time-stamp-start: "scriptversion=" 787191cded7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 788ba064abeSmrg# time-stamp-time-zone: "UTC" 789ba064abeSmrg# time-stamp-end: "; # UTC" 790191cded7Smrg# End: 791