depcomp revision 949d0342
19f606849Smrg#! /bin/sh 29f606849Smrg# depcomp - compile a program generating dependencies as side-effects 39f606849Smrg 4949d0342Smrgscriptversion=2018-03-07.03; # UTC 59f606849Smrg 6949d0342Smrg# Copyright (C) 1999-2021 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>. 509f606849SmrgEOF 519f606849Smrg exit $? 529f606849Smrg ;; 539f606849Smrg -v | --v*) 549f606849Smrg echo "depcomp $scriptversion" 559f606849Smrg exit $? 569f606849Smrg ;; 579f606849Smrgesac 589f606849Smrg 59cdbfa18aSmrg# Get the directory component of the given path, and save it in the 60cdbfa18aSmrg# global variables '$dir'. Note that this directory component will 61cdbfa18aSmrg# be either empty or ending with a '/' character. This is deliberate. 62cdbfa18aSmrgset_dir_from () 63cdbfa18aSmrg{ 64cdbfa18aSmrg case $1 in 65cdbfa18aSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66cdbfa18aSmrg *) dir=;; 67cdbfa18aSmrg esac 68cdbfa18aSmrg} 69cdbfa18aSmrg 70cdbfa18aSmrg# Get the suffix-stripped basename of the given path, and save it the 71cdbfa18aSmrg# global variable '$base'. 72cdbfa18aSmrgset_base_from () 73cdbfa18aSmrg{ 74cdbfa18aSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75cdbfa18aSmrg} 76cdbfa18aSmrg 77cdbfa18aSmrg# If no dependency file was actually created by the compiler invocation, 78cdbfa18aSmrg# we still have to create a dummy depfile, to avoid errors with the 79cdbfa18aSmrg# Makefile "include basename.Plo" scheme. 80cdbfa18aSmrgmake_dummy_depfile () 81cdbfa18aSmrg{ 82cdbfa18aSmrg echo "#dummy" > "$depfile" 83cdbfa18aSmrg} 84cdbfa18aSmrg 85cdbfa18aSmrg# Factor out some common post-processing of the generated depfile. 86cdbfa18aSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87cdbfa18aSmrgaix_post_process_depfile () 88cdbfa18aSmrg{ 89cdbfa18aSmrg # If the compiler actually managed to produce a dependency file, 90cdbfa18aSmrg # post-process it. 91cdbfa18aSmrg if test -f "$tmpdepfile"; then 92cdbfa18aSmrg # Each line is of the form 'foo.o: dependency.h'. 93cdbfa18aSmrg # Do two passes, one to just change these to 94cdbfa18aSmrg # $object: dependency.h 95cdbfa18aSmrg # and one to simply output 96cdbfa18aSmrg # dependency.h: 97cdbfa18aSmrg # which is needed to avoid the deleted-header problem. 98cdbfa18aSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99cdbfa18aSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100cdbfa18aSmrg } > "$depfile" 101cdbfa18aSmrg rm -f "$tmpdepfile" 102cdbfa18aSmrg else 103cdbfa18aSmrg make_dummy_depfile 104cdbfa18aSmrg fi 105cdbfa18aSmrg} 106cdbfa18aSmrg 107cdbfa18aSmrg# A tabulation character. 108cdbfa18aSmrgtab=' ' 109cdbfa18aSmrg# A newline character. 110cdbfa18aSmrgnl=' 111cdbfa18aSmrg' 112cdbfa18aSmrg# Character ranges might be problematic outside the C locale. 113cdbfa18aSmrg# These definitions help. 114cdbfa18aSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115cdbfa18aSmrglower=abcdefghijklmnopqrstuvwxyz 116cdbfa18aSmrgdigits=0123456789 117cdbfa18aSmrgalpha=${upper}${lower} 118cdbfa18aSmrg 1199f606849Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1209f606849Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1219f606849Smrg exit 1 1229f606849Smrgfi 1239f606849Smrg 1249f606849Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1259f606849Smrgdepfile=${depfile-`echo "$object" | 1269f606849Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1279f606849Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1289f606849Smrg 1299f606849Smrgrm -f "$tmpdepfile" 1309f606849Smrg 131cdbfa18aSmrg# Avoid interferences from the environment. 132cdbfa18aSmrggccflag= dashmflag= 133cdbfa18aSmrg 1349f606849Smrg# Some modes work just like other modes, but use different flags. We 1359f606849Smrg# parameterize here, but still list the modes in the big case below, 1369f606849Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1379f606849Smrg# here, because this file can only contain one case statement. 1389f606849Smrgif test "$depmode" = hp; then 1399f606849Smrg # HP compiler uses -M and no extra arg. 1409f606849Smrg gccflag=-M 1419f606849Smrg depmode=gcc 1429f606849Smrgfi 1439f606849Smrg 1449f606849Smrgif test "$depmode" = dashXmstdout; then 145cdbfa18aSmrg # This is just like dashmstdout with a different argument. 146cdbfa18aSmrg dashmflag=-xM 147cdbfa18aSmrg depmode=dashmstdout 1489f606849Smrgfi 1499f606849Smrg 150fba89afeSmrgcygpath_u="cygpath -u -f -" 151fba89afeSmrgif test "$depmode" = msvcmsys; then 152cdbfa18aSmrg # This is just like msvisualcpp but w/o cygpath translation. 153cdbfa18aSmrg # Just convert the backslash-escaped backslashes to single forward 154cdbfa18aSmrg # slashes to satisfy depend.m4 155cdbfa18aSmrg cygpath_u='sed s,\\\\,/,g' 156cdbfa18aSmrg depmode=msvisualcpp 157cdbfa18aSmrgfi 158cdbfa18aSmrg 159cdbfa18aSmrgif test "$depmode" = msvc7msys; then 160cdbfa18aSmrg # This is just like msvc7 but w/o cygpath translation. 161cdbfa18aSmrg # Just convert the backslash-escaped backslashes to single forward 162cdbfa18aSmrg # slashes to satisfy depend.m4 163cdbfa18aSmrg cygpath_u='sed s,\\\\,/,g' 164cdbfa18aSmrg depmode=msvc7 165cdbfa18aSmrgfi 166cdbfa18aSmrg 167cdbfa18aSmrgif test "$depmode" = xlc; then 168cdbfa18aSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169cdbfa18aSmrg gccflag=-qmakedep=gcc,-MF 170cdbfa18aSmrg depmode=gcc 171fba89afeSmrgfi 172fba89afeSmrg 1739f606849Smrgcase "$depmode" in 1749f606849Smrggcc3) 1759f606849Smrg## gcc 3 implements dependency tracking that does exactly what 1769f606849Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1779f606849Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 1789f606849Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1799f606849Smrg## the command line argument order; so add the flags where they 1809f606849Smrg## appear in depend2.am. Note that the slowdown incurred here 1819f606849Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1829f606849Smrg for arg 1839f606849Smrg do 1849f606849Smrg case $arg in 1859f606849Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1869f606849Smrg *) set fnord "$@" "$arg" ;; 1879f606849Smrg esac 1889f606849Smrg shift # fnord 1899f606849Smrg shift # $arg 1909f606849Smrg done 1919f606849Smrg "$@" 1929f606849Smrg stat=$? 193cdbfa18aSmrg if test $stat -ne 0; then 1949f606849Smrg rm -f "$tmpdepfile" 1959f606849Smrg exit $stat 1969f606849Smrg fi 1979f606849Smrg mv "$tmpdepfile" "$depfile" 1989f606849Smrg ;; 1999f606849Smrg 2009f606849Smrggcc) 201cdbfa18aSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202cdbfa18aSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203cdbfa18aSmrg## (see the conditional assignment to $gccflag above). 2049f606849Smrg## There are various ways to get dependency output from gcc. Here's 2059f606849Smrg## why we pick this rather obscure method: 2069f606849Smrg## - Don't want to use -MD because we'd like the dependencies to end 2079f606849Smrg## up in a subdir. Having to rename by hand is ugly. 2089f606849Smrg## (We might end up doing this anyway to support other compilers.) 2099f606849Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210cdbfa18aSmrg## -MM, not -M (despite what the docs say). Also, it might not be 211cdbfa18aSmrg## supported by the other compilers which use the 'gcc' depmode. 2129f606849Smrg## - Using -M directly means running the compiler twice (even worse 2139f606849Smrg## than renaming). 2149f606849Smrg if test -z "$gccflag"; then 2159f606849Smrg gccflag=-MD, 2169f606849Smrg fi 2179f606849Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2189f606849Smrg stat=$? 219cdbfa18aSmrg if test $stat -ne 0; then 2209f606849Smrg rm -f "$tmpdepfile" 2219f606849Smrg exit $stat 2229f606849Smrg fi 2239f606849Smrg rm -f "$depfile" 2249f606849Smrg echo "$object : \\" > "$depfile" 225cdbfa18aSmrg # The second -e expression handles DOS-style file names with drive 226cdbfa18aSmrg # letters. 2279f606849Smrg sed -e 's/^[^:]*: / /' \ 2289f606849Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229cdbfa18aSmrg## This next piece of magic avoids the "deleted header file" problem. 2309f606849Smrg## The problem is that when a header file which appears in a .P file 2319f606849Smrg## is deleted, the dependency causes make to die (because there is 2329f606849Smrg## typically no way to rebuild the header). We avoid this by adding 2339f606849Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2349f606849Smrg## this for us directly. 235cdbfa18aSmrg## Some versions of gcc put a space before the ':'. On the theory 2369f606849Smrg## that the space means something, we add a space to the output as 237cdbfa18aSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 238cdbfa18aSmrg## to the object. Take care to not repeat it in the output. 2399f606849Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2409f606849Smrg## correctly. Breaking it into two sed invocations is a workaround. 241cdbfa18aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 242cdbfa18aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243cdbfa18aSmrg | sed -e 's/$/ :/' >> "$depfile" 2449f606849Smrg rm -f "$tmpdepfile" 2459f606849Smrg ;; 2469f606849Smrg 2479f606849Smrghp) 2489f606849Smrg # This case exists only to let depend.m4 do its work. It works by 2499f606849Smrg # looking at the text of this script. This case will never be run, 2509f606849Smrg # since it is checked for above. 2519f606849Smrg exit 1 2529f606849Smrg ;; 2539f606849Smrg 2549f606849Smrgsgi) 2559f606849Smrg if test "$libtool" = yes; then 2569f606849Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2579f606849Smrg else 2589f606849Smrg "$@" -MDupdate "$tmpdepfile" 2599f606849Smrg fi 2609f606849Smrg stat=$? 261cdbfa18aSmrg if test $stat -ne 0; then 2629f606849Smrg rm -f "$tmpdepfile" 2639f606849Smrg exit $stat 2649f606849Smrg fi 2659f606849Smrg rm -f "$depfile" 2669f606849Smrg 2679f606849Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2689f606849Smrg echo "$object : \\" > "$depfile" 2699f606849Smrg # Clip off the initial element (the dependent). Don't try to be 2709f606849Smrg # clever and replace this with sed code, as IRIX sed won't handle 2719f606849Smrg # lines with more than a fixed number of characters (4096 in 2729f606849Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273cdbfa18aSmrg # the IRIX cc adds comments like '#:fec' to the end of the 2749f606849Smrg # dependency line. 275cdbfa18aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 276cdbfa18aSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277cdbfa18aSmrg | tr "$nl" ' ' >> "$depfile" 278fba89afeSmrg echo >> "$depfile" 2799f606849Smrg # The second pass generates a dummy entry for each header file. 280cdbfa18aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 281cdbfa18aSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282cdbfa18aSmrg >> "$depfile" 2839f606849Smrg else 284cdbfa18aSmrg make_dummy_depfile 2859f606849Smrg fi 2869f606849Smrg rm -f "$tmpdepfile" 2879f606849Smrg ;; 2889f606849Smrg 289cdbfa18aSmrgxlc) 290cdbfa18aSmrg # This case exists only to let depend.m4 do its work. It works by 291cdbfa18aSmrg # looking at the text of this script. This case will never be run, 292cdbfa18aSmrg # since it is checked for above. 293cdbfa18aSmrg exit 1 294cdbfa18aSmrg ;; 295cdbfa18aSmrg 2969f606849Smrgaix) 2979f606849Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2989f606849Smrg # in a .u file. In older versions, this file always lives in the 299cdbfa18aSmrg # current directory. Also, the AIX compiler puts '$object:' at the 3009f606849Smrg # start of each line; $object doesn't have directory information. 3019f606849Smrg # Version 6 uses the directory in both cases. 302cdbfa18aSmrg set_dir_from "$object" 303cdbfa18aSmrg set_base_from "$object" 3049f606849Smrg if test "$libtool" = yes; then 305fba89afeSmrg tmpdepfile1=$dir$base.u 306fba89afeSmrg tmpdepfile2=$base.u 307fba89afeSmrg tmpdepfile3=$dir.libs/$base.u 3089f606849Smrg "$@" -Wc,-M 3099f606849Smrg else 310fba89afeSmrg tmpdepfile1=$dir$base.u 311fba89afeSmrg tmpdepfile2=$dir$base.u 312fba89afeSmrg tmpdepfile3=$dir$base.u 3139f606849Smrg "$@" -M 3149f606849Smrg fi 3159f606849Smrg stat=$? 316cdbfa18aSmrg if test $stat -ne 0; then 317fba89afeSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3189f606849Smrg exit $stat 3199f606849Smrg fi 3209f606849Smrg 321fba89afeSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322fba89afeSmrg do 323fba89afeSmrg test -f "$tmpdepfile" && break 324fba89afeSmrg done 325cdbfa18aSmrg aix_post_process_depfile 326cdbfa18aSmrg ;; 327cdbfa18aSmrg 328cdbfa18aSmrgtcc) 329cdbfa18aSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330cdbfa18aSmrg # FIXME: That version still under development at the moment of writing. 331cdbfa18aSmrg # Make that this statement remains true also for stable, released 332cdbfa18aSmrg # versions. 333cdbfa18aSmrg # It will wrap lines (doesn't matter whether long or short) with a 334cdbfa18aSmrg # trailing '\', as in: 335cdbfa18aSmrg # 336cdbfa18aSmrg # foo.o : \ 337cdbfa18aSmrg # foo.c \ 338cdbfa18aSmrg # foo.h \ 339cdbfa18aSmrg # 340cdbfa18aSmrg # It will put a trailing '\' even on the last line, and will use leading 341cdbfa18aSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 342cdbfa18aSmrg # "Emit spaces for -MD"). 343cdbfa18aSmrg "$@" -MD -MF "$tmpdepfile" 344cdbfa18aSmrg stat=$? 345cdbfa18aSmrg if test $stat -ne 0; then 346cdbfa18aSmrg rm -f "$tmpdepfile" 347cdbfa18aSmrg exit $stat 3489f606849Smrg fi 349cdbfa18aSmrg rm -f "$depfile" 350cdbfa18aSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351cdbfa18aSmrg # We have to change lines of the first kind to '$object: \'. 352cdbfa18aSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353cdbfa18aSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 354cdbfa18aSmrg # dummy dependency, to avoid the deleted-header problem. 355cdbfa18aSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3569f606849Smrg rm -f "$tmpdepfile" 3579f606849Smrg ;; 3589f606849Smrg 359cdbfa18aSmrg## The order of this option in the case statement is important, since the 360cdbfa18aSmrg## shell code in configure will try each of these formats in the order 361cdbfa18aSmrg## listed in this file. A plain '-MD' option would be understood by many 362cdbfa18aSmrg## compilers, so we must ensure this comes after the gcc and icc options. 363cdbfa18aSmrgpgcc) 364cdbfa18aSmrg # Portland's C compiler understands '-MD'. 365cdbfa18aSmrg # Will always output deps to 'file.d' where file is the root name of the 366cdbfa18aSmrg # source file under compilation, even if file resides in a subdirectory. 367cdbfa18aSmrg # The object file name does not affect the name of the '.d' file. 368cdbfa18aSmrg # pgcc 10.2 will output 3699f606849Smrg # foo.o: sub/foo.c sub/foo.h 370cdbfa18aSmrg # and will wrap long lines using '\' : 3719f606849Smrg # foo.o: sub/foo.c ... \ 3729f606849Smrg # sub/foo.h ... \ 3739f606849Smrg # ... 374cdbfa18aSmrg set_dir_from "$object" 375cdbfa18aSmrg # Use the source, not the object, to determine the base name, since 376cdbfa18aSmrg # that's sadly what pgcc will do too. 377cdbfa18aSmrg set_base_from "$source" 378cdbfa18aSmrg tmpdepfile=$base.d 379cdbfa18aSmrg 380cdbfa18aSmrg # For projects that build the same source file twice into different object 381cdbfa18aSmrg # files, the pgcc approach of using the *source* file root name can cause 382cdbfa18aSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383cdbfa18aSmrg # the same $tmpdepfile. 384cdbfa18aSmrg lockdir=$base.d-lock 385cdbfa18aSmrg trap " 386cdbfa18aSmrg echo '$0: caught signal, cleaning up...' >&2 387cdbfa18aSmrg rmdir '$lockdir' 388cdbfa18aSmrg exit 1 389cdbfa18aSmrg " 1 2 13 15 390cdbfa18aSmrg numtries=100 391cdbfa18aSmrg i=$numtries 392cdbfa18aSmrg while test $i -gt 0; do 393cdbfa18aSmrg # mkdir is a portable test-and-set. 394cdbfa18aSmrg if mkdir "$lockdir" 2>/dev/null; then 395cdbfa18aSmrg # This process acquired the lock. 396cdbfa18aSmrg "$@" -MD 397cdbfa18aSmrg stat=$? 398cdbfa18aSmrg # Release the lock. 399cdbfa18aSmrg rmdir "$lockdir" 400cdbfa18aSmrg break 401cdbfa18aSmrg else 402cdbfa18aSmrg # If the lock is being held by a different process, wait 403cdbfa18aSmrg # until the winning process is done or we timeout. 404cdbfa18aSmrg while test -d "$lockdir" && test $i -gt 0; do 405cdbfa18aSmrg sleep 1 406cdbfa18aSmrg i=`expr $i - 1` 407cdbfa18aSmrg done 408cdbfa18aSmrg fi 409cdbfa18aSmrg i=`expr $i - 1` 410cdbfa18aSmrg done 411cdbfa18aSmrg trap - 1 2 13 15 412cdbfa18aSmrg if test $i -le 0; then 413cdbfa18aSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414cdbfa18aSmrg echo "$0: check lockdir '$lockdir'" >&2 415cdbfa18aSmrg exit 1 416cdbfa18aSmrg fi 4179f606849Smrg 418cdbfa18aSmrg if test $stat -ne 0; then 4199f606849Smrg rm -f "$tmpdepfile" 4209f606849Smrg exit $stat 4219f606849Smrg fi 4229f606849Smrg rm -f "$depfile" 4239f606849Smrg # Each line is of the form `foo.o: dependent.h', 4249f606849Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4259f606849Smrg # Do two passes, one to just change these to 4269f606849Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4279f606849Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4289f606849Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4299f606849Smrg # correctly. Breaking it into two sed invocations is a workaround. 430cdbfa18aSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431cdbfa18aSmrg | sed -e 's/$/ :/' >> "$depfile" 4329f606849Smrg rm -f "$tmpdepfile" 4339f606849Smrg ;; 4349f606849Smrg 4359f606849Smrghp2) 4369f606849Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4379f606849Smrg # compilers, which have integrated preprocessors. The correct option 4389f606849Smrg # to use with these is +Maked; it writes dependencies to a file named 4399f606849Smrg # 'foo.d', which lands next to the object file, wherever that 4409f606849Smrg # happens to be. 4419f606849Smrg # Much of this is similar to the tru64 case; see comments there. 442cdbfa18aSmrg set_dir_from "$object" 443cdbfa18aSmrg set_base_from "$object" 4449f606849Smrg if test "$libtool" = yes; then 4459f606849Smrg tmpdepfile1=$dir$base.d 4469f606849Smrg tmpdepfile2=$dir.libs/$base.d 4479f606849Smrg "$@" -Wc,+Maked 4489f606849Smrg else 4499f606849Smrg tmpdepfile1=$dir$base.d 4509f606849Smrg tmpdepfile2=$dir$base.d 4519f606849Smrg "$@" +Maked 4529f606849Smrg fi 4539f606849Smrg stat=$? 454cdbfa18aSmrg if test $stat -ne 0; then 4559f606849Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4569f606849Smrg exit $stat 4579f606849Smrg fi 4589f606849Smrg 4599f606849Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4609f606849Smrg do 4619f606849Smrg test -f "$tmpdepfile" && break 4629f606849Smrg done 4639f606849Smrg if test -f "$tmpdepfile"; then 464cdbfa18aSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465cdbfa18aSmrg # Add 'dependent.h:' lines. 466fba89afeSmrg sed -ne '2,${ 467cdbfa18aSmrg s/^ *// 468cdbfa18aSmrg s/ \\*$// 469cdbfa18aSmrg s/$/:/ 470cdbfa18aSmrg p 471cdbfa18aSmrg }' "$tmpdepfile" >> "$depfile" 4729f606849Smrg else 473cdbfa18aSmrg make_dummy_depfile 4749f606849Smrg fi 4759f606849Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4769f606849Smrg ;; 4779f606849Smrg 4789f606849Smrgtru64) 479cdbfa18aSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 480cdbfa18aSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481cdbfa18aSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482cdbfa18aSmrg # dependencies in 'foo.d' instead, so we check for that too. 483cdbfa18aSmrg # Subdirectories are respected. 484cdbfa18aSmrg set_dir_from "$object" 485cdbfa18aSmrg set_base_from "$object" 486cdbfa18aSmrg 487cdbfa18aSmrg if test "$libtool" = yes; then 488cdbfa18aSmrg # Libtool generates 2 separate objects for the 2 libraries. These 489cdbfa18aSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 490cdbfa18aSmrg # in $dir$base.o.d. We have to check for both files, because 491cdbfa18aSmrg # one of the two compilations can be disabled. We should prefer 492cdbfa18aSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493cdbfa18aSmrg # automatically cleaned when .libs/ is deleted, while ignoring 494cdbfa18aSmrg # the former would cause a distcleancheck panic. 495cdbfa18aSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496cdbfa18aSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497cdbfa18aSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498cdbfa18aSmrg "$@" -Wc,-MD 499cdbfa18aSmrg else 500cdbfa18aSmrg tmpdepfile1=$dir$base.d 501cdbfa18aSmrg tmpdepfile2=$dir$base.d 502cdbfa18aSmrg tmpdepfile3=$dir$base.d 503cdbfa18aSmrg "$@" -MD 504cdbfa18aSmrg fi 505cdbfa18aSmrg 506cdbfa18aSmrg stat=$? 507cdbfa18aSmrg if test $stat -ne 0; then 508cdbfa18aSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509cdbfa18aSmrg exit $stat 510cdbfa18aSmrg fi 511cdbfa18aSmrg 512cdbfa18aSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513cdbfa18aSmrg do 514cdbfa18aSmrg test -f "$tmpdepfile" && break 515cdbfa18aSmrg done 516cdbfa18aSmrg # Same post-processing that is required for AIX mode. 517cdbfa18aSmrg aix_post_process_depfile 518cdbfa18aSmrg ;; 519cdbfa18aSmrg 520cdbfa18aSmrgmsvc7) 521cdbfa18aSmrg if test "$libtool" = yes; then 522cdbfa18aSmrg showIncludes=-Wc,-showIncludes 523cdbfa18aSmrg else 524cdbfa18aSmrg showIncludes=-showIncludes 525cdbfa18aSmrg fi 526cdbfa18aSmrg "$@" $showIncludes > "$tmpdepfile" 527cdbfa18aSmrg stat=$? 528cdbfa18aSmrg grep -v '^Note: including file: ' "$tmpdepfile" 529cdbfa18aSmrg if test $stat -ne 0; then 530cdbfa18aSmrg rm -f "$tmpdepfile" 531cdbfa18aSmrg exit $stat 532cdbfa18aSmrg fi 533cdbfa18aSmrg rm -f "$depfile" 534cdbfa18aSmrg echo "$object : \\" > "$depfile" 535cdbfa18aSmrg # The first sed program below extracts the file names and escapes 536cdbfa18aSmrg # backslashes for cygpath. The second sed program outputs the file 537cdbfa18aSmrg # name when reading, but also accumulates all include files in the 538cdbfa18aSmrg # hold buffer in order to output them again at the end. This only 539cdbfa18aSmrg # works with sed implementations that can handle large buffers. 540cdbfa18aSmrg sed < "$tmpdepfile" -n ' 541cdbfa18aSmrg/^Note: including file: *\(.*\)/ { 542cdbfa18aSmrg s//\1/ 543cdbfa18aSmrg s/\\/\\\\/g 544cdbfa18aSmrg p 545cdbfa18aSmrg}' | $cygpath_u | sort -u | sed -n ' 546cdbfa18aSmrgs/ /\\ /g 547cdbfa18aSmrgs/\(.*\)/'"$tab"'\1 \\/p 548cdbfa18aSmrgs/.\(.*\) \\/\1:/ 549cdbfa18aSmrgH 550cdbfa18aSmrg$ { 551cdbfa18aSmrg s/.*/'"$tab"'/ 552cdbfa18aSmrg G 553cdbfa18aSmrg p 554cdbfa18aSmrg}' >> "$depfile" 555fef5d1ffSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556cdbfa18aSmrg rm -f "$tmpdepfile" 557cdbfa18aSmrg ;; 558cdbfa18aSmrg 559cdbfa18aSmrgmsvc7msys) 560cdbfa18aSmrg # This case exists only to let depend.m4 do its work. It works by 561cdbfa18aSmrg # looking at the text of this script. This case will never be run, 562cdbfa18aSmrg # since it is checked for above. 563cdbfa18aSmrg exit 1 564cdbfa18aSmrg ;; 5659f606849Smrg 5669f606849Smrg#nosideeffect) 5679f606849Smrg # This comment above is used by automake to tell side-effect 5689f606849Smrg # dependency tracking mechanisms from slower ones. 5699f606849Smrg 5709f606849Smrgdashmstdout) 5719f606849Smrg # Important note: in order to support this mode, a compiler *must* 5729f606849Smrg # always write the preprocessed file to stdout, regardless of -o. 5739f606849Smrg "$@" || exit $? 5749f606849Smrg 5759f606849Smrg # Remove the call to Libtool. 5769f606849Smrg if test "$libtool" = yes; then 577fba89afeSmrg while test "X$1" != 'X--mode=compile'; do 5789f606849Smrg shift 5799f606849Smrg done 5809f606849Smrg shift 5819f606849Smrg fi 5829f606849Smrg 583cdbfa18aSmrg # Remove '-o $object'. 5849f606849Smrg IFS=" " 5859f606849Smrg for arg 5869f606849Smrg do 5879f606849Smrg case $arg in 5889f606849Smrg -o) 5899f606849Smrg shift 5909f606849Smrg ;; 5919f606849Smrg $object) 5929f606849Smrg shift 5939f606849Smrg ;; 5949f606849Smrg *) 5959f606849Smrg set fnord "$@" "$arg" 5969f606849Smrg shift # fnord 5979f606849Smrg shift # $arg 5989f606849Smrg ;; 5999f606849Smrg esac 6009f606849Smrg done 6019f606849Smrg 6029f606849Smrg test -z "$dashmflag" && dashmflag=-M 603cdbfa18aSmrg # Require at least two characters before searching for ':' 6049f606849Smrg # in the target name. This is to cope with DOS-style filenames: 605cdbfa18aSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6069f606849Smrg "$@" $dashmflag | 607cdbfa18aSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6089f606849Smrg rm -f "$depfile" 6099f606849Smrg cat < "$tmpdepfile" > "$depfile" 610cdbfa18aSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611cdbfa18aSmrg # correctly. Breaking it into two sed invocations is a workaround. 612cdbfa18aSmrg tr ' ' "$nl" < "$tmpdepfile" \ 613cdbfa18aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614cdbfa18aSmrg | sed -e 's/$/ :/' >> "$depfile" 6159f606849Smrg rm -f "$tmpdepfile" 6169f606849Smrg ;; 6179f606849Smrg 6189f606849SmrgdashXmstdout) 6199f606849Smrg # This case only exists to satisfy depend.m4. It is never actually 6209f606849Smrg # run, as this mode is specially recognized in the preamble. 6219f606849Smrg exit 1 6229f606849Smrg ;; 6239f606849Smrg 6249f606849Smrgmakedepend) 6259f606849Smrg "$@" || exit $? 6269f606849Smrg # Remove any Libtool call 6279f606849Smrg if test "$libtool" = yes; then 628fba89afeSmrg while test "X$1" != 'X--mode=compile'; do 6299f606849Smrg shift 6309f606849Smrg done 6319f606849Smrg shift 6329f606849Smrg fi 6339f606849Smrg # X makedepend 6349f606849Smrg shift 635fba89afeSmrg cleared=no eat=no 636fba89afeSmrg for arg 637fba89afeSmrg do 6389f606849Smrg case $cleared in 6399f606849Smrg no) 6409f606849Smrg set ""; shift 6419f606849Smrg cleared=yes ;; 6429f606849Smrg esac 643fba89afeSmrg if test $eat = yes; then 644fba89afeSmrg eat=no 645fba89afeSmrg continue 646fba89afeSmrg fi 6479f606849Smrg case "$arg" in 6489f606849Smrg -D*|-I*) 6499f606849Smrg set fnord "$@" "$arg"; shift ;; 6509f606849Smrg # Strip any option that makedepend may not understand. Remove 6519f606849Smrg # the object too, otherwise makedepend will parse it as a source file. 652fba89afeSmrg -arch) 653fba89afeSmrg eat=yes ;; 6549f606849Smrg -*|$object) 6559f606849Smrg ;; 6569f606849Smrg *) 6579f606849Smrg set fnord "$@" "$arg"; shift ;; 6589f606849Smrg esac 6599f606849Smrg done 660fba89afeSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6619f606849Smrg touch "$tmpdepfile" 6629f606849Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6639f606849Smrg rm -f "$depfile" 664cdbfa18aSmrg # makedepend may prepend the VPATH from the source file name to the object. 665cdbfa18aSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 666cdbfa18aSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667cdbfa18aSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668cdbfa18aSmrg # correctly. Breaking it into two sed invocations is a workaround. 669cdbfa18aSmrg sed '1,2d' "$tmpdepfile" \ 670cdbfa18aSmrg | tr ' ' "$nl" \ 671cdbfa18aSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672cdbfa18aSmrg | sed -e 's/$/ :/' >> "$depfile" 6739f606849Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6749f606849Smrg ;; 6759f606849Smrg 6769f606849Smrgcpp) 6779f606849Smrg # Important note: in order to support this mode, a compiler *must* 6789f606849Smrg # always write the preprocessed file to stdout. 6799f606849Smrg "$@" || exit $? 6809f606849Smrg 6819f606849Smrg # Remove the call to Libtool. 6829f606849Smrg if test "$libtool" = yes; then 683fba89afeSmrg while test "X$1" != 'X--mode=compile'; do 6849f606849Smrg shift 6859f606849Smrg done 6869f606849Smrg shift 6879f606849Smrg fi 6889f606849Smrg 689cdbfa18aSmrg # Remove '-o $object'. 6909f606849Smrg IFS=" " 6919f606849Smrg for arg 6929f606849Smrg do 6939f606849Smrg case $arg in 6949f606849Smrg -o) 6959f606849Smrg shift 6969f606849Smrg ;; 6979f606849Smrg $object) 6989f606849Smrg shift 6999f606849Smrg ;; 7009f606849Smrg *) 7019f606849Smrg set fnord "$@" "$arg" 7029f606849Smrg shift # fnord 7039f606849Smrg shift # $arg 7049f606849Smrg ;; 7059f606849Smrg esac 7069f606849Smrg done 7079f606849Smrg 708cdbfa18aSmrg "$@" -E \ 709cdbfa18aSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710cdbfa18aSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711cdbfa18aSmrg | sed '$ s: \\$::' > "$tmpdepfile" 7129f606849Smrg rm -f "$depfile" 7139f606849Smrg echo "$object : \\" > "$depfile" 7149f606849Smrg cat < "$tmpdepfile" >> "$depfile" 7159f606849Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7169f606849Smrg rm -f "$tmpdepfile" 7179f606849Smrg ;; 7189f606849Smrg 7199f606849Smrgmsvisualcpp) 7209f606849Smrg # Important note: in order to support this mode, a compiler *must* 721fba89afeSmrg # always write the preprocessed file to stdout. 7229f606849Smrg "$@" || exit $? 723fba89afeSmrg 724fba89afeSmrg # Remove the call to Libtool. 725fba89afeSmrg if test "$libtool" = yes; then 726fba89afeSmrg while test "X$1" != 'X--mode=compile'; do 727fba89afeSmrg shift 728fba89afeSmrg done 729fba89afeSmrg shift 730fba89afeSmrg fi 731fba89afeSmrg 7329f606849Smrg IFS=" " 7339f606849Smrg for arg 7349f606849Smrg do 7359f606849Smrg case "$arg" in 736fba89afeSmrg -o) 737fba89afeSmrg shift 738fba89afeSmrg ;; 739fba89afeSmrg $object) 740fba89afeSmrg shift 741fba89afeSmrg ;; 7429f606849Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743cdbfa18aSmrg set fnord "$@" 744cdbfa18aSmrg shift 745cdbfa18aSmrg shift 746cdbfa18aSmrg ;; 7479f606849Smrg *) 748cdbfa18aSmrg set fnord "$@" "$arg" 749cdbfa18aSmrg shift 750cdbfa18aSmrg shift 751cdbfa18aSmrg ;; 7529f606849Smrg esac 7539f606849Smrg done 754fba89afeSmrg "$@" -E 2>/dev/null | 755fba89afeSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7569f606849Smrg rm -f "$depfile" 7579f606849Smrg echo "$object : \\" > "$depfile" 758cdbfa18aSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759cdbfa18aSmrg echo "$tab" >> "$depfile" 760fba89afeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7619f606849Smrg rm -f "$tmpdepfile" 7629f606849Smrg ;; 7639f606849Smrg 764fba89afeSmrgmsvcmsys) 765fba89afeSmrg # This case exists only to let depend.m4 do its work. It works by 766fba89afeSmrg # looking at the text of this script. This case will never be run, 767fba89afeSmrg # since it is checked for above. 768fba89afeSmrg exit 1 769fba89afeSmrg ;; 770fba89afeSmrg 7719f606849Smrgnone) 7729f606849Smrg exec "$@" 7739f606849Smrg ;; 7749f606849Smrg 7759f606849Smrg*) 7769f606849Smrg echo "Unknown depmode $depmode" 1>&2 7779f606849Smrg exit 1 7789f606849Smrg ;; 7799f606849Smrgesac 7809f606849Smrg 7819f606849Smrgexit 0 7829f606849Smrg 7839f606849Smrg# Local Variables: 7849f606849Smrg# mode: shell-script 7859f606849Smrg# sh-indentation: 2 786949d0342Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 7879f606849Smrg# time-stamp-start: "scriptversion=" 7889f606849Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 789949d0342Smrg# time-stamp-time-zone: "UTC0" 790fba89afeSmrg# time-stamp-end: "; # UTC" 7919f606849Smrg# End: 792