1d1e97bf2SAndrey Kiselev#! /bin/sh 2d1e97bf2SAndrey Kiselev# depcomp - compile a program generating dependencies as side-effects 3d1e97bf2SAndrey Kiselev 4d1be5cb7SEven Rouaultscriptversion=2013-05-30.07; # UTC 5d1e97bf2SAndrey Kiselev 6*a17a6e5eSEven Rouault# Copyright (C) 1999-2014 Free Software Foundation, Inc. 7d1e97bf2SAndrey Kiselev 8d1e97bf2SAndrey Kiselev# This program is free software; you can redistribute it and/or modify 9d1e97bf2SAndrey Kiselev# it under the terms of the GNU General Public License as published by 10d1e97bf2SAndrey Kiselev# the Free Software Foundation; either version 2, or (at your option) 11d1e97bf2SAndrey Kiselev# any later version. 12d1e97bf2SAndrey Kiselev 13d1e97bf2SAndrey Kiselev# This program is distributed in the hope that it will be useful, 14d1e97bf2SAndrey Kiselev# but WITHOUT ANY WARRANTY; without even the implied warranty of 15d1e97bf2SAndrey Kiselev# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16d1e97bf2SAndrey Kiselev# GNU General Public License for more details. 17d1e97bf2SAndrey Kiselev 18d1e97bf2SAndrey Kiselev# You should have received a copy of the GNU General Public License 19d1be5cb7SEven Rouault# along with this program. If not, see <http://www.gnu.org/licenses/>. 20d1e97bf2SAndrey Kiselev 21d1e97bf2SAndrey Kiselev# As a special exception to the GNU General Public License, if you 22d1e97bf2SAndrey Kiselev# distribute this file as part of a program that contains a 23d1e97bf2SAndrey Kiselev# configuration script generated by Autoconf, you may include it under 24d1e97bf2SAndrey Kiselev# the same distribution terms that you use for the rest of that program. 25d1e97bf2SAndrey Kiselev 26d1e97bf2SAndrey Kiselev# Originally written by Alexandre Oliva <[email protected]>. 27d1e97bf2SAndrey Kiselev 28d1e97bf2SAndrey Kiselevcase $1 in 29d1e97bf2SAndrey Kiselev '') 30d1be5cb7SEven Rouault echo "$0: No command. Try '$0 --help' for more information." 1>&2 31d1e97bf2SAndrey Kiselev exit 1; 32d1e97bf2SAndrey Kiselev ;; 33d1e97bf2SAndrey Kiselev -h | --h*) 34d1e97bf2SAndrey Kiselev cat <<\EOF 35d1e97bf2SAndrey KiselevUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36d1e97bf2SAndrey Kiselev 37d1e97bf2SAndrey KiselevRun PROGRAMS ARGS to compile a file, generating dependencies 38d1e97bf2SAndrey Kiselevas side-effects. 39d1e97bf2SAndrey Kiselev 40d1e97bf2SAndrey KiselevEnvironment variables: 41d1e97bf2SAndrey Kiselev depmode Dependency tracking mode. 42d1be5cb7SEven Rouault source Source file read by 'PROGRAMS ARGS'. 43d1be5cb7SEven Rouault object Object file output by 'PROGRAMS ARGS'. 44f714980aSAndrey Kiselev DEPDIR directory where to store dependencies. 45d1e97bf2SAndrey Kiselev depfile Dependency file to output. 46d1be5cb7SEven Rouault tmpdepfile Temporary file to use when outputting dependencies. 47d1e97bf2SAndrey Kiselev libtool Whether libtool is used (yes/no). 48d1e97bf2SAndrey Kiselev 49d1e97bf2SAndrey KiselevReport bugs to <bug-automake@gnu.org>. 50d1e97bf2SAndrey KiselevEOF 51f714980aSAndrey Kiselev exit $? 52d1e97bf2SAndrey Kiselev ;; 53d1e97bf2SAndrey Kiselev -v | --v*) 54d1e97bf2SAndrey Kiselev echo "depcomp $scriptversion" 55f714980aSAndrey Kiselev exit $? 56d1e97bf2SAndrey Kiselev ;; 57d1e97bf2SAndrey Kiselevesac 58d1e97bf2SAndrey Kiselev 59d1be5cb7SEven Rouault# Get the directory component of the given path, and save it in the 60d1be5cb7SEven Rouault# global variables '$dir'. Note that this directory component will 61d1be5cb7SEven Rouault# be either empty or ending with a '/' character. This is deliberate. 62d1be5cb7SEven Rouaultset_dir_from () 63d1be5cb7SEven Rouault{ 64d1be5cb7SEven Rouault case $1 in 65d1be5cb7SEven Rouault */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66d1be5cb7SEven Rouault *) dir=;; 67d1be5cb7SEven Rouault esac 68d1be5cb7SEven Rouault} 69d1be5cb7SEven Rouault 70d1be5cb7SEven Rouault# Get the suffix-stripped basename of the given path, and save it the 71d1be5cb7SEven Rouault# global variable '$base'. 72d1be5cb7SEven Rouaultset_base_from () 73d1be5cb7SEven Rouault{ 74d1be5cb7SEven Rouault base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75d1be5cb7SEven Rouault} 76d1be5cb7SEven Rouault 77d1be5cb7SEven Rouault# If no dependency file was actually created by the compiler invocation, 78d1be5cb7SEven Rouault# we still have to create a dummy depfile, to avoid errors with the 79d1be5cb7SEven Rouault# Makefile "include basename.Plo" scheme. 80d1be5cb7SEven Rouaultmake_dummy_depfile () 81d1be5cb7SEven Rouault{ 82d1be5cb7SEven Rouault echo "#dummy" > "$depfile" 83d1be5cb7SEven Rouault} 84d1be5cb7SEven Rouault 85d1be5cb7SEven Rouault# Factor out some common post-processing of the generated depfile. 86d1be5cb7SEven Rouault# Requires the auxiliary global variable '$tmpdepfile' to be set. 87d1be5cb7SEven Rouaultaix_post_process_depfile () 88d1be5cb7SEven Rouault{ 89d1be5cb7SEven Rouault # If the compiler actually managed to produce a dependency file, 90d1be5cb7SEven Rouault # post-process it. 91d1be5cb7SEven Rouault if test -f "$tmpdepfile"; then 92d1be5cb7SEven Rouault # Each line is of the form 'foo.o: dependency.h'. 93d1be5cb7SEven Rouault # Do two passes, one to just change these to 94d1be5cb7SEven Rouault # $object: dependency.h 95d1be5cb7SEven Rouault # and one to simply output 96d1be5cb7SEven Rouault # dependency.h: 97d1be5cb7SEven Rouault # which is needed to avoid the deleted-header problem. 98d1be5cb7SEven Rouault { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99d1be5cb7SEven Rouault sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100d1be5cb7SEven Rouault } > "$depfile" 101d1be5cb7SEven Rouault rm -f "$tmpdepfile" 102d1be5cb7SEven Rouault else 103d1be5cb7SEven Rouault make_dummy_depfile 104d1be5cb7SEven Rouault fi 105d1be5cb7SEven Rouault} 106d1be5cb7SEven Rouault 107d1be5cb7SEven Rouault# A tabulation character. 108d1be5cb7SEven Rouaulttab=' ' 109d1be5cb7SEven Rouault# A newline character. 110d1be5cb7SEven Rouaultnl=' 111d1be5cb7SEven Rouault' 112d1be5cb7SEven Rouault# Character ranges might be problematic outside the C locale. 113d1be5cb7SEven Rouault# These definitions help. 114d1be5cb7SEven Rouaultupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115d1be5cb7SEven Rouaultlower=abcdefghijklmnopqrstuvwxyz 116d1be5cb7SEven Rouaultdigits=0123456789 117d1be5cb7SEven Rouaultalpha=${upper}${lower} 118d1be5cb7SEven Rouault 119d1e97bf2SAndrey Kiselevif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120d1e97bf2SAndrey Kiselev echo "depcomp: Variables source, object and depmode must be set" 1>&2 121d1e97bf2SAndrey Kiselev exit 1 122d1e97bf2SAndrey Kiselevfi 123d1e97bf2SAndrey Kiselev 124f714980aSAndrey Kiselev# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125f714980aSAndrey Kiselevdepfile=${depfile-`echo "$object" | 126f714980aSAndrey Kiselev sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127d1e97bf2SAndrey Kiselevtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128d1e97bf2SAndrey Kiselev 129d1e97bf2SAndrey Kiselevrm -f "$tmpdepfile" 130d1e97bf2SAndrey Kiselev 131d1be5cb7SEven Rouault# Avoid interferences from the environment. 132d1be5cb7SEven Rouaultgccflag= dashmflag= 133d1be5cb7SEven Rouault 134d1e97bf2SAndrey Kiselev# Some modes work just like other modes, but use different flags. We 135d1e97bf2SAndrey Kiselev# parameterize here, but still list the modes in the big case below, 136d1e97bf2SAndrey Kiselev# to make depend.m4 easier to write. Note that we *cannot* use a case 137d1e97bf2SAndrey Kiselev# here, because this file can only contain one case statement. 138d1e97bf2SAndrey Kiselevif test "$depmode" = hp; then 139d1e97bf2SAndrey Kiselev # HP compiler uses -M and no extra arg. 140d1e97bf2SAndrey Kiselev gccflag=-M 141d1e97bf2SAndrey Kiselev depmode=gcc 142d1e97bf2SAndrey Kiselevfi 143d1e97bf2SAndrey Kiselev 144d1e97bf2SAndrey Kiselevif test "$depmode" = dashXmstdout; then 145d1e97bf2SAndrey Kiselev # This is just like dashmstdout with a different argument. 146d1e97bf2SAndrey Kiselev dashmflag=-xM 147d1e97bf2SAndrey Kiselev depmode=dashmstdout 148d1e97bf2SAndrey Kiselevfi 149d1e97bf2SAndrey Kiselev 150d1be5cb7SEven Rouaultcygpath_u="cygpath -u -f -" 151d1be5cb7SEven Rouaultif test "$depmode" = msvcmsys; then 152d1be5cb7SEven Rouault # This is just like msvisualcpp but w/o cygpath translation. 153d1be5cb7SEven Rouault # Just convert the backslash-escaped backslashes to single forward 154d1be5cb7SEven Rouault # slashes to satisfy depend.m4 155d1be5cb7SEven Rouault cygpath_u='sed s,\\\\,/,g' 156d1be5cb7SEven Rouault depmode=msvisualcpp 157d1be5cb7SEven Rouaultfi 158d1be5cb7SEven Rouault 159d1be5cb7SEven Rouaultif test "$depmode" = msvc7msys; then 160d1be5cb7SEven Rouault # This is just like msvc7 but w/o cygpath translation. 161d1be5cb7SEven Rouault # Just convert the backslash-escaped backslashes to single forward 162d1be5cb7SEven Rouault # slashes to satisfy depend.m4 163d1be5cb7SEven Rouault cygpath_u='sed s,\\\\,/,g' 164d1be5cb7SEven Rouault depmode=msvc7 165d1be5cb7SEven Rouaultfi 166d1be5cb7SEven Rouault 167d1be5cb7SEven Rouaultif test "$depmode" = xlc; then 168d1be5cb7SEven Rouault # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169d1be5cb7SEven Rouault gccflag=-qmakedep=gcc,-MF 170d1be5cb7SEven Rouault depmode=gcc 171d1be5cb7SEven Rouaultfi 172d1be5cb7SEven Rouault 173d1e97bf2SAndrey Kiselevcase "$depmode" in 174d1e97bf2SAndrey Kiselevgcc3) 175d1e97bf2SAndrey Kiselev## gcc 3 implements dependency tracking that does exactly what 176d1e97bf2SAndrey Kiselev## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177d1e97bf2SAndrey Kiselev## it if -MD -MP comes after the -MF stuff. Hmm. 17871b78038SBob Friesenhahn## Unfortunately, FreeBSD c89 acceptance of flags depends upon 17971b78038SBob Friesenhahn## the command line argument order; so add the flags where they 18071b78038SBob Friesenhahn## appear in depend2.am. Note that the slowdown incurred here 18171b78038SBob Friesenhahn## affects only configure: in makefiles, %FASTDEP% shortcuts this. 18271b78038SBob Friesenhahn for arg 18371b78038SBob Friesenhahn do 18471b78038SBob Friesenhahn case $arg in 18571b78038SBob Friesenhahn -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 18671b78038SBob Friesenhahn *) set fnord "$@" "$arg" ;; 18771b78038SBob Friesenhahn esac 18871b78038SBob Friesenhahn shift # fnord 18971b78038SBob Friesenhahn shift # $arg 19071b78038SBob Friesenhahn done 19171b78038SBob Friesenhahn "$@" 192d1e97bf2SAndrey Kiselev stat=$? 193d1be5cb7SEven Rouault if test $stat -ne 0; then 194d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 195d1e97bf2SAndrey Kiselev exit $stat 196d1e97bf2SAndrey Kiselev fi 197d1e97bf2SAndrey Kiselev mv "$tmpdepfile" "$depfile" 198d1e97bf2SAndrey Kiselev ;; 199d1e97bf2SAndrey Kiselev 200d1e97bf2SAndrey Kiselevgcc) 201d1be5cb7SEven Rouault## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202d1be5cb7SEven Rouault## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203d1be5cb7SEven Rouault## (see the conditional assignment to $gccflag above). 204d1e97bf2SAndrey Kiselev## There are various ways to get dependency output from gcc. Here's 205d1e97bf2SAndrey Kiselev## why we pick this rather obscure method: 206d1e97bf2SAndrey Kiselev## - Don't want to use -MD because we'd like the dependencies to end 207d1e97bf2SAndrey Kiselev## up in a subdir. Having to rename by hand is ugly. 208d1e97bf2SAndrey Kiselev## (We might end up doing this anyway to support other compilers.) 209d1e97bf2SAndrey Kiselev## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210d1be5cb7SEven Rouault## -MM, not -M (despite what the docs say). Also, it might not be 211d1be5cb7SEven Rouault## supported by the other compilers which use the 'gcc' depmode. 212d1e97bf2SAndrey Kiselev## - Using -M directly means running the compiler twice (even worse 213d1e97bf2SAndrey Kiselev## than renaming). 214d1e97bf2SAndrey Kiselev if test -z "$gccflag"; then 215d1e97bf2SAndrey Kiselev gccflag=-MD, 216d1e97bf2SAndrey Kiselev fi 217d1e97bf2SAndrey Kiselev "$@" -Wp,"$gccflag$tmpdepfile" 218d1e97bf2SAndrey Kiselev stat=$? 219d1be5cb7SEven Rouault if test $stat -ne 0; then 220d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 221d1e97bf2SAndrey Kiselev exit $stat 222d1e97bf2SAndrey Kiselev fi 223d1e97bf2SAndrey Kiselev rm -f "$depfile" 224d1e97bf2SAndrey Kiselev echo "$object : \\" > "$depfile" 225d1be5cb7SEven Rouault # The second -e expression handles DOS-style file names with drive 226d1be5cb7SEven Rouault # letters. 227d1e97bf2SAndrey Kiselev sed -e 's/^[^:]*: / /' \ 228d1e97bf2SAndrey Kiselev -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229d1be5cb7SEven Rouault## This next piece of magic avoids the "deleted header file" problem. 230d1e97bf2SAndrey Kiselev## The problem is that when a header file which appears in a .P file 231d1e97bf2SAndrey Kiselev## is deleted, the dependency causes make to die (because there is 232d1e97bf2SAndrey Kiselev## typically no way to rebuild the header). We avoid this by adding 233d1e97bf2SAndrey Kiselev## dummy dependencies for each header file. Too bad gcc doesn't do 234d1e97bf2SAndrey Kiselev## this for us directly. 235d1be5cb7SEven Rouault## Some versions of gcc put a space before the ':'. On the theory 236d1e97bf2SAndrey Kiselev## that the space means something, we add a space to the output as 237d1be5cb7SEven Rouault## well. hp depmode also adds that space, but also prefixes the VPATH 238d1be5cb7SEven Rouault## to the object. Take care to not repeat it in the output. 239d1e97bf2SAndrey Kiselev## Some versions of the HPUX 10.20 sed can't process this invocation 240d1e97bf2SAndrey Kiselev## correctly. Breaking it into two sed invocations is a workaround. 241d1be5cb7SEven Rouault tr ' ' "$nl" < "$tmpdepfile" \ 242d1be5cb7SEven Rouault | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243d1be5cb7SEven Rouault | sed -e 's/$/ :/' >> "$depfile" 244d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 245d1e97bf2SAndrey Kiselev ;; 246d1e97bf2SAndrey Kiselev 247d1e97bf2SAndrey Kiselevhp) 248d1e97bf2SAndrey Kiselev # This case exists only to let depend.m4 do its work. It works by 249d1e97bf2SAndrey Kiselev # looking at the text of this script. This case will never be run, 250d1e97bf2SAndrey Kiselev # since it is checked for above. 251d1e97bf2SAndrey Kiselev exit 1 252d1e97bf2SAndrey Kiselev ;; 253d1e97bf2SAndrey Kiselev 254d1e97bf2SAndrey Kiselevsgi) 255d1e97bf2SAndrey Kiselev if test "$libtool" = yes; then 256d1e97bf2SAndrey Kiselev "$@" "-Wp,-MDupdate,$tmpdepfile" 257d1e97bf2SAndrey Kiselev else 258d1e97bf2SAndrey Kiselev "$@" -MDupdate "$tmpdepfile" 259d1e97bf2SAndrey Kiselev fi 260d1e97bf2SAndrey Kiselev stat=$? 261d1be5cb7SEven Rouault if test $stat -ne 0; then 262d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 263d1e97bf2SAndrey Kiselev exit $stat 264d1e97bf2SAndrey Kiselev fi 265d1e97bf2SAndrey Kiselev rm -f "$depfile" 266d1e97bf2SAndrey Kiselev 267d1e97bf2SAndrey Kiselev if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268d1e97bf2SAndrey Kiselev echo "$object : \\" > "$depfile" 269d1e97bf2SAndrey Kiselev # Clip off the initial element (the dependent). Don't try to be 270d1e97bf2SAndrey Kiselev # clever and replace this with sed code, as IRIX sed won't handle 271d1e97bf2SAndrey Kiselev # lines with more than a fixed number of characters (4096 in 272d1e97bf2SAndrey Kiselev # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273d1be5cb7SEven Rouault # the IRIX cc adds comments like '#:fec' to the end of the 274d1e97bf2SAndrey Kiselev # dependency line. 275d1be5cb7SEven Rouault tr ' ' "$nl" < "$tmpdepfile" \ 276d1be5cb7SEven Rouault | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277d1be5cb7SEven Rouault | tr "$nl" ' ' >> "$depfile" 278d1be5cb7SEven Rouault echo >> "$depfile" 279d1e97bf2SAndrey Kiselev # The second pass generates a dummy entry for each header file. 280d1be5cb7SEven Rouault tr ' ' "$nl" < "$tmpdepfile" \ 281d1e97bf2SAndrey Kiselev | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282d1be5cb7SEven Rouault >> "$depfile" 283d1e97bf2SAndrey Kiselev else 284d1be5cb7SEven Rouault make_dummy_depfile 285d1e97bf2SAndrey Kiselev fi 286d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 287d1e97bf2SAndrey Kiselev ;; 288d1e97bf2SAndrey Kiselev 289d1be5cb7SEven Rouaultxlc) 290d1be5cb7SEven Rouault # This case exists only to let depend.m4 do its work. It works by 291d1be5cb7SEven Rouault # looking at the text of this script. This case will never be run, 292d1be5cb7SEven Rouault # since it is checked for above. 293d1be5cb7SEven Rouault exit 1 294d1be5cb7SEven Rouault ;; 295d1be5cb7SEven Rouault 296d1e97bf2SAndrey Kiselevaix) 297d1e97bf2SAndrey Kiselev # The C for AIX Compiler uses -M and outputs the dependencies 298d1e97bf2SAndrey Kiselev # in a .u file. In older versions, this file always lives in the 299d1be5cb7SEven Rouault # current directory. Also, the AIX compiler puts '$object:' at the 300d1e97bf2SAndrey Kiselev # start of each line; $object doesn't have directory information. 301d1e97bf2SAndrey Kiselev # Version 6 uses the directory in both cases. 302d1be5cb7SEven Rouault set_dir_from "$object" 303d1be5cb7SEven Rouault set_base_from "$object" 304d1e97bf2SAndrey Kiselev if test "$libtool" = yes; then 305d1be5cb7SEven Rouault tmpdepfile1=$dir$base.u 306d1be5cb7SEven Rouault tmpdepfile2=$base.u 307d1be5cb7SEven Rouault tmpdepfile3=$dir.libs/$base.u 308d1e97bf2SAndrey Kiselev "$@" -Wc,-M 309d1e97bf2SAndrey Kiselev else 310d1be5cb7SEven Rouault tmpdepfile1=$dir$base.u 311d1be5cb7SEven Rouault tmpdepfile2=$dir$base.u 312d1be5cb7SEven Rouault tmpdepfile3=$dir$base.u 313d1e97bf2SAndrey Kiselev "$@" -M 314d1e97bf2SAndrey Kiselev fi 315d1e97bf2SAndrey Kiselev stat=$? 316d1be5cb7SEven Rouault if test $stat -ne 0; then 317d1be5cb7SEven Rouault rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318d1e97bf2SAndrey Kiselev exit $stat 319d1e97bf2SAndrey Kiselev fi 320d1e97bf2SAndrey Kiselev 321d1be5cb7SEven Rouault for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322d1be5cb7SEven Rouault do 323d1be5cb7SEven Rouault test -f "$tmpdepfile" && break 324d1be5cb7SEven Rouault done 325d1be5cb7SEven Rouault aix_post_process_depfile 326d1be5cb7SEven Rouault ;; 327d1be5cb7SEven Rouault 328d1be5cb7SEven Rouaulttcc) 329d1be5cb7SEven Rouault # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330d1be5cb7SEven Rouault # FIXME: That version still under development at the moment of writing. 331d1be5cb7SEven Rouault # Make that this statement remains true also for stable, released 332d1be5cb7SEven Rouault # versions. 333d1be5cb7SEven Rouault # It will wrap lines (doesn't matter whether long or short) with a 334d1be5cb7SEven Rouault # trailing '\', as in: 335d1be5cb7SEven Rouault # 336d1be5cb7SEven Rouault # foo.o : \ 337d1be5cb7SEven Rouault # foo.c \ 338d1be5cb7SEven Rouault # foo.h \ 339d1be5cb7SEven Rouault # 340d1be5cb7SEven Rouault # It will put a trailing '\' even on the last line, and will use leading 341d1be5cb7SEven Rouault # spaces rather than leading tabs (at least since its commit 0394caf7 342d1be5cb7SEven Rouault # "Emit spaces for -MD"). 343d1be5cb7SEven Rouault "$@" -MD -MF "$tmpdepfile" 344d1be5cb7SEven Rouault stat=$? 345d1be5cb7SEven Rouault if test $stat -ne 0; then 346d1be5cb7SEven Rouault rm -f "$tmpdepfile" 347d1be5cb7SEven Rouault exit $stat 348d1e97bf2SAndrey Kiselev fi 349d1be5cb7SEven Rouault rm -f "$depfile" 350d1be5cb7SEven Rouault # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351d1be5cb7SEven Rouault # We have to change lines of the first kind to '$object: \'. 352d1be5cb7SEven Rouault sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353d1be5cb7SEven Rouault # And for each line of the second kind, we have to emit a 'dep.h:' 354d1be5cb7SEven Rouault # dummy dependency, to avoid the deleted-header problem. 355d1be5cb7SEven Rouault sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 357d1e97bf2SAndrey Kiselev ;; 358d1e97bf2SAndrey Kiselev 359d1be5cb7SEven Rouault## The order of this option in the case statement is important, since the 360d1be5cb7SEven Rouault## shell code in configure will try each of these formats in the order 361d1be5cb7SEven Rouault## listed in this file. A plain '-MD' option would be understood by many 362d1be5cb7SEven Rouault## compilers, so we must ensure this comes after the gcc and icc options. 363d1be5cb7SEven Rouaultpgcc) 364d1be5cb7SEven Rouault # Portland's C compiler understands '-MD'. 365d1be5cb7SEven Rouault # Will always output deps to 'file.d' where file is the root name of the 366d1be5cb7SEven Rouault # source file under compilation, even if file resides in a subdirectory. 367d1be5cb7SEven Rouault # The object file name does not affect the name of the '.d' file. 368d1be5cb7SEven Rouault # pgcc 10.2 will output 369d1e97bf2SAndrey Kiselev # foo.o: sub/foo.c sub/foo.h 370d1be5cb7SEven Rouault # and will wrap long lines using '\' : 371d1e97bf2SAndrey Kiselev # foo.o: sub/foo.c ... \ 372d1e97bf2SAndrey Kiselev # sub/foo.h ... \ 373d1e97bf2SAndrey Kiselev # ... 374d1be5cb7SEven Rouault set_dir_from "$object" 375d1be5cb7SEven Rouault # Use the source, not the object, to determine the base name, since 376d1be5cb7SEven Rouault # that's sadly what pgcc will do too. 377d1be5cb7SEven Rouault set_base_from "$source" 378d1be5cb7SEven Rouault tmpdepfile=$base.d 379d1e97bf2SAndrey Kiselev 380d1be5cb7SEven Rouault # For projects that build the same source file twice into different object 381d1be5cb7SEven Rouault # files, the pgcc approach of using the *source* file root name can cause 382d1be5cb7SEven Rouault # problems in parallel builds. Use a locking strategy to avoid stomping on 383d1be5cb7SEven Rouault # the same $tmpdepfile. 384d1be5cb7SEven Rouault lockdir=$base.d-lock 385d1be5cb7SEven Rouault trap " 386d1be5cb7SEven Rouault echo '$0: caught signal, cleaning up...' >&2 387d1be5cb7SEven Rouault rmdir '$lockdir' 388d1be5cb7SEven Rouault exit 1 389d1be5cb7SEven Rouault " 1 2 13 15 390d1be5cb7SEven Rouault numtries=100 391d1be5cb7SEven Rouault i=$numtries 392d1be5cb7SEven Rouault while test $i -gt 0; do 393d1be5cb7SEven Rouault # mkdir is a portable test-and-set. 394d1be5cb7SEven Rouault if mkdir "$lockdir" 2>/dev/null; then 395d1be5cb7SEven Rouault # This process acquired the lock. 396d1be5cb7SEven Rouault "$@" -MD 397d1e97bf2SAndrey Kiselev stat=$? 398d1be5cb7SEven Rouault # Release the lock. 399d1be5cb7SEven Rouault rmdir "$lockdir" 400d1be5cb7SEven Rouault break 401d1e97bf2SAndrey Kiselev else 402d1be5cb7SEven Rouault # If the lock is being held by a different process, wait 403d1be5cb7SEven Rouault # until the winning process is done or we timeout. 404d1be5cb7SEven Rouault while test -d "$lockdir" && test $i -gt 0; do 405d1be5cb7SEven Rouault sleep 1 406d1be5cb7SEven Rouault i=`expr $i - 1` 407d1be5cb7SEven Rouault done 408d1be5cb7SEven Rouault fi 409d1be5cb7SEven Rouault i=`expr $i - 1` 410d1be5cb7SEven Rouault done 411d1be5cb7SEven Rouault trap - 1 2 13 15 412d1be5cb7SEven Rouault if test $i -le 0; then 413d1be5cb7SEven Rouault echo "$0: failed to acquire lock after $numtries attempts" >&2 414d1be5cb7SEven Rouault echo "$0: check lockdir '$lockdir'" >&2 415d1be5cb7SEven Rouault exit 1 416d1be5cb7SEven Rouault fi 417d1be5cb7SEven Rouault 418d1be5cb7SEven Rouault if test $stat -ne 0; then 419d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 420d1e97bf2SAndrey Kiselev exit $stat 421d1e97bf2SAndrey Kiselev fi 422d1e97bf2SAndrey Kiselev rm -f "$depfile" 423d1e97bf2SAndrey Kiselev # Each line is of the form `foo.o: dependent.h', 424d1e97bf2SAndrey Kiselev # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425d1e97bf2SAndrey Kiselev # Do two passes, one to just change these to 426d1e97bf2SAndrey Kiselev # `$object: dependent.h' and one to simply `dependent.h:'. 427d1e97bf2SAndrey Kiselev sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428d1e97bf2SAndrey Kiselev # Some versions of the HPUX 10.20 sed can't process this invocation 429d1e97bf2SAndrey Kiselev # correctly. Breaking it into two sed invocations is a workaround. 430d1be5cb7SEven Rouault sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431d1be5cb7SEven Rouault | sed -e 's/$/ :/' >> "$depfile" 432d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 433d1e97bf2SAndrey Kiselev ;; 434d1e97bf2SAndrey Kiselev 43571b78038SBob Friesenhahnhp2) 43671b78038SBob Friesenhahn # The "hp" stanza above does not work with aCC (C++) and HP's ia64 43771b78038SBob Friesenhahn # compilers, which have integrated preprocessors. The correct option 43871b78038SBob Friesenhahn # to use with these is +Maked; it writes dependencies to a file named 43971b78038SBob Friesenhahn # 'foo.d', which lands next to the object file, wherever that 44071b78038SBob Friesenhahn # happens to be. 44171b78038SBob Friesenhahn # Much of this is similar to the tru64 case; see comments there. 442d1be5cb7SEven Rouault set_dir_from "$object" 443d1be5cb7SEven Rouault set_base_from "$object" 44471b78038SBob Friesenhahn if test "$libtool" = yes; then 44571b78038SBob Friesenhahn tmpdepfile1=$dir$base.d 44671b78038SBob Friesenhahn tmpdepfile2=$dir.libs/$base.d 44771b78038SBob Friesenhahn "$@" -Wc,+Maked 44871b78038SBob Friesenhahn else 44971b78038SBob Friesenhahn tmpdepfile1=$dir$base.d 45071b78038SBob Friesenhahn tmpdepfile2=$dir$base.d 45171b78038SBob Friesenhahn "$@" +Maked 45271b78038SBob Friesenhahn fi 45371b78038SBob Friesenhahn stat=$? 454d1be5cb7SEven Rouault if test $stat -ne 0; then 45571b78038SBob Friesenhahn rm -f "$tmpdepfile1" "$tmpdepfile2" 45671b78038SBob Friesenhahn exit $stat 45771b78038SBob Friesenhahn fi 45871b78038SBob Friesenhahn 45971b78038SBob Friesenhahn for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 46071b78038SBob Friesenhahn do 46171b78038SBob Friesenhahn test -f "$tmpdepfile" && break 46271b78038SBob Friesenhahn done 46371b78038SBob Friesenhahn if test -f "$tmpdepfile"; then 464d1be5cb7SEven Rouault sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465d1be5cb7SEven Rouault # Add 'dependent.h:' lines. 466d1be5cb7SEven Rouault sed -ne '2,${ 467d1be5cb7SEven Rouault s/^ *// 468d1be5cb7SEven Rouault s/ \\*$// 469d1be5cb7SEven Rouault s/$/:/ 470d1be5cb7SEven Rouault p 471d1be5cb7SEven Rouault }' "$tmpdepfile" >> "$depfile" 47271b78038SBob Friesenhahn else 473d1be5cb7SEven Rouault make_dummy_depfile 47471b78038SBob Friesenhahn fi 47571b78038SBob Friesenhahn rm -f "$tmpdepfile" "$tmpdepfile2" 47671b78038SBob Friesenhahn ;; 47771b78038SBob Friesenhahn 478d1e97bf2SAndrey Kiselevtru64) 479d1e97bf2SAndrey Kiselev # The Tru64 compiler uses -MD to generate dependencies as a side 480d1be5cb7SEven Rouault # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481d1e97bf2SAndrey Kiselev # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482d1be5cb7SEven Rouault # dependencies in 'foo.d' instead, so we check for that too. 483d1e97bf2SAndrey Kiselev # Subdirectories are respected. 484d1be5cb7SEven Rouault set_dir_from "$object" 485d1be5cb7SEven Rouault set_base_from "$object" 486d1e97bf2SAndrey Kiselev 487d1e97bf2SAndrey Kiselev if test "$libtool" = yes; then 488d1be5cb7SEven Rouault # Libtool generates 2 separate objects for the 2 libraries. These 489d1be5cb7SEven Rouault # two compilations output dependencies in $dir.libs/$base.o.d and 490f714980aSAndrey Kiselev # in $dir$base.o.d. We have to check for both files, because 491f714980aSAndrey Kiselev # one of the two compilations can be disabled. We should prefer 492f714980aSAndrey Kiselev # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493f714980aSAndrey Kiselev # automatically cleaned when .libs/ is deleted, while ignoring 494f714980aSAndrey Kiselev # the former would cause a distcleancheck panic. 495d1be5cb7SEven Rouault tmpdepfile1=$dir$base.o.d # libtool 1.5 496d1be5cb7SEven Rouault tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497d1be5cb7SEven Rouault tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498d1e97bf2SAndrey Kiselev "$@" -Wc,-MD 499d1e97bf2SAndrey Kiselev else 500d1be5cb7SEven Rouault tmpdepfile1=$dir$base.d 501f714980aSAndrey Kiselev tmpdepfile2=$dir$base.d 502f714980aSAndrey Kiselev tmpdepfile3=$dir$base.d 503d1e97bf2SAndrey Kiselev "$@" -MD 504d1e97bf2SAndrey Kiselev fi 505d1e97bf2SAndrey Kiselev 506d1e97bf2SAndrey Kiselev stat=$? 507d1be5cb7SEven Rouault if test $stat -ne 0; then 508d1be5cb7SEven Rouault rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509d1e97bf2SAndrey Kiselev exit $stat 510d1e97bf2SAndrey Kiselev fi 511d1e97bf2SAndrey Kiselev 512d1be5cb7SEven Rouault for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513f714980aSAndrey Kiselev do 514f714980aSAndrey Kiselev test -f "$tmpdepfile" && break 515f714980aSAndrey Kiselev done 516d1be5cb7SEven Rouault # Same post-processing that is required for AIX mode. 517d1be5cb7SEven Rouault aix_post_process_depfile 518d1be5cb7SEven Rouault ;; 519d1be5cb7SEven Rouault 520d1be5cb7SEven Rouaultmsvc7) 521d1be5cb7SEven Rouault if test "$libtool" = yes; then 522d1be5cb7SEven Rouault showIncludes=-Wc,-showIncludes 523d1e97bf2SAndrey Kiselev else 524d1be5cb7SEven Rouault showIncludes=-showIncludes 525d1e97bf2SAndrey Kiselev fi 526d1be5cb7SEven Rouault "$@" $showIncludes > "$tmpdepfile" 527d1be5cb7SEven Rouault stat=$? 528d1be5cb7SEven Rouault grep -v '^Note: including file: ' "$tmpdepfile" 529d1be5cb7SEven Rouault if test $stat -ne 0; then 530d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 531d1be5cb7SEven Rouault exit $stat 532d1be5cb7SEven Rouault fi 533d1be5cb7SEven Rouault rm -f "$depfile" 534d1be5cb7SEven Rouault echo "$object : \\" > "$depfile" 535d1be5cb7SEven Rouault # The first sed program below extracts the file names and escapes 536d1be5cb7SEven Rouault # backslashes for cygpath. The second sed program outputs the file 537d1be5cb7SEven Rouault # name when reading, but also accumulates all include files in the 538d1be5cb7SEven Rouault # hold buffer in order to output them again at the end. This only 539d1be5cb7SEven Rouault # works with sed implementations that can handle large buffers. 540d1be5cb7SEven Rouault sed < "$tmpdepfile" -n ' 541d1be5cb7SEven Rouault/^Note: including file: *\(.*\)/ { 542d1be5cb7SEven Rouault s//\1/ 543d1be5cb7SEven Rouault s/\\/\\\\/g 544d1be5cb7SEven Rouault p 545d1be5cb7SEven Rouault}' | $cygpath_u | sort -u | sed -n ' 546d1be5cb7SEven Rouaults/ /\\ /g 547d1be5cb7SEven Rouaults/\(.*\)/'"$tab"'\1 \\/p 548d1be5cb7SEven Rouaults/.\(.*\) \\/\1:/ 549d1be5cb7SEven RouaultH 550d1be5cb7SEven Rouault$ { 551d1be5cb7SEven Rouault s/.*/'"$tab"'/ 552d1be5cb7SEven Rouault G 553d1be5cb7SEven Rouault p 554d1be5cb7SEven Rouault}' >> "$depfile" 555d1be5cb7SEven Rouault echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556d1be5cb7SEven Rouault rm -f "$tmpdepfile" 557d1be5cb7SEven Rouault ;; 558d1be5cb7SEven Rouault 559d1be5cb7SEven Rouaultmsvc7msys) 560d1be5cb7SEven Rouault # This case exists only to let depend.m4 do its work. It works by 561d1be5cb7SEven Rouault # looking at the text of this script. This case will never be run, 562d1be5cb7SEven Rouault # since it is checked for above. 563d1be5cb7SEven Rouault exit 1 564d1e97bf2SAndrey Kiselev ;; 565d1e97bf2SAndrey Kiselev 566d1e97bf2SAndrey Kiselev#nosideeffect) 567d1e97bf2SAndrey Kiselev # This comment above is used by automake to tell side-effect 568d1e97bf2SAndrey Kiselev # dependency tracking mechanisms from slower ones. 569d1e97bf2SAndrey Kiselev 570d1e97bf2SAndrey Kiselevdashmstdout) 571d1e97bf2SAndrey Kiselev # Important note: in order to support this mode, a compiler *must* 572d1e97bf2SAndrey Kiselev # always write the preprocessed file to stdout, regardless of -o. 573d1e97bf2SAndrey Kiselev "$@" || exit $? 574d1e97bf2SAndrey Kiselev 575d1e97bf2SAndrey Kiselev # Remove the call to Libtool. 576d1e97bf2SAndrey Kiselev if test "$libtool" = yes; then 577d1be5cb7SEven Rouault while test "X$1" != 'X--mode=compile'; do 578d1e97bf2SAndrey Kiselev shift 579d1e97bf2SAndrey Kiselev done 580d1e97bf2SAndrey Kiselev shift 581d1e97bf2SAndrey Kiselev fi 582d1e97bf2SAndrey Kiselev 583d1be5cb7SEven Rouault # Remove '-o $object'. 584d1e97bf2SAndrey Kiselev IFS=" " 585d1e97bf2SAndrey Kiselev for arg 586d1e97bf2SAndrey Kiselev do 587d1e97bf2SAndrey Kiselev case $arg in 588d1e97bf2SAndrey Kiselev -o) 589d1e97bf2SAndrey Kiselev shift 590d1e97bf2SAndrey Kiselev ;; 591d1e97bf2SAndrey Kiselev $object) 592d1e97bf2SAndrey Kiselev shift 593d1e97bf2SAndrey Kiselev ;; 594d1e97bf2SAndrey Kiselev *) 595d1e97bf2SAndrey Kiselev set fnord "$@" "$arg" 596d1e97bf2SAndrey Kiselev shift # fnord 597d1e97bf2SAndrey Kiselev shift # $arg 598d1e97bf2SAndrey Kiselev ;; 599d1e97bf2SAndrey Kiselev esac 600d1e97bf2SAndrey Kiselev done 601d1e97bf2SAndrey Kiselev 602d1e97bf2SAndrey Kiselev test -z "$dashmflag" && dashmflag=-M 603d1be5cb7SEven Rouault # Require at least two characters before searching for ':' 604d1e97bf2SAndrey Kiselev # in the target name. This is to cope with DOS-style filenames: 605d1be5cb7SEven Rouault # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606d1e97bf2SAndrey Kiselev "$@" $dashmflag | 607d1be5cb7SEven Rouault sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608d1e97bf2SAndrey Kiselev rm -f "$depfile" 609d1e97bf2SAndrey Kiselev cat < "$tmpdepfile" > "$depfile" 610d1be5cb7SEven Rouault # Some versions of the HPUX 10.20 sed can't process this sed invocation 611d1be5cb7SEven Rouault # correctly. Breaking it into two sed invocations is a workaround. 612d1be5cb7SEven Rouault tr ' ' "$nl" < "$tmpdepfile" \ 613d1be5cb7SEven Rouault | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614d1be5cb7SEven Rouault | sed -e 's/$/ :/' >> "$depfile" 615d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 616d1e97bf2SAndrey Kiselev ;; 617d1e97bf2SAndrey Kiselev 618d1e97bf2SAndrey KiselevdashXmstdout) 619d1e97bf2SAndrey Kiselev # This case only exists to satisfy depend.m4. It is never actually 620d1e97bf2SAndrey Kiselev # run, as this mode is specially recognized in the preamble. 621d1e97bf2SAndrey Kiselev exit 1 622d1e97bf2SAndrey Kiselev ;; 623d1e97bf2SAndrey Kiselev 624d1e97bf2SAndrey Kiselevmakedepend) 625d1e97bf2SAndrey Kiselev "$@" || exit $? 626d1e97bf2SAndrey Kiselev # Remove any Libtool call 627d1e97bf2SAndrey Kiselev if test "$libtool" = yes; then 628d1be5cb7SEven Rouault while test "X$1" != 'X--mode=compile'; do 629d1e97bf2SAndrey Kiselev shift 630d1e97bf2SAndrey Kiselev done 631d1e97bf2SAndrey Kiselev shift 632d1e97bf2SAndrey Kiselev fi 633d1e97bf2SAndrey Kiselev # X makedepend 634d1e97bf2SAndrey Kiselev shift 635d1be5cb7SEven Rouault cleared=no eat=no 636d1be5cb7SEven Rouault for arg 637d1be5cb7SEven Rouault do 638d1e97bf2SAndrey Kiselev case $cleared in 639d1e97bf2SAndrey Kiselev no) 640d1e97bf2SAndrey Kiselev set ""; shift 641d1e97bf2SAndrey Kiselev cleared=yes ;; 642d1e97bf2SAndrey Kiselev esac 643d1be5cb7SEven Rouault if test $eat = yes; then 644d1be5cb7SEven Rouault eat=no 645d1be5cb7SEven Rouault continue 646d1be5cb7SEven Rouault fi 647d1e97bf2SAndrey Kiselev case "$arg" in 648d1e97bf2SAndrey Kiselev -D*|-I*) 649d1e97bf2SAndrey Kiselev set fnord "$@" "$arg"; shift ;; 650d1e97bf2SAndrey Kiselev # Strip any option that makedepend may not understand. Remove 651d1e97bf2SAndrey Kiselev # the object too, otherwise makedepend will parse it as a source file. 652d1be5cb7SEven Rouault -arch) 653d1be5cb7SEven Rouault eat=yes ;; 654d1e97bf2SAndrey Kiselev -*|$object) 655d1e97bf2SAndrey Kiselev ;; 656d1e97bf2SAndrey Kiselev *) 657d1e97bf2SAndrey Kiselev set fnord "$@" "$arg"; shift ;; 658d1e97bf2SAndrey Kiselev esac 659d1e97bf2SAndrey Kiselev done 660d1be5cb7SEven Rouault obj_suffix=`echo "$object" | sed 's/^.*\././'` 661d1e97bf2SAndrey Kiselev touch "$tmpdepfile" 662d1e97bf2SAndrey Kiselev ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663d1e97bf2SAndrey Kiselev rm -f "$depfile" 664d1be5cb7SEven Rouault # makedepend may prepend the VPATH from the source file name to the object. 665d1be5cb7SEven Rouault # No need to regex-escape $object, excess matching of '.' is harmless. 666d1be5cb7SEven Rouault sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667d1be5cb7SEven Rouault # Some versions of the HPUX 10.20 sed can't process the last invocation 668d1be5cb7SEven Rouault # correctly. Breaking it into two sed invocations is a workaround. 669d1be5cb7SEven Rouault sed '1,2d' "$tmpdepfile" \ 670d1be5cb7SEven Rouault | tr ' ' "$nl" \ 671d1be5cb7SEven Rouault | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672d1be5cb7SEven Rouault | sed -e 's/$/ :/' >> "$depfile" 673d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" "$tmpdepfile".bak 674d1e97bf2SAndrey Kiselev ;; 675d1e97bf2SAndrey Kiselev 676d1e97bf2SAndrey Kiselevcpp) 677d1e97bf2SAndrey Kiselev # Important note: in order to support this mode, a compiler *must* 678d1e97bf2SAndrey Kiselev # always write the preprocessed file to stdout. 679d1e97bf2SAndrey Kiselev "$@" || exit $? 680d1e97bf2SAndrey Kiselev 681d1e97bf2SAndrey Kiselev # Remove the call to Libtool. 682d1e97bf2SAndrey Kiselev if test "$libtool" = yes; then 683d1be5cb7SEven Rouault while test "X$1" != 'X--mode=compile'; do 684d1e97bf2SAndrey Kiselev shift 685d1e97bf2SAndrey Kiselev done 686d1e97bf2SAndrey Kiselev shift 687d1e97bf2SAndrey Kiselev fi 688d1e97bf2SAndrey Kiselev 689d1be5cb7SEven Rouault # Remove '-o $object'. 690d1e97bf2SAndrey Kiselev IFS=" " 691d1e97bf2SAndrey Kiselev for arg 692d1e97bf2SAndrey Kiselev do 693d1e97bf2SAndrey Kiselev case $arg in 694d1e97bf2SAndrey Kiselev -o) 695d1e97bf2SAndrey Kiselev shift 696d1e97bf2SAndrey Kiselev ;; 697d1e97bf2SAndrey Kiselev $object) 698d1e97bf2SAndrey Kiselev shift 699d1e97bf2SAndrey Kiselev ;; 700d1e97bf2SAndrey Kiselev *) 701d1e97bf2SAndrey Kiselev set fnord "$@" "$arg" 702d1e97bf2SAndrey Kiselev shift # fnord 703d1e97bf2SAndrey Kiselev shift # $arg 704d1e97bf2SAndrey Kiselev ;; 705d1e97bf2SAndrey Kiselev esac 706d1e97bf2SAndrey Kiselev done 707d1e97bf2SAndrey Kiselev 708d1be5cb7SEven Rouault "$@" -E \ 709d1be5cb7SEven Rouault | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710d1be5cb7SEven Rouault -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711d1be5cb7SEven Rouault | sed '$ s: \\$::' > "$tmpdepfile" 712d1e97bf2SAndrey Kiselev rm -f "$depfile" 713d1e97bf2SAndrey Kiselev echo "$object : \\" > "$depfile" 714d1e97bf2SAndrey Kiselev cat < "$tmpdepfile" >> "$depfile" 715d1e97bf2SAndrey Kiselev sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 717d1e97bf2SAndrey Kiselev ;; 718d1e97bf2SAndrey Kiselev 719d1e97bf2SAndrey Kiselevmsvisualcpp) 720d1e97bf2SAndrey Kiselev # Important note: in order to support this mode, a compiler *must* 721d1be5cb7SEven Rouault # always write the preprocessed file to stdout. 722d1e97bf2SAndrey Kiselev "$@" || exit $? 723d1be5cb7SEven Rouault 724d1be5cb7SEven Rouault # Remove the call to Libtool. 725d1be5cb7SEven Rouault if test "$libtool" = yes; then 726d1be5cb7SEven Rouault while test "X$1" != 'X--mode=compile'; do 727d1be5cb7SEven Rouault shift 728d1be5cb7SEven Rouault done 729d1be5cb7SEven Rouault shift 730d1be5cb7SEven Rouault fi 731d1be5cb7SEven Rouault 732d1e97bf2SAndrey Kiselev IFS=" " 733d1e97bf2SAndrey Kiselev for arg 734d1e97bf2SAndrey Kiselev do 735d1e97bf2SAndrey Kiselev case "$arg" in 736d1be5cb7SEven Rouault -o) 737d1be5cb7SEven Rouault shift 738d1be5cb7SEven Rouault ;; 739d1be5cb7SEven Rouault $object) 740d1be5cb7SEven Rouault shift 741d1be5cb7SEven Rouault ;; 742d1e97bf2SAndrey Kiselev "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743d1e97bf2SAndrey Kiselev set fnord "$@" 744d1e97bf2SAndrey Kiselev shift 745d1e97bf2SAndrey Kiselev shift 746d1e97bf2SAndrey Kiselev ;; 747d1e97bf2SAndrey Kiselev *) 748d1e97bf2SAndrey Kiselev set fnord "$@" "$arg" 749d1e97bf2SAndrey Kiselev shift 750d1e97bf2SAndrey Kiselev shift 751d1e97bf2SAndrey Kiselev ;; 752d1e97bf2SAndrey Kiselev esac 753d1e97bf2SAndrey Kiselev done 754d1be5cb7SEven Rouault "$@" -E 2>/dev/null | 755d1be5cb7SEven Rouault sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756d1e97bf2SAndrey Kiselev rm -f "$depfile" 757d1e97bf2SAndrey Kiselev echo "$object : \\" > "$depfile" 758d1be5cb7SEven Rouault sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759d1be5cb7SEven Rouault echo "$tab" >> "$depfile" 760d1be5cb7SEven Rouault sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761d1e97bf2SAndrey Kiselev rm -f "$tmpdepfile" 762d1e97bf2SAndrey Kiselev ;; 763d1e97bf2SAndrey Kiselev 764d1be5cb7SEven Rouaultmsvcmsys) 765d1be5cb7SEven Rouault # This case exists only to let depend.m4 do its work. It works by 766d1be5cb7SEven Rouault # looking at the text of this script. This case will never be run, 767d1be5cb7SEven Rouault # since it is checked for above. 768d1be5cb7SEven Rouault exit 1 769d1be5cb7SEven Rouault ;; 770d1be5cb7SEven Rouault 771d1e97bf2SAndrey Kiselevnone) 772d1e97bf2SAndrey Kiselev exec "$@" 773d1e97bf2SAndrey Kiselev ;; 774d1e97bf2SAndrey Kiselev 775d1e97bf2SAndrey Kiselev*) 776d1e97bf2SAndrey Kiselev echo "Unknown depmode $depmode" 1>&2 777d1e97bf2SAndrey Kiselev exit 1 778d1e97bf2SAndrey Kiselev ;; 779d1e97bf2SAndrey Kiselevesac 780d1e97bf2SAndrey Kiselev 781d1e97bf2SAndrey Kiselevexit 0 782d1e97bf2SAndrey Kiselev 783d1e97bf2SAndrey Kiselev# Local Variables: 784d1e97bf2SAndrey Kiselev# mode: shell-script 785d1e97bf2SAndrey Kiselev# sh-indentation: 2 786d1e97bf2SAndrey Kiselev# eval: (add-hook 'write-file-hooks 'time-stamp) 787d1e97bf2SAndrey Kiselev# time-stamp-start: "scriptversion=" 788d1e97bf2SAndrey Kiselev# time-stamp-format: "%:y-%02m-%02d.%02H" 789d1be5cb7SEven Rouault# time-stamp-time-zone: "UTC" 790d1be5cb7SEven Rouault# time-stamp-end: "; # UTC" 791d1e97bf2SAndrey Kiselev# End: 792