19f606849Smrg#! /bin/sh 29f606849Smrg# depcomp - compile a program generating dependencies as side-effects 39f606849Smrg 4dc088bc7Smrgscriptversion=2024-06-19.01; # UTC 59f606849Smrg 6dc088bc7Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 79f606849Smrg 89f606849Smrg# This program is free software; you can redistribute it and/or modify 99f606849Smrg# it under the terms of the GNU General Public License as published by 109f606849Smrg# the Free Software Foundation; either version 2, or (at your option) 119f606849Smrg# any later version. 129f606849Smrg 139f606849Smrg# This program is distributed in the hope that it will be useful, 149f606849Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 159f606849Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 169f606849Smrg# GNU General Public License for more details. 179f606849Smrg 189f606849Smrg# You should have received a copy of the GNU General Public License 19949d0342Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 209f606849Smrg 219f606849Smrg# As a special exception to the GNU General Public License, if you 229f606849Smrg# distribute this file as part of a program that contains a 239f606849Smrg# configuration script generated by Autoconf, you may include it under 249f606849Smrg# the same distribution terms that you use for the rest of that program. 259f606849Smrg 269f606849Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 279f606849Smrg 289f606849Smrgcase $1 in 299f606849Smrg '') 30cdbfa18aSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31cdbfa18aSmrg exit 1; 32cdbfa18aSmrg ;; 339f606849Smrg -h | --h*) 349f606849Smrg cat <<\EOF 359f606849SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 369f606849Smrg 379f606849SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 389f606849Smrgas side-effects. 399f606849Smrg 409f606849SmrgEnvironment variables: 419f606849Smrg depmode Dependency tracking mode. 42cdbfa18aSmrg source Source file read by 'PROGRAMS ARGS'. 43cdbfa18aSmrg object Object file output by 'PROGRAMS ARGS'. 449f606849Smrg DEPDIR directory where to store dependencies. 459f606849Smrg depfile Dependency file to output. 46cdbfa18aSmrg tmpdepfile Temporary file to use when outputting dependencies. 479f606849Smrg libtool Whether libtool is used (yes/no). 489f606849Smrg 499f606849SmrgReport bugs to <bug-automake@gnu.org>. 50dc088bc7SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 51dc088bc7SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 529f606849SmrgEOF 539f606849Smrg exit $? 549f606849Smrg ;; 559f606849Smrg -v | --v*) 56dc088bc7Smrg echo "depcomp (GNU Automake) $scriptversion" 579f606849Smrg exit $? 589f606849Smrg ;; 599f606849Smrgesac 609f606849Smrg 61cdbfa18aSmrg# Get the directory component of the given path, and save it in the 62cdbfa18aSmrg# global variables '$dir'. Note that this directory component will 63cdbfa18aSmrg# be either empty or ending with a '/' character. This is deliberate. 64cdbfa18aSmrgset_dir_from () 65cdbfa18aSmrg{ 66cdbfa18aSmrg case $1 in 67cdbfa18aSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 68cdbfa18aSmrg *) dir=;; 69cdbfa18aSmrg esac 70cdbfa18aSmrg} 71cdbfa18aSmrg 72cdbfa18aSmrg# Get the suffix-stripped basename of the given path, and save it the 73cdbfa18aSmrg# global variable '$base'. 74cdbfa18aSmrgset_base_from () 75cdbfa18aSmrg{ 76cdbfa18aSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 77cdbfa18aSmrg} 78cdbfa18aSmrg 79cdbfa18aSmrg# If no dependency file was actually created by the compiler invocation, 80cdbfa18aSmrg# we still have to create a dummy depfile, to avoid errors with the 81cdbfa18aSmrg# Makefile "include basename.Plo" scheme. 82cdbfa18aSmrgmake_dummy_depfile () 83cdbfa18aSmrg{ 84cdbfa18aSmrg echo "#dummy" > "$depfile" 85cdbfa18aSmrg} 86cdbfa18aSmrg 87cdbfa18aSmrg# Factor out some common post-processing of the generated depfile. 88cdbfa18aSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 89cdbfa18aSmrgaix_post_process_depfile () 90cdbfa18aSmrg{ 91cdbfa18aSmrg # If the compiler actually managed to produce a dependency file, 92cdbfa18aSmrg # post-process it. 93cdbfa18aSmrg if test -f "$tmpdepfile"; then 94cdbfa18aSmrg # Each line is of the form 'foo.o: dependency.h'. 95cdbfa18aSmrg # Do two passes, one to just change these to 96cdbfa18aSmrg # $object: dependency.h 97cdbfa18aSmrg # and one to simply output 98cdbfa18aSmrg # dependency.h: 99cdbfa18aSmrg # which is needed to avoid the deleted-header problem. 100cdbfa18aSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 101cdbfa18aSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 102cdbfa18aSmrg } > "$depfile" 103cdbfa18aSmrg rm -f "$tmpdepfile" 104cdbfa18aSmrg else 105cdbfa18aSmrg make_dummy_depfile 106cdbfa18aSmrg fi 107cdbfa18aSmrg} 108cdbfa18aSmrg 109cdbfa18aSmrg# A tabulation character. 110cdbfa18aSmrgtab=' ' 111cdbfa18aSmrg# A newline character. 112cdbfa18aSmrgnl=' 113cdbfa18aSmrg' 114cdbfa18aSmrg# Character ranges might be problematic outside the C locale. 115cdbfa18aSmrg# These definitions help. 116cdbfa18aSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 117cdbfa18aSmrglower=abcdefghijklmnopqrstuvwxyz 118cdbfa18aSmrgalpha=${upper}${lower} 119cdbfa18aSmrg 1209f606849Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1219f606849Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1229f606849Smrg exit 1 1239f606849Smrgfi 1249f606849Smrg 1259f606849Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1269f606849Smrgdepfile=${depfile-`echo "$object" | 1279f606849Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1289f606849Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1299f606849Smrg 1309f606849Smrgrm -f "$tmpdepfile" 1319f606849Smrg 132dc088bc7Smrg# Avoid interference from the environment. 133cdbfa18aSmrggccflag= dashmflag= 134cdbfa18aSmrg 1359f606849Smrg# Some modes work just like other modes, but use different flags. We 1369f606849Smrg# parameterize here, but still list the modes in the big case below, 1379f606849Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1389f606849Smrg# here, because this file can only contain one case statement. 1399f606849Smrgif test "$depmode" = hp; then 1409f606849Smrg # HP compiler uses -M and no extra arg. 1419f606849Smrg gccflag=-M 1429f606849Smrg depmode=gcc 1439f606849Smrgfi 1449f606849Smrg 1459f606849Smrgif test "$depmode" = dashXmstdout; then 146cdbfa18aSmrg # This is just like dashmstdout with a different argument. 147cdbfa18aSmrg dashmflag=-xM 148cdbfa18aSmrg depmode=dashmstdout 1499f606849Smrgfi 1509f606849Smrg 151fba89afeSmrgcygpath_u="cygpath -u -f -" 152fba89afeSmrgif test "$depmode" = msvcmsys; then 153cdbfa18aSmrg # This is just like msvisualcpp but w/o cygpath translation. 154cdbfa18aSmrg # Just convert the backslash-escaped backslashes to single forward 155cdbfa18aSmrg # slashes to satisfy depend.m4 156cdbfa18aSmrg cygpath_u='sed s,\\\\,/,g' 157cdbfa18aSmrg depmode=msvisualcpp 158cdbfa18aSmrgfi 159cdbfa18aSmrg 160cdbfa18aSmrgif test "$depmode" = msvc7msys; then 161cdbfa18aSmrg # This is just like msvc7 but w/o cygpath translation. 162cdbfa18aSmrg # Just convert the backslash-escaped backslashes to single forward 163cdbfa18aSmrg # slashes to satisfy depend.m4 164cdbfa18aSmrg cygpath_u='sed s,\\\\,/,g' 165cdbfa18aSmrg depmode=msvc7 166cdbfa18aSmrgfi 167cdbfa18aSmrg 168cdbfa18aSmrgif test "$depmode" = xlc; then 169cdbfa18aSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 170cdbfa18aSmrg gccflag=-qmakedep=gcc,-MF 171cdbfa18aSmrg depmode=gcc 172fba89afeSmrgfi 173fba89afeSmrg 1749f606849Smrgcase "$depmode" in 1759f606849Smrggcc3) 1769f606849Smrg## gcc 3 implements dependency tracking that does exactly what 1779f606849Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1789f606849Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 1799f606849Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1809f606849Smrg## the command line argument order; so add the flags where they 1819f606849Smrg## appear in depend2.am. Note that the slowdown incurred here 1829f606849Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1839f606849Smrg for arg 1849f606849Smrg do 1859f606849Smrg case $arg in 1869f606849Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1879f606849Smrg *) set fnord "$@" "$arg" ;; 1889f606849Smrg esac 1899f606849Smrg shift # fnord 1909f606849Smrg shift # $arg 1919f606849Smrg done 1929f606849Smrg "$@" 1939f606849Smrg stat=$? 194cdbfa18aSmrg if test $stat -ne 0; then 1959f606849Smrg rm -f "$tmpdepfile" 1969f606849Smrg exit $stat 1979f606849Smrg fi 1989f606849Smrg mv "$tmpdepfile" "$depfile" 1999f606849Smrg ;; 2009f606849Smrg 2019f606849Smrggcc) 202dc088bc7Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 203dc088bc7Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 204cdbfa18aSmrg## (see the conditional assignment to $gccflag above). 2059f606849Smrg## There are various ways to get dependency output from gcc. Here's 2069f606849Smrg## why we pick this rather obscure method: 2079f606849Smrg## - Don't want to use -MD because we'd like the dependencies to end 2089f606849Smrg## up in a subdir. Having to rename by hand is ugly. 2099f606849Smrg## (We might end up doing this anyway to support other compilers.) 2109f606849Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 211cdbfa18aSmrg## -MM, not -M (despite what the docs say). Also, it might not be 212cdbfa18aSmrg## supported by the other compilers which use the 'gcc' depmode. 2139f606849Smrg## - Using -M directly means running the compiler twice (even worse 2149f606849Smrg## than renaming). 2159f606849Smrg if test -z "$gccflag"; then 2169f606849Smrg gccflag=-MD, 2179f606849Smrg fi 2189f606849Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2199f606849Smrg stat=$? 220cdbfa18aSmrg if test $stat -ne 0; then 2219f606849Smrg rm -f "$tmpdepfile" 2229f606849Smrg exit $stat 2239f606849Smrg fi 2249f606849Smrg rm -f "$depfile" 2259f606849Smrg echo "$object : \\" > "$depfile" 226cdbfa18aSmrg # The second -e expression handles DOS-style file names with drive 227cdbfa18aSmrg # letters. 2289f606849Smrg sed -e 's/^[^:]*: / /' \ 2299f606849Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 230cdbfa18aSmrg## This next piece of magic avoids the "deleted header file" problem. 2319f606849Smrg## The problem is that when a header file which appears in a .P file 2329f606849Smrg## is deleted, the dependency causes make to die (because there is 2339f606849Smrg## typically no way to rebuild the header). We avoid this by adding 2349f606849Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2359f606849Smrg## this for us directly. 236cdbfa18aSmrg## Some versions of gcc put a space before the ':'. On the theory 2379f606849Smrg## that the space means something, we add a space to the output as 238cdbfa18aSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 239cdbfa18aSmrg## to the object. Take care to not repeat it in the output. 2409f606849Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2419f606849Smrg## correctly. Breaking it into two sed invocations is a workaround. 242cdbfa18aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 243cdbfa18aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 244cdbfa18aSmrg | sed -e 's/$/ :/' >> "$depfile" 2459f606849Smrg rm -f "$tmpdepfile" 2469f606849Smrg ;; 2479f606849Smrg 2489f606849Smrghp) 2499f606849Smrg # This case exists only to let depend.m4 do its work. It works by 2509f606849Smrg # looking at the text of this script. This case will never be run, 2519f606849Smrg # since it is checked for above. 2529f606849Smrg exit 1 2539f606849Smrg ;; 2549f606849Smrg 2559f606849Smrgsgi) 2569f606849Smrg if test "$libtool" = yes; then 2579f606849Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2589f606849Smrg else 2599f606849Smrg "$@" -MDupdate "$tmpdepfile" 2609f606849Smrg fi 2619f606849Smrg stat=$? 262cdbfa18aSmrg if test $stat -ne 0; then 2639f606849Smrg rm -f "$tmpdepfile" 2649f606849Smrg exit $stat 2659f606849Smrg fi 2669f606849Smrg rm -f "$depfile" 2679f606849Smrg 2689f606849Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2699f606849Smrg echo "$object : \\" > "$depfile" 2709f606849Smrg # Clip off the initial element (the dependent). Don't try to be 2719f606849Smrg # clever and replace this with sed code, as IRIX sed won't handle 2729f606849Smrg # lines with more than a fixed number of characters (4096 in 2739f606849Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 274cdbfa18aSmrg # the IRIX cc adds comments like '#:fec' to the end of the 2759f606849Smrg # dependency line. 276cdbfa18aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 277cdbfa18aSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 278cdbfa18aSmrg | tr "$nl" ' ' >> "$depfile" 279fba89afeSmrg echo >> "$depfile" 2809f606849Smrg # The second pass generates a dummy entry for each header file. 281cdbfa18aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 282cdbfa18aSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 283cdbfa18aSmrg >> "$depfile" 2849f606849Smrg else 285cdbfa18aSmrg make_dummy_depfile 2869f606849Smrg fi 2879f606849Smrg rm -f "$tmpdepfile" 2889f606849Smrg ;; 2899f606849Smrg 290cdbfa18aSmrgxlc) 291cdbfa18aSmrg # This case exists only to let depend.m4 do its work. It works by 292cdbfa18aSmrg # looking at the text of this script. This case will never be run, 293cdbfa18aSmrg # since it is checked for above. 294cdbfa18aSmrg exit 1 295cdbfa18aSmrg ;; 296cdbfa18aSmrg 2979f606849Smrgaix) 2989f606849Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2999f606849Smrg # in a .u file. In older versions, this file always lives in the 300cdbfa18aSmrg # current directory. Also, the AIX compiler puts '$object:' at the 3019f606849Smrg # start of each line; $object doesn't have directory information. 3029f606849Smrg # Version 6 uses the directory in both cases. 303cdbfa18aSmrg set_dir_from "$object" 304cdbfa18aSmrg set_base_from "$object" 3059f606849Smrg if test "$libtool" = yes; then 306fba89afeSmrg tmpdepfile1=$dir$base.u 307fba89afeSmrg tmpdepfile2=$base.u 308fba89afeSmrg tmpdepfile3=$dir.libs/$base.u 3099f606849Smrg "$@" -Wc,-M 3109f606849Smrg else 311fba89afeSmrg tmpdepfile1=$dir$base.u 312fba89afeSmrg tmpdepfile2=$dir$base.u 313fba89afeSmrg tmpdepfile3=$dir$base.u 3149f606849Smrg "$@" -M 3159f606849Smrg fi 3169f606849Smrg stat=$? 317cdbfa18aSmrg if test $stat -ne 0; then 318fba89afeSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3199f606849Smrg exit $stat 3209f606849Smrg fi 3219f606849Smrg 322fba89afeSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 323fba89afeSmrg do 324fba89afeSmrg test -f "$tmpdepfile" && break 325fba89afeSmrg done 326cdbfa18aSmrg aix_post_process_depfile 327cdbfa18aSmrg ;; 328cdbfa18aSmrg 329cdbfa18aSmrgtcc) 330cdbfa18aSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 331cdbfa18aSmrg # FIXME: That version still under development at the moment of writing. 332cdbfa18aSmrg # Make that this statement remains true also for stable, released 333cdbfa18aSmrg # versions. 334cdbfa18aSmrg # It will wrap lines (doesn't matter whether long or short) with a 335cdbfa18aSmrg # trailing '\', as in: 336cdbfa18aSmrg # 337cdbfa18aSmrg # foo.o : \ 338cdbfa18aSmrg # foo.c \ 339cdbfa18aSmrg # foo.h \ 340cdbfa18aSmrg # 341cdbfa18aSmrg # It will put a trailing '\' even on the last line, and will use leading 342cdbfa18aSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 343cdbfa18aSmrg # "Emit spaces for -MD"). 344cdbfa18aSmrg "$@" -MD -MF "$tmpdepfile" 345cdbfa18aSmrg stat=$? 346cdbfa18aSmrg if test $stat -ne 0; then 347cdbfa18aSmrg rm -f "$tmpdepfile" 348cdbfa18aSmrg exit $stat 3499f606849Smrg fi 350cdbfa18aSmrg rm -f "$depfile" 351cdbfa18aSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 352cdbfa18aSmrg # We have to change lines of the first kind to '$object: \'. 353cdbfa18aSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 354cdbfa18aSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 355cdbfa18aSmrg # dummy dependency, to avoid the deleted-header problem. 356cdbfa18aSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3579f606849Smrg rm -f "$tmpdepfile" 3589f606849Smrg ;; 3599f606849Smrg 360cdbfa18aSmrg## The order of this option in the case statement is important, since the 361cdbfa18aSmrg## shell code in configure will try each of these formats in the order 362cdbfa18aSmrg## listed in this file. A plain '-MD' option would be understood by many 363cdbfa18aSmrg## compilers, so we must ensure this comes after the gcc and icc options. 364cdbfa18aSmrgpgcc) 365cdbfa18aSmrg # Portland's C compiler understands '-MD'. 366cdbfa18aSmrg # Will always output deps to 'file.d' where file is the root name of the 367cdbfa18aSmrg # source file under compilation, even if file resides in a subdirectory. 368cdbfa18aSmrg # The object file name does not affect the name of the '.d' file. 369cdbfa18aSmrg # pgcc 10.2 will output 3709f606849Smrg # foo.o: sub/foo.c sub/foo.h 371cdbfa18aSmrg # and will wrap long lines using '\' : 3729f606849Smrg # foo.o: sub/foo.c ... \ 3739f606849Smrg # sub/foo.h ... \ 3749f606849Smrg # ... 375cdbfa18aSmrg set_dir_from "$object" 376cdbfa18aSmrg # Use the source, not the object, to determine the base name, since 377cdbfa18aSmrg # that's sadly what pgcc will do too. 378cdbfa18aSmrg set_base_from "$source" 379cdbfa18aSmrg tmpdepfile=$base.d 380cdbfa18aSmrg 381cdbfa18aSmrg # For projects that build the same source file twice into different object 382cdbfa18aSmrg # files, the pgcc approach of using the *source* file root name can cause 383cdbfa18aSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 384cdbfa18aSmrg # the same $tmpdepfile. 385cdbfa18aSmrg lockdir=$base.d-lock 386cdbfa18aSmrg trap " 387cdbfa18aSmrg echo '$0: caught signal, cleaning up...' >&2 388cdbfa18aSmrg rmdir '$lockdir' 389cdbfa18aSmrg exit 1 390cdbfa18aSmrg " 1 2 13 15 391cdbfa18aSmrg numtries=100 392cdbfa18aSmrg i=$numtries 393cdbfa18aSmrg while test $i -gt 0; do 394cdbfa18aSmrg # mkdir is a portable test-and-set. 395cdbfa18aSmrg if mkdir "$lockdir" 2>/dev/null; then 396cdbfa18aSmrg # This process acquired the lock. 397cdbfa18aSmrg "$@" -MD 398cdbfa18aSmrg stat=$? 399cdbfa18aSmrg # Release the lock. 400cdbfa18aSmrg rmdir "$lockdir" 401cdbfa18aSmrg break 402cdbfa18aSmrg else 403cdbfa18aSmrg # If the lock is being held by a different process, wait 404cdbfa18aSmrg # until the winning process is done or we timeout. 405cdbfa18aSmrg while test -d "$lockdir" && test $i -gt 0; do 406cdbfa18aSmrg sleep 1 407cdbfa18aSmrg i=`expr $i - 1` 408cdbfa18aSmrg done 409cdbfa18aSmrg fi 410cdbfa18aSmrg i=`expr $i - 1` 411cdbfa18aSmrg done 412cdbfa18aSmrg trap - 1 2 13 15 413cdbfa18aSmrg if test $i -le 0; then 414cdbfa18aSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 415cdbfa18aSmrg echo "$0: check lockdir '$lockdir'" >&2 416cdbfa18aSmrg exit 1 417cdbfa18aSmrg fi 4189f606849Smrg 419cdbfa18aSmrg if test $stat -ne 0; then 4209f606849Smrg rm -f "$tmpdepfile" 4219f606849Smrg exit $stat 4229f606849Smrg fi 4239f606849Smrg rm -f "$depfile" 4249f606849Smrg # Each line is of the form `foo.o: dependent.h', 4259f606849Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4269f606849Smrg # Do two passes, one to just change these to 4279f606849Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4289f606849Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4299f606849Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4309f606849Smrg # correctly. Breaking it into two sed invocations is a workaround. 431cdbfa18aSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 432cdbfa18aSmrg | sed -e 's/$/ :/' >> "$depfile" 4339f606849Smrg rm -f "$tmpdepfile" 4349f606849Smrg ;; 4359f606849Smrg 4369f606849Smrghp2) 4379f606849Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4389f606849Smrg # compilers, which have integrated preprocessors. The correct option 4399f606849Smrg # to use with these is +Maked; it writes dependencies to a file named 4409f606849Smrg # 'foo.d', which lands next to the object file, wherever that 4419f606849Smrg # happens to be. 4429f606849Smrg # Much of this is similar to the tru64 case; see comments there. 443cdbfa18aSmrg set_dir_from "$object" 444cdbfa18aSmrg set_base_from "$object" 4459f606849Smrg if test "$libtool" = yes; then 4469f606849Smrg tmpdepfile1=$dir$base.d 4479f606849Smrg tmpdepfile2=$dir.libs/$base.d 4489f606849Smrg "$@" -Wc,+Maked 4499f606849Smrg else 4509f606849Smrg tmpdepfile1=$dir$base.d 4519f606849Smrg tmpdepfile2=$dir$base.d 4529f606849Smrg "$@" +Maked 4539f606849Smrg fi 4549f606849Smrg stat=$? 455cdbfa18aSmrg if test $stat -ne 0; then 4569f606849Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4579f606849Smrg exit $stat 4589f606849Smrg fi 4599f606849Smrg 4609f606849Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4619f606849Smrg do 4629f606849Smrg test -f "$tmpdepfile" && break 4639f606849Smrg done 4649f606849Smrg if test -f "$tmpdepfile"; then 465cdbfa18aSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 466cdbfa18aSmrg # Add 'dependent.h:' lines. 467fba89afeSmrg sed -ne '2,${ 468cdbfa18aSmrg s/^ *// 469cdbfa18aSmrg s/ \\*$// 470cdbfa18aSmrg s/$/:/ 471cdbfa18aSmrg p 472cdbfa18aSmrg }' "$tmpdepfile" >> "$depfile" 4739f606849Smrg else 474cdbfa18aSmrg make_dummy_depfile 4759f606849Smrg fi 4769f606849Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4779f606849Smrg ;; 4789f606849Smrg 4799f606849Smrgtru64) 480cdbfa18aSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 481cdbfa18aSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 482cdbfa18aSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 483cdbfa18aSmrg # dependencies in 'foo.d' instead, so we check for that too. 484cdbfa18aSmrg # Subdirectories are respected. 485cdbfa18aSmrg set_dir_from "$object" 486cdbfa18aSmrg set_base_from "$object" 487cdbfa18aSmrg 488cdbfa18aSmrg if test "$libtool" = yes; then 489cdbfa18aSmrg # Libtool generates 2 separate objects for the 2 libraries. These 490cdbfa18aSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 491cdbfa18aSmrg # in $dir$base.o.d. We have to check for both files, because 492cdbfa18aSmrg # one of the two compilations can be disabled. We should prefer 493cdbfa18aSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 494cdbfa18aSmrg # automatically cleaned when .libs/ is deleted, while ignoring 495cdbfa18aSmrg # the former would cause a distcleancheck panic. 496cdbfa18aSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 497cdbfa18aSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 498cdbfa18aSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 499cdbfa18aSmrg "$@" -Wc,-MD 500cdbfa18aSmrg else 501cdbfa18aSmrg tmpdepfile1=$dir$base.d 502cdbfa18aSmrg tmpdepfile2=$dir$base.d 503cdbfa18aSmrg tmpdepfile3=$dir$base.d 504cdbfa18aSmrg "$@" -MD 505cdbfa18aSmrg fi 506cdbfa18aSmrg 507cdbfa18aSmrg stat=$? 508cdbfa18aSmrg if test $stat -ne 0; then 509cdbfa18aSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 510cdbfa18aSmrg exit $stat 511cdbfa18aSmrg fi 512cdbfa18aSmrg 513cdbfa18aSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 514cdbfa18aSmrg do 515cdbfa18aSmrg test -f "$tmpdepfile" && break 516cdbfa18aSmrg done 517cdbfa18aSmrg # Same post-processing that is required for AIX mode. 518cdbfa18aSmrg aix_post_process_depfile 519cdbfa18aSmrg ;; 520cdbfa18aSmrg 521cdbfa18aSmrgmsvc7) 522cdbfa18aSmrg if test "$libtool" = yes; then 523cdbfa18aSmrg showIncludes=-Wc,-showIncludes 524cdbfa18aSmrg else 525cdbfa18aSmrg showIncludes=-showIncludes 526cdbfa18aSmrg fi 527cdbfa18aSmrg "$@" $showIncludes > "$tmpdepfile" 528cdbfa18aSmrg stat=$? 529cdbfa18aSmrg grep -v '^Note: including file: ' "$tmpdepfile" 530cdbfa18aSmrg if test $stat -ne 0; then 531cdbfa18aSmrg rm -f "$tmpdepfile" 532cdbfa18aSmrg exit $stat 533cdbfa18aSmrg fi 534cdbfa18aSmrg rm -f "$depfile" 535cdbfa18aSmrg echo "$object : \\" > "$depfile" 536cdbfa18aSmrg # The first sed program below extracts the file names and escapes 537cdbfa18aSmrg # backslashes for cygpath. The second sed program outputs the file 538cdbfa18aSmrg # name when reading, but also accumulates all include files in the 539cdbfa18aSmrg # hold buffer in order to output them again at the end. This only 540cdbfa18aSmrg # works with sed implementations that can handle large buffers. 541cdbfa18aSmrg sed < "$tmpdepfile" -n ' 542cdbfa18aSmrg/^Note: including file: *\(.*\)/ { 543cdbfa18aSmrg s//\1/ 544cdbfa18aSmrg s/\\/\\\\/g 545cdbfa18aSmrg p 546cdbfa18aSmrg}' | $cygpath_u | sort -u | sed -n ' 547cdbfa18aSmrgs/ /\\ /g 548cdbfa18aSmrgs/\(.*\)/'"$tab"'\1 \\/p 549cdbfa18aSmrgs/.\(.*\) \\/\1:/ 550cdbfa18aSmrgH 551cdbfa18aSmrg$ { 552cdbfa18aSmrg s/.*/'"$tab"'/ 553cdbfa18aSmrg G 554cdbfa18aSmrg p 555cdbfa18aSmrg}' >> "$depfile" 556fef5d1ffSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 557cdbfa18aSmrg rm -f "$tmpdepfile" 558cdbfa18aSmrg ;; 559cdbfa18aSmrg 560cdbfa18aSmrgmsvc7msys) 561cdbfa18aSmrg # This case exists only to let depend.m4 do its work. It works by 562cdbfa18aSmrg # looking at the text of this script. This case will never be run, 563cdbfa18aSmrg # since it is checked for above. 564cdbfa18aSmrg exit 1 565cdbfa18aSmrg ;; 5669f606849Smrg 5679f606849Smrg#nosideeffect) 5689f606849Smrg # This comment above is used by automake to tell side-effect 5699f606849Smrg # dependency tracking mechanisms from slower ones. 5709f606849Smrg 5719f606849Smrgdashmstdout) 5729f606849Smrg # Important note: in order to support this mode, a compiler *must* 5739f606849Smrg # always write the preprocessed file to stdout, regardless of -o. 5749f606849Smrg "$@" || exit $? 5759f606849Smrg 5769f606849Smrg # Remove the call to Libtool. 5779f606849Smrg if test "$libtool" = yes; then 578fba89afeSmrg while test "X$1" != 'X--mode=compile'; do 5799f606849Smrg shift 5809f606849Smrg done 5819f606849Smrg shift 5829f606849Smrg fi 5839f606849Smrg 584cdbfa18aSmrg # Remove '-o $object'. 5859f606849Smrg IFS=" " 5869f606849Smrg for arg 5879f606849Smrg do 5889f606849Smrg case $arg in 5899f606849Smrg -o) 5909f606849Smrg shift 5919f606849Smrg ;; 5929f606849Smrg $object) 5939f606849Smrg shift 5949f606849Smrg ;; 5959f606849Smrg *) 5969f606849Smrg set fnord "$@" "$arg" 5979f606849Smrg shift # fnord 5989f606849Smrg shift # $arg 5999f606849Smrg ;; 6009f606849Smrg esac 6019f606849Smrg done 6029f606849Smrg 6039f606849Smrg test -z "$dashmflag" && dashmflag=-M 604cdbfa18aSmrg # Require at least two characters before searching for ':' 6059f606849Smrg # in the target name. This is to cope with DOS-style filenames: 606cdbfa18aSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6079f606849Smrg "$@" $dashmflag | 608cdbfa18aSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6099f606849Smrg rm -f "$depfile" 6109f606849Smrg cat < "$tmpdepfile" > "$depfile" 611cdbfa18aSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 612cdbfa18aSmrg # correctly. Breaking it into two sed invocations is a workaround. 613cdbfa18aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 614cdbfa18aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 615cdbfa18aSmrg | sed -e 's/$/ :/' >> "$depfile" 6169f606849Smrg rm -f "$tmpdepfile" 6179f606849Smrg ;; 6189f606849Smrg 6199f606849SmrgdashXmstdout) 6209f606849Smrg # This case only exists to satisfy depend.m4. It is never actually 6219f606849Smrg # run, as this mode is specially recognized in the preamble. 6229f606849Smrg exit 1 6239f606849Smrg ;; 6249f606849Smrg 6259f606849Smrgmakedepend) 6269f606849Smrg "$@" || exit $? 6279f606849Smrg # Remove any Libtool call 6289f606849Smrg if test "$libtool" = yes; then 629fba89afeSmrg while test "X$1" != 'X--mode=compile'; do 6309f606849Smrg shift 6319f606849Smrg done 6329f606849Smrg shift 6339f606849Smrg fi 6349f606849Smrg # X makedepend 6359f606849Smrg shift 636fba89afeSmrg cleared=no eat=no 637fba89afeSmrg for arg 638fba89afeSmrg do 6399f606849Smrg case $cleared in 6409f606849Smrg no) 6419f606849Smrg set ""; shift 6429f606849Smrg cleared=yes ;; 6439f606849Smrg esac 644fba89afeSmrg if test $eat = yes; then 645fba89afeSmrg eat=no 646fba89afeSmrg continue 647fba89afeSmrg fi 6489f606849Smrg case "$arg" in 6499f606849Smrg -D*|-I*) 6509f606849Smrg set fnord "$@" "$arg"; shift ;; 6519f606849Smrg # Strip any option that makedepend may not understand. Remove 6529f606849Smrg # the object too, otherwise makedepend will parse it as a source file. 653fba89afeSmrg -arch) 654fba89afeSmrg eat=yes ;; 6559f606849Smrg -*|$object) 6569f606849Smrg ;; 6579f606849Smrg *) 6589f606849Smrg set fnord "$@" "$arg"; shift ;; 6599f606849Smrg esac 6609f606849Smrg done 661fba89afeSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6629f606849Smrg touch "$tmpdepfile" 6639f606849Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6649f606849Smrg rm -f "$depfile" 665cdbfa18aSmrg # makedepend may prepend the VPATH from the source file name to the object. 666cdbfa18aSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 667cdbfa18aSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 668cdbfa18aSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 669cdbfa18aSmrg # correctly. Breaking it into two sed invocations is a workaround. 670cdbfa18aSmrg sed '1,2d' "$tmpdepfile" \ 671cdbfa18aSmrg | tr ' ' "$nl" \ 672cdbfa18aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 673cdbfa18aSmrg | sed -e 's/$/ :/' >> "$depfile" 6749f606849Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6759f606849Smrg ;; 6769f606849Smrg 6779f606849Smrgcpp) 6789f606849Smrg # Important note: in order to support this mode, a compiler *must* 6799f606849Smrg # always write the preprocessed file to stdout. 6809f606849Smrg "$@" || exit $? 6819f606849Smrg 6829f606849Smrg # Remove the call to Libtool. 6839f606849Smrg if test "$libtool" = yes; then 684fba89afeSmrg while test "X$1" != 'X--mode=compile'; do 6859f606849Smrg shift 6869f606849Smrg done 6879f606849Smrg shift 6889f606849Smrg fi 6899f606849Smrg 690cdbfa18aSmrg # Remove '-o $object'. 6919f606849Smrg IFS=" " 6929f606849Smrg for arg 6939f606849Smrg do 6949f606849Smrg case $arg in 6959f606849Smrg -o) 6969f606849Smrg shift 6979f606849Smrg ;; 6989f606849Smrg $object) 6999f606849Smrg shift 7009f606849Smrg ;; 7019f606849Smrg *) 7029f606849Smrg set fnord "$@" "$arg" 7039f606849Smrg shift # fnord 7049f606849Smrg shift # $arg 7059f606849Smrg ;; 7069f606849Smrg esac 7079f606849Smrg done 7089f606849Smrg 709cdbfa18aSmrg "$@" -E \ 710cdbfa18aSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711cdbfa18aSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 712cdbfa18aSmrg | sed '$ s: \\$::' > "$tmpdepfile" 7139f606849Smrg rm -f "$depfile" 7149f606849Smrg echo "$object : \\" > "$depfile" 7159f606849Smrg cat < "$tmpdepfile" >> "$depfile" 7169f606849Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7179f606849Smrg rm -f "$tmpdepfile" 7189f606849Smrg ;; 7199f606849Smrg 7209f606849Smrgmsvisualcpp) 7219f606849Smrg # Important note: in order to support this mode, a compiler *must* 722fba89afeSmrg # always write the preprocessed file to stdout. 7239f606849Smrg "$@" || exit $? 724fba89afeSmrg 725fba89afeSmrg # Remove the call to Libtool. 726fba89afeSmrg if test "$libtool" = yes; then 727fba89afeSmrg while test "X$1" != 'X--mode=compile'; do 728fba89afeSmrg shift 729fba89afeSmrg done 730fba89afeSmrg shift 731fba89afeSmrg fi 732fba89afeSmrg 7339f606849Smrg IFS=" " 7349f606849Smrg for arg 7359f606849Smrg do 7369f606849Smrg case "$arg" in 737fba89afeSmrg -o) 738fba89afeSmrg shift 739fba89afeSmrg ;; 740fba89afeSmrg $object) 741fba89afeSmrg shift 742fba89afeSmrg ;; 7439f606849Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 744cdbfa18aSmrg set fnord "$@" 745cdbfa18aSmrg shift 746cdbfa18aSmrg shift 747cdbfa18aSmrg ;; 7489f606849Smrg *) 749cdbfa18aSmrg set fnord "$@" "$arg" 750cdbfa18aSmrg shift 751cdbfa18aSmrg shift 752cdbfa18aSmrg ;; 7539f606849Smrg esac 7549f606849Smrg done 755fba89afeSmrg "$@" -E 2>/dev/null | 756fba89afeSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7579f606849Smrg rm -f "$depfile" 7589f606849Smrg echo "$object : \\" > "$depfile" 759cdbfa18aSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 760cdbfa18aSmrg echo "$tab" >> "$depfile" 761fba89afeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7629f606849Smrg rm -f "$tmpdepfile" 7639f606849Smrg ;; 7649f606849Smrg 765fba89afeSmrgmsvcmsys) 766fba89afeSmrg # This case exists only to let depend.m4 do its work. It works by 767fba89afeSmrg # looking at the text of this script. This case will never be run, 768fba89afeSmrg # since it is checked for above. 769fba89afeSmrg exit 1 770fba89afeSmrg ;; 771fba89afeSmrg 7729f606849Smrgnone) 7739f606849Smrg exec "$@" 7749f606849Smrg ;; 7759f606849Smrg 7769f606849Smrg*) 7779f606849Smrg echo "Unknown depmode $depmode" 1>&2 7789f606849Smrg exit 1 7799f606849Smrg ;; 7809f606849Smrgesac 7819f606849Smrg 7829f606849Smrgexit 0 7839f606849Smrg 7849f606849Smrg# Local Variables: 7859f606849Smrg# mode: shell-script 7869f606849Smrg# sh-indentation: 2 787949d0342Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 7889f606849Smrg# time-stamp-start: "scriptversion=" 7899f606849Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 790949d0342Smrg# time-stamp-time-zone: "UTC0" 791fba89afeSmrg# time-stamp-end: "; # UTC" 7929f606849Smrg# End: 793