depcomp revision ee3e8c14
1191cded7Smrg#! /bin/sh 2191cded7Smrg# depcomp - compile a program generating dependencies as side-effects 3191cded7Smrg 4ee3e8c14Smrgscriptversion=2018-03-07.03; # UTC 5191cded7Smrg 6ee3e8c14Smrg# Copyright (C) 1999-2021 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 19ee3e8c14Smrg# along with this program. If not, see <https://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" 55558deefebSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556d9dcd5aeSmrg rm -f "$tmpdepfile" 557d9dcd5aeSmrg ;; 558d9dcd5aeSmrg 559d9dcd5aeSmrgmsvc7msys) 560d9dcd5aeSmrg # This case exists only to let depend.m4 do its work. It works by 561d9dcd5aeSmrg # looking at the text of this script. This case will never be run, 562d9dcd5aeSmrg # since it is checked for above. 563d9dcd5aeSmrg exit 1 564d9dcd5aeSmrg ;; 565191cded7Smrg 566191cded7Smrg#nosideeffect) 567191cded7Smrg # This comment above is used by automake to tell side-effect 568191cded7Smrg # dependency tracking mechanisms from slower ones. 569191cded7Smrg 570191cded7Smrgdashmstdout) 571191cded7Smrg # Important note: in order to support this mode, a compiler *must* 572191cded7Smrg # always write the preprocessed file to stdout, regardless of -o. 573191cded7Smrg "$@" || exit $? 574191cded7Smrg 575191cded7Smrg # Remove the call to Libtool. 576191cded7Smrg if test "$libtool" = yes; then 577ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 578191cded7Smrg shift 579191cded7Smrg done 580191cded7Smrg shift 581191cded7Smrg fi 582191cded7Smrg 583d9dcd5aeSmrg # Remove '-o $object'. 584191cded7Smrg IFS=" " 585191cded7Smrg for arg 586191cded7Smrg do 587191cded7Smrg case $arg in 588191cded7Smrg -o) 589191cded7Smrg shift 590191cded7Smrg ;; 591191cded7Smrg $object) 592191cded7Smrg shift 593191cded7Smrg ;; 594191cded7Smrg *) 595191cded7Smrg set fnord "$@" "$arg" 596191cded7Smrg shift # fnord 597191cded7Smrg shift # $arg 598191cded7Smrg ;; 599191cded7Smrg esac 600191cded7Smrg done 601191cded7Smrg 602191cded7Smrg test -z "$dashmflag" && dashmflag=-M 603d9dcd5aeSmrg # Require at least two characters before searching for ':' 604191cded7Smrg # in the target name. This is to cope with DOS-style filenames: 605d9dcd5aeSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606191cded7Smrg "$@" $dashmflag | 607d9dcd5aeSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608191cded7Smrg rm -f "$depfile" 609191cded7Smrg cat < "$tmpdepfile" > "$depfile" 610d9dcd5aeSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611d9dcd5aeSmrg # correctly. Breaking it into two sed invocations is a workaround. 612d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 613d9dcd5aeSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 615191cded7Smrg rm -f "$tmpdepfile" 616191cded7Smrg ;; 617191cded7Smrg 618191cded7SmrgdashXmstdout) 619191cded7Smrg # This case only exists to satisfy depend.m4. It is never actually 620191cded7Smrg # run, as this mode is specially recognized in the preamble. 621191cded7Smrg exit 1 622191cded7Smrg ;; 623191cded7Smrg 624191cded7Smrgmakedepend) 625191cded7Smrg "$@" || exit $? 626191cded7Smrg # Remove any Libtool call 627191cded7Smrg if test "$libtool" = yes; then 628ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 629191cded7Smrg shift 630191cded7Smrg done 631191cded7Smrg shift 632191cded7Smrg fi 633191cded7Smrg # X makedepend 634191cded7Smrg shift 635ba064abeSmrg cleared=no eat=no 636ba064abeSmrg for arg 637ba064abeSmrg do 638191cded7Smrg case $cleared in 639191cded7Smrg no) 640191cded7Smrg set ""; shift 641191cded7Smrg cleared=yes ;; 642191cded7Smrg esac 643ba064abeSmrg if test $eat = yes; then 644ba064abeSmrg eat=no 645ba064abeSmrg continue 646ba064abeSmrg fi 647191cded7Smrg case "$arg" in 648191cded7Smrg -D*|-I*) 649191cded7Smrg set fnord "$@" "$arg"; shift ;; 650191cded7Smrg # Strip any option that makedepend may not understand. Remove 651191cded7Smrg # the object too, otherwise makedepend will parse it as a source file. 652ba064abeSmrg -arch) 653ba064abeSmrg eat=yes ;; 654191cded7Smrg -*|$object) 655191cded7Smrg ;; 656191cded7Smrg *) 657191cded7Smrg set fnord "$@" "$arg"; shift ;; 658191cded7Smrg esac 659191cded7Smrg done 660ba064abeSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 661191cded7Smrg touch "$tmpdepfile" 662191cded7Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663191cded7Smrg rm -f "$depfile" 664d9dcd5aeSmrg # makedepend may prepend the VPATH from the source file name to the object. 665d9dcd5aeSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 666d9dcd5aeSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667d9dcd5aeSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668d9dcd5aeSmrg # correctly. Breaking it into two sed invocations is a workaround. 669d9dcd5aeSmrg sed '1,2d' "$tmpdepfile" \ 670d9dcd5aeSmrg | tr ' ' "$nl" \ 671d9dcd5aeSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 673191cded7Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 674191cded7Smrg ;; 675191cded7Smrg 676191cded7Smrgcpp) 677191cded7Smrg # Important note: in order to support this mode, a compiler *must* 678191cded7Smrg # always write the preprocessed file to stdout. 679191cded7Smrg "$@" || exit $? 680191cded7Smrg 681191cded7Smrg # Remove the call to Libtool. 682191cded7Smrg if test "$libtool" = yes; then 683ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 684191cded7Smrg shift 685191cded7Smrg done 686191cded7Smrg shift 687191cded7Smrg fi 688191cded7Smrg 689d9dcd5aeSmrg # Remove '-o $object'. 690191cded7Smrg IFS=" " 691191cded7Smrg for arg 692191cded7Smrg do 693191cded7Smrg case $arg in 694191cded7Smrg -o) 695191cded7Smrg shift 696191cded7Smrg ;; 697191cded7Smrg $object) 698191cded7Smrg shift 699191cded7Smrg ;; 700191cded7Smrg *) 701191cded7Smrg set fnord "$@" "$arg" 702191cded7Smrg shift # fnord 703191cded7Smrg shift # $arg 704191cded7Smrg ;; 705191cded7Smrg esac 706191cded7Smrg done 707191cded7Smrg 708d9dcd5aeSmrg "$@" -E \ 709d9dcd5aeSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710d9dcd5aeSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711d9dcd5aeSmrg | sed '$ s: \\$::' > "$tmpdepfile" 712191cded7Smrg rm -f "$depfile" 713191cded7Smrg echo "$object : \\" > "$depfile" 714191cded7Smrg cat < "$tmpdepfile" >> "$depfile" 715191cded7Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716191cded7Smrg rm -f "$tmpdepfile" 717191cded7Smrg ;; 718191cded7Smrg 719191cded7Smrgmsvisualcpp) 720191cded7Smrg # Important note: in order to support this mode, a compiler *must* 721ba064abeSmrg # always write the preprocessed file to stdout. 722191cded7Smrg "$@" || exit $? 723ba064abeSmrg 724ba064abeSmrg # Remove the call to Libtool. 725ba064abeSmrg if test "$libtool" = yes; then 726ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 727ba064abeSmrg shift 728ba064abeSmrg done 729ba064abeSmrg shift 730ba064abeSmrg fi 731ba064abeSmrg 732191cded7Smrg IFS=" " 733191cded7Smrg for arg 734191cded7Smrg do 735191cded7Smrg case "$arg" in 736ba064abeSmrg -o) 737ba064abeSmrg shift 738ba064abeSmrg ;; 739ba064abeSmrg $object) 740ba064abeSmrg shift 741ba064abeSmrg ;; 742191cded7Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743d9dcd5aeSmrg set fnord "$@" 744d9dcd5aeSmrg shift 745d9dcd5aeSmrg shift 746d9dcd5aeSmrg ;; 747191cded7Smrg *) 748d9dcd5aeSmrg set fnord "$@" "$arg" 749d9dcd5aeSmrg shift 750d9dcd5aeSmrg shift 751d9dcd5aeSmrg ;; 752191cded7Smrg esac 753191cded7Smrg done 754ba064abeSmrg "$@" -E 2>/dev/null | 755ba064abeSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756191cded7Smrg rm -f "$depfile" 757191cded7Smrg echo "$object : \\" > "$depfile" 758d9dcd5aeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759d9dcd5aeSmrg echo "$tab" >> "$depfile" 760ba064abeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761191cded7Smrg rm -f "$tmpdepfile" 762191cded7Smrg ;; 763191cded7Smrg 764ba064abeSmrgmsvcmsys) 765ba064abeSmrg # This case exists only to let depend.m4 do its work. It works by 766ba064abeSmrg # looking at the text of this script. This case will never be run, 767ba064abeSmrg # since it is checked for above. 768ba064abeSmrg exit 1 769ba064abeSmrg ;; 770ba064abeSmrg 771191cded7Smrgnone) 772191cded7Smrg exec "$@" 773191cded7Smrg ;; 774191cded7Smrg 775191cded7Smrg*) 776191cded7Smrg echo "Unknown depmode $depmode" 1>&2 777191cded7Smrg exit 1 778191cded7Smrg ;; 779191cded7Smrgesac 780191cded7Smrg 781191cded7Smrgexit 0 782191cded7Smrg 783191cded7Smrg# Local Variables: 784191cded7Smrg# mode: shell-script 785191cded7Smrg# sh-indentation: 2 786ee3e8c14Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 787191cded7Smrg# time-stamp-start: "scriptversion=" 788191cded7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789ee3e8c14Smrg# time-stamp-time-zone: "UTC0" 790ba064abeSmrg# time-stamp-end: "; # UTC" 791191cded7Smrg# End: 792