1251883Speter#! /bin/sh 2251883Speter# depcomp - compile a program generating dependencies as side-effects 3251883Speter 4346442Scyscriptversion=2016-01-11.22; # UTC 5251883Speter 6346442Scy# Copyright (C) 1999-2017 Free Software Foundation, Inc. 7251883Speter 8251883Speter# This program is free software; you can redistribute it and/or modify 9251883Speter# it under the terms of the GNU General Public License as published by 10251883Speter# the Free Software Foundation; either version 2, or (at your option) 11251883Speter# any later version. 12251883Speter 13251883Speter# This program is distributed in the hope that it will be useful, 14251883Speter# but WITHOUT ANY WARRANTY; without even the implied warranty of 15251883Speter# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16251883Speter# GNU General Public License for more details. 17251883Speter 18251883Speter# You should have received a copy of the GNU General Public License 19269851Speter# along with this program. If not, see <http://www.gnu.org/licenses/>. 20251883Speter 21251883Speter# As a special exception to the GNU General Public License, if you 22251883Speter# distribute this file as part of a program that contains a 23251883Speter# configuration script generated by Autoconf, you may include it under 24251883Speter# the same distribution terms that you use for the rest of that program. 25251883Speter 26251883Speter# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27251883Speter 28251883Spetercase $1 in 29251883Speter '') 30298161Sbapt echo "$0: No command. Try '$0 --help' for more information." 1>&2 31298161Sbapt exit 1; 32298161Sbapt ;; 33251883Speter -h | --h*) 34251883Speter cat <<\EOF 35251883SpeterUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36251883Speter 37251883SpeterRun PROGRAMS ARGS to compile a file, generating dependencies 38251883Speteras side-effects. 39251883Speter 40251883SpeterEnvironment variables: 41251883Speter depmode Dependency tracking mode. 42269851Speter source Source file read by 'PROGRAMS ARGS'. 43269851Speter object Object file output by 'PROGRAMS ARGS'. 44251883Speter DEPDIR directory where to store dependencies. 45251883Speter depfile Dependency file to output. 46269851Speter tmpdepfile Temporary file to use when outputting dependencies. 47251883Speter libtool Whether libtool is used (yes/no). 48251883Speter 49251883SpeterReport bugs to <bug-automake@gnu.org>. 50251883SpeterEOF 51251883Speter exit $? 52251883Speter ;; 53251883Speter -v | --v*) 54251883Speter echo "depcomp $scriptversion" 55251883Speter exit $? 56251883Speter ;; 57251883Speteresac 58251883Speter 59298161Sbapt# Get the directory component of the given path, and save it in the 60298161Sbapt# global variables '$dir'. Note that this directory component will 61298161Sbapt# be either empty or ending with a '/' character. This is deliberate. 62298161Sbaptset_dir_from () 63298161Sbapt{ 64298161Sbapt case $1 in 65298161Sbapt */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66298161Sbapt *) dir=;; 67298161Sbapt esac 68298161Sbapt} 69298161Sbapt 70298161Sbapt# Get the suffix-stripped basename of the given path, and save it the 71298161Sbapt# global variable '$base'. 72298161Sbaptset_base_from () 73298161Sbapt{ 74298161Sbapt base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75298161Sbapt} 76298161Sbapt 77298161Sbapt# If no dependency file was actually created by the compiler invocation, 78298161Sbapt# we still have to create a dummy depfile, to avoid errors with the 79298161Sbapt# Makefile "include basename.Plo" scheme. 80298161Sbaptmake_dummy_depfile () 81298161Sbapt{ 82298161Sbapt echo "#dummy" > "$depfile" 83298161Sbapt} 84298161Sbapt 85298161Sbapt# Factor out some common post-processing of the generated depfile. 86298161Sbapt# Requires the auxiliary global variable '$tmpdepfile' to be set. 87298161Sbaptaix_post_process_depfile () 88298161Sbapt{ 89298161Sbapt # If the compiler actually managed to produce a dependency file, 90298161Sbapt # post-process it. 91298161Sbapt if test -f "$tmpdepfile"; then 92298161Sbapt # Each line is of the form 'foo.o: dependency.h'. 93298161Sbapt # Do two passes, one to just change these to 94298161Sbapt # $object: dependency.h 95298161Sbapt # and one to simply output 96298161Sbapt # dependency.h: 97298161Sbapt # which is needed to avoid the deleted-header problem. 98298161Sbapt { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99298161Sbapt sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100298161Sbapt } > "$depfile" 101298161Sbapt rm -f "$tmpdepfile" 102298161Sbapt else 103298161Sbapt make_dummy_depfile 104298161Sbapt fi 105298161Sbapt} 106298161Sbapt 107269851Speter# A tabulation character. 108269851Spetertab=' ' 109269851Speter# A newline character. 110269851Speternl=' 111269851Speter' 112298161Sbapt# Character ranges might be problematic outside the C locale. 113298161Sbapt# These definitions help. 114298161Sbaptupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115298161Sbaptlower=abcdefghijklmnopqrstuvwxyz 116298161Sbaptdigits=0123456789 117298161Sbaptalpha=${upper}${lower} 118269851Speter 119251883Speterif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120251883Speter echo "depcomp: Variables source, object and depmode must be set" 1>&2 121251883Speter exit 1 122251883Speterfi 123251883Speter 124251883Speter# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125251883Speterdepfile=${depfile-`echo "$object" | 126251883Speter sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127251883Spetertmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128251883Speter 129251883Speterrm -f "$tmpdepfile" 130251883Speter 131298161Sbapt# Avoid interferences from the environment. 132298161Sbaptgccflag= dashmflag= 133298161Sbapt 134251883Speter# Some modes work just like other modes, but use different flags. We 135251883Speter# parameterize here, but still list the modes in the big case below, 136251883Speter# to make depend.m4 easier to write. Note that we *cannot* use a case 137251883Speter# here, because this file can only contain one case statement. 138251883Speterif test "$depmode" = hp; then 139251883Speter # HP compiler uses -M and no extra arg. 140251883Speter gccflag=-M 141251883Speter depmode=gcc 142251883Speterfi 143251883Speter 144251883Speterif test "$depmode" = dashXmstdout; then 145298161Sbapt # This is just like dashmstdout with a different argument. 146298161Sbapt dashmflag=-xM 147298161Sbapt depmode=dashmstdout 148251883Speterfi 149251883Speter 150269851Spetercygpath_u="cygpath -u -f -" 151269851Speterif test "$depmode" = msvcmsys; then 152298161Sbapt # This is just like msvisualcpp but w/o cygpath translation. 153298161Sbapt # Just convert the backslash-escaped backslashes to single forward 154298161Sbapt # slashes to satisfy depend.m4 155298161Sbapt cygpath_u='sed s,\\\\,/,g' 156298161Sbapt depmode=msvisualcpp 157269851Speterfi 158269851Speter 159269851Speterif test "$depmode" = msvc7msys; then 160298161Sbapt # This is just like msvc7 but w/o cygpath translation. 161298161Sbapt # Just convert the backslash-escaped backslashes to single forward 162298161Sbapt # slashes to satisfy depend.m4 163298161Sbapt cygpath_u='sed s,\\\\,/,g' 164298161Sbapt depmode=msvc7 165269851Speterfi 166269851Speter 167269851Speterif test "$depmode" = xlc; then 168298161Sbapt # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169298161Sbapt gccflag=-qmakedep=gcc,-MF 170298161Sbapt depmode=gcc 171269851Speterfi 172269851Speter 173251883Spetercase "$depmode" in 174251883Spetergcc3) 175251883Speter## gcc 3 implements dependency tracking that does exactly what 176251883Speter## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177251883Speter## it if -MD -MP comes after the -MF stuff. Hmm. 178269851Speter## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179269851Speter## the command line argument order; so add the flags where they 180269851Speter## appear in depend2.am. Note that the slowdown incurred here 181269851Speter## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182269851Speter for arg 183269851Speter do 184269851Speter case $arg in 185269851Speter -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186269851Speter *) set fnord "$@" "$arg" ;; 187269851Speter esac 188269851Speter shift # fnord 189269851Speter shift # $arg 190269851Speter done 191269851Speter "$@" 192251883Speter stat=$? 193298161Sbapt if test $stat -ne 0; then 194251883Speter rm -f "$tmpdepfile" 195251883Speter exit $stat 196251883Speter fi 197251883Speter mv "$tmpdepfile" "$depfile" 198251883Speter ;; 199251883Speter 200251883Spetergcc) 201298161Sbapt## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202298161Sbapt## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203298161Sbapt## (see the conditional assignment to $gccflag above). 204251883Speter## There are various ways to get dependency output from gcc. Here's 205251883Speter## why we pick this rather obscure method: 206251883Speter## - Don't want to use -MD because we'd like the dependencies to end 207251883Speter## up in a subdir. Having to rename by hand is ugly. 208251883Speter## (We might end up doing this anyway to support other compilers.) 209251883Speter## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210298161Sbapt## -MM, not -M (despite what the docs say). Also, it might not be 211298161Sbapt## supported by the other compilers which use the 'gcc' depmode. 212251883Speter## - Using -M directly means running the compiler twice (even worse 213251883Speter## than renaming). 214251883Speter if test -z "$gccflag"; then 215251883Speter gccflag=-MD, 216251883Speter fi 217251883Speter "$@" -Wp,"$gccflag$tmpdepfile" 218251883Speter stat=$? 219298161Sbapt if test $stat -ne 0; then 220251883Speter rm -f "$tmpdepfile" 221251883Speter exit $stat 222251883Speter fi 223251883Speter rm -f "$depfile" 224251883Speter echo "$object : \\" > "$depfile" 225298161Sbapt # The second -e expression handles DOS-style file names with drive 226298161Sbapt # letters. 227251883Speter sed -e 's/^[^:]*: / /' \ 228251883Speter -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229269851Speter## This next piece of magic avoids the "deleted header file" problem. 230251883Speter## The problem is that when a header file which appears in a .P file 231251883Speter## is deleted, the dependency causes make to die (because there is 232251883Speter## typically no way to rebuild the header). We avoid this by adding 233251883Speter## dummy dependencies for each header file. Too bad gcc doesn't do 234251883Speter## this for us directly. 235269851Speter## Some versions of gcc put a space before the ':'. On the theory 236251883Speter## that the space means something, we add a space to the output as 237269851Speter## well. hp depmode also adds that space, but also prefixes the VPATH 238269851Speter## to the object. Take care to not repeat it in the output. 239251883Speter## Some versions of the HPUX 10.20 sed can't process this invocation 240251883Speter## correctly. Breaking it into two sed invocations is a workaround. 241298161Sbapt tr ' ' "$nl" < "$tmpdepfile" \ 242298161Sbapt | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243298161Sbapt | sed -e 's/$/ :/' >> "$depfile" 244251883Speter rm -f "$tmpdepfile" 245251883Speter ;; 246251883Speter 247251883Speterhp) 248251883Speter # This case exists only to let depend.m4 do its work. It works by 249251883Speter # looking at the text of this script. This case will never be run, 250251883Speter # since it is checked for above. 251251883Speter exit 1 252251883Speter ;; 253251883Speter 254251883Spetersgi) 255251883Speter if test "$libtool" = yes; then 256251883Speter "$@" "-Wp,-MDupdate,$tmpdepfile" 257251883Speter else 258251883Speter "$@" -MDupdate "$tmpdepfile" 259251883Speter fi 260251883Speter stat=$? 261298161Sbapt if test $stat -ne 0; then 262251883Speter rm -f "$tmpdepfile" 263251883Speter exit $stat 264251883Speter fi 265251883Speter rm -f "$depfile" 266251883Speter 267251883Speter if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268251883Speter echo "$object : \\" > "$depfile" 269251883Speter # Clip off the initial element (the dependent). Don't try to be 270251883Speter # clever and replace this with sed code, as IRIX sed won't handle 271251883Speter # lines with more than a fixed number of characters (4096 in 272251883Speter # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273269851Speter # the IRIX cc adds comments like '#:fec' to the end of the 274251883Speter # dependency line. 275269851Speter tr ' ' "$nl" < "$tmpdepfile" \ 276298161Sbapt | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277298161Sbapt | tr "$nl" ' ' >> "$depfile" 278269851Speter echo >> "$depfile" 279251883Speter # The second pass generates a dummy entry for each header file. 280269851Speter tr ' ' "$nl" < "$tmpdepfile" \ 281298161Sbapt | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282298161Sbapt >> "$depfile" 283251883Speter else 284298161Sbapt make_dummy_depfile 285251883Speter fi 286251883Speter rm -f "$tmpdepfile" 287251883Speter ;; 288251883Speter 289269851Speterxlc) 290269851Speter # This case exists only to let depend.m4 do its work. It works by 291269851Speter # looking at the text of this script. This case will never be run, 292269851Speter # since it is checked for above. 293269851Speter exit 1 294269851Speter ;; 295269851Speter 296251883Speteraix) 297251883Speter # The C for AIX Compiler uses -M and outputs the dependencies 298251883Speter # in a .u file. In older versions, this file always lives in the 299269851Speter # current directory. Also, the AIX compiler puts '$object:' at the 300251883Speter # start of each line; $object doesn't have directory information. 301251883Speter # Version 6 uses the directory in both cases. 302298161Sbapt set_dir_from "$object" 303298161Sbapt set_base_from "$object" 304251883Speter if test "$libtool" = yes; then 305269851Speter tmpdepfile1=$dir$base.u 306269851Speter tmpdepfile2=$base.u 307269851Speter tmpdepfile3=$dir.libs/$base.u 308251883Speter "$@" -Wc,-M 309251883Speter else 310269851Speter tmpdepfile1=$dir$base.u 311269851Speter tmpdepfile2=$dir$base.u 312269851Speter tmpdepfile3=$dir$base.u 313251883Speter "$@" -M 314251883Speter fi 315251883Speter stat=$? 316298161Sbapt if test $stat -ne 0; then 317269851Speter rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318251883Speter exit $stat 319251883Speter fi 320251883Speter 321269851Speter for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322269851Speter do 323269851Speter test -f "$tmpdepfile" && break 324269851Speter done 325298161Sbapt aix_post_process_depfile 326298161Sbapt ;; 327298161Sbapt 328298161Sbapttcc) 329298161Sbapt # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330298161Sbapt # FIXME: That version still under development at the moment of writing. 331298161Sbapt # Make that this statement remains true also for stable, released 332298161Sbapt # versions. 333298161Sbapt # It will wrap lines (doesn't matter whether long or short) with a 334298161Sbapt # trailing '\', as in: 335298161Sbapt # 336298161Sbapt # foo.o : \ 337298161Sbapt # foo.c \ 338298161Sbapt # foo.h \ 339298161Sbapt # 340298161Sbapt # It will put a trailing '\' even on the last line, and will use leading 341298161Sbapt # spaces rather than leading tabs (at least since its commit 0394caf7 342298161Sbapt # "Emit spaces for -MD"). 343298161Sbapt "$@" -MD -MF "$tmpdepfile" 344298161Sbapt stat=$? 345298161Sbapt if test $stat -ne 0; then 346298161Sbapt rm -f "$tmpdepfile" 347298161Sbapt exit $stat 348251883Speter fi 349298161Sbapt rm -f "$depfile" 350298161Sbapt # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351298161Sbapt # We have to change lines of the first kind to '$object: \'. 352298161Sbapt sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353298161Sbapt # And for each line of the second kind, we have to emit a 'dep.h:' 354298161Sbapt # dummy dependency, to avoid the deleted-header problem. 355298161Sbapt sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356251883Speter rm -f "$tmpdepfile" 357251883Speter ;; 358251883Speter 359298161Sbapt## The order of this option in the case statement is important, since the 360298161Sbapt## shell code in configure will try each of these formats in the order 361298161Sbapt## listed in this file. A plain '-MD' option would be understood by many 362298161Sbapt## compilers, so we must ensure this comes after the gcc and icc options. 363298161Sbaptpgcc) 364298161Sbapt # Portland's C compiler understands '-MD'. 365298161Sbapt # Will always output deps to 'file.d' where file is the root name of the 366298161Sbapt # source file under compilation, even if file resides in a subdirectory. 367298161Sbapt # The object file name does not affect the name of the '.d' file. 368298161Sbapt # pgcc 10.2 will output 369251883Speter # foo.o: sub/foo.c sub/foo.h 370298161Sbapt # and will wrap long lines using '\' : 371251883Speter # foo.o: sub/foo.c ... \ 372251883Speter # sub/foo.h ... \ 373251883Speter # ... 374298161Sbapt set_dir_from "$object" 375298161Sbapt # Use the source, not the object, to determine the base name, since 376298161Sbapt # that's sadly what pgcc will do too. 377298161Sbapt set_base_from "$source" 378298161Sbapt tmpdepfile=$base.d 379298161Sbapt 380298161Sbapt # For projects that build the same source file twice into different object 381298161Sbapt # files, the pgcc approach of using the *source* file root name can cause 382298161Sbapt # problems in parallel builds. Use a locking strategy to avoid stomping on 383298161Sbapt # the same $tmpdepfile. 384298161Sbapt lockdir=$base.d-lock 385298161Sbapt trap " 386298161Sbapt echo '$0: caught signal, cleaning up...' >&2 387298161Sbapt rmdir '$lockdir' 388298161Sbapt exit 1 389298161Sbapt " 1 2 13 15 390298161Sbapt numtries=100 391298161Sbapt i=$numtries 392298161Sbapt while test $i -gt 0; do 393298161Sbapt # mkdir is a portable test-and-set. 394298161Sbapt if mkdir "$lockdir" 2>/dev/null; then 395298161Sbapt # This process acquired the lock. 396298161Sbapt "$@" -MD 397298161Sbapt stat=$? 398298161Sbapt # Release the lock. 399298161Sbapt rmdir "$lockdir" 400298161Sbapt break 401298161Sbapt else 402298161Sbapt # If the lock is being held by a different process, wait 403298161Sbapt # until the winning process is done or we timeout. 404298161Sbapt while test -d "$lockdir" && test $i -gt 0; do 405298161Sbapt sleep 1 406298161Sbapt i=`expr $i - 1` 407298161Sbapt done 408298161Sbapt fi 409298161Sbapt i=`expr $i - 1` 410298161Sbapt done 411298161Sbapt trap - 1 2 13 15 412298161Sbapt if test $i -le 0; then 413298161Sbapt echo "$0: failed to acquire lock after $numtries attempts" >&2 414298161Sbapt echo "$0: check lockdir '$lockdir'" >&2 415298161Sbapt exit 1 416298161Sbapt fi 417298161Sbapt 418298161Sbapt if test $stat -ne 0; then 419251883Speter rm -f "$tmpdepfile" 420251883Speter exit $stat 421251883Speter fi 422251883Speter rm -f "$depfile" 423298161Sbapt # Each line is of the form `foo.o: dependent.h', 424298161Sbapt # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425251883Speter # Do two passes, one to just change these to 426298161Sbapt # `$object: dependent.h' and one to simply `dependent.h:'. 427298161Sbapt sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428298161Sbapt # Some versions of the HPUX 10.20 sed can't process this invocation 429298161Sbapt # correctly. Breaking it into two sed invocations is a workaround. 430298161Sbapt sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431298161Sbapt | sed -e 's/$/ :/' >> "$depfile" 432251883Speter rm -f "$tmpdepfile" 433251883Speter ;; 434251883Speter 435269851Speterhp2) 436269851Speter # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437269851Speter # compilers, which have integrated preprocessors. The correct option 438269851Speter # to use with these is +Maked; it writes dependencies to a file named 439269851Speter # 'foo.d', which lands next to the object file, wherever that 440269851Speter # happens to be. 441269851Speter # Much of this is similar to the tru64 case; see comments there. 442298161Sbapt set_dir_from "$object" 443298161Sbapt set_base_from "$object" 444269851Speter if test "$libtool" = yes; then 445269851Speter tmpdepfile1=$dir$base.d 446269851Speter tmpdepfile2=$dir.libs/$base.d 447269851Speter "$@" -Wc,+Maked 448269851Speter else 449269851Speter tmpdepfile1=$dir$base.d 450269851Speter tmpdepfile2=$dir$base.d 451269851Speter "$@" +Maked 452269851Speter fi 453269851Speter stat=$? 454298161Sbapt if test $stat -ne 0; then 455269851Speter rm -f "$tmpdepfile1" "$tmpdepfile2" 456269851Speter exit $stat 457269851Speter fi 458269851Speter 459269851Speter for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460269851Speter do 461269851Speter test -f "$tmpdepfile" && break 462269851Speter done 463269851Speter if test -f "$tmpdepfile"; then 464298161Sbapt sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465269851Speter # Add 'dependent.h:' lines. 466269851Speter sed -ne '2,${ 467298161Sbapt s/^ *// 468298161Sbapt s/ \\*$// 469298161Sbapt s/$/:/ 470298161Sbapt p 471298161Sbapt }' "$tmpdepfile" >> "$depfile" 472269851Speter else 473298161Sbapt make_dummy_depfile 474269851Speter fi 475269851Speter rm -f "$tmpdepfile" "$tmpdepfile2" 476269851Speter ;; 477269851Speter 478251883Spetertru64) 479298161Sbapt # The Tru64 compiler uses -MD to generate dependencies as a side 480298161Sbapt # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481298161Sbapt # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482298161Sbapt # dependencies in 'foo.d' instead, so we check for that too. 483298161Sbapt # Subdirectories are respected. 484298161Sbapt set_dir_from "$object" 485298161Sbapt set_base_from "$object" 486251883Speter 487298161Sbapt if test "$libtool" = yes; then 488298161Sbapt # Libtool generates 2 separate objects for the 2 libraries. These 489298161Sbapt # two compilations output dependencies in $dir.libs/$base.o.d and 490298161Sbapt # in $dir$base.o.d. We have to check for both files, because 491298161Sbapt # one of the two compilations can be disabled. We should prefer 492298161Sbapt # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493298161Sbapt # automatically cleaned when .libs/ is deleted, while ignoring 494298161Sbapt # the former would cause a distcleancheck panic. 495298161Sbapt tmpdepfile1=$dir$base.o.d # libtool 1.5 496298161Sbapt tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497298161Sbapt tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498298161Sbapt "$@" -Wc,-MD 499298161Sbapt else 500298161Sbapt tmpdepfile1=$dir$base.d 501298161Sbapt tmpdepfile2=$dir$base.d 502298161Sbapt tmpdepfile3=$dir$base.d 503298161Sbapt "$@" -MD 504298161Sbapt fi 505251883Speter 506298161Sbapt stat=$? 507298161Sbapt if test $stat -ne 0; then 508298161Sbapt rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509298161Sbapt exit $stat 510298161Sbapt fi 511251883Speter 512298161Sbapt for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513298161Sbapt do 514298161Sbapt test -f "$tmpdepfile" && break 515298161Sbapt done 516298161Sbapt # Same post-processing that is required for AIX mode. 517298161Sbapt aix_post_process_depfile 518298161Sbapt ;; 519251883Speter 520269851Spetermsvc7) 521269851Speter if test "$libtool" = yes; then 522269851Speter showIncludes=-Wc,-showIncludes 523269851Speter else 524269851Speter showIncludes=-showIncludes 525269851Speter fi 526269851Speter "$@" $showIncludes > "$tmpdepfile" 527269851Speter stat=$? 528269851Speter grep -v '^Note: including file: ' "$tmpdepfile" 529298161Sbapt if test $stat -ne 0; then 530269851Speter rm -f "$tmpdepfile" 531269851Speter exit $stat 532269851Speter fi 533269851Speter rm -f "$depfile" 534269851Speter echo "$object : \\" > "$depfile" 535269851Speter # The first sed program below extracts the file names and escapes 536269851Speter # backslashes for cygpath. The second sed program outputs the file 537269851Speter # name when reading, but also accumulates all include files in the 538269851Speter # hold buffer in order to output them again at the end. This only 539269851Speter # works with sed implementations that can handle large buffers. 540269851Speter sed < "$tmpdepfile" -n ' 541269851Speter/^Note: including file: *\(.*\)/ { 542269851Speter s//\1/ 543269851Speter s/\\/\\\\/g 544269851Speter p 545269851Speter}' | $cygpath_u | sort -u | sed -n ' 546269851Speters/ /\\ /g 547269851Speters/\(.*\)/'"$tab"'\1 \\/p 548269851Speters/.\(.*\) \\/\1:/ 549269851SpeterH 550269851Speter$ { 551269851Speter s/.*/'"$tab"'/ 552269851Speter G 553269851Speter p 554269851Speter}' >> "$depfile" 555298161Sbapt echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556269851Speter rm -f "$tmpdepfile" 557269851Speter ;; 558269851Speter 559269851Spetermsvc7msys) 560269851Speter # This case exists only to let depend.m4 do its work. It works by 561269851Speter # looking at the text of this script. This case will never be run, 562269851Speter # since it is checked for above. 563269851Speter exit 1 564269851Speter ;; 565269851Speter 566251883Speter#nosideeffect) 567251883Speter # This comment above is used by automake to tell side-effect 568251883Speter # dependency tracking mechanisms from slower ones. 569251883Speter 570251883Speterdashmstdout) 571251883Speter # Important note: in order to support this mode, a compiler *must* 572251883Speter # always write the preprocessed file to stdout, regardless of -o. 573251883Speter "$@" || exit $? 574251883Speter 575251883Speter # Remove the call to Libtool. 576251883Speter if test "$libtool" = yes; then 577269851Speter while test "X$1" != 'X--mode=compile'; do 578251883Speter shift 579251883Speter done 580251883Speter shift 581251883Speter fi 582251883Speter 583269851Speter # Remove '-o $object'. 584251883Speter IFS=" " 585251883Speter for arg 586251883Speter do 587251883Speter case $arg in 588251883Speter -o) 589251883Speter shift 590251883Speter ;; 591251883Speter $object) 592251883Speter shift 593251883Speter ;; 594251883Speter *) 595251883Speter set fnord "$@" "$arg" 596251883Speter shift # fnord 597251883Speter shift # $arg 598251883Speter ;; 599251883Speter esac 600251883Speter done 601251883Speter 602251883Speter test -z "$dashmflag" && dashmflag=-M 603269851Speter # Require at least two characters before searching for ':' 604251883Speter # in the target name. This is to cope with DOS-style filenames: 605269851Speter # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606251883Speter "$@" $dashmflag | 607298161Sbapt sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608251883Speter rm -f "$depfile" 609251883Speter cat < "$tmpdepfile" > "$depfile" 610298161Sbapt # Some versions of the HPUX 10.20 sed can't process this sed invocation 611298161Sbapt # correctly. Breaking it into two sed invocations is a workaround. 612298161Sbapt tr ' ' "$nl" < "$tmpdepfile" \ 613298161Sbapt | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614298161Sbapt | sed -e 's/$/ :/' >> "$depfile" 615251883Speter rm -f "$tmpdepfile" 616251883Speter ;; 617251883Speter 618251883SpeterdashXmstdout) 619251883Speter # This case only exists to satisfy depend.m4. It is never actually 620251883Speter # run, as this mode is specially recognized in the preamble. 621251883Speter exit 1 622251883Speter ;; 623251883Speter 624251883Spetermakedepend) 625251883Speter "$@" || exit $? 626251883Speter # Remove any Libtool call 627251883Speter if test "$libtool" = yes; then 628269851Speter while test "X$1" != 'X--mode=compile'; do 629251883Speter shift 630251883Speter done 631251883Speter shift 632251883Speter fi 633251883Speter # X makedepend 634251883Speter shift 635269851Speter cleared=no eat=no 636269851Speter for arg 637269851Speter do 638251883Speter case $cleared in 639251883Speter no) 640251883Speter set ""; shift 641251883Speter cleared=yes ;; 642251883Speter esac 643269851Speter if test $eat = yes; then 644269851Speter eat=no 645269851Speter continue 646269851Speter fi 647251883Speter case "$arg" in 648251883Speter -D*|-I*) 649251883Speter set fnord "$@" "$arg"; shift ;; 650251883Speter # Strip any option that makedepend may not understand. Remove 651251883Speter # the object too, otherwise makedepend will parse it as a source file. 652269851Speter -arch) 653269851Speter eat=yes ;; 654251883Speter -*|$object) 655251883Speter ;; 656251883Speter *) 657251883Speter set fnord "$@" "$arg"; shift ;; 658251883Speter esac 659251883Speter done 660269851Speter obj_suffix=`echo "$object" | sed 's/^.*\././'` 661251883Speter touch "$tmpdepfile" 662251883Speter ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663251883Speter rm -f "$depfile" 664269851Speter # makedepend may prepend the VPATH from the source file name to the object. 665269851Speter # No need to regex-escape $object, excess matching of '.' is harmless. 666269851Speter sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667298161Sbapt # Some versions of the HPUX 10.20 sed can't process the last invocation 668298161Sbapt # correctly. Breaking it into two sed invocations is a workaround. 669298161Sbapt sed '1,2d' "$tmpdepfile" \ 670298161Sbapt | tr ' ' "$nl" \ 671298161Sbapt | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672298161Sbapt | sed -e 's/$/ :/' >> "$depfile" 673251883Speter rm -f "$tmpdepfile" "$tmpdepfile".bak 674251883Speter ;; 675251883Speter 676251883Spetercpp) 677251883Speter # Important note: in order to support this mode, a compiler *must* 678251883Speter # always write the preprocessed file to stdout. 679251883Speter "$@" || exit $? 680251883Speter 681251883Speter # Remove the call to Libtool. 682251883Speter if test "$libtool" = yes; then 683269851Speter while test "X$1" != 'X--mode=compile'; do 684251883Speter shift 685251883Speter done 686251883Speter shift 687251883Speter fi 688251883Speter 689269851Speter # Remove '-o $object'. 690251883Speter IFS=" " 691251883Speter for arg 692251883Speter do 693251883Speter case $arg in 694251883Speter -o) 695251883Speter shift 696251883Speter ;; 697251883Speter $object) 698251883Speter shift 699251883Speter ;; 700251883Speter *) 701251883Speter set fnord "$@" "$arg" 702251883Speter shift # fnord 703251883Speter shift # $arg 704251883Speter ;; 705251883Speter esac 706251883Speter done 707251883Speter 708298161Sbapt "$@" -E \ 709298161Sbapt | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710298161Sbapt -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711298161Sbapt | sed '$ s: \\$::' > "$tmpdepfile" 712251883Speter rm -f "$depfile" 713251883Speter echo "$object : \\" > "$depfile" 714251883Speter cat < "$tmpdepfile" >> "$depfile" 715251883Speter sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716251883Speter rm -f "$tmpdepfile" 717251883Speter ;; 718251883Speter 719251883Spetermsvisualcpp) 720251883Speter # Important note: in order to support this mode, a compiler *must* 721269851Speter # always write the preprocessed file to stdout. 722251883Speter "$@" || exit $? 723269851Speter 724269851Speter # Remove the call to Libtool. 725269851Speter if test "$libtool" = yes; then 726269851Speter while test "X$1" != 'X--mode=compile'; do 727269851Speter shift 728269851Speter done 729269851Speter shift 730269851Speter fi 731269851Speter 732251883Speter IFS=" " 733251883Speter for arg 734251883Speter do 735251883Speter case "$arg" in 736269851Speter -o) 737269851Speter shift 738269851Speter ;; 739269851Speter $object) 740269851Speter shift 741269851Speter ;; 742251883Speter "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743298161Sbapt set fnord "$@" 744298161Sbapt shift 745298161Sbapt shift 746298161Sbapt ;; 747251883Speter *) 748298161Sbapt set fnord "$@" "$arg" 749298161Sbapt shift 750298161Sbapt shift 751298161Sbapt ;; 752251883Speter esac 753251883Speter done 754269851Speter "$@" -E 2>/dev/null | 755269851Speter sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756251883Speter rm -f "$depfile" 757251883Speter echo "$object : \\" > "$depfile" 758269851Speter sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759269851Speter echo "$tab" >> "$depfile" 760269851Speter sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761251883Speter rm -f "$tmpdepfile" 762251883Speter ;; 763251883Speter 764269851Spetermsvcmsys) 765269851Speter # This case exists only to let depend.m4 do its work. It works by 766269851Speter # looking at the text of this script. This case will never be run, 767269851Speter # since it is checked for above. 768269851Speter exit 1 769269851Speter ;; 770269851Speter 771251883Speternone) 772251883Speter exec "$@" 773251883Speter ;; 774251883Speter 775251883Speter*) 776251883Speter echo "Unknown depmode $depmode" 1>&2 777251883Speter exit 1 778251883Speter ;; 779251883Speteresac 780251883Speter 781251883Speterexit 0 782251883Speter 783251883Speter# Local Variables: 784251883Speter# mode: shell-script 785251883Speter# sh-indentation: 2 786251883Speter# eval: (add-hook 'write-file-hooks 'time-stamp) 787251883Speter# time-stamp-start: "scriptversion=" 788251883Speter# time-stamp-format: "%:y-%02m-%02d.%02H" 789346442Scy# time-stamp-time-zone: "UTC0" 790269851Speter# time-stamp-end: "; # UTC" 791251883Speter# End: 792