depcomp revision eb411b4b
11ab64890Smrg#! /bin/sh 21ab64890Smrg# depcomp - compile a program generating dependencies as side-effects 31ab64890Smrg 4eb411b4bSmrgscriptversion=2012-10-18.11; # UTC 51ab64890Smrg 6eb411b4bSmrg# Copyright (C) 1999-2013 Free Software Foundation, Inc. 71ab64890Smrg 81ab64890Smrg# This program is free software; you can redistribute it and/or modify 91ab64890Smrg# it under the terms of the GNU General Public License as published by 101ab64890Smrg# the Free Software Foundation; either version 2, or (at your option) 111ab64890Smrg# any later version. 121ab64890Smrg 131ab64890Smrg# This program is distributed in the hope that it will be useful, 141ab64890Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 151ab64890Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 161ab64890Smrg# GNU General Public License for more details. 171ab64890Smrg 181ab64890Smrg# You should have received a copy of the GNU General Public License 19b4ee4795Smrg# along with this program. If not, see <http://www.gnu.org/licenses/>. 201ab64890Smrg 211ab64890Smrg# As a special exception to the GNU General Public License, if you 221ab64890Smrg# distribute this file as part of a program that contains a 231ab64890Smrg# configuration script generated by Autoconf, you may include it under 241ab64890Smrg# the same distribution terms that you use for the rest of that program. 251ab64890Smrg 261ab64890Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 271ab64890Smrg 281ab64890Smrgcase $1 in 291ab64890Smrg '') 30eb411b4bSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31eb411b4bSmrg exit 1; 32eb411b4bSmrg ;; 331ab64890Smrg -h | --h*) 341ab64890Smrg cat <<\EOF 351ab64890SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 361ab64890Smrg 371ab64890SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 381ab64890Smrgas side-effects. 391ab64890Smrg 401ab64890SmrgEnvironment variables: 411ab64890Smrg depmode Dependency tracking mode. 42eb411b4bSmrg source Source file read by 'PROGRAMS ARGS'. 43eb411b4bSmrg object Object file output by 'PROGRAMS ARGS'. 441ab64890Smrg DEPDIR directory where to store dependencies. 451ab64890Smrg depfile Dependency file to output. 46eb411b4bSmrg tmpdepfile Temporary file to use when outputting dependencies. 471ab64890Smrg libtool Whether libtool is used (yes/no). 481ab64890Smrg 491ab64890SmrgReport bugs to <bug-automake@gnu.org>. 501ab64890SmrgEOF 511ab64890Smrg exit $? 521ab64890Smrg ;; 531ab64890Smrg -v | --v*) 541ab64890Smrg echo "depcomp $scriptversion" 551ab64890Smrg exit $? 561ab64890Smrg ;; 571ab64890Smrgesac 581ab64890Smrg 59eb411b4bSmrg# Get the directory component of the given path, and save it in the 60eb411b4bSmrg# global variables '$dir'. Note that this directory component will 61eb411b4bSmrg# be either empty or ending with a '/' character. This is deliberate. 62eb411b4bSmrgset_dir_from () 63eb411b4bSmrg{ 64eb411b4bSmrg case $1 in 65eb411b4bSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66eb411b4bSmrg *) dir=;; 67eb411b4bSmrg esac 68eb411b4bSmrg} 69eb411b4bSmrg 70eb411b4bSmrg# Get the suffix-stripped basename of the given path, and save it the 71eb411b4bSmrg# global variable '$base'. 72eb411b4bSmrgset_base_from () 73eb411b4bSmrg{ 74eb411b4bSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75eb411b4bSmrg} 76eb411b4bSmrg 77eb411b4bSmrg# If no dependency file was actually created by the compiler invocation, 78eb411b4bSmrg# we still have to create a dummy depfile, to avoid errors with the 79eb411b4bSmrg# Makefile "include basename.Plo" scheme. 80eb411b4bSmrgmake_dummy_depfile () 81eb411b4bSmrg{ 82eb411b4bSmrg echo "#dummy" > "$depfile" 83eb411b4bSmrg} 84eb411b4bSmrg 85eb411b4bSmrg# Factor out some common post-processing of the generated depfile. 86eb411b4bSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87eb411b4bSmrgaix_post_process_depfile () 88eb411b4bSmrg{ 89eb411b4bSmrg # If the compiler actually managed to produce a dependency file, 90eb411b4bSmrg # post-process it. 91eb411b4bSmrg if test -f "$tmpdepfile"; then 92eb411b4bSmrg # Each line is of the form 'foo.o: dependency.h'. 93eb411b4bSmrg # Do two passes, one to just change these to 94eb411b4bSmrg # $object: dependency.h 95eb411b4bSmrg # and one to simply output 96eb411b4bSmrg # dependency.h: 97eb411b4bSmrg # which is needed to avoid the deleted-header problem. 98eb411b4bSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99eb411b4bSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100eb411b4bSmrg } > "$depfile" 101eb411b4bSmrg rm -f "$tmpdepfile" 102eb411b4bSmrg else 103eb411b4bSmrg make_dummy_depfile 104eb411b4bSmrg fi 105eb411b4bSmrg} 106eb411b4bSmrg 107eb411b4bSmrg# A tabulation character. 108eb411b4bSmrgtab=' ' 109eb411b4bSmrg# A newline character. 110eb411b4bSmrgnl=' 111eb411b4bSmrg' 112eb411b4bSmrg# Character ranges might be problematic outside the C locale. 113eb411b4bSmrg# These definitions help. 114eb411b4bSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115eb411b4bSmrglower=abcdefghijklmnopqrstuvwxyz 116eb411b4bSmrgdigits=0123456789 117eb411b4bSmrgalpha=${upper}${lower} 118eb411b4bSmrg 1191ab64890Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1201ab64890Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1211ab64890Smrg exit 1 1221ab64890Smrgfi 1231ab64890Smrg 1241ab64890Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1251ab64890Smrgdepfile=${depfile-`echo "$object" | 1261ab64890Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1271ab64890Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1281ab64890Smrg 1291ab64890Smrgrm -f "$tmpdepfile" 1301ab64890Smrg 131eb411b4bSmrg# Avoid interferences from the environment. 132eb411b4bSmrggccflag= dashmflag= 133eb411b4bSmrg 1341ab64890Smrg# Some modes work just like other modes, but use different flags. We 1351ab64890Smrg# parameterize here, but still list the modes in the big case below, 1361ab64890Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1371ab64890Smrg# here, because this file can only contain one case statement. 1381ab64890Smrgif test "$depmode" = hp; then 1391ab64890Smrg # HP compiler uses -M and no extra arg. 1401ab64890Smrg gccflag=-M 1411ab64890Smrg depmode=gcc 1421ab64890Smrgfi 1431ab64890Smrg 1441ab64890Smrgif test "$depmode" = dashXmstdout; then 145eb411b4bSmrg # This is just like dashmstdout with a different argument. 146eb411b4bSmrg dashmflag=-xM 147eb411b4bSmrg depmode=dashmstdout 1481ab64890Smrgfi 1491ab64890Smrg 150b4ee4795Smrgcygpath_u="cygpath -u -f -" 151b4ee4795Smrgif test "$depmode" = msvcmsys; then 152eb411b4bSmrg # This is just like msvisualcpp but w/o cygpath translation. 153eb411b4bSmrg # Just convert the backslash-escaped backslashes to single forward 154eb411b4bSmrg # slashes to satisfy depend.m4 155eb411b4bSmrg cygpath_u='sed s,\\\\,/,g' 156eb411b4bSmrg depmode=msvisualcpp 157eb411b4bSmrgfi 158eb411b4bSmrg 159eb411b4bSmrgif test "$depmode" = msvc7msys; then 160eb411b4bSmrg # This is just like msvc7 but w/o cygpath translation. 161eb411b4bSmrg # Just convert the backslash-escaped backslashes to single forward 162eb411b4bSmrg # slashes to satisfy depend.m4 163eb411b4bSmrg cygpath_u='sed s,\\\\,/,g' 164eb411b4bSmrg depmode=msvc7 165eb411b4bSmrgfi 166eb411b4bSmrg 167eb411b4bSmrgif test "$depmode" = xlc; then 168eb411b4bSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169eb411b4bSmrg gccflag=-qmakedep=gcc,-MF 170eb411b4bSmrg depmode=gcc 171b4ee4795Smrgfi 172b4ee4795Smrg 1731ab64890Smrgcase "$depmode" in 1741ab64890Smrggcc3) 1751ab64890Smrg## gcc 3 implements dependency tracking that does exactly what 1761ab64890Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1771ab64890Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 1781ab64890Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1791ab64890Smrg## the command line argument order; so add the flags where they 1801ab64890Smrg## appear in depend2.am. Note that the slowdown incurred here 1811ab64890Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1821ab64890Smrg for arg 1831ab64890Smrg do 1841ab64890Smrg case $arg in 1851ab64890Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1861ab64890Smrg *) set fnord "$@" "$arg" ;; 1871ab64890Smrg esac 1881ab64890Smrg shift # fnord 1891ab64890Smrg shift # $arg 1901ab64890Smrg done 1911ab64890Smrg "$@" 1921ab64890Smrg stat=$? 193eb411b4bSmrg if test $stat -ne 0; then 1941ab64890Smrg rm -f "$tmpdepfile" 1951ab64890Smrg exit $stat 1961ab64890Smrg fi 1971ab64890Smrg mv "$tmpdepfile" "$depfile" 1981ab64890Smrg ;; 1991ab64890Smrg 2001ab64890Smrggcc) 201eb411b4bSmrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202eb411b4bSmrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203eb411b4bSmrg## (see the conditional assignment to $gccflag above). 2041ab64890Smrg## There are various ways to get dependency output from gcc. Here's 2051ab64890Smrg## why we pick this rather obscure method: 2061ab64890Smrg## - Don't want to use -MD because we'd like the dependencies to end 2071ab64890Smrg## up in a subdir. Having to rename by hand is ugly. 2081ab64890Smrg## (We might end up doing this anyway to support other compilers.) 2091ab64890Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210eb411b4bSmrg## -MM, not -M (despite what the docs say). Also, it might not be 211eb411b4bSmrg## supported by the other compilers which use the 'gcc' depmode. 2121ab64890Smrg## - Using -M directly means running the compiler twice (even worse 2131ab64890Smrg## than renaming). 2141ab64890Smrg if test -z "$gccflag"; then 2151ab64890Smrg gccflag=-MD, 2161ab64890Smrg fi 2171ab64890Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2181ab64890Smrg stat=$? 219eb411b4bSmrg if test $stat -ne 0; then 2201ab64890Smrg rm -f "$tmpdepfile" 2211ab64890Smrg exit $stat 2221ab64890Smrg fi 2231ab64890Smrg rm -f "$depfile" 2241ab64890Smrg echo "$object : \\" > "$depfile" 225eb411b4bSmrg # The second -e expression handles DOS-style file names with drive 226eb411b4bSmrg # letters. 2271ab64890Smrg sed -e 's/^[^:]*: / /' \ 2281ab64890Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229eb411b4bSmrg## This next piece of magic avoids the "deleted header file" problem. 2301ab64890Smrg## The problem is that when a header file which appears in a .P file 2311ab64890Smrg## is deleted, the dependency causes make to die (because there is 2321ab64890Smrg## typically no way to rebuild the header). We avoid this by adding 2331ab64890Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2341ab64890Smrg## this for us directly. 235eb411b4bSmrg## Some versions of gcc put a space before the ':'. On the theory 2361ab64890Smrg## that the space means something, we add a space to the output as 237eb411b4bSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 238eb411b4bSmrg## to the object. Take care to not repeat it in the output. 2391ab64890Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2401ab64890Smrg## correctly. Breaking it into two sed invocations is a workaround. 241eb411b4bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 242eb411b4bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243eb411b4bSmrg | sed -e 's/$/ :/' >> "$depfile" 2441ab64890Smrg rm -f "$tmpdepfile" 2451ab64890Smrg ;; 2461ab64890Smrg 2471ab64890Smrghp) 2481ab64890Smrg # This case exists only to let depend.m4 do its work. It works by 2491ab64890Smrg # looking at the text of this script. This case will never be run, 2501ab64890Smrg # since it is checked for above. 2511ab64890Smrg exit 1 2521ab64890Smrg ;; 2531ab64890Smrg 2541ab64890Smrgsgi) 2551ab64890Smrg if test "$libtool" = yes; then 2561ab64890Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2571ab64890Smrg else 2581ab64890Smrg "$@" -MDupdate "$tmpdepfile" 2591ab64890Smrg fi 2601ab64890Smrg stat=$? 261eb411b4bSmrg if test $stat -ne 0; then 2621ab64890Smrg rm -f "$tmpdepfile" 2631ab64890Smrg exit $stat 2641ab64890Smrg fi 2651ab64890Smrg rm -f "$depfile" 2661ab64890Smrg 2671ab64890Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2681ab64890Smrg echo "$object : \\" > "$depfile" 2691ab64890Smrg # Clip off the initial element (the dependent). Don't try to be 2701ab64890Smrg # clever and replace this with sed code, as IRIX sed won't handle 2711ab64890Smrg # lines with more than a fixed number of characters (4096 in 2721ab64890Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273eb411b4bSmrg # the IRIX cc adds comments like '#:fec' to the end of the 2741ab64890Smrg # dependency line. 275eb411b4bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 276eb411b4bSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277eb411b4bSmrg | tr "$nl" ' ' >> "$depfile" 278b4ee4795Smrg echo >> "$depfile" 2791ab64890Smrg # The second pass generates a dummy entry for each header file. 280eb411b4bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 281eb411b4bSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282eb411b4bSmrg >> "$depfile" 2831ab64890Smrg else 284eb411b4bSmrg make_dummy_depfile 2851ab64890Smrg fi 2861ab64890Smrg rm -f "$tmpdepfile" 2871ab64890Smrg ;; 2881ab64890Smrg 289eb411b4bSmrgxlc) 290eb411b4bSmrg # This case exists only to let depend.m4 do its work. It works by 291eb411b4bSmrg # looking at the text of this script. This case will never be run, 292eb411b4bSmrg # since it is checked for above. 293eb411b4bSmrg exit 1 294eb411b4bSmrg ;; 295eb411b4bSmrg 2961ab64890Smrgaix) 2971ab64890Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2981ab64890Smrg # in a .u file. In older versions, this file always lives in the 299eb411b4bSmrg # current directory. Also, the AIX compiler puts '$object:' at the 3001ab64890Smrg # start of each line; $object doesn't have directory information. 3011ab64890Smrg # Version 6 uses the directory in both cases. 302eb411b4bSmrg set_dir_from "$object" 303eb411b4bSmrg set_base_from "$object" 3041ab64890Smrg if test "$libtool" = yes; then 3051ab64890Smrg tmpdepfile1=$dir$base.u 3061ab64890Smrg tmpdepfile2=$base.u 3071ab64890Smrg tmpdepfile3=$dir.libs/$base.u 3081ab64890Smrg "$@" -Wc,-M 3091ab64890Smrg else 3101ab64890Smrg tmpdepfile1=$dir$base.u 3111ab64890Smrg tmpdepfile2=$dir$base.u 3121ab64890Smrg tmpdepfile3=$dir$base.u 3131ab64890Smrg "$@" -M 3141ab64890Smrg fi 3151ab64890Smrg stat=$? 316eb411b4bSmrg if test $stat -ne 0; then 3171ab64890Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3181ab64890Smrg exit $stat 3191ab64890Smrg fi 3201ab64890Smrg 3211ab64890Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3221ab64890Smrg do 3231ab64890Smrg test -f "$tmpdepfile" && break 3241ab64890Smrg done 325eb411b4bSmrg aix_post_process_depfile 326eb411b4bSmrg ;; 327eb411b4bSmrg 328eb411b4bSmrgtcc) 329eb411b4bSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330eb411b4bSmrg # FIXME: That version still under development at the moment of writing. 331eb411b4bSmrg # Make that this statement remains true also for stable, released 332eb411b4bSmrg # versions. 333eb411b4bSmrg # It will wrap lines (doesn't matter whether long or short) with a 334eb411b4bSmrg # trailing '\', as in: 335eb411b4bSmrg # 336eb411b4bSmrg # foo.o : \ 337eb411b4bSmrg # foo.c \ 338eb411b4bSmrg # foo.h \ 339eb411b4bSmrg # 340eb411b4bSmrg # It will put a trailing '\' even on the last line, and will use leading 341eb411b4bSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 342eb411b4bSmrg # "Emit spaces for -MD"). 343eb411b4bSmrg "$@" -MD -MF "$tmpdepfile" 344eb411b4bSmrg stat=$? 345eb411b4bSmrg if test $stat -ne 0; then 346eb411b4bSmrg rm -f "$tmpdepfile" 347eb411b4bSmrg exit $stat 3481ab64890Smrg fi 349eb411b4bSmrg rm -f "$depfile" 350eb411b4bSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351eb411b4bSmrg # We have to change lines of the first kind to '$object: \'. 352eb411b4bSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353eb411b4bSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 354eb411b4bSmrg # dummy dependency, to avoid the deleted-header problem. 355eb411b4bSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3561ab64890Smrg rm -f "$tmpdepfile" 3571ab64890Smrg ;; 3581ab64890Smrg 359eb411b4bSmrg## The order of this option in the case statement is important, since the 360eb411b4bSmrg## shell code in configure will try each of these formats in the order 361eb411b4bSmrg## listed in this file. A plain '-MD' option would be understood by many 362eb411b4bSmrg## compilers, so we must ensure this comes after the gcc and icc options. 363eb411b4bSmrgpgcc) 364eb411b4bSmrg # Portland's C compiler understands '-MD'. 365eb411b4bSmrg # Will always output deps to 'file.d' where file is the root name of the 366eb411b4bSmrg # source file under compilation, even if file resides in a subdirectory. 367eb411b4bSmrg # The object file name does not affect the name of the '.d' file. 368eb411b4bSmrg # pgcc 10.2 will output 3691ab64890Smrg # foo.o: sub/foo.c sub/foo.h 370eb411b4bSmrg # and will wrap long lines using '\' : 3711ab64890Smrg # foo.o: sub/foo.c ... \ 3721ab64890Smrg # sub/foo.h ... \ 3731ab64890Smrg # ... 374eb411b4bSmrg set_dir_from "$object" 375eb411b4bSmrg # Use the source, not the object, to determine the base name, since 376eb411b4bSmrg # that's sadly what pgcc will do too. 377eb411b4bSmrg set_base_from "$source" 378eb411b4bSmrg tmpdepfile=$base.d 379eb411b4bSmrg 380eb411b4bSmrg # For projects that build the same source file twice into different object 381eb411b4bSmrg # files, the pgcc approach of using the *source* file root name can cause 382eb411b4bSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383eb411b4bSmrg # the same $tmpdepfile. 384eb411b4bSmrg lockdir=$base.d-lock 385eb411b4bSmrg trap " 386eb411b4bSmrg echo '$0: caught signal, cleaning up...' >&2 387eb411b4bSmrg rmdir '$lockdir' 388eb411b4bSmrg exit 1 389eb411b4bSmrg " 1 2 13 15 390eb411b4bSmrg numtries=100 391eb411b4bSmrg i=$numtries 392eb411b4bSmrg while test $i -gt 0; do 393eb411b4bSmrg # mkdir is a portable test-and-set. 394eb411b4bSmrg if mkdir "$lockdir" 2>/dev/null; then 395eb411b4bSmrg # This process acquired the lock. 396eb411b4bSmrg "$@" -MD 397eb411b4bSmrg stat=$? 398eb411b4bSmrg # Release the lock. 399eb411b4bSmrg rmdir "$lockdir" 400eb411b4bSmrg break 401eb411b4bSmrg else 402eb411b4bSmrg # If the lock is being held by a different process, wait 403eb411b4bSmrg # until the winning process is done or we timeout. 404eb411b4bSmrg while test -d "$lockdir" && test $i -gt 0; do 405eb411b4bSmrg sleep 1 406eb411b4bSmrg i=`expr $i - 1` 407eb411b4bSmrg done 408eb411b4bSmrg fi 409eb411b4bSmrg i=`expr $i - 1` 410eb411b4bSmrg done 411eb411b4bSmrg trap - 1 2 13 15 412eb411b4bSmrg if test $i -le 0; then 413eb411b4bSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414eb411b4bSmrg echo "$0: check lockdir '$lockdir'" >&2 415eb411b4bSmrg exit 1 416eb411b4bSmrg fi 4171ab64890Smrg 418eb411b4bSmrg if test $stat -ne 0; then 4191ab64890Smrg rm -f "$tmpdepfile" 4201ab64890Smrg exit $stat 4211ab64890Smrg fi 4221ab64890Smrg rm -f "$depfile" 4231ab64890Smrg # Each line is of the form `foo.o: dependent.h', 4241ab64890Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4251ab64890Smrg # Do two passes, one to just change these to 4261ab64890Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4271ab64890Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4281ab64890Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4291ab64890Smrg # correctly. Breaking it into two sed invocations is a workaround. 430eb411b4bSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431eb411b4bSmrg | sed -e 's/$/ :/' >> "$depfile" 4321ab64890Smrg rm -f "$tmpdepfile" 4331ab64890Smrg ;; 4341ab64890Smrg 4351ab64890Smrghp2) 4361ab64890Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4371ab64890Smrg # compilers, which have integrated preprocessors. The correct option 4381ab64890Smrg # to use with these is +Maked; it writes dependencies to a file named 4391ab64890Smrg # 'foo.d', which lands next to the object file, wherever that 4401ab64890Smrg # happens to be. 4411ab64890Smrg # Much of this is similar to the tru64 case; see comments there. 442eb411b4bSmrg set_dir_from "$object" 443eb411b4bSmrg set_base_from "$object" 4441ab64890Smrg if test "$libtool" = yes; then 4451ab64890Smrg tmpdepfile1=$dir$base.d 4461ab64890Smrg tmpdepfile2=$dir.libs/$base.d 4471ab64890Smrg "$@" -Wc,+Maked 4481ab64890Smrg else 4491ab64890Smrg tmpdepfile1=$dir$base.d 4501ab64890Smrg tmpdepfile2=$dir$base.d 4511ab64890Smrg "$@" +Maked 4521ab64890Smrg fi 4531ab64890Smrg stat=$? 454eb411b4bSmrg if test $stat -ne 0; then 4551ab64890Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4561ab64890Smrg exit $stat 4571ab64890Smrg fi 4581ab64890Smrg 4591ab64890Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4601ab64890Smrg do 4611ab64890Smrg test -f "$tmpdepfile" && break 4621ab64890Smrg done 4631ab64890Smrg if test -f "$tmpdepfile"; then 464eb411b4bSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465eb411b4bSmrg # Add 'dependent.h:' lines. 466b4ee4795Smrg sed -ne '2,${ 467eb411b4bSmrg s/^ *// 468eb411b4bSmrg s/ \\*$// 469eb411b4bSmrg s/$/:/ 470eb411b4bSmrg p 471eb411b4bSmrg }' "$tmpdepfile" >> "$depfile" 4721ab64890Smrg else 473eb411b4bSmrg make_dummy_depfile 4741ab64890Smrg fi 4751ab64890Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4761ab64890Smrg ;; 4771ab64890Smrg 4781ab64890Smrgtru64) 479eb411b4bSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 480eb411b4bSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481eb411b4bSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482eb411b4bSmrg # dependencies in 'foo.d' instead, so we check for that too. 483eb411b4bSmrg # Subdirectories are respected. 484eb411b4bSmrg set_dir_from "$object" 485eb411b4bSmrg set_base_from "$object" 486eb411b4bSmrg 487eb411b4bSmrg if test "$libtool" = yes; then 488eb411b4bSmrg # Libtool generates 2 separate objects for the 2 libraries. These 489eb411b4bSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 490eb411b4bSmrg # in $dir$base.o.d. We have to check for both files, because 491eb411b4bSmrg # one of the two compilations can be disabled. We should prefer 492eb411b4bSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493eb411b4bSmrg # automatically cleaned when .libs/ is deleted, while ignoring 494eb411b4bSmrg # the former would cause a distcleancheck panic. 495eb411b4bSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496eb411b4bSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497eb411b4bSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498eb411b4bSmrg "$@" -Wc,-MD 499eb411b4bSmrg else 500eb411b4bSmrg tmpdepfile1=$dir$base.d 501eb411b4bSmrg tmpdepfile2=$dir$base.d 502eb411b4bSmrg tmpdepfile3=$dir$base.d 503eb411b4bSmrg "$@" -MD 504eb411b4bSmrg fi 505eb411b4bSmrg 506eb411b4bSmrg stat=$? 507eb411b4bSmrg if test $stat -ne 0; then 508eb411b4bSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509eb411b4bSmrg exit $stat 510eb411b4bSmrg fi 511eb411b4bSmrg 512eb411b4bSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513eb411b4bSmrg do 514eb411b4bSmrg test -f "$tmpdepfile" && break 515eb411b4bSmrg done 516eb411b4bSmrg # Same post-processing that is required for AIX mode. 517eb411b4bSmrg aix_post_process_depfile 518eb411b4bSmrg ;; 519eb411b4bSmrg 520eb411b4bSmrgmsvc7) 521eb411b4bSmrg if test "$libtool" = yes; then 522eb411b4bSmrg showIncludes=-Wc,-showIncludes 523eb411b4bSmrg else 524eb411b4bSmrg showIncludes=-showIncludes 525eb411b4bSmrg fi 526eb411b4bSmrg "$@" $showIncludes > "$tmpdepfile" 527eb411b4bSmrg stat=$? 528eb411b4bSmrg grep -v '^Note: including file: ' "$tmpdepfile" 529eb411b4bSmrg if test $stat -ne 0; then 530eb411b4bSmrg rm -f "$tmpdepfile" 531eb411b4bSmrg exit $stat 532eb411b4bSmrg fi 533eb411b4bSmrg rm -f "$depfile" 534eb411b4bSmrg echo "$object : \\" > "$depfile" 535eb411b4bSmrg # The first sed program below extracts the file names and escapes 536eb411b4bSmrg # backslashes for cygpath. The second sed program outputs the file 537eb411b4bSmrg # name when reading, but also accumulates all include files in the 538eb411b4bSmrg # hold buffer in order to output them again at the end. This only 539eb411b4bSmrg # works with sed implementations that can handle large buffers. 540eb411b4bSmrg sed < "$tmpdepfile" -n ' 541eb411b4bSmrg/^Note: including file: *\(.*\)/ { 542eb411b4bSmrg s//\1/ 543eb411b4bSmrg s/\\/\\\\/g 544eb411b4bSmrg p 545eb411b4bSmrg}' | $cygpath_u | sort -u | sed -n ' 546eb411b4bSmrgs/ /\\ /g 547eb411b4bSmrgs/\(.*\)/'"$tab"'\1 \\/p 548eb411b4bSmrgs/.\(.*\) \\/\1:/ 549eb411b4bSmrgH 550eb411b4bSmrg$ { 551eb411b4bSmrg s/.*/'"$tab"'/ 552eb411b4bSmrg G 553eb411b4bSmrg p 554eb411b4bSmrg}' >> "$depfile" 555eb411b4bSmrg rm -f "$tmpdepfile" 556eb411b4bSmrg ;; 557eb411b4bSmrg 558eb411b4bSmrgmsvc7msys) 559eb411b4bSmrg # This case exists only to let depend.m4 do its work. It works by 560eb411b4bSmrg # looking at the text of this script. This case will never be run, 561eb411b4bSmrg # since it is checked for above. 562eb411b4bSmrg exit 1 563eb411b4bSmrg ;; 5641ab64890Smrg 5651ab64890Smrg#nosideeffect) 5661ab64890Smrg # This comment above is used by automake to tell side-effect 5671ab64890Smrg # dependency tracking mechanisms from slower ones. 5681ab64890Smrg 5691ab64890Smrgdashmstdout) 5701ab64890Smrg # Important note: in order to support this mode, a compiler *must* 5711ab64890Smrg # always write the preprocessed file to stdout, regardless of -o. 5721ab64890Smrg "$@" || exit $? 5731ab64890Smrg 5741ab64890Smrg # Remove the call to Libtool. 5751ab64890Smrg if test "$libtool" = yes; then 576b4ee4795Smrg while test "X$1" != 'X--mode=compile'; do 5771ab64890Smrg shift 5781ab64890Smrg done 5791ab64890Smrg shift 5801ab64890Smrg fi 5811ab64890Smrg 582eb411b4bSmrg # Remove '-o $object'. 5831ab64890Smrg IFS=" " 5841ab64890Smrg for arg 5851ab64890Smrg do 5861ab64890Smrg case $arg in 5871ab64890Smrg -o) 5881ab64890Smrg shift 5891ab64890Smrg ;; 5901ab64890Smrg $object) 5911ab64890Smrg shift 5921ab64890Smrg ;; 5931ab64890Smrg *) 5941ab64890Smrg set fnord "$@" "$arg" 5951ab64890Smrg shift # fnord 5961ab64890Smrg shift # $arg 5971ab64890Smrg ;; 5981ab64890Smrg esac 5991ab64890Smrg done 6001ab64890Smrg 6011ab64890Smrg test -z "$dashmflag" && dashmflag=-M 602eb411b4bSmrg # Require at least two characters before searching for ':' 6031ab64890Smrg # in the target name. This is to cope with DOS-style filenames: 604eb411b4bSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6051ab64890Smrg "$@" $dashmflag | 606eb411b4bSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6071ab64890Smrg rm -f "$depfile" 6081ab64890Smrg cat < "$tmpdepfile" > "$depfile" 609eb411b4bSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 610eb411b4bSmrg # correctly. Breaking it into two sed invocations is a workaround. 611eb411b4bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 612eb411b4bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 613eb411b4bSmrg | sed -e 's/$/ :/' >> "$depfile" 6141ab64890Smrg rm -f "$tmpdepfile" 6151ab64890Smrg ;; 6161ab64890Smrg 6171ab64890SmrgdashXmstdout) 6181ab64890Smrg # This case only exists to satisfy depend.m4. It is never actually 6191ab64890Smrg # run, as this mode is specially recognized in the preamble. 6201ab64890Smrg exit 1 6211ab64890Smrg ;; 6221ab64890Smrg 6231ab64890Smrgmakedepend) 6241ab64890Smrg "$@" || exit $? 6251ab64890Smrg # Remove any Libtool call 6261ab64890Smrg if test "$libtool" = yes; then 627b4ee4795Smrg while test "X$1" != 'X--mode=compile'; do 6281ab64890Smrg shift 6291ab64890Smrg done 6301ab64890Smrg shift 6311ab64890Smrg fi 6321ab64890Smrg # X makedepend 6331ab64890Smrg shift 634b4ee4795Smrg cleared=no eat=no 635b4ee4795Smrg for arg 636b4ee4795Smrg do 6371ab64890Smrg case $cleared in 6381ab64890Smrg no) 6391ab64890Smrg set ""; shift 6401ab64890Smrg cleared=yes ;; 6411ab64890Smrg esac 642b4ee4795Smrg if test $eat = yes; then 643b4ee4795Smrg eat=no 644b4ee4795Smrg continue 645b4ee4795Smrg fi 6461ab64890Smrg case "$arg" in 6471ab64890Smrg -D*|-I*) 6481ab64890Smrg set fnord "$@" "$arg"; shift ;; 6491ab64890Smrg # Strip any option that makedepend may not understand. Remove 6501ab64890Smrg # the object too, otherwise makedepend will parse it as a source file. 651b4ee4795Smrg -arch) 652b4ee4795Smrg eat=yes ;; 6531ab64890Smrg -*|$object) 6541ab64890Smrg ;; 6551ab64890Smrg *) 6561ab64890Smrg set fnord "$@" "$arg"; shift ;; 6571ab64890Smrg esac 6581ab64890Smrg done 659b4ee4795Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6601ab64890Smrg touch "$tmpdepfile" 6611ab64890Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6621ab64890Smrg rm -f "$depfile" 663eb411b4bSmrg # makedepend may prepend the VPATH from the source file name to the object. 664eb411b4bSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 665eb411b4bSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 666eb411b4bSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 667eb411b4bSmrg # correctly. Breaking it into two sed invocations is a workaround. 668eb411b4bSmrg sed '1,2d' "$tmpdepfile" \ 669eb411b4bSmrg | tr ' ' "$nl" \ 670eb411b4bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 671eb411b4bSmrg | sed -e 's/$/ :/' >> "$depfile" 6721ab64890Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6731ab64890Smrg ;; 6741ab64890Smrg 6751ab64890Smrgcpp) 6761ab64890Smrg # Important note: in order to support this mode, a compiler *must* 6771ab64890Smrg # always write the preprocessed file to stdout. 6781ab64890Smrg "$@" || exit $? 6791ab64890Smrg 6801ab64890Smrg # Remove the call to Libtool. 6811ab64890Smrg if test "$libtool" = yes; then 682b4ee4795Smrg while test "X$1" != 'X--mode=compile'; do 6831ab64890Smrg shift 6841ab64890Smrg done 6851ab64890Smrg shift 6861ab64890Smrg fi 6871ab64890Smrg 688eb411b4bSmrg # Remove '-o $object'. 6891ab64890Smrg IFS=" " 6901ab64890Smrg for arg 6911ab64890Smrg do 6921ab64890Smrg case $arg in 6931ab64890Smrg -o) 6941ab64890Smrg shift 6951ab64890Smrg ;; 6961ab64890Smrg $object) 6971ab64890Smrg shift 6981ab64890Smrg ;; 6991ab64890Smrg *) 7001ab64890Smrg set fnord "$@" "$arg" 7011ab64890Smrg shift # fnord 7021ab64890Smrg shift # $arg 7031ab64890Smrg ;; 7041ab64890Smrg esac 7051ab64890Smrg done 7061ab64890Smrg 707eb411b4bSmrg "$@" -E \ 708eb411b4bSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 709eb411b4bSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710eb411b4bSmrg | sed '$ s: \\$::' > "$tmpdepfile" 7111ab64890Smrg rm -f "$depfile" 7121ab64890Smrg echo "$object : \\" > "$depfile" 7131ab64890Smrg cat < "$tmpdepfile" >> "$depfile" 7141ab64890Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7151ab64890Smrg rm -f "$tmpdepfile" 7161ab64890Smrg ;; 7171ab64890Smrg 7181ab64890Smrgmsvisualcpp) 7191ab64890Smrg # Important note: in order to support this mode, a compiler *must* 720b4ee4795Smrg # always write the preprocessed file to stdout. 7211ab64890Smrg "$@" || exit $? 722b4ee4795Smrg 723b4ee4795Smrg # Remove the call to Libtool. 724b4ee4795Smrg if test "$libtool" = yes; then 725b4ee4795Smrg while test "X$1" != 'X--mode=compile'; do 726b4ee4795Smrg shift 727b4ee4795Smrg done 728b4ee4795Smrg shift 729b4ee4795Smrg fi 730b4ee4795Smrg 7311ab64890Smrg IFS=" " 7321ab64890Smrg for arg 7331ab64890Smrg do 7341ab64890Smrg case "$arg" in 735b4ee4795Smrg -o) 736b4ee4795Smrg shift 737b4ee4795Smrg ;; 738b4ee4795Smrg $object) 739b4ee4795Smrg shift 740b4ee4795Smrg ;; 7411ab64890Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 742eb411b4bSmrg set fnord "$@" 743eb411b4bSmrg shift 744eb411b4bSmrg shift 745eb411b4bSmrg ;; 7461ab64890Smrg *) 747eb411b4bSmrg set fnord "$@" "$arg" 748eb411b4bSmrg shift 749eb411b4bSmrg shift 750eb411b4bSmrg ;; 7511ab64890Smrg esac 7521ab64890Smrg done 753b4ee4795Smrg "$@" -E 2>/dev/null | 754b4ee4795Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7551ab64890Smrg rm -f "$depfile" 7561ab64890Smrg echo "$object : \\" > "$depfile" 757eb411b4bSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 758eb411b4bSmrg echo "$tab" >> "$depfile" 759b4ee4795Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7601ab64890Smrg rm -f "$tmpdepfile" 7611ab64890Smrg ;; 7621ab64890Smrg 763b4ee4795Smrgmsvcmsys) 764b4ee4795Smrg # This case exists only to let depend.m4 do its work. It works by 765b4ee4795Smrg # looking at the text of this script. This case will never be run, 766b4ee4795Smrg # since it is checked for above. 767b4ee4795Smrg exit 1 768b4ee4795Smrg ;; 769b4ee4795Smrg 7701ab64890Smrgnone) 7711ab64890Smrg exec "$@" 7721ab64890Smrg ;; 7731ab64890Smrg 7741ab64890Smrg*) 7751ab64890Smrg echo "Unknown depmode $depmode" 1>&2 7761ab64890Smrg exit 1 7771ab64890Smrg ;; 7781ab64890Smrgesac 7791ab64890Smrg 7801ab64890Smrgexit 0 7811ab64890Smrg 7821ab64890Smrg# Local Variables: 7831ab64890Smrg# mode: shell-script 7841ab64890Smrg# sh-indentation: 2 7851ab64890Smrg# eval: (add-hook 'write-file-hooks 'time-stamp) 7861ab64890Smrg# time-stamp-start: "scriptversion=" 7871ab64890Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 788b4ee4795Smrg# time-stamp-time-zone: "UTC" 789b4ee4795Smrg# time-stamp-end: "; # UTC" 7901ab64890Smrg# End: 791