1d1333322Smrg#! /bin/sh 2d1333322Smrg# depcomp - compile a program generating dependencies as side-effects 3d1333322Smrg 4742aa962Smrgscriptversion=2024-06-19.01; # UTC 5d1333322Smrg 6742aa962Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 7d1333322Smrg 8d1333322Smrg# This program is free software; you can redistribute it and/or modify 9d1333322Smrg# it under the terms of the GNU General Public License as published by 10d1333322Smrg# the Free Software Foundation; either version 2, or (at your option) 11d1333322Smrg# any later version. 12d1333322Smrg 13d1333322Smrg# This program is distributed in the hope that it will be useful, 14d1333322Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15d1333322Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16d1333322Smrg# GNU General Public License for more details. 17d1333322Smrg 18d1333322Smrg# You should have received a copy of the GNU General Public License 19d04472e1Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 20d1333322Smrg 21d1333322Smrg# As a special exception to the GNU General Public License, if you 22d1333322Smrg# distribute this file as part of a program that contains a 23d1333322Smrg# configuration script generated by Autoconf, you may include it under 24d1333322Smrg# the same distribution terms that you use for the rest of that program. 25d1333322Smrg 26d1333322Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27d1333322Smrg 28d1333322Smrgcase $1 in 29d1333322Smrg '') 3069ef5f27Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 3169ef5f27Smrg exit 1; 3269ef5f27Smrg ;; 33d1333322Smrg -h | --h*) 34d1333322Smrg cat <<\EOF 35d1333322SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36d1333322Smrg 37d1333322SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38d1333322Smrgas side-effects. 39d1333322Smrg 40d1333322SmrgEnvironment variables: 41d1333322Smrg depmode Dependency tracking mode. 4269ef5f27Smrg source Source file read by 'PROGRAMS ARGS'. 4369ef5f27Smrg object Object file output by 'PROGRAMS ARGS'. 44d1333322Smrg DEPDIR directory where to store dependencies. 45d1333322Smrg depfile Dependency file to output. 46c27291ebSmrg tmpdepfile Temporary file to use when outputting dependencies. 47d1333322Smrg libtool Whether libtool is used (yes/no). 48d1333322Smrg 49d1333322SmrgReport bugs to <bug-automake@gnu.org>. 50742aa962SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 51742aa962SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 52d1333322SmrgEOF 53d1333322Smrg exit $? 54d1333322Smrg ;; 55d1333322Smrg -v | --v*) 56742aa962Smrg echo "depcomp (GNU Automake) $scriptversion" 57d1333322Smrg exit $? 58d1333322Smrg ;; 59d1333322Smrgesac 60d1333322Smrg 6169ef5f27Smrg# Get the directory component of the given path, and save it in the 6269ef5f27Smrg# global variables '$dir'. Note that this directory component will 6369ef5f27Smrg# be either empty or ending with a '/' character. This is deliberate. 6469ef5f27Smrgset_dir_from () 6569ef5f27Smrg{ 6669ef5f27Smrg case $1 in 6769ef5f27Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 6869ef5f27Smrg *) dir=;; 6969ef5f27Smrg esac 7069ef5f27Smrg} 7169ef5f27Smrg 7269ef5f27Smrg# Get the suffix-stripped basename of the given path, and save it the 7369ef5f27Smrg# global variable '$base'. 7469ef5f27Smrgset_base_from () 7569ef5f27Smrg{ 7669ef5f27Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 7769ef5f27Smrg} 7869ef5f27Smrg 7969ef5f27Smrg# If no dependency file was actually created by the compiler invocation, 8069ef5f27Smrg# we still have to create a dummy depfile, to avoid errors with the 8169ef5f27Smrg# Makefile "include basename.Plo" scheme. 8269ef5f27Smrgmake_dummy_depfile () 8369ef5f27Smrg{ 8469ef5f27Smrg echo "#dummy" > "$depfile" 8569ef5f27Smrg} 8669ef5f27Smrg 8769ef5f27Smrg# Factor out some common post-processing of the generated depfile. 8869ef5f27Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 8969ef5f27Smrgaix_post_process_depfile () 9069ef5f27Smrg{ 9169ef5f27Smrg # If the compiler actually managed to produce a dependency file, 9269ef5f27Smrg # post-process it. 9369ef5f27Smrg if test -f "$tmpdepfile"; then 9469ef5f27Smrg # Each line is of the form 'foo.o: dependency.h'. 9569ef5f27Smrg # Do two passes, one to just change these to 9669ef5f27Smrg # $object: dependency.h 9769ef5f27Smrg # and one to simply output 9869ef5f27Smrg # dependency.h: 9969ef5f27Smrg # which is needed to avoid the deleted-header problem. 10069ef5f27Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 10169ef5f27Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 10269ef5f27Smrg } > "$depfile" 10369ef5f27Smrg rm -f "$tmpdepfile" 10469ef5f27Smrg else 10569ef5f27Smrg make_dummy_depfile 10669ef5f27Smrg fi 10769ef5f27Smrg} 10869ef5f27Smrg 10969ef5f27Smrg# A tabulation character. 11069ef5f27Smrgtab=' ' 11169ef5f27Smrg# A newline character. 11269ef5f27Smrgnl=' 11369ef5f27Smrg' 11469ef5f27Smrg# Character ranges might be problematic outside the C locale. 11569ef5f27Smrg# These definitions help. 11669ef5f27Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 11769ef5f27Smrglower=abcdefghijklmnopqrstuvwxyz 11869ef5f27Smrgalpha=${upper}${lower} 11969ef5f27Smrg 120d1333322Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 121d1333322Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 122d1333322Smrg exit 1 123d1333322Smrgfi 124d1333322Smrg 125d1333322Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 126d1333322Smrgdepfile=${depfile-`echo "$object" | 127d1333322Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 128d1333322Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 129d1333322Smrg 130d1333322Smrgrm -f "$tmpdepfile" 131d1333322Smrg 132742aa962Smrg# Avoid interference from the environment. 13369ef5f27Smrggccflag= dashmflag= 13469ef5f27Smrg 135d1333322Smrg# Some modes work just like other modes, but use different flags. We 136d1333322Smrg# parameterize here, but still list the modes in the big case below, 137d1333322Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 138d1333322Smrg# here, because this file can only contain one case statement. 139d1333322Smrgif test "$depmode" = hp; then 140d1333322Smrg # HP compiler uses -M and no extra arg. 141d1333322Smrg gccflag=-M 142d1333322Smrg depmode=gcc 143d1333322Smrgfi 144d1333322Smrg 145d1333322Smrgif test "$depmode" = dashXmstdout; then 14669ef5f27Smrg # This is just like dashmstdout with a different argument. 14769ef5f27Smrg dashmflag=-xM 14869ef5f27Smrg depmode=dashmstdout 149d1333322Smrgfi 150d1333322Smrg 1514f9ac78aSmrgcygpath_u="cygpath -u -f -" 1524f9ac78aSmrgif test "$depmode" = msvcmsys; then 15369ef5f27Smrg # This is just like msvisualcpp but w/o cygpath translation. 15469ef5f27Smrg # Just convert the backslash-escaped backslashes to single forward 15569ef5f27Smrg # slashes to satisfy depend.m4 15669ef5f27Smrg cygpath_u='sed s,\\\\,/,g' 15769ef5f27Smrg depmode=msvisualcpp 1584f9ac78aSmrgfi 1594f9ac78aSmrg 160c27291ebSmrgif test "$depmode" = msvc7msys; then 16169ef5f27Smrg # This is just like msvc7 but w/o cygpath translation. 16269ef5f27Smrg # Just convert the backslash-escaped backslashes to single forward 16369ef5f27Smrg # slashes to satisfy depend.m4 16469ef5f27Smrg cygpath_u='sed s,\\\\,/,g' 16569ef5f27Smrg depmode=msvc7 16669ef5f27Smrgfi 16769ef5f27Smrg 16869ef5f27Smrgif test "$depmode" = xlc; then 16969ef5f27Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 17069ef5f27Smrg gccflag=-qmakedep=gcc,-MF 17169ef5f27Smrg depmode=gcc 172c27291ebSmrgfi 173c27291ebSmrg 174d1333322Smrgcase "$depmode" in 175d1333322Smrggcc3) 176d1333322Smrg## gcc 3 implements dependency tracking that does exactly what 177d1333322Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 178d1333322Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 179d1333322Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 180d1333322Smrg## the command line argument order; so add the flags where they 181d1333322Smrg## appear in depend2.am. Note that the slowdown incurred here 182d1333322Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 183d1333322Smrg for arg 184d1333322Smrg do 185d1333322Smrg case $arg in 186d1333322Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 187d1333322Smrg *) set fnord "$@" "$arg" ;; 188d1333322Smrg esac 189d1333322Smrg shift # fnord 190d1333322Smrg shift # $arg 191d1333322Smrg done 192d1333322Smrg "$@" 193d1333322Smrg stat=$? 19469ef5f27Smrg if test $stat -ne 0; then 195d1333322Smrg rm -f "$tmpdepfile" 196d1333322Smrg exit $stat 197d1333322Smrg fi 198d1333322Smrg mv "$tmpdepfile" "$depfile" 199d1333322Smrg ;; 200d1333322Smrg 201d1333322Smrggcc) 202742aa962Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 203742aa962Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 20469ef5f27Smrg## (see the conditional assignment to $gccflag above). 205d1333322Smrg## There are various ways to get dependency output from gcc. Here's 206d1333322Smrg## why we pick this rather obscure method: 207d1333322Smrg## - Don't want to use -MD because we'd like the dependencies to end 208d1333322Smrg## up in a subdir. Having to rename by hand is ugly. 209d1333322Smrg## (We might end up doing this anyway to support other compilers.) 210d1333322Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 21169ef5f27Smrg## -MM, not -M (despite what the docs say). Also, it might not be 21269ef5f27Smrg## supported by the other compilers which use the 'gcc' depmode. 213d1333322Smrg## - Using -M directly means running the compiler twice (even worse 214d1333322Smrg## than renaming). 215d1333322Smrg if test -z "$gccflag"; then 216d1333322Smrg gccflag=-MD, 217d1333322Smrg fi 218d1333322Smrg "$@" -Wp,"$gccflag$tmpdepfile" 219d1333322Smrg stat=$? 22069ef5f27Smrg if test $stat -ne 0; then 221d1333322Smrg rm -f "$tmpdepfile" 222d1333322Smrg exit $stat 223d1333322Smrg fi 224d1333322Smrg rm -f "$depfile" 225d1333322Smrg echo "$object : \\" > "$depfile" 22669ef5f27Smrg # The second -e expression handles DOS-style file names with drive 22769ef5f27Smrg # letters. 228d1333322Smrg sed -e 's/^[^:]*: / /' \ 229d1333322Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 23069ef5f27Smrg## This next piece of magic avoids the "deleted header file" problem. 231d1333322Smrg## The problem is that when a header file which appears in a .P file 232d1333322Smrg## is deleted, the dependency causes make to die (because there is 233d1333322Smrg## typically no way to rebuild the header). We avoid this by adding 234d1333322Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 235d1333322Smrg## this for us directly. 23669ef5f27Smrg## Some versions of gcc put a space before the ':'. On the theory 237d1333322Smrg## that the space means something, we add a space to the output as 238c27291ebSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 239c27291ebSmrg## to the object. Take care to not repeat it in the output. 240d1333322Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 241d1333322Smrg## correctly. Breaking it into two sed invocations is a workaround. 24269ef5f27Smrg tr ' ' "$nl" < "$tmpdepfile" \ 24369ef5f27Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 24469ef5f27Smrg | sed -e 's/$/ :/' >> "$depfile" 245d1333322Smrg rm -f "$tmpdepfile" 246d1333322Smrg ;; 247d1333322Smrg 248d1333322Smrghp) 249d1333322Smrg # This case exists only to let depend.m4 do its work. It works by 250d1333322Smrg # looking at the text of this script. This case will never be run, 251d1333322Smrg # since it is checked for above. 252d1333322Smrg exit 1 253d1333322Smrg ;; 254d1333322Smrg 255d1333322Smrgsgi) 256d1333322Smrg if test "$libtool" = yes; then 257d1333322Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 258d1333322Smrg else 259d1333322Smrg "$@" -MDupdate "$tmpdepfile" 260d1333322Smrg fi 261d1333322Smrg stat=$? 26269ef5f27Smrg if test $stat -ne 0; then 263d1333322Smrg rm -f "$tmpdepfile" 264d1333322Smrg exit $stat 265d1333322Smrg fi 266d1333322Smrg rm -f "$depfile" 267d1333322Smrg 268d1333322Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 269d1333322Smrg echo "$object : \\" > "$depfile" 270d1333322Smrg # Clip off the initial element (the dependent). Don't try to be 271d1333322Smrg # clever and replace this with sed code, as IRIX sed won't handle 272d1333322Smrg # lines with more than a fixed number of characters (4096 in 273d1333322Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 27469ef5f27Smrg # the IRIX cc adds comments like '#:fec' to the end of the 275d1333322Smrg # dependency line. 27669ef5f27Smrg tr ' ' "$nl" < "$tmpdepfile" \ 27769ef5f27Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 27869ef5f27Smrg | tr "$nl" ' ' >> "$depfile" 2794f9ac78aSmrg echo >> "$depfile" 280d1333322Smrg # The second pass generates a dummy entry for each header file. 28169ef5f27Smrg tr ' ' "$nl" < "$tmpdepfile" \ 28269ef5f27Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 28369ef5f27Smrg >> "$depfile" 284d1333322Smrg else 28569ef5f27Smrg make_dummy_depfile 286d1333322Smrg fi 287d1333322Smrg rm -f "$tmpdepfile" 288d1333322Smrg ;; 289d1333322Smrg 29069ef5f27Smrgxlc) 29169ef5f27Smrg # This case exists only to let depend.m4 do its work. It works by 29269ef5f27Smrg # looking at the text of this script. This case will never be run, 29369ef5f27Smrg # since it is checked for above. 29469ef5f27Smrg exit 1 29569ef5f27Smrg ;; 29669ef5f27Smrg 297d1333322Smrgaix) 298d1333322Smrg # The C for AIX Compiler uses -M and outputs the dependencies 299d1333322Smrg # in a .u file. In older versions, this file always lives in the 30069ef5f27Smrg # current directory. Also, the AIX compiler puts '$object:' at the 301d1333322Smrg # start of each line; $object doesn't have directory information. 302d1333322Smrg # Version 6 uses the directory in both cases. 30369ef5f27Smrg set_dir_from "$object" 30469ef5f27Smrg set_base_from "$object" 305d1333322Smrg if test "$libtool" = yes; then 3064f9ac78aSmrg tmpdepfile1=$dir$base.u 3074f9ac78aSmrg tmpdepfile2=$base.u 3084f9ac78aSmrg tmpdepfile3=$dir.libs/$base.u 309d1333322Smrg "$@" -Wc,-M 310d1333322Smrg else 3114f9ac78aSmrg tmpdepfile1=$dir$base.u 3124f9ac78aSmrg tmpdepfile2=$dir$base.u 3134f9ac78aSmrg tmpdepfile3=$dir$base.u 314d1333322Smrg "$@" -M 315d1333322Smrg fi 316d1333322Smrg stat=$? 31769ef5f27Smrg if test $stat -ne 0; then 3184f9ac78aSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 319d1333322Smrg exit $stat 320d1333322Smrg fi 321d1333322Smrg 3224f9ac78aSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3234f9ac78aSmrg do 3244f9ac78aSmrg test -f "$tmpdepfile" && break 3254f9ac78aSmrg done 32669ef5f27Smrg aix_post_process_depfile 32769ef5f27Smrg ;; 32869ef5f27Smrg 32969ef5f27Smrgtcc) 33069ef5f27Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 33169ef5f27Smrg # FIXME: That version still under development at the moment of writing. 33269ef5f27Smrg # Make that this statement remains true also for stable, released 33369ef5f27Smrg # versions. 33469ef5f27Smrg # It will wrap lines (doesn't matter whether long or short) with a 33569ef5f27Smrg # trailing '\', as in: 33669ef5f27Smrg # 33769ef5f27Smrg # foo.o : \ 33869ef5f27Smrg # foo.c \ 33969ef5f27Smrg # foo.h \ 34069ef5f27Smrg # 34169ef5f27Smrg # It will put a trailing '\' even on the last line, and will use leading 34269ef5f27Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 34369ef5f27Smrg # "Emit spaces for -MD"). 34469ef5f27Smrg "$@" -MD -MF "$tmpdepfile" 34569ef5f27Smrg stat=$? 34669ef5f27Smrg if test $stat -ne 0; then 34769ef5f27Smrg rm -f "$tmpdepfile" 34869ef5f27Smrg exit $stat 349d1333322Smrg fi 35069ef5f27Smrg rm -f "$depfile" 35169ef5f27Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 35269ef5f27Smrg # We have to change lines of the first kind to '$object: \'. 35369ef5f27Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 35469ef5f27Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 35569ef5f27Smrg # dummy dependency, to avoid the deleted-header problem. 35669ef5f27Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 357d1333322Smrg rm -f "$tmpdepfile" 358d1333322Smrg ;; 359d1333322Smrg 36069ef5f27Smrg## The order of this option in the case statement is important, since the 36169ef5f27Smrg## shell code in configure will try each of these formats in the order 36269ef5f27Smrg## listed in this file. A plain '-MD' option would be understood by many 36369ef5f27Smrg## compilers, so we must ensure this comes after the gcc and icc options. 36469ef5f27Smrgpgcc) 36569ef5f27Smrg # Portland's C compiler understands '-MD'. 36669ef5f27Smrg # Will always output deps to 'file.d' where file is the root name of the 36769ef5f27Smrg # source file under compilation, even if file resides in a subdirectory. 36869ef5f27Smrg # The object file name does not affect the name of the '.d' file. 36969ef5f27Smrg # pgcc 10.2 will output 370d1333322Smrg # foo.o: sub/foo.c sub/foo.h 37169ef5f27Smrg # and will wrap long lines using '\' : 372d1333322Smrg # foo.o: sub/foo.c ... \ 373d1333322Smrg # sub/foo.h ... \ 374d1333322Smrg # ... 37569ef5f27Smrg set_dir_from "$object" 37669ef5f27Smrg # Use the source, not the object, to determine the base name, since 37769ef5f27Smrg # that's sadly what pgcc will do too. 37869ef5f27Smrg set_base_from "$source" 37969ef5f27Smrg tmpdepfile=$base.d 38069ef5f27Smrg 38169ef5f27Smrg # For projects that build the same source file twice into different object 38269ef5f27Smrg # files, the pgcc approach of using the *source* file root name can cause 38369ef5f27Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 38469ef5f27Smrg # the same $tmpdepfile. 38569ef5f27Smrg lockdir=$base.d-lock 38669ef5f27Smrg trap " 38769ef5f27Smrg echo '$0: caught signal, cleaning up...' >&2 38869ef5f27Smrg rmdir '$lockdir' 38969ef5f27Smrg exit 1 39069ef5f27Smrg " 1 2 13 15 39169ef5f27Smrg numtries=100 39269ef5f27Smrg i=$numtries 39369ef5f27Smrg while test $i -gt 0; do 39469ef5f27Smrg # mkdir is a portable test-and-set. 39569ef5f27Smrg if mkdir "$lockdir" 2>/dev/null; then 39669ef5f27Smrg # This process acquired the lock. 39769ef5f27Smrg "$@" -MD 39869ef5f27Smrg stat=$? 39969ef5f27Smrg # Release the lock. 40069ef5f27Smrg rmdir "$lockdir" 40169ef5f27Smrg break 40269ef5f27Smrg else 40369ef5f27Smrg # If the lock is being held by a different process, wait 40469ef5f27Smrg # until the winning process is done or we timeout. 40569ef5f27Smrg while test -d "$lockdir" && test $i -gt 0; do 40669ef5f27Smrg sleep 1 40769ef5f27Smrg i=`expr $i - 1` 40869ef5f27Smrg done 40969ef5f27Smrg fi 41069ef5f27Smrg i=`expr $i - 1` 41169ef5f27Smrg done 41269ef5f27Smrg trap - 1 2 13 15 41369ef5f27Smrg if test $i -le 0; then 41469ef5f27Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 41569ef5f27Smrg echo "$0: check lockdir '$lockdir'" >&2 41669ef5f27Smrg exit 1 41769ef5f27Smrg fi 418d1333322Smrg 41969ef5f27Smrg if test $stat -ne 0; then 420d1333322Smrg rm -f "$tmpdepfile" 421d1333322Smrg exit $stat 422d1333322Smrg fi 423d1333322Smrg rm -f "$depfile" 424d1333322Smrg # Each line is of the form `foo.o: dependent.h', 425d1333322Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 426d1333322Smrg # Do two passes, one to just change these to 427d1333322Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 428d1333322Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 429d1333322Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 430d1333322Smrg # correctly. Breaking it into two sed invocations is a workaround. 43169ef5f27Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 43269ef5f27Smrg | sed -e 's/$/ :/' >> "$depfile" 433d1333322Smrg rm -f "$tmpdepfile" 434d1333322Smrg ;; 435d1333322Smrg 436d1333322Smrghp2) 437d1333322Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 438d1333322Smrg # compilers, which have integrated preprocessors. The correct option 439d1333322Smrg # to use with these is +Maked; it writes dependencies to a file named 440d1333322Smrg # 'foo.d', which lands next to the object file, wherever that 441d1333322Smrg # happens to be. 442d1333322Smrg # Much of this is similar to the tru64 case; see comments there. 44369ef5f27Smrg set_dir_from "$object" 44469ef5f27Smrg set_base_from "$object" 445d1333322Smrg if test "$libtool" = yes; then 446d1333322Smrg tmpdepfile1=$dir$base.d 447d1333322Smrg tmpdepfile2=$dir.libs/$base.d 448d1333322Smrg "$@" -Wc,+Maked 449d1333322Smrg else 450d1333322Smrg tmpdepfile1=$dir$base.d 451d1333322Smrg tmpdepfile2=$dir$base.d 452d1333322Smrg "$@" +Maked 453d1333322Smrg fi 454d1333322Smrg stat=$? 45569ef5f27Smrg if test $stat -ne 0; then 456d1333322Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 457d1333322Smrg exit $stat 458d1333322Smrg fi 459d1333322Smrg 460d1333322Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 461d1333322Smrg do 462d1333322Smrg test -f "$tmpdepfile" && break 463d1333322Smrg done 464d1333322Smrg if test -f "$tmpdepfile"; then 46569ef5f27Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 46669ef5f27Smrg # Add 'dependent.h:' lines. 4674f9ac78aSmrg sed -ne '2,${ 46869ef5f27Smrg s/^ *// 46969ef5f27Smrg s/ \\*$// 47069ef5f27Smrg s/$/:/ 47169ef5f27Smrg p 47269ef5f27Smrg }' "$tmpdepfile" >> "$depfile" 473d1333322Smrg else 47469ef5f27Smrg make_dummy_depfile 475d1333322Smrg fi 476d1333322Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 477d1333322Smrg ;; 478d1333322Smrg 479d1333322Smrgtru64) 48069ef5f27Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 48169ef5f27Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 48269ef5f27Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 48369ef5f27Smrg # dependencies in 'foo.d' instead, so we check for that too. 48469ef5f27Smrg # Subdirectories are respected. 48569ef5f27Smrg set_dir_from "$object" 48669ef5f27Smrg set_base_from "$object" 48769ef5f27Smrg 48869ef5f27Smrg if test "$libtool" = yes; then 48969ef5f27Smrg # Libtool generates 2 separate objects for the 2 libraries. These 49069ef5f27Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 49169ef5f27Smrg # in $dir$base.o.d. We have to check for both files, because 49269ef5f27Smrg # one of the two compilations can be disabled. We should prefer 49369ef5f27Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 49469ef5f27Smrg # automatically cleaned when .libs/ is deleted, while ignoring 49569ef5f27Smrg # the former would cause a distcleancheck panic. 49669ef5f27Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 49769ef5f27Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 49869ef5f27Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 49969ef5f27Smrg "$@" -Wc,-MD 50069ef5f27Smrg else 50169ef5f27Smrg tmpdepfile1=$dir$base.d 50269ef5f27Smrg tmpdepfile2=$dir$base.d 50369ef5f27Smrg tmpdepfile3=$dir$base.d 50469ef5f27Smrg "$@" -MD 50569ef5f27Smrg fi 50669ef5f27Smrg 50769ef5f27Smrg stat=$? 50869ef5f27Smrg if test $stat -ne 0; then 50969ef5f27Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 51069ef5f27Smrg exit $stat 51169ef5f27Smrg fi 51269ef5f27Smrg 51369ef5f27Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 51469ef5f27Smrg do 51569ef5f27Smrg test -f "$tmpdepfile" && break 51669ef5f27Smrg done 51769ef5f27Smrg # Same post-processing that is required for AIX mode. 51869ef5f27Smrg aix_post_process_depfile 51969ef5f27Smrg ;; 520d1333322Smrg 521c27291ebSmrgmsvc7) 522c27291ebSmrg if test "$libtool" = yes; then 523c27291ebSmrg showIncludes=-Wc,-showIncludes 524c27291ebSmrg else 525c27291ebSmrg showIncludes=-showIncludes 526c27291ebSmrg fi 527c27291ebSmrg "$@" $showIncludes > "$tmpdepfile" 528c27291ebSmrg stat=$? 529c27291ebSmrg grep -v '^Note: including file: ' "$tmpdepfile" 53069ef5f27Smrg if test $stat -ne 0; then 531c27291ebSmrg rm -f "$tmpdepfile" 532c27291ebSmrg exit $stat 533c27291ebSmrg fi 534c27291ebSmrg rm -f "$depfile" 535c27291ebSmrg echo "$object : \\" > "$depfile" 536c27291ebSmrg # The first sed program below extracts the file names and escapes 537c27291ebSmrg # backslashes for cygpath. The second sed program outputs the file 538c27291ebSmrg # name when reading, but also accumulates all include files in the 539c27291ebSmrg # hold buffer in order to output them again at the end. This only 540c27291ebSmrg # works with sed implementations that can handle large buffers. 541c27291ebSmrg sed < "$tmpdepfile" -n ' 542c27291ebSmrg/^Note: including file: *\(.*\)/ { 543c27291ebSmrg s//\1/ 544c27291ebSmrg s/\\/\\\\/g 545c27291ebSmrg p 546c27291ebSmrg}' | $cygpath_u | sort -u | sed -n ' 547c27291ebSmrgs/ /\\ /g 54869ef5f27Smrgs/\(.*\)/'"$tab"'\1 \\/p 549c27291ebSmrgs/.\(.*\) \\/\1:/ 550c27291ebSmrgH 551c27291ebSmrg$ { 55269ef5f27Smrg s/.*/'"$tab"'/ 553c27291ebSmrg G 554c27291ebSmrg p 555c27291ebSmrg}' >> "$depfile" 55669ef5f27Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 557c27291ebSmrg rm -f "$tmpdepfile" 558c27291ebSmrg ;; 559c27291ebSmrg 560c27291ebSmrgmsvc7msys) 561c27291ebSmrg # This case exists only to let depend.m4 do its work. It works by 562c27291ebSmrg # looking at the text of this script. This case will never be run, 563c27291ebSmrg # since it is checked for above. 564c27291ebSmrg exit 1 565c27291ebSmrg ;; 566c27291ebSmrg 567d1333322Smrg#nosideeffect) 568d1333322Smrg # This comment above is used by automake to tell side-effect 569d1333322Smrg # dependency tracking mechanisms from slower ones. 570d1333322Smrg 571d1333322Smrgdashmstdout) 572d1333322Smrg # Important note: in order to support this mode, a compiler *must* 573d1333322Smrg # always write the preprocessed file to stdout, regardless of -o. 574d1333322Smrg "$@" || exit $? 575d1333322Smrg 576d1333322Smrg # Remove the call to Libtool. 577d1333322Smrg if test "$libtool" = yes; then 5784f9ac78aSmrg while test "X$1" != 'X--mode=compile'; do 579d1333322Smrg shift 580d1333322Smrg done 581d1333322Smrg shift 582d1333322Smrg fi 583d1333322Smrg 58469ef5f27Smrg # Remove '-o $object'. 585d1333322Smrg IFS=" " 586d1333322Smrg for arg 587d1333322Smrg do 588d1333322Smrg case $arg in 589d1333322Smrg -o) 590d1333322Smrg shift 591d1333322Smrg ;; 592d1333322Smrg $object) 593d1333322Smrg shift 594d1333322Smrg ;; 595d1333322Smrg *) 596d1333322Smrg set fnord "$@" "$arg" 597d1333322Smrg shift # fnord 598d1333322Smrg shift # $arg 599d1333322Smrg ;; 600d1333322Smrg esac 601d1333322Smrg done 602d1333322Smrg 603d1333322Smrg test -z "$dashmflag" && dashmflag=-M 60469ef5f27Smrg # Require at least two characters before searching for ':' 605d1333322Smrg # in the target name. This is to cope with DOS-style filenames: 60669ef5f27Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 607d1333322Smrg "$@" $dashmflag | 60869ef5f27Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 609d1333322Smrg rm -f "$depfile" 610d1333322Smrg cat < "$tmpdepfile" > "$depfile" 61169ef5f27Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 61269ef5f27Smrg # correctly. Breaking it into two sed invocations is a workaround. 61369ef5f27Smrg tr ' ' "$nl" < "$tmpdepfile" \ 61469ef5f27Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 61569ef5f27Smrg | sed -e 's/$/ :/' >> "$depfile" 616d1333322Smrg rm -f "$tmpdepfile" 617d1333322Smrg ;; 618d1333322Smrg 619d1333322SmrgdashXmstdout) 620d1333322Smrg # This case only exists to satisfy depend.m4. It is never actually 621d1333322Smrg # run, as this mode is specially recognized in the preamble. 622d1333322Smrg exit 1 623d1333322Smrg ;; 624d1333322Smrg 625d1333322Smrgmakedepend) 626d1333322Smrg "$@" || exit $? 627d1333322Smrg # Remove any Libtool call 628d1333322Smrg if test "$libtool" = yes; then 6294f9ac78aSmrg while test "X$1" != 'X--mode=compile'; do 630d1333322Smrg shift 631d1333322Smrg done 632d1333322Smrg shift 633d1333322Smrg fi 634d1333322Smrg # X makedepend 635d1333322Smrg shift 6364f9ac78aSmrg cleared=no eat=no 6374f9ac78aSmrg for arg 6384f9ac78aSmrg do 639d1333322Smrg case $cleared in 640d1333322Smrg no) 641d1333322Smrg set ""; shift 642d1333322Smrg cleared=yes ;; 643d1333322Smrg esac 6444f9ac78aSmrg if test $eat = yes; then 6454f9ac78aSmrg eat=no 6464f9ac78aSmrg continue 6474f9ac78aSmrg fi 648d1333322Smrg case "$arg" in 649d1333322Smrg -D*|-I*) 650d1333322Smrg set fnord "$@" "$arg"; shift ;; 651d1333322Smrg # Strip any option that makedepend may not understand. Remove 652d1333322Smrg # the object too, otherwise makedepend will parse it as a source file. 6534f9ac78aSmrg -arch) 6544f9ac78aSmrg eat=yes ;; 655d1333322Smrg -*|$object) 656d1333322Smrg ;; 657d1333322Smrg *) 658d1333322Smrg set fnord "$@" "$arg"; shift ;; 659d1333322Smrg esac 660d1333322Smrg done 6614f9ac78aSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 662d1333322Smrg touch "$tmpdepfile" 663d1333322Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 664d1333322Smrg rm -f "$depfile" 665c27291ebSmrg # makedepend may prepend the VPATH from the source file name to the object. 666c27291ebSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 667c27291ebSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 66869ef5f27Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 66969ef5f27Smrg # correctly. Breaking it into two sed invocations is a workaround. 67069ef5f27Smrg sed '1,2d' "$tmpdepfile" \ 67169ef5f27Smrg | tr ' ' "$nl" \ 67269ef5f27Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 67369ef5f27Smrg | sed -e 's/$/ :/' >> "$depfile" 674d1333322Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 675d1333322Smrg ;; 676d1333322Smrg 677d1333322Smrgcpp) 678d1333322Smrg # Important note: in order to support this mode, a compiler *must* 679d1333322Smrg # always write the preprocessed file to stdout. 680d1333322Smrg "$@" || exit $? 681d1333322Smrg 682d1333322Smrg # Remove the call to Libtool. 683d1333322Smrg if test "$libtool" = yes; then 6844f9ac78aSmrg while test "X$1" != 'X--mode=compile'; do 685d1333322Smrg shift 686d1333322Smrg done 687d1333322Smrg shift 688d1333322Smrg fi 689d1333322Smrg 69069ef5f27Smrg # Remove '-o $object'. 691d1333322Smrg IFS=" " 692d1333322Smrg for arg 693d1333322Smrg do 694d1333322Smrg case $arg in 695d1333322Smrg -o) 696d1333322Smrg shift 697d1333322Smrg ;; 698d1333322Smrg $object) 699d1333322Smrg shift 700d1333322Smrg ;; 701d1333322Smrg *) 702d1333322Smrg set fnord "$@" "$arg" 703d1333322Smrg shift # fnord 704d1333322Smrg shift # $arg 705d1333322Smrg ;; 706d1333322Smrg esac 707d1333322Smrg done 708d1333322Smrg 70969ef5f27Smrg "$@" -E \ 71069ef5f27Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71169ef5f27Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71269ef5f27Smrg | sed '$ s: \\$::' > "$tmpdepfile" 713d1333322Smrg rm -f "$depfile" 714d1333322Smrg echo "$object : \\" > "$depfile" 715d1333322Smrg cat < "$tmpdepfile" >> "$depfile" 716d1333322Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 717d1333322Smrg rm -f "$tmpdepfile" 718d1333322Smrg ;; 719d1333322Smrg 720d1333322Smrgmsvisualcpp) 721d1333322Smrg # Important note: in order to support this mode, a compiler *must* 7224f9ac78aSmrg # always write the preprocessed file to stdout. 723d1333322Smrg "$@" || exit $? 7244f9ac78aSmrg 7254f9ac78aSmrg # Remove the call to Libtool. 7264f9ac78aSmrg if test "$libtool" = yes; then 7274f9ac78aSmrg while test "X$1" != 'X--mode=compile'; do 7284f9ac78aSmrg shift 7294f9ac78aSmrg done 7304f9ac78aSmrg shift 7314f9ac78aSmrg fi 7324f9ac78aSmrg 733d1333322Smrg IFS=" " 734d1333322Smrg for arg 735d1333322Smrg do 736d1333322Smrg case "$arg" in 7374f9ac78aSmrg -o) 7384f9ac78aSmrg shift 7394f9ac78aSmrg ;; 7404f9ac78aSmrg $object) 7414f9ac78aSmrg shift 7424f9ac78aSmrg ;; 743d1333322Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 74469ef5f27Smrg set fnord "$@" 74569ef5f27Smrg shift 74669ef5f27Smrg shift 74769ef5f27Smrg ;; 748d1333322Smrg *) 74969ef5f27Smrg set fnord "$@" "$arg" 75069ef5f27Smrg shift 75169ef5f27Smrg shift 75269ef5f27Smrg ;; 753d1333322Smrg esac 754d1333322Smrg done 7554f9ac78aSmrg "$@" -E 2>/dev/null | 7564f9ac78aSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 757d1333322Smrg rm -f "$depfile" 758d1333322Smrg echo "$object : \\" > "$depfile" 75969ef5f27Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 76069ef5f27Smrg echo "$tab" >> "$depfile" 7614f9ac78aSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 762d1333322Smrg rm -f "$tmpdepfile" 763d1333322Smrg ;; 764d1333322Smrg 7654f9ac78aSmrgmsvcmsys) 7664f9ac78aSmrg # This case exists only to let depend.m4 do its work. It works by 7674f9ac78aSmrg # looking at the text of this script. This case will never be run, 7684f9ac78aSmrg # since it is checked for above. 7694f9ac78aSmrg exit 1 7704f9ac78aSmrg ;; 7714f9ac78aSmrg 772d1333322Smrgnone) 773d1333322Smrg exec "$@" 774d1333322Smrg ;; 775d1333322Smrg 776d1333322Smrg*) 777d1333322Smrg echo "Unknown depmode $depmode" 1>&2 778d1333322Smrg exit 1 779d1333322Smrg ;; 780d1333322Smrgesac 781d1333322Smrg 782d1333322Smrgexit 0 783d1333322Smrg 784d1333322Smrg# Local Variables: 785d1333322Smrg# mode: shell-script 786d1333322Smrg# sh-indentation: 2 787d04472e1Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 788d1333322Smrg# time-stamp-start: "scriptversion=" 789d1333322Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 790d04472e1Smrg# time-stamp-time-zone: "UTC0" 7914f9ac78aSmrg# time-stamp-end: "; # UTC" 792d1333322Smrg# End: 793