depcomp revision 3b4ba46c
11ab64890Smrg#! /bin/sh 21ab64890Smrg# depcomp - compile a program generating dependencies as side-effects 31ab64890Smrg 43b4ba46cSmrgscriptversion=2024-06-19.01; # UTC 51ab64890Smrg 63b4ba46cSmrg# Copyright (C) 1999-2024 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 197d2c738bSmrg# along with this program. If not, see <https://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>. 503b4ba46cSmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 513b4ba46cSmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 521ab64890SmrgEOF 531ab64890Smrg exit $? 541ab64890Smrg ;; 551ab64890Smrg -v | --v*) 563b4ba46cSmrg echo "depcomp (GNU Automake) $scriptversion" 571ab64890Smrg exit $? 581ab64890Smrg ;; 591ab64890Smrgesac 601ab64890Smrg 61eb411b4bSmrg# Get the directory component of the given path, and save it in the 62eb411b4bSmrg# global variables '$dir'. Note that this directory component will 63eb411b4bSmrg# be either empty or ending with a '/' character. This is deliberate. 64eb411b4bSmrgset_dir_from () 65eb411b4bSmrg{ 66eb411b4bSmrg case $1 in 67eb411b4bSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 68eb411b4bSmrg *) dir=;; 69eb411b4bSmrg esac 70eb411b4bSmrg} 71eb411b4bSmrg 72eb411b4bSmrg# Get the suffix-stripped basename of the given path, and save it the 73eb411b4bSmrg# global variable '$base'. 74eb411b4bSmrgset_base_from () 75eb411b4bSmrg{ 76eb411b4bSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 77eb411b4bSmrg} 78eb411b4bSmrg 79eb411b4bSmrg# If no dependency file was actually created by the compiler invocation, 80eb411b4bSmrg# we still have to create a dummy depfile, to avoid errors with the 81eb411b4bSmrg# Makefile "include basename.Plo" scheme. 82eb411b4bSmrgmake_dummy_depfile () 83eb411b4bSmrg{ 84eb411b4bSmrg echo "#dummy" > "$depfile" 85eb411b4bSmrg} 86eb411b4bSmrg 87eb411b4bSmrg# Factor out some common post-processing of the generated depfile. 88eb411b4bSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 89eb411b4bSmrgaix_post_process_depfile () 90eb411b4bSmrg{ 91eb411b4bSmrg # If the compiler actually managed to produce a dependency file, 92eb411b4bSmrg # post-process it. 93eb411b4bSmrg if test -f "$tmpdepfile"; then 94eb411b4bSmrg # Each line is of the form 'foo.o: dependency.h'. 95eb411b4bSmrg # Do two passes, one to just change these to 96eb411b4bSmrg # $object: dependency.h 97eb411b4bSmrg # and one to simply output 98eb411b4bSmrg # dependency.h: 99eb411b4bSmrg # which is needed to avoid the deleted-header problem. 100eb411b4bSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 101eb411b4bSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 102eb411b4bSmrg } > "$depfile" 103eb411b4bSmrg rm -f "$tmpdepfile" 104eb411b4bSmrg else 105eb411b4bSmrg make_dummy_depfile 106eb411b4bSmrg fi 107eb411b4bSmrg} 108eb411b4bSmrg 109eb411b4bSmrg# A tabulation character. 110eb411b4bSmrgtab=' ' 111eb411b4bSmrg# A newline character. 112eb411b4bSmrgnl=' 113eb411b4bSmrg' 114eb411b4bSmrg# Character ranges might be problematic outside the C locale. 115eb411b4bSmrg# These definitions help. 116eb411b4bSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 117eb411b4bSmrglower=abcdefghijklmnopqrstuvwxyz 118eb411b4bSmrgalpha=${upper}${lower} 119eb411b4bSmrg 1201ab64890Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1211ab64890Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1221ab64890Smrg exit 1 1231ab64890Smrgfi 1241ab64890Smrg 1251ab64890Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1261ab64890Smrgdepfile=${depfile-`echo "$object" | 1271ab64890Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1281ab64890Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1291ab64890Smrg 1301ab64890Smrgrm -f "$tmpdepfile" 1311ab64890Smrg 1323b4ba46cSmrg# Avoid interference from the environment. 133eb411b4bSmrggccflag= dashmflag= 134eb411b4bSmrg 1351ab64890Smrg# Some modes work just like other modes, but use different flags. We 1361ab64890Smrg# parameterize here, but still list the modes in the big case below, 1371ab64890Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1381ab64890Smrg# here, because this file can only contain one case statement. 1391ab64890Smrgif test "$depmode" = hp; then 1401ab64890Smrg # HP compiler uses -M and no extra arg. 1411ab64890Smrg gccflag=-M 1421ab64890Smrg depmode=gcc 1431ab64890Smrgfi 1441ab64890Smrg 1451ab64890Smrgif test "$depmode" = dashXmstdout; then 146eb411b4bSmrg # This is just like dashmstdout with a different argument. 147eb411b4bSmrg dashmflag=-xM 148eb411b4bSmrg depmode=dashmstdout 1491ab64890Smrgfi 1501ab64890Smrg 151b4ee4795Smrgcygpath_u="cygpath -u -f -" 152b4ee4795Smrgif test "$depmode" = msvcmsys; then 153eb411b4bSmrg # This is just like msvisualcpp but w/o cygpath translation. 154eb411b4bSmrg # Just convert the backslash-escaped backslashes to single forward 155eb411b4bSmrg # slashes to satisfy depend.m4 156eb411b4bSmrg cygpath_u='sed s,\\\\,/,g' 157eb411b4bSmrg depmode=msvisualcpp 158eb411b4bSmrgfi 159eb411b4bSmrg 160eb411b4bSmrgif test "$depmode" = msvc7msys; then 161eb411b4bSmrg # This is just like msvc7 but w/o cygpath translation. 162eb411b4bSmrg # Just convert the backslash-escaped backslashes to single forward 163eb411b4bSmrg # slashes to satisfy depend.m4 164eb411b4bSmrg cygpath_u='sed s,\\\\,/,g' 165eb411b4bSmrg depmode=msvc7 166eb411b4bSmrgfi 167eb411b4bSmrg 168eb411b4bSmrgif test "$depmode" = xlc; then 169eb411b4bSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 170eb411b4bSmrg gccflag=-qmakedep=gcc,-MF 171eb411b4bSmrg depmode=gcc 172b4ee4795Smrgfi 173b4ee4795Smrg 1741ab64890Smrgcase "$depmode" in 1751ab64890Smrggcc3) 1761ab64890Smrg## gcc 3 implements dependency tracking that does exactly what 1771ab64890Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1781ab64890Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 1791ab64890Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1801ab64890Smrg## the command line argument order; so add the flags where they 1811ab64890Smrg## appear in depend2.am. Note that the slowdown incurred here 1821ab64890Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1831ab64890Smrg for arg 1841ab64890Smrg do 1851ab64890Smrg case $arg in 1861ab64890Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1871ab64890Smrg *) set fnord "$@" "$arg" ;; 1881ab64890Smrg esac 1891ab64890Smrg shift # fnord 1901ab64890Smrg shift # $arg 1911ab64890Smrg done 1921ab64890Smrg "$@" 1931ab64890Smrg stat=$? 194eb411b4bSmrg if test $stat -ne 0; then 1951ab64890Smrg rm -f "$tmpdepfile" 1961ab64890Smrg exit $stat 1971ab64890Smrg fi 1981ab64890Smrg mv "$tmpdepfile" "$depfile" 1991ab64890Smrg ;; 2001ab64890Smrg 2011ab64890Smrggcc) 2023b4ba46cSmrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 2033b4ba46cSmrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 204eb411b4bSmrg## (see the conditional assignment to $gccflag above). 2051ab64890Smrg## There are various ways to get dependency output from gcc. Here's 2061ab64890Smrg## why we pick this rather obscure method: 2071ab64890Smrg## - Don't want to use -MD because we'd like the dependencies to end 2081ab64890Smrg## up in a subdir. Having to rename by hand is ugly. 2091ab64890Smrg## (We might end up doing this anyway to support other compilers.) 2101ab64890Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 211eb411b4bSmrg## -MM, not -M (despite what the docs say). Also, it might not be 212eb411b4bSmrg## supported by the other compilers which use the 'gcc' depmode. 2131ab64890Smrg## - Using -M directly means running the compiler twice (even worse 2141ab64890Smrg## than renaming). 2151ab64890Smrg if test -z "$gccflag"; then 2161ab64890Smrg gccflag=-MD, 2171ab64890Smrg fi 2181ab64890Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2191ab64890Smrg stat=$? 220eb411b4bSmrg if test $stat -ne 0; then 2211ab64890Smrg rm -f "$tmpdepfile" 2221ab64890Smrg exit $stat 2231ab64890Smrg fi 2241ab64890Smrg rm -f "$depfile" 2251ab64890Smrg echo "$object : \\" > "$depfile" 226eb411b4bSmrg # The second -e expression handles DOS-style file names with drive 227eb411b4bSmrg # letters. 2281ab64890Smrg sed -e 's/^[^:]*: / /' \ 2291ab64890Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 230eb411b4bSmrg## This next piece of magic avoids the "deleted header file" problem. 2311ab64890Smrg## The problem is that when a header file which appears in a .P file 2321ab64890Smrg## is deleted, the dependency causes make to die (because there is 2331ab64890Smrg## typically no way to rebuild the header). We avoid this by adding 2341ab64890Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2351ab64890Smrg## this for us directly. 236eb411b4bSmrg## Some versions of gcc put a space before the ':'. On the theory 2371ab64890Smrg## that the space means something, we add a space to the output as 238eb411b4bSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 239eb411b4bSmrg## to the object. Take care to not repeat it in the output. 2401ab64890Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2411ab64890Smrg## correctly. Breaking it into two sed invocations is a workaround. 242eb411b4bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 243eb411b4bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 244eb411b4bSmrg | sed -e 's/$/ :/' >> "$depfile" 2451ab64890Smrg rm -f "$tmpdepfile" 2461ab64890Smrg ;; 2471ab64890Smrg 2481ab64890Smrghp) 2491ab64890Smrg # This case exists only to let depend.m4 do its work. It works by 2501ab64890Smrg # looking at the text of this script. This case will never be run, 2511ab64890Smrg # since it is checked for above. 2521ab64890Smrg exit 1 2531ab64890Smrg ;; 2541ab64890Smrg 2551ab64890Smrgsgi) 2561ab64890Smrg if test "$libtool" = yes; then 2571ab64890Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2581ab64890Smrg else 2591ab64890Smrg "$@" -MDupdate "$tmpdepfile" 2601ab64890Smrg fi 2611ab64890Smrg stat=$? 262eb411b4bSmrg if test $stat -ne 0; then 2631ab64890Smrg rm -f "$tmpdepfile" 2641ab64890Smrg exit $stat 2651ab64890Smrg fi 2661ab64890Smrg rm -f "$depfile" 2671ab64890Smrg 2681ab64890Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2691ab64890Smrg echo "$object : \\" > "$depfile" 2701ab64890Smrg # Clip off the initial element (the dependent). Don't try to be 2711ab64890Smrg # clever and replace this with sed code, as IRIX sed won't handle 2721ab64890Smrg # lines with more than a fixed number of characters (4096 in 2731ab64890Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 274eb411b4bSmrg # the IRIX cc adds comments like '#:fec' to the end of the 2751ab64890Smrg # dependency line. 276eb411b4bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 277eb411b4bSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 278eb411b4bSmrg | tr "$nl" ' ' >> "$depfile" 279b4ee4795Smrg echo >> "$depfile" 2801ab64890Smrg # The second pass generates a dummy entry for each header file. 281eb411b4bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 282eb411b4bSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 283eb411b4bSmrg >> "$depfile" 2841ab64890Smrg else 285eb411b4bSmrg make_dummy_depfile 2861ab64890Smrg fi 2871ab64890Smrg rm -f "$tmpdepfile" 2881ab64890Smrg ;; 2891ab64890Smrg 290eb411b4bSmrgxlc) 291eb411b4bSmrg # This case exists only to let depend.m4 do its work. It works by 292eb411b4bSmrg # looking at the text of this script. This case will never be run, 293eb411b4bSmrg # since it is checked for above. 294eb411b4bSmrg exit 1 295eb411b4bSmrg ;; 296eb411b4bSmrg 2971ab64890Smrgaix) 2981ab64890Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2991ab64890Smrg # in a .u file. In older versions, this file always lives in the 300eb411b4bSmrg # current directory. Also, the AIX compiler puts '$object:' at the 3011ab64890Smrg # start of each line; $object doesn't have directory information. 3021ab64890Smrg # Version 6 uses the directory in both cases. 303eb411b4bSmrg set_dir_from "$object" 304eb411b4bSmrg set_base_from "$object" 3051ab64890Smrg if test "$libtool" = yes; then 3061ab64890Smrg tmpdepfile1=$dir$base.u 3071ab64890Smrg tmpdepfile2=$base.u 3081ab64890Smrg tmpdepfile3=$dir.libs/$base.u 3091ab64890Smrg "$@" -Wc,-M 3101ab64890Smrg else 3111ab64890Smrg tmpdepfile1=$dir$base.u 3121ab64890Smrg tmpdepfile2=$dir$base.u 3131ab64890Smrg tmpdepfile3=$dir$base.u 3141ab64890Smrg "$@" -M 3151ab64890Smrg fi 3161ab64890Smrg stat=$? 317eb411b4bSmrg if test $stat -ne 0; then 3181ab64890Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3191ab64890Smrg exit $stat 3201ab64890Smrg fi 3211ab64890Smrg 3221ab64890Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3231ab64890Smrg do 3241ab64890Smrg test -f "$tmpdepfile" && break 3251ab64890Smrg done 326eb411b4bSmrg aix_post_process_depfile 327eb411b4bSmrg ;; 328eb411b4bSmrg 329eb411b4bSmrgtcc) 330eb411b4bSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 331eb411b4bSmrg # FIXME: That version still under development at the moment of writing. 332eb411b4bSmrg # Make that this statement remains true also for stable, released 333eb411b4bSmrg # versions. 334eb411b4bSmrg # It will wrap lines (doesn't matter whether long or short) with a 335eb411b4bSmrg # trailing '\', as in: 336eb411b4bSmrg # 337eb411b4bSmrg # foo.o : \ 338eb411b4bSmrg # foo.c \ 339eb411b4bSmrg # foo.h \ 340eb411b4bSmrg # 341eb411b4bSmrg # It will put a trailing '\' even on the last line, and will use leading 342eb411b4bSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 343eb411b4bSmrg # "Emit spaces for -MD"). 344eb411b4bSmrg "$@" -MD -MF "$tmpdepfile" 345eb411b4bSmrg stat=$? 346eb411b4bSmrg if test $stat -ne 0; then 347eb411b4bSmrg rm -f "$tmpdepfile" 348eb411b4bSmrg exit $stat 3491ab64890Smrg fi 350eb411b4bSmrg rm -f "$depfile" 351eb411b4bSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 352eb411b4bSmrg # We have to change lines of the first kind to '$object: \'. 353eb411b4bSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 354eb411b4bSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 355eb411b4bSmrg # dummy dependency, to avoid the deleted-header problem. 356eb411b4bSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3571ab64890Smrg rm -f "$tmpdepfile" 3581ab64890Smrg ;; 3591ab64890Smrg 360eb411b4bSmrg## The order of this option in the case statement is important, since the 361eb411b4bSmrg## shell code in configure will try each of these formats in the order 362eb411b4bSmrg## listed in this file. A plain '-MD' option would be understood by many 363eb411b4bSmrg## compilers, so we must ensure this comes after the gcc and icc options. 364eb411b4bSmrgpgcc) 365eb411b4bSmrg # Portland's C compiler understands '-MD'. 366eb411b4bSmrg # Will always output deps to 'file.d' where file is the root name of the 367eb411b4bSmrg # source file under compilation, even if file resides in a subdirectory. 368eb411b4bSmrg # The object file name does not affect the name of the '.d' file. 369eb411b4bSmrg # pgcc 10.2 will output 3701ab64890Smrg # foo.o: sub/foo.c sub/foo.h 371eb411b4bSmrg # and will wrap long lines using '\' : 3721ab64890Smrg # foo.o: sub/foo.c ... \ 3731ab64890Smrg # sub/foo.h ... \ 3741ab64890Smrg # ... 375eb411b4bSmrg set_dir_from "$object" 376eb411b4bSmrg # Use the source, not the object, to determine the base name, since 377eb411b4bSmrg # that's sadly what pgcc will do too. 378eb411b4bSmrg set_base_from "$source" 379eb411b4bSmrg tmpdepfile=$base.d 380eb411b4bSmrg 381eb411b4bSmrg # For projects that build the same source file twice into different object 382eb411b4bSmrg # files, the pgcc approach of using the *source* file root name can cause 383eb411b4bSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 384eb411b4bSmrg # the same $tmpdepfile. 385eb411b4bSmrg lockdir=$base.d-lock 386eb411b4bSmrg trap " 387eb411b4bSmrg echo '$0: caught signal, cleaning up...' >&2 388eb411b4bSmrg rmdir '$lockdir' 389eb411b4bSmrg exit 1 390eb411b4bSmrg " 1 2 13 15 391eb411b4bSmrg numtries=100 392eb411b4bSmrg i=$numtries 393eb411b4bSmrg while test $i -gt 0; do 394eb411b4bSmrg # mkdir is a portable test-and-set. 395eb411b4bSmrg if mkdir "$lockdir" 2>/dev/null; then 396eb411b4bSmrg # This process acquired the lock. 397eb411b4bSmrg "$@" -MD 398eb411b4bSmrg stat=$? 399eb411b4bSmrg # Release the lock. 400eb411b4bSmrg rmdir "$lockdir" 401eb411b4bSmrg break 402eb411b4bSmrg else 403eb411b4bSmrg # If the lock is being held by a different process, wait 404eb411b4bSmrg # until the winning process is done or we timeout. 405eb411b4bSmrg while test -d "$lockdir" && test $i -gt 0; do 406eb411b4bSmrg sleep 1 407eb411b4bSmrg i=`expr $i - 1` 408eb411b4bSmrg done 409eb411b4bSmrg fi 410eb411b4bSmrg i=`expr $i - 1` 411eb411b4bSmrg done 412eb411b4bSmrg trap - 1 2 13 15 413eb411b4bSmrg if test $i -le 0; then 414eb411b4bSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 415eb411b4bSmrg echo "$0: check lockdir '$lockdir'" >&2 416eb411b4bSmrg exit 1 417eb411b4bSmrg fi 4181ab64890Smrg 419eb411b4bSmrg if test $stat -ne 0; then 4201ab64890Smrg rm -f "$tmpdepfile" 4211ab64890Smrg exit $stat 4221ab64890Smrg fi 4231ab64890Smrg rm -f "$depfile" 4241ab64890Smrg # Each line is of the form `foo.o: dependent.h', 4251ab64890Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4261ab64890Smrg # Do two passes, one to just change these to 4271ab64890Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4281ab64890Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4291ab64890Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4301ab64890Smrg # correctly. Breaking it into two sed invocations is a workaround. 431eb411b4bSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 432eb411b4bSmrg | sed -e 's/$/ :/' >> "$depfile" 4331ab64890Smrg rm -f "$tmpdepfile" 4341ab64890Smrg ;; 4351ab64890Smrg 4361ab64890Smrghp2) 4371ab64890Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4381ab64890Smrg # compilers, which have integrated preprocessors. The correct option 4391ab64890Smrg # to use with these is +Maked; it writes dependencies to a file named 4401ab64890Smrg # 'foo.d', which lands next to the object file, wherever that 4411ab64890Smrg # happens to be. 4421ab64890Smrg # Much of this is similar to the tru64 case; see comments there. 443eb411b4bSmrg set_dir_from "$object" 444eb411b4bSmrg set_base_from "$object" 4451ab64890Smrg if test "$libtool" = yes; then 4461ab64890Smrg tmpdepfile1=$dir$base.d 4471ab64890Smrg tmpdepfile2=$dir.libs/$base.d 4481ab64890Smrg "$@" -Wc,+Maked 4491ab64890Smrg else 4501ab64890Smrg tmpdepfile1=$dir$base.d 4511ab64890Smrg tmpdepfile2=$dir$base.d 4521ab64890Smrg "$@" +Maked 4531ab64890Smrg fi 4541ab64890Smrg stat=$? 455eb411b4bSmrg if test $stat -ne 0; then 4561ab64890Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4571ab64890Smrg exit $stat 4581ab64890Smrg fi 4591ab64890Smrg 4601ab64890Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4611ab64890Smrg do 4621ab64890Smrg test -f "$tmpdepfile" && break 4631ab64890Smrg done 4641ab64890Smrg if test -f "$tmpdepfile"; then 465eb411b4bSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 466eb411b4bSmrg # Add 'dependent.h:' lines. 467b4ee4795Smrg sed -ne '2,${ 468eb411b4bSmrg s/^ *// 469eb411b4bSmrg s/ \\*$// 470eb411b4bSmrg s/$/:/ 471eb411b4bSmrg p 472eb411b4bSmrg }' "$tmpdepfile" >> "$depfile" 4731ab64890Smrg else 474eb411b4bSmrg make_dummy_depfile 4751ab64890Smrg fi 4761ab64890Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4771ab64890Smrg ;; 4781ab64890Smrg 4791ab64890Smrgtru64) 480eb411b4bSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 481eb411b4bSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 482eb411b4bSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 483eb411b4bSmrg # dependencies in 'foo.d' instead, so we check for that too. 484eb411b4bSmrg # Subdirectories are respected. 485eb411b4bSmrg set_dir_from "$object" 486eb411b4bSmrg set_base_from "$object" 487eb411b4bSmrg 488eb411b4bSmrg if test "$libtool" = yes; then 489eb411b4bSmrg # Libtool generates 2 separate objects for the 2 libraries. These 490eb411b4bSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 491eb411b4bSmrg # in $dir$base.o.d. We have to check for both files, because 492eb411b4bSmrg # one of the two compilations can be disabled. We should prefer 493eb411b4bSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 494eb411b4bSmrg # automatically cleaned when .libs/ is deleted, while ignoring 495eb411b4bSmrg # the former would cause a distcleancheck panic. 496eb411b4bSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 497eb411b4bSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 498eb411b4bSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 499eb411b4bSmrg "$@" -Wc,-MD 500eb411b4bSmrg else 501eb411b4bSmrg tmpdepfile1=$dir$base.d 502eb411b4bSmrg tmpdepfile2=$dir$base.d 503eb411b4bSmrg tmpdepfile3=$dir$base.d 504eb411b4bSmrg "$@" -MD 505eb411b4bSmrg fi 506eb411b4bSmrg 507eb411b4bSmrg stat=$? 508eb411b4bSmrg if test $stat -ne 0; then 509eb411b4bSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 510eb411b4bSmrg exit $stat 511eb411b4bSmrg fi 512eb411b4bSmrg 513eb411b4bSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 514eb411b4bSmrg do 515eb411b4bSmrg test -f "$tmpdepfile" && break 516eb411b4bSmrg done 517eb411b4bSmrg # Same post-processing that is required for AIX mode. 518eb411b4bSmrg aix_post_process_depfile 519eb411b4bSmrg ;; 520eb411b4bSmrg 521eb411b4bSmrgmsvc7) 522eb411b4bSmrg if test "$libtool" = yes; then 523eb411b4bSmrg showIncludes=-Wc,-showIncludes 524eb411b4bSmrg else 525eb411b4bSmrg showIncludes=-showIncludes 526eb411b4bSmrg fi 527eb411b4bSmrg "$@" $showIncludes > "$tmpdepfile" 528eb411b4bSmrg stat=$? 529eb411b4bSmrg grep -v '^Note: including file: ' "$tmpdepfile" 530eb411b4bSmrg if test $stat -ne 0; then 531eb411b4bSmrg rm -f "$tmpdepfile" 532eb411b4bSmrg exit $stat 533eb411b4bSmrg fi 534eb411b4bSmrg rm -f "$depfile" 535eb411b4bSmrg echo "$object : \\" > "$depfile" 536eb411b4bSmrg # The first sed program below extracts the file names and escapes 537eb411b4bSmrg # backslashes for cygpath. The second sed program outputs the file 538eb411b4bSmrg # name when reading, but also accumulates all include files in the 539eb411b4bSmrg # hold buffer in order to output them again at the end. This only 540eb411b4bSmrg # works with sed implementations that can handle large buffers. 541eb411b4bSmrg sed < "$tmpdepfile" -n ' 542eb411b4bSmrg/^Note: including file: *\(.*\)/ { 543eb411b4bSmrg s//\1/ 544eb411b4bSmrg s/\\/\\\\/g 545eb411b4bSmrg p 546eb411b4bSmrg}' | $cygpath_u | sort -u | sed -n ' 547eb411b4bSmrgs/ /\\ /g 548eb411b4bSmrgs/\(.*\)/'"$tab"'\1 \\/p 549eb411b4bSmrgs/.\(.*\) \\/\1:/ 550eb411b4bSmrgH 551eb411b4bSmrg$ { 552eb411b4bSmrg s/.*/'"$tab"'/ 553eb411b4bSmrg G 554eb411b4bSmrg p 555eb411b4bSmrg}' >> "$depfile" 556818534a1Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 557eb411b4bSmrg rm -f "$tmpdepfile" 558eb411b4bSmrg ;; 559eb411b4bSmrg 560eb411b4bSmrgmsvc7msys) 561eb411b4bSmrg # This case exists only to let depend.m4 do its work. It works by 562eb411b4bSmrg # looking at the text of this script. This case will never be run, 563eb411b4bSmrg # since it is checked for above. 564eb411b4bSmrg exit 1 565eb411b4bSmrg ;; 5661ab64890Smrg 5671ab64890Smrg#nosideeffect) 5681ab64890Smrg # This comment above is used by automake to tell side-effect 5691ab64890Smrg # dependency tracking mechanisms from slower ones. 5701ab64890Smrg 5711ab64890Smrgdashmstdout) 5721ab64890Smrg # Important note: in order to support this mode, a compiler *must* 5731ab64890Smrg # always write the preprocessed file to stdout, regardless of -o. 5741ab64890Smrg "$@" || exit $? 5751ab64890Smrg 5761ab64890Smrg # Remove the call to Libtool. 5771ab64890Smrg if test "$libtool" = yes; then 578b4ee4795Smrg while test "X$1" != 'X--mode=compile'; do 5791ab64890Smrg shift 5801ab64890Smrg done 5811ab64890Smrg shift 5821ab64890Smrg fi 5831ab64890Smrg 584eb411b4bSmrg # Remove '-o $object'. 5851ab64890Smrg IFS=" " 5861ab64890Smrg for arg 5871ab64890Smrg do 5881ab64890Smrg case $arg in 5891ab64890Smrg -o) 5901ab64890Smrg shift 5911ab64890Smrg ;; 5921ab64890Smrg $object) 5931ab64890Smrg shift 5941ab64890Smrg ;; 5951ab64890Smrg *) 5961ab64890Smrg set fnord "$@" "$arg" 5971ab64890Smrg shift # fnord 5981ab64890Smrg shift # $arg 5991ab64890Smrg ;; 6001ab64890Smrg esac 6011ab64890Smrg done 6021ab64890Smrg 6031ab64890Smrg test -z "$dashmflag" && dashmflag=-M 604eb411b4bSmrg # Require at least two characters before searching for ':' 6051ab64890Smrg # in the target name. This is to cope with DOS-style filenames: 606eb411b4bSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6071ab64890Smrg "$@" $dashmflag | 608eb411b4bSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6091ab64890Smrg rm -f "$depfile" 6101ab64890Smrg cat < "$tmpdepfile" > "$depfile" 611eb411b4bSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 612eb411b4bSmrg # correctly. Breaking it into two sed invocations is a workaround. 613eb411b4bSmrg tr ' ' "$nl" < "$tmpdepfile" \ 614eb411b4bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 615eb411b4bSmrg | sed -e 's/$/ :/' >> "$depfile" 6161ab64890Smrg rm -f "$tmpdepfile" 6171ab64890Smrg ;; 6181ab64890Smrg 6191ab64890SmrgdashXmstdout) 6201ab64890Smrg # This case only exists to satisfy depend.m4. It is never actually 6211ab64890Smrg # run, as this mode is specially recognized in the preamble. 6221ab64890Smrg exit 1 6231ab64890Smrg ;; 6241ab64890Smrg 6251ab64890Smrgmakedepend) 6261ab64890Smrg "$@" || exit $? 6271ab64890Smrg # Remove any Libtool call 6281ab64890Smrg if test "$libtool" = yes; then 629b4ee4795Smrg while test "X$1" != 'X--mode=compile'; do 6301ab64890Smrg shift 6311ab64890Smrg done 6321ab64890Smrg shift 6331ab64890Smrg fi 6341ab64890Smrg # X makedepend 6351ab64890Smrg shift 636b4ee4795Smrg cleared=no eat=no 637b4ee4795Smrg for arg 638b4ee4795Smrg do 6391ab64890Smrg case $cleared in 6401ab64890Smrg no) 6411ab64890Smrg set ""; shift 6421ab64890Smrg cleared=yes ;; 6431ab64890Smrg esac 644b4ee4795Smrg if test $eat = yes; then 645b4ee4795Smrg eat=no 646b4ee4795Smrg continue 647b4ee4795Smrg fi 6481ab64890Smrg case "$arg" in 6491ab64890Smrg -D*|-I*) 6501ab64890Smrg set fnord "$@" "$arg"; shift ;; 6511ab64890Smrg # Strip any option that makedepend may not understand. Remove 6521ab64890Smrg # the object too, otherwise makedepend will parse it as a source file. 653b4ee4795Smrg -arch) 654b4ee4795Smrg eat=yes ;; 6551ab64890Smrg -*|$object) 6561ab64890Smrg ;; 6571ab64890Smrg *) 6581ab64890Smrg set fnord "$@" "$arg"; shift ;; 6591ab64890Smrg esac 6601ab64890Smrg done 661b4ee4795Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6621ab64890Smrg touch "$tmpdepfile" 6631ab64890Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6641ab64890Smrg rm -f "$depfile" 665eb411b4bSmrg # makedepend may prepend the VPATH from the source file name to the object. 666eb411b4bSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 667eb411b4bSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 668eb411b4bSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 669eb411b4bSmrg # correctly. Breaking it into two sed invocations is a workaround. 670eb411b4bSmrg sed '1,2d' "$tmpdepfile" \ 671eb411b4bSmrg | tr ' ' "$nl" \ 672eb411b4bSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 673eb411b4bSmrg | sed -e 's/$/ :/' >> "$depfile" 6741ab64890Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6751ab64890Smrg ;; 6761ab64890Smrg 6771ab64890Smrgcpp) 6781ab64890Smrg # Important note: in order to support this mode, a compiler *must* 6791ab64890Smrg # always write the preprocessed file to stdout. 6801ab64890Smrg "$@" || exit $? 6811ab64890Smrg 6821ab64890Smrg # Remove the call to Libtool. 6831ab64890Smrg if test "$libtool" = yes; then 684b4ee4795Smrg while test "X$1" != 'X--mode=compile'; do 6851ab64890Smrg shift 6861ab64890Smrg done 6871ab64890Smrg shift 6881ab64890Smrg fi 6891ab64890Smrg 690eb411b4bSmrg # Remove '-o $object'. 6911ab64890Smrg IFS=" " 6921ab64890Smrg for arg 6931ab64890Smrg do 6941ab64890Smrg case $arg in 6951ab64890Smrg -o) 6961ab64890Smrg shift 6971ab64890Smrg ;; 6981ab64890Smrg $object) 6991ab64890Smrg shift 7001ab64890Smrg ;; 7011ab64890Smrg *) 7021ab64890Smrg set fnord "$@" "$arg" 7031ab64890Smrg shift # fnord 7041ab64890Smrg shift # $arg 7051ab64890Smrg ;; 7061ab64890Smrg esac 7071ab64890Smrg done 7081ab64890Smrg 709eb411b4bSmrg "$@" -E \ 710eb411b4bSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711eb411b4bSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 712eb411b4bSmrg | sed '$ s: \\$::' > "$tmpdepfile" 7131ab64890Smrg rm -f "$depfile" 7141ab64890Smrg echo "$object : \\" > "$depfile" 7151ab64890Smrg cat < "$tmpdepfile" >> "$depfile" 7161ab64890Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7171ab64890Smrg rm -f "$tmpdepfile" 7181ab64890Smrg ;; 7191ab64890Smrg 7201ab64890Smrgmsvisualcpp) 7211ab64890Smrg # Important note: in order to support this mode, a compiler *must* 722b4ee4795Smrg # always write the preprocessed file to stdout. 7231ab64890Smrg "$@" || exit $? 724b4ee4795Smrg 725b4ee4795Smrg # Remove the call to Libtool. 726b4ee4795Smrg if test "$libtool" = yes; then 727b4ee4795Smrg while test "X$1" != 'X--mode=compile'; do 728b4ee4795Smrg shift 729b4ee4795Smrg done 730b4ee4795Smrg shift 731b4ee4795Smrg fi 732b4ee4795Smrg 7331ab64890Smrg IFS=" " 7341ab64890Smrg for arg 7351ab64890Smrg do 7361ab64890Smrg case "$arg" in 737b4ee4795Smrg -o) 738b4ee4795Smrg shift 739b4ee4795Smrg ;; 740b4ee4795Smrg $object) 741b4ee4795Smrg shift 742b4ee4795Smrg ;; 7431ab64890Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 744eb411b4bSmrg set fnord "$@" 745eb411b4bSmrg shift 746eb411b4bSmrg shift 747eb411b4bSmrg ;; 7481ab64890Smrg *) 749eb411b4bSmrg set fnord "$@" "$arg" 750eb411b4bSmrg shift 751eb411b4bSmrg shift 752eb411b4bSmrg ;; 7531ab64890Smrg esac 7541ab64890Smrg done 755b4ee4795Smrg "$@" -E 2>/dev/null | 756b4ee4795Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7571ab64890Smrg rm -f "$depfile" 7581ab64890Smrg echo "$object : \\" > "$depfile" 759eb411b4bSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 760eb411b4bSmrg echo "$tab" >> "$depfile" 761b4ee4795Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7621ab64890Smrg rm -f "$tmpdepfile" 7631ab64890Smrg ;; 7641ab64890Smrg 765b4ee4795Smrgmsvcmsys) 766b4ee4795Smrg # This case exists only to let depend.m4 do its work. It works by 767b4ee4795Smrg # looking at the text of this script. This case will never be run, 768b4ee4795Smrg # since it is checked for above. 769b4ee4795Smrg exit 1 770b4ee4795Smrg ;; 771b4ee4795Smrg 7721ab64890Smrgnone) 7731ab64890Smrg exec "$@" 7741ab64890Smrg ;; 7751ab64890Smrg 7761ab64890Smrg*) 7771ab64890Smrg echo "Unknown depmode $depmode" 1>&2 7781ab64890Smrg exit 1 7791ab64890Smrg ;; 7801ab64890Smrgesac 7811ab64890Smrg 7821ab64890Smrgexit 0 7831ab64890Smrg 7841ab64890Smrg# Local Variables: 7851ab64890Smrg# mode: shell-script 7861ab64890Smrg# sh-indentation: 2 7877d2c738bSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 7881ab64890Smrg# time-stamp-start: "scriptversion=" 7891ab64890Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7907d2c738bSmrg# time-stamp-time-zone: "UTC0" 791b4ee4795Smrg# time-stamp-end: "; # UTC" 7921ab64890Smrg# End: 793