1ba6a1819Smrg#! /bin/sh 2ba6a1819Smrg# depcomp - compile a program generating dependencies as side-effects 3ba6a1819Smrg 400ca1914Smrgscriptversion=2024-06-19.01; # UTC 5ba6a1819Smrg 600ca1914Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 7ba6a1819Smrg 8ba6a1819Smrg# This program is free software; you can redistribute it and/or modify 9ba6a1819Smrg# it under the terms of the GNU General Public License as published by 10ba6a1819Smrg# the Free Software Foundation; either version 2, or (at your option) 11ba6a1819Smrg# any later version. 12ba6a1819Smrg 13ba6a1819Smrg# This program is distributed in the hope that it will be useful, 14ba6a1819Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15ba6a1819Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16ba6a1819Smrg# GNU General Public License for more details. 17ba6a1819Smrg 18ba6a1819Smrg# You should have received a copy of the GNU General Public License 19da1f2d5dSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 20ba6a1819Smrg 21ba6a1819Smrg# As a special exception to the GNU General Public License, if you 22ba6a1819Smrg# distribute this file as part of a program that contains a 23ba6a1819Smrg# configuration script generated by Autoconf, you may include it under 24ba6a1819Smrg# the same distribution terms that you use for the rest of that program. 25ba6a1819Smrg 26ba6a1819Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27ba6a1819Smrg 28ba6a1819Smrgcase $1 in 29ba6a1819Smrg '') 301bedbe3fSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 311bedbe3fSmrg exit 1; 321bedbe3fSmrg ;; 33ba6a1819Smrg -h | --h*) 34ba6a1819Smrg cat <<\EOF 35ba6a1819SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36ba6a1819Smrg 37ba6a1819SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38ba6a1819Smrgas side-effects. 39ba6a1819Smrg 40ba6a1819SmrgEnvironment variables: 41ba6a1819Smrg depmode Dependency tracking mode. 421bedbe3fSmrg source Source file read by 'PROGRAMS ARGS'. 431bedbe3fSmrg object Object file output by 'PROGRAMS ARGS'. 44ba6a1819Smrg DEPDIR directory where to store dependencies. 45ba6a1819Smrg depfile Dependency file to output. 461bedbe3fSmrg tmpdepfile Temporary file to use when outputting dependencies. 47ba6a1819Smrg libtool Whether libtool is used (yes/no). 48ba6a1819Smrg 49ba6a1819SmrgReport bugs to <bug-automake@gnu.org>. 5000ca1914SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 5100ca1914SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 52ba6a1819SmrgEOF 53ba6a1819Smrg exit $? 54ba6a1819Smrg ;; 55ba6a1819Smrg -v | --v*) 5600ca1914Smrg echo "depcomp (GNU Automake) $scriptversion" 57ba6a1819Smrg exit $? 58ba6a1819Smrg ;; 59ba6a1819Smrgesac 60ba6a1819Smrg 611bedbe3fSmrg# Get the directory component of the given path, and save it in the 621bedbe3fSmrg# global variables '$dir'. Note that this directory component will 631bedbe3fSmrg# be either empty or ending with a '/' character. This is deliberate. 641bedbe3fSmrgset_dir_from () 651bedbe3fSmrg{ 661bedbe3fSmrg case $1 in 671bedbe3fSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 681bedbe3fSmrg *) dir=;; 691bedbe3fSmrg esac 701bedbe3fSmrg} 711bedbe3fSmrg 721bedbe3fSmrg# Get the suffix-stripped basename of the given path, and save it the 731bedbe3fSmrg# global variable '$base'. 741bedbe3fSmrgset_base_from () 751bedbe3fSmrg{ 761bedbe3fSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 771bedbe3fSmrg} 781bedbe3fSmrg 791bedbe3fSmrg# If no dependency file was actually created by the compiler invocation, 801bedbe3fSmrg# we still have to create a dummy depfile, to avoid errors with the 811bedbe3fSmrg# Makefile "include basename.Plo" scheme. 821bedbe3fSmrgmake_dummy_depfile () 831bedbe3fSmrg{ 841bedbe3fSmrg echo "#dummy" > "$depfile" 851bedbe3fSmrg} 861bedbe3fSmrg 871bedbe3fSmrg# Factor out some common post-processing of the generated depfile. 881bedbe3fSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 891bedbe3fSmrgaix_post_process_depfile () 901bedbe3fSmrg{ 911bedbe3fSmrg # If the compiler actually managed to produce a dependency file, 921bedbe3fSmrg # post-process it. 931bedbe3fSmrg if test -f "$tmpdepfile"; then 941bedbe3fSmrg # Each line is of the form 'foo.o: dependency.h'. 951bedbe3fSmrg # Do two passes, one to just change these to 961bedbe3fSmrg # $object: dependency.h 971bedbe3fSmrg # and one to simply output 981bedbe3fSmrg # dependency.h: 991bedbe3fSmrg # which is needed to avoid the deleted-header problem. 1001bedbe3fSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 1011bedbe3fSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 1021bedbe3fSmrg } > "$depfile" 1031bedbe3fSmrg rm -f "$tmpdepfile" 1041bedbe3fSmrg else 1051bedbe3fSmrg make_dummy_depfile 1061bedbe3fSmrg fi 1071bedbe3fSmrg} 1081bedbe3fSmrg 1091bedbe3fSmrg# A tabulation character. 1101bedbe3fSmrgtab=' ' 1111bedbe3fSmrg# A newline character. 1121bedbe3fSmrgnl=' 1131bedbe3fSmrg' 1141bedbe3fSmrg# Character ranges might be problematic outside the C locale. 1151bedbe3fSmrg# These definitions help. 1161bedbe3fSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 1171bedbe3fSmrglower=abcdefghijklmnopqrstuvwxyz 1181bedbe3fSmrgalpha=${upper}${lower} 1191bedbe3fSmrg 120ba6a1819Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 121ba6a1819Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 122ba6a1819Smrg exit 1 123ba6a1819Smrgfi 124ba6a1819Smrg 125ba6a1819Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 126ba6a1819Smrgdepfile=${depfile-`echo "$object" | 127ba6a1819Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 128ba6a1819Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 129ba6a1819Smrg 130ba6a1819Smrgrm -f "$tmpdepfile" 131ba6a1819Smrg 13200ca1914Smrg# Avoid interference from the environment. 1331bedbe3fSmrggccflag= dashmflag= 1341bedbe3fSmrg 135ba6a1819Smrg# Some modes work just like other modes, but use different flags. We 136ba6a1819Smrg# parameterize here, but still list the modes in the big case below, 137ba6a1819Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 138ba6a1819Smrg# here, because this file can only contain one case statement. 139ba6a1819Smrgif test "$depmode" = hp; then 140ba6a1819Smrg # HP compiler uses -M and no extra arg. 141ba6a1819Smrg gccflag=-M 142ba6a1819Smrg depmode=gcc 143ba6a1819Smrgfi 144ba6a1819Smrg 145ba6a1819Smrgif test "$depmode" = dashXmstdout; then 1461bedbe3fSmrg # This is just like dashmstdout with a different argument. 1471bedbe3fSmrg dashmflag=-xM 1481bedbe3fSmrg depmode=dashmstdout 149ba6a1819Smrgfi 150ba6a1819Smrg 151549e21daSmrgcygpath_u="cygpath -u -f -" 152549e21daSmrgif test "$depmode" = msvcmsys; then 1531bedbe3fSmrg # This is just like msvisualcpp but w/o cygpath translation. 1541bedbe3fSmrg # Just convert the backslash-escaped backslashes to single forward 1551bedbe3fSmrg # slashes to satisfy depend.m4 1561bedbe3fSmrg cygpath_u='sed s,\\\\,/,g' 1571bedbe3fSmrg depmode=msvisualcpp 1581bedbe3fSmrgfi 1591bedbe3fSmrg 1601bedbe3fSmrgif test "$depmode" = msvc7msys; then 1611bedbe3fSmrg # This is just like msvc7 but w/o cygpath translation. 1621bedbe3fSmrg # Just convert the backslash-escaped backslashes to single forward 1631bedbe3fSmrg # slashes to satisfy depend.m4 1641bedbe3fSmrg cygpath_u='sed s,\\\\,/,g' 1651bedbe3fSmrg depmode=msvc7 1661bedbe3fSmrgfi 1671bedbe3fSmrg 1681bedbe3fSmrgif test "$depmode" = xlc; then 1691bedbe3fSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 1701bedbe3fSmrg gccflag=-qmakedep=gcc,-MF 1711bedbe3fSmrg depmode=gcc 172549e21daSmrgfi 173549e21daSmrg 174ba6a1819Smrgcase "$depmode" in 175ba6a1819Smrggcc3) 176ba6a1819Smrg## gcc 3 implements dependency tracking that does exactly what 177ba6a1819Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 178ba6a1819Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 179ba6a1819Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 180ba6a1819Smrg## the command line argument order; so add the flags where they 181ba6a1819Smrg## appear in depend2.am. Note that the slowdown incurred here 182ba6a1819Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 183ba6a1819Smrg for arg 184ba6a1819Smrg do 185ba6a1819Smrg case $arg in 186ba6a1819Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 187ba6a1819Smrg *) set fnord "$@" "$arg" ;; 188ba6a1819Smrg esac 189ba6a1819Smrg shift # fnord 190ba6a1819Smrg shift # $arg 191ba6a1819Smrg done 192ba6a1819Smrg "$@" 193ba6a1819Smrg stat=$? 1941bedbe3fSmrg if test $stat -ne 0; then 195ba6a1819Smrg rm -f "$tmpdepfile" 196ba6a1819Smrg exit $stat 197ba6a1819Smrg fi 198ba6a1819Smrg mv "$tmpdepfile" "$depfile" 199ba6a1819Smrg ;; 200ba6a1819Smrg 201ba6a1819Smrggcc) 20200ca1914Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 20300ca1914Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 2041bedbe3fSmrg## (see the conditional assignment to $gccflag above). 205ba6a1819Smrg## There are various ways to get dependency output from gcc. Here's 206ba6a1819Smrg## why we pick this rather obscure method: 207ba6a1819Smrg## - Don't want to use -MD because we'd like the dependencies to end 208ba6a1819Smrg## up in a subdir. Having to rename by hand is ugly. 209ba6a1819Smrg## (We might end up doing this anyway to support other compilers.) 210ba6a1819Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 2111bedbe3fSmrg## -MM, not -M (despite what the docs say). Also, it might not be 2121bedbe3fSmrg## supported by the other compilers which use the 'gcc' depmode. 213ba6a1819Smrg## - Using -M directly means running the compiler twice (even worse 214ba6a1819Smrg## than renaming). 215ba6a1819Smrg if test -z "$gccflag"; then 216ba6a1819Smrg gccflag=-MD, 217ba6a1819Smrg fi 218ba6a1819Smrg "$@" -Wp,"$gccflag$tmpdepfile" 219ba6a1819Smrg stat=$? 2201bedbe3fSmrg if test $stat -ne 0; then 221ba6a1819Smrg rm -f "$tmpdepfile" 222ba6a1819Smrg exit $stat 223ba6a1819Smrg fi 224ba6a1819Smrg rm -f "$depfile" 225ba6a1819Smrg echo "$object : \\" > "$depfile" 2261bedbe3fSmrg # The second -e expression handles DOS-style file names with drive 2271bedbe3fSmrg # letters. 228ba6a1819Smrg sed -e 's/^[^:]*: / /' \ 229ba6a1819Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 2301bedbe3fSmrg## This next piece of magic avoids the "deleted header file" problem. 231ba6a1819Smrg## The problem is that when a header file which appears in a .P file 232ba6a1819Smrg## is deleted, the dependency causes make to die (because there is 233ba6a1819Smrg## typically no way to rebuild the header). We avoid this by adding 234ba6a1819Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 235ba6a1819Smrg## this for us directly. 2361bedbe3fSmrg## Some versions of gcc put a space before the ':'. On the theory 237ba6a1819Smrg## that the space means something, we add a space to the output as 2381bedbe3fSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 2391bedbe3fSmrg## to the object. Take care to not repeat it in the output. 240ba6a1819Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 241ba6a1819Smrg## correctly. Breaking it into two sed invocations is a workaround. 2421bedbe3fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2431bedbe3fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 2441bedbe3fSmrg | sed -e 's/$/ :/' >> "$depfile" 245ba6a1819Smrg rm -f "$tmpdepfile" 246ba6a1819Smrg ;; 247ba6a1819Smrg 248ba6a1819Smrghp) 249ba6a1819Smrg # This case exists only to let depend.m4 do its work. It works by 250ba6a1819Smrg # looking at the text of this script. This case will never be run, 251ba6a1819Smrg # since it is checked for above. 252ba6a1819Smrg exit 1 253ba6a1819Smrg ;; 254ba6a1819Smrg 255ba6a1819Smrgsgi) 256ba6a1819Smrg if test "$libtool" = yes; then 257ba6a1819Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 258ba6a1819Smrg else 259ba6a1819Smrg "$@" -MDupdate "$tmpdepfile" 260ba6a1819Smrg fi 261ba6a1819Smrg stat=$? 2621bedbe3fSmrg if test $stat -ne 0; then 263ba6a1819Smrg rm -f "$tmpdepfile" 264ba6a1819Smrg exit $stat 265ba6a1819Smrg fi 266ba6a1819Smrg rm -f "$depfile" 267ba6a1819Smrg 268ba6a1819Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 269ba6a1819Smrg echo "$object : \\" > "$depfile" 270ba6a1819Smrg # Clip off the initial element (the dependent). Don't try to be 271ba6a1819Smrg # clever and replace this with sed code, as IRIX sed won't handle 272ba6a1819Smrg # lines with more than a fixed number of characters (4096 in 273ba6a1819Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 2741bedbe3fSmrg # the IRIX cc adds comments like '#:fec' to the end of the 275ba6a1819Smrg # dependency line. 2761bedbe3fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2771bedbe3fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 2781bedbe3fSmrg | tr "$nl" ' ' >> "$depfile" 279549e21daSmrg echo >> "$depfile" 280ba6a1819Smrg # The second pass generates a dummy entry for each header file. 2811bedbe3fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 2821bedbe3fSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 2831bedbe3fSmrg >> "$depfile" 284ba6a1819Smrg else 2851bedbe3fSmrg make_dummy_depfile 286ba6a1819Smrg fi 287ba6a1819Smrg rm -f "$tmpdepfile" 288ba6a1819Smrg ;; 289ba6a1819Smrg 2901bedbe3fSmrgxlc) 2911bedbe3fSmrg # This case exists only to let depend.m4 do its work. It works by 2921bedbe3fSmrg # looking at the text of this script. This case will never be run, 2931bedbe3fSmrg # since it is checked for above. 2941bedbe3fSmrg exit 1 2951bedbe3fSmrg ;; 2961bedbe3fSmrg 297ba6a1819Smrgaix) 298ba6a1819Smrg # The C for AIX Compiler uses -M and outputs the dependencies 299ba6a1819Smrg # in a .u file. In older versions, this file always lives in the 3001bedbe3fSmrg # current directory. Also, the AIX compiler puts '$object:' at the 301ba6a1819Smrg # start of each line; $object doesn't have directory information. 302ba6a1819Smrg # Version 6 uses the directory in both cases. 3031bedbe3fSmrg set_dir_from "$object" 3041bedbe3fSmrg set_base_from "$object" 305ba6a1819Smrg if test "$libtool" = yes; then 306549e21daSmrg tmpdepfile1=$dir$base.u 307549e21daSmrg tmpdepfile2=$base.u 308549e21daSmrg tmpdepfile3=$dir.libs/$base.u 309ba6a1819Smrg "$@" -Wc,-M 310ba6a1819Smrg else 311549e21daSmrg tmpdepfile1=$dir$base.u 312549e21daSmrg tmpdepfile2=$dir$base.u 313549e21daSmrg tmpdepfile3=$dir$base.u 314ba6a1819Smrg "$@" -M 315ba6a1819Smrg fi 316ba6a1819Smrg stat=$? 3171bedbe3fSmrg if test $stat -ne 0; then 318549e21daSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 319ba6a1819Smrg exit $stat 320ba6a1819Smrg fi 321ba6a1819Smrg 322549e21daSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 323549e21daSmrg do 324549e21daSmrg test -f "$tmpdepfile" && break 325549e21daSmrg done 3261bedbe3fSmrg aix_post_process_depfile 3271bedbe3fSmrg ;; 3281bedbe3fSmrg 3291bedbe3fSmrgtcc) 3301bedbe3fSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 3311bedbe3fSmrg # FIXME: That version still under development at the moment of writing. 3321bedbe3fSmrg # Make that this statement remains true also for stable, released 3331bedbe3fSmrg # versions. 3341bedbe3fSmrg # It will wrap lines (doesn't matter whether long or short) with a 3351bedbe3fSmrg # trailing '\', as in: 3361bedbe3fSmrg # 3371bedbe3fSmrg # foo.o : \ 3381bedbe3fSmrg # foo.c \ 3391bedbe3fSmrg # foo.h \ 3401bedbe3fSmrg # 3411bedbe3fSmrg # It will put a trailing '\' even on the last line, and will use leading 3421bedbe3fSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 3431bedbe3fSmrg # "Emit spaces for -MD"). 3441bedbe3fSmrg "$@" -MD -MF "$tmpdepfile" 3451bedbe3fSmrg stat=$? 3461bedbe3fSmrg if test $stat -ne 0; then 3471bedbe3fSmrg rm -f "$tmpdepfile" 3481bedbe3fSmrg exit $stat 349ba6a1819Smrg fi 3501bedbe3fSmrg rm -f "$depfile" 3511bedbe3fSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 3521bedbe3fSmrg # We have to change lines of the first kind to '$object: \'. 3531bedbe3fSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 3541bedbe3fSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 3551bedbe3fSmrg # dummy dependency, to avoid the deleted-header problem. 3561bedbe3fSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 357ba6a1819Smrg rm -f "$tmpdepfile" 358ba6a1819Smrg ;; 359ba6a1819Smrg 3601bedbe3fSmrg## The order of this option in the case statement is important, since the 3611bedbe3fSmrg## shell code in configure will try each of these formats in the order 3621bedbe3fSmrg## listed in this file. A plain '-MD' option would be understood by many 3631bedbe3fSmrg## compilers, so we must ensure this comes after the gcc and icc options. 3641bedbe3fSmrgpgcc) 3651bedbe3fSmrg # Portland's C compiler understands '-MD'. 3661bedbe3fSmrg # Will always output deps to 'file.d' where file is the root name of the 3671bedbe3fSmrg # source file under compilation, even if file resides in a subdirectory. 3681bedbe3fSmrg # The object file name does not affect the name of the '.d' file. 3691bedbe3fSmrg # pgcc 10.2 will output 370ba6a1819Smrg # foo.o: sub/foo.c sub/foo.h 3711bedbe3fSmrg # and will wrap long lines using '\' : 372ba6a1819Smrg # foo.o: sub/foo.c ... \ 373ba6a1819Smrg # sub/foo.h ... \ 374ba6a1819Smrg # ... 3751bedbe3fSmrg set_dir_from "$object" 3761bedbe3fSmrg # Use the source, not the object, to determine the base name, since 3771bedbe3fSmrg # that's sadly what pgcc will do too. 3781bedbe3fSmrg set_base_from "$source" 3791bedbe3fSmrg tmpdepfile=$base.d 3801bedbe3fSmrg 3811bedbe3fSmrg # For projects that build the same source file twice into different object 3821bedbe3fSmrg # files, the pgcc approach of using the *source* file root name can cause 3831bedbe3fSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 3841bedbe3fSmrg # the same $tmpdepfile. 3851bedbe3fSmrg lockdir=$base.d-lock 3861bedbe3fSmrg trap " 3871bedbe3fSmrg echo '$0: caught signal, cleaning up...' >&2 3881bedbe3fSmrg rmdir '$lockdir' 3891bedbe3fSmrg exit 1 3901bedbe3fSmrg " 1 2 13 15 3911bedbe3fSmrg numtries=100 3921bedbe3fSmrg i=$numtries 3931bedbe3fSmrg while test $i -gt 0; do 3941bedbe3fSmrg # mkdir is a portable test-and-set. 3951bedbe3fSmrg if mkdir "$lockdir" 2>/dev/null; then 3961bedbe3fSmrg # This process acquired the lock. 3971bedbe3fSmrg "$@" -MD 3981bedbe3fSmrg stat=$? 3991bedbe3fSmrg # Release the lock. 4001bedbe3fSmrg rmdir "$lockdir" 4011bedbe3fSmrg break 4021bedbe3fSmrg else 4031bedbe3fSmrg # If the lock is being held by a different process, wait 4041bedbe3fSmrg # until the winning process is done or we timeout. 4051bedbe3fSmrg while test -d "$lockdir" && test $i -gt 0; do 4061bedbe3fSmrg sleep 1 4071bedbe3fSmrg i=`expr $i - 1` 4081bedbe3fSmrg done 4091bedbe3fSmrg fi 4101bedbe3fSmrg i=`expr $i - 1` 4111bedbe3fSmrg done 4121bedbe3fSmrg trap - 1 2 13 15 4131bedbe3fSmrg if test $i -le 0; then 4141bedbe3fSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 4151bedbe3fSmrg echo "$0: check lockdir '$lockdir'" >&2 4161bedbe3fSmrg exit 1 4171bedbe3fSmrg fi 418ba6a1819Smrg 4191bedbe3fSmrg if test $stat -ne 0; then 420ba6a1819Smrg rm -f "$tmpdepfile" 421ba6a1819Smrg exit $stat 422ba6a1819Smrg fi 423ba6a1819Smrg rm -f "$depfile" 424ba6a1819Smrg # Each line is of the form `foo.o: dependent.h', 425ba6a1819Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 426ba6a1819Smrg # Do two passes, one to just change these to 427ba6a1819Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 428ba6a1819Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 429ba6a1819Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 430ba6a1819Smrg # correctly. Breaking it into two sed invocations is a workaround. 4311bedbe3fSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 4321bedbe3fSmrg | sed -e 's/$/ :/' >> "$depfile" 433ba6a1819Smrg rm -f "$tmpdepfile" 434ba6a1819Smrg ;; 435ba6a1819Smrg 436ba6a1819Smrghp2) 437ba6a1819Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 438ba6a1819Smrg # compilers, which have integrated preprocessors. The correct option 439ba6a1819Smrg # to use with these is +Maked; it writes dependencies to a file named 440ba6a1819Smrg # 'foo.d', which lands next to the object file, wherever that 441ba6a1819Smrg # happens to be. 442ba6a1819Smrg # Much of this is similar to the tru64 case; see comments there. 4431bedbe3fSmrg set_dir_from "$object" 4441bedbe3fSmrg set_base_from "$object" 445ba6a1819Smrg if test "$libtool" = yes; then 446ba6a1819Smrg tmpdepfile1=$dir$base.d 447ba6a1819Smrg tmpdepfile2=$dir.libs/$base.d 448ba6a1819Smrg "$@" -Wc,+Maked 449ba6a1819Smrg else 450ba6a1819Smrg tmpdepfile1=$dir$base.d 451ba6a1819Smrg tmpdepfile2=$dir$base.d 452ba6a1819Smrg "$@" +Maked 453ba6a1819Smrg fi 454ba6a1819Smrg stat=$? 4551bedbe3fSmrg if test $stat -ne 0; then 456ba6a1819Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 457ba6a1819Smrg exit $stat 458ba6a1819Smrg fi 459ba6a1819Smrg 460ba6a1819Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 461ba6a1819Smrg do 462ba6a1819Smrg test -f "$tmpdepfile" && break 463ba6a1819Smrg done 464ba6a1819Smrg if test -f "$tmpdepfile"; then 4651bedbe3fSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 4661bedbe3fSmrg # Add 'dependent.h:' lines. 467549e21daSmrg sed -ne '2,${ 4681bedbe3fSmrg s/^ *// 4691bedbe3fSmrg s/ \\*$// 4701bedbe3fSmrg s/$/:/ 4711bedbe3fSmrg p 4721bedbe3fSmrg }' "$tmpdepfile" >> "$depfile" 473ba6a1819Smrg else 4741bedbe3fSmrg make_dummy_depfile 475ba6a1819Smrg fi 476ba6a1819Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 477ba6a1819Smrg ;; 478ba6a1819Smrg 479ba6a1819Smrgtru64) 4801bedbe3fSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 4811bedbe3fSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 4821bedbe3fSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 4831bedbe3fSmrg # dependencies in 'foo.d' instead, so we check for that too. 4841bedbe3fSmrg # Subdirectories are respected. 4851bedbe3fSmrg set_dir_from "$object" 4861bedbe3fSmrg set_base_from "$object" 4871bedbe3fSmrg 4881bedbe3fSmrg if test "$libtool" = yes; then 4891bedbe3fSmrg # Libtool generates 2 separate objects for the 2 libraries. These 4901bedbe3fSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 4911bedbe3fSmrg # in $dir$base.o.d. We have to check for both files, because 4921bedbe3fSmrg # one of the two compilations can be disabled. We should prefer 4931bedbe3fSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 4941bedbe3fSmrg # automatically cleaned when .libs/ is deleted, while ignoring 4951bedbe3fSmrg # the former would cause a distcleancheck panic. 4961bedbe3fSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 4971bedbe3fSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 4981bedbe3fSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 4991bedbe3fSmrg "$@" -Wc,-MD 5001bedbe3fSmrg else 5011bedbe3fSmrg tmpdepfile1=$dir$base.d 5021bedbe3fSmrg tmpdepfile2=$dir$base.d 5031bedbe3fSmrg tmpdepfile3=$dir$base.d 5041bedbe3fSmrg "$@" -MD 5051bedbe3fSmrg fi 5061bedbe3fSmrg 5071bedbe3fSmrg stat=$? 5081bedbe3fSmrg if test $stat -ne 0; then 5091bedbe3fSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5101bedbe3fSmrg exit $stat 5111bedbe3fSmrg fi 5121bedbe3fSmrg 5131bedbe3fSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 5141bedbe3fSmrg do 5151bedbe3fSmrg test -f "$tmpdepfile" && break 5161bedbe3fSmrg done 5171bedbe3fSmrg # Same post-processing that is required for AIX mode. 5181bedbe3fSmrg aix_post_process_depfile 5191bedbe3fSmrg ;; 5201bedbe3fSmrg 5211bedbe3fSmrgmsvc7) 5221bedbe3fSmrg if test "$libtool" = yes; then 5231bedbe3fSmrg showIncludes=-Wc,-showIncludes 5241bedbe3fSmrg else 5251bedbe3fSmrg showIncludes=-showIncludes 5261bedbe3fSmrg fi 5271bedbe3fSmrg "$@" $showIncludes > "$tmpdepfile" 5281bedbe3fSmrg stat=$? 5291bedbe3fSmrg grep -v '^Note: including file: ' "$tmpdepfile" 5301bedbe3fSmrg if test $stat -ne 0; then 5311bedbe3fSmrg rm -f "$tmpdepfile" 5321bedbe3fSmrg exit $stat 5331bedbe3fSmrg fi 5341bedbe3fSmrg rm -f "$depfile" 5351bedbe3fSmrg echo "$object : \\" > "$depfile" 5361bedbe3fSmrg # The first sed program below extracts the file names and escapes 5371bedbe3fSmrg # backslashes for cygpath. The second sed program outputs the file 5381bedbe3fSmrg # name when reading, but also accumulates all include files in the 5391bedbe3fSmrg # hold buffer in order to output them again at the end. This only 5401bedbe3fSmrg # works with sed implementations that can handle large buffers. 5411bedbe3fSmrg sed < "$tmpdepfile" -n ' 5421bedbe3fSmrg/^Note: including file: *\(.*\)/ { 5431bedbe3fSmrg s//\1/ 5441bedbe3fSmrg s/\\/\\\\/g 5451bedbe3fSmrg p 5461bedbe3fSmrg}' | $cygpath_u | sort -u | sed -n ' 5471bedbe3fSmrgs/ /\\ /g 5481bedbe3fSmrgs/\(.*\)/'"$tab"'\1 \\/p 5491bedbe3fSmrgs/.\(.*\) \\/\1:/ 5501bedbe3fSmrgH 5511bedbe3fSmrg$ { 5521bedbe3fSmrg s/.*/'"$tab"'/ 5531bedbe3fSmrg G 5541bedbe3fSmrg p 5551bedbe3fSmrg}' >> "$depfile" 5566af7124fSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5571bedbe3fSmrg rm -f "$tmpdepfile" 5581bedbe3fSmrg ;; 5591bedbe3fSmrg 5601bedbe3fSmrgmsvc7msys) 5611bedbe3fSmrg # This case exists only to let depend.m4 do its work. It works by 5621bedbe3fSmrg # looking at the text of this script. This case will never be run, 5631bedbe3fSmrg # since it is checked for above. 5641bedbe3fSmrg exit 1 5651bedbe3fSmrg ;; 566ba6a1819Smrg 567ba6a1819Smrg#nosideeffect) 568ba6a1819Smrg # This comment above is used by automake to tell side-effect 569ba6a1819Smrg # dependency tracking mechanisms from slower ones. 570ba6a1819Smrg 571ba6a1819Smrgdashmstdout) 572ba6a1819Smrg # Important note: in order to support this mode, a compiler *must* 573ba6a1819Smrg # always write the preprocessed file to stdout, regardless of -o. 574ba6a1819Smrg "$@" || exit $? 575ba6a1819Smrg 576ba6a1819Smrg # Remove the call to Libtool. 577ba6a1819Smrg if test "$libtool" = yes; then 578549e21daSmrg while test "X$1" != 'X--mode=compile'; do 579ba6a1819Smrg shift 580ba6a1819Smrg done 581ba6a1819Smrg shift 582ba6a1819Smrg fi 583ba6a1819Smrg 5841bedbe3fSmrg # Remove '-o $object'. 585ba6a1819Smrg IFS=" " 586ba6a1819Smrg for arg 587ba6a1819Smrg do 588ba6a1819Smrg case $arg in 589ba6a1819Smrg -o) 590ba6a1819Smrg shift 591ba6a1819Smrg ;; 592ba6a1819Smrg $object) 593ba6a1819Smrg shift 594ba6a1819Smrg ;; 595ba6a1819Smrg *) 596ba6a1819Smrg set fnord "$@" "$arg" 597ba6a1819Smrg shift # fnord 598ba6a1819Smrg shift # $arg 599ba6a1819Smrg ;; 600ba6a1819Smrg esac 601ba6a1819Smrg done 602ba6a1819Smrg 603ba6a1819Smrg test -z "$dashmflag" && dashmflag=-M 6041bedbe3fSmrg # Require at least two characters before searching for ':' 605ba6a1819Smrg # in the target name. This is to cope with DOS-style filenames: 6061bedbe3fSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 607ba6a1819Smrg "$@" $dashmflag | 6081bedbe3fSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 609ba6a1819Smrg rm -f "$depfile" 610ba6a1819Smrg cat < "$tmpdepfile" > "$depfile" 6111bedbe3fSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 6121bedbe3fSmrg # correctly. Breaking it into two sed invocations is a workaround. 6131bedbe3fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 6141bedbe3fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6151bedbe3fSmrg | sed -e 's/$/ :/' >> "$depfile" 616ba6a1819Smrg rm -f "$tmpdepfile" 617ba6a1819Smrg ;; 618ba6a1819Smrg 619ba6a1819SmrgdashXmstdout) 620ba6a1819Smrg # This case only exists to satisfy depend.m4. It is never actually 621ba6a1819Smrg # run, as this mode is specially recognized in the preamble. 622ba6a1819Smrg exit 1 623ba6a1819Smrg ;; 624ba6a1819Smrg 625ba6a1819Smrgmakedepend) 626ba6a1819Smrg "$@" || exit $? 627ba6a1819Smrg # Remove any Libtool call 628ba6a1819Smrg if test "$libtool" = yes; then 629549e21daSmrg while test "X$1" != 'X--mode=compile'; do 630ba6a1819Smrg shift 631ba6a1819Smrg done 632ba6a1819Smrg shift 633ba6a1819Smrg fi 634ba6a1819Smrg # X makedepend 635ba6a1819Smrg shift 636549e21daSmrg cleared=no eat=no 637549e21daSmrg for arg 638549e21daSmrg do 639ba6a1819Smrg case $cleared in 640ba6a1819Smrg no) 641ba6a1819Smrg set ""; shift 642ba6a1819Smrg cleared=yes ;; 643ba6a1819Smrg esac 644549e21daSmrg if test $eat = yes; then 645549e21daSmrg eat=no 646549e21daSmrg continue 647549e21daSmrg fi 648ba6a1819Smrg case "$arg" in 649ba6a1819Smrg -D*|-I*) 650ba6a1819Smrg set fnord "$@" "$arg"; shift ;; 651ba6a1819Smrg # Strip any option that makedepend may not understand. Remove 652ba6a1819Smrg # the object too, otherwise makedepend will parse it as a source file. 653549e21daSmrg -arch) 654549e21daSmrg eat=yes ;; 655ba6a1819Smrg -*|$object) 656ba6a1819Smrg ;; 657ba6a1819Smrg *) 658ba6a1819Smrg set fnord "$@" "$arg"; shift ;; 659ba6a1819Smrg esac 660ba6a1819Smrg done 661549e21daSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 662ba6a1819Smrg touch "$tmpdepfile" 663ba6a1819Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 664ba6a1819Smrg rm -f "$depfile" 6651bedbe3fSmrg # makedepend may prepend the VPATH from the source file name to the object. 6661bedbe3fSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 6671bedbe3fSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 6681bedbe3fSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 6691bedbe3fSmrg # correctly. Breaking it into two sed invocations is a workaround. 6701bedbe3fSmrg sed '1,2d' "$tmpdepfile" \ 6711bedbe3fSmrg | tr ' ' "$nl" \ 6721bedbe3fSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 6731bedbe3fSmrg | sed -e 's/$/ :/' >> "$depfile" 674ba6a1819Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 675ba6a1819Smrg ;; 676ba6a1819Smrg 677ba6a1819Smrgcpp) 678ba6a1819Smrg # Important note: in order to support this mode, a compiler *must* 679ba6a1819Smrg # always write the preprocessed file to stdout. 680ba6a1819Smrg "$@" || exit $? 681ba6a1819Smrg 682ba6a1819Smrg # Remove the call to Libtool. 683ba6a1819Smrg if test "$libtool" = yes; then 684549e21daSmrg while test "X$1" != 'X--mode=compile'; do 685ba6a1819Smrg shift 686ba6a1819Smrg done 687ba6a1819Smrg shift 688ba6a1819Smrg fi 689ba6a1819Smrg 6901bedbe3fSmrg # Remove '-o $object'. 691ba6a1819Smrg IFS=" " 692ba6a1819Smrg for arg 693ba6a1819Smrg do 694ba6a1819Smrg case $arg in 695ba6a1819Smrg -o) 696ba6a1819Smrg shift 697ba6a1819Smrg ;; 698ba6a1819Smrg $object) 699ba6a1819Smrg shift 700ba6a1819Smrg ;; 701ba6a1819Smrg *) 702ba6a1819Smrg set fnord "$@" "$arg" 703ba6a1819Smrg shift # fnord 704ba6a1819Smrg shift # $arg 705ba6a1819Smrg ;; 706ba6a1819Smrg esac 707ba6a1819Smrg done 708ba6a1819Smrg 7091bedbe3fSmrg "$@" -E \ 7101bedbe3fSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7111bedbe3fSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 7121bedbe3fSmrg | sed '$ s: \\$::' > "$tmpdepfile" 713ba6a1819Smrg rm -f "$depfile" 714ba6a1819Smrg echo "$object : \\" > "$depfile" 715ba6a1819Smrg cat < "$tmpdepfile" >> "$depfile" 716ba6a1819Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 717ba6a1819Smrg rm -f "$tmpdepfile" 718ba6a1819Smrg ;; 719ba6a1819Smrg 720ba6a1819Smrgmsvisualcpp) 721ba6a1819Smrg # Important note: in order to support this mode, a compiler *must* 722549e21daSmrg # always write the preprocessed file to stdout. 723ba6a1819Smrg "$@" || exit $? 724549e21daSmrg 725549e21daSmrg # Remove the call to Libtool. 726549e21daSmrg if test "$libtool" = yes; then 727549e21daSmrg while test "X$1" != 'X--mode=compile'; do 728549e21daSmrg shift 729549e21daSmrg done 730549e21daSmrg shift 731549e21daSmrg fi 732549e21daSmrg 733ba6a1819Smrg IFS=" " 734ba6a1819Smrg for arg 735ba6a1819Smrg do 736ba6a1819Smrg case "$arg" in 737549e21daSmrg -o) 738549e21daSmrg shift 739549e21daSmrg ;; 740549e21daSmrg $object) 741549e21daSmrg shift 742549e21daSmrg ;; 743ba6a1819Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 7441bedbe3fSmrg set fnord "$@" 7451bedbe3fSmrg shift 7461bedbe3fSmrg shift 7471bedbe3fSmrg ;; 748ba6a1819Smrg *) 7491bedbe3fSmrg set fnord "$@" "$arg" 7501bedbe3fSmrg shift 7511bedbe3fSmrg shift 7521bedbe3fSmrg ;; 753ba6a1819Smrg esac 754ba6a1819Smrg done 755549e21daSmrg "$@" -E 2>/dev/null | 756549e21daSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 757ba6a1819Smrg rm -f "$depfile" 758ba6a1819Smrg echo "$object : \\" > "$depfile" 7591bedbe3fSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 7601bedbe3fSmrg echo "$tab" >> "$depfile" 761549e21daSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 762ba6a1819Smrg rm -f "$tmpdepfile" 763ba6a1819Smrg ;; 764ba6a1819Smrg 765549e21daSmrgmsvcmsys) 766549e21daSmrg # This case exists only to let depend.m4 do its work. It works by 767549e21daSmrg # looking at the text of this script. This case will never be run, 768549e21daSmrg # since it is checked for above. 769549e21daSmrg exit 1 770549e21daSmrg ;; 771549e21daSmrg 772ba6a1819Smrgnone) 773ba6a1819Smrg exec "$@" 774ba6a1819Smrg ;; 775ba6a1819Smrg 776ba6a1819Smrg*) 777ba6a1819Smrg echo "Unknown depmode $depmode" 1>&2 778ba6a1819Smrg exit 1 779ba6a1819Smrg ;; 780ba6a1819Smrgesac 781ba6a1819Smrg 782ba6a1819Smrgexit 0 783ba6a1819Smrg 784ba6a1819Smrg# Local Variables: 785ba6a1819Smrg# mode: shell-script 786ba6a1819Smrg# sh-indentation: 2 787da1f2d5dSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 788ba6a1819Smrg# time-stamp-start: "scriptversion=" 789ba6a1819Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 790da1f2d5dSmrg# time-stamp-time-zone: "UTC0" 791549e21daSmrg# time-stamp-end: "; # UTC" 792ba6a1819Smrg# End: 793