
1: #! /bin/sh 2: # depcomp - compile a program generating dependencies as side-effects 3: 4: scriptversion=2005-05-16.16 5: 6: # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. 7: 8: # This program is free software; you can redistribute it and/or modify 9: # it under the terms of the GNU General Public License as published by 10: # the Free Software Foundation; either version 2, or (at your option) 11: # any later version. 12: 13: # This program is distributed in the hope that it will be useful, 14: # but WITHOUT ANY WARRANTY; without even the implied warranty of 15: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16: # GNU General Public License for more details. 17: 18: # You should have received a copy of the GNU General Public License 19: # along with this program; if not, write to the Free Software 20: # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 21: # 02110-1301, USA. 22: 23: # As a special exception to the GNU General Public License, if you 24: # distribute this file as part of a program that contains a 25: # configuration script generated by Autoconf, you may include it under 26: # the same distribution terms that you use for the rest of that program. 27: 28: # Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 29: 30: case $1 in 31: '') 32: echo "$0: No command. Try \`$0 --help' for more information." 1>&2 33: exit 1; 34: ;; 35: -h | --h*) 36: cat <<\EOF 37: Usage: depcomp [--help] [--version] PROGRAM [ARGS] 38: 39: Run PROGRAMS ARGS to compile a file, generating dependencies 40: as side-effects. 41: 42: Environment variables: 43: depmode Dependency tracking mode. 44: source Source file read by `PROGRAMS ARGS'. 45: object Object file output by `PROGRAMS ARGS'. 46: DEPDIR directory where to store dependencies. 47: depfile Dependency file to output. 48: tmpdepfile Temporary file to use when outputing dependencies. 49: libtool Whether libtool is used (yes/no). 50: 51: Report bugs to <bug-automake@gnu.org>. 52: EOF 53: exit $? 54: ;; 55: -v | --v*) 56: echo "depcomp $scriptversion" 57: exit $? 58: ;; 59: esac 60: 61: if test -z "$depmode" || test -z "$source" || test -z "$object"; then 62: echo "depcomp: Variables source, object and depmode must be set" 1>&2 63: exit 1 64: fi 65: 66: # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 67: depfile=${depfile-`echo "$object" | 68: sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 69: tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 70: 71: rm -f "$tmpdepfile" 72: 73: # Some modes work just like other modes, but use different flags. We 74: # parameterize here, but still list the modes in the big case below, 75: # to make depend.m4 easier to write. Note that we *cannot* use a case 76: # here, because this file can only contain one case statement. 77: if test "$depmode" = hp; then 78: # HP compiler uses -M and no extra arg. 79: gccflag=-M 80: depmode=gcc 81: fi 82: 83: if test "$depmode" = dashXmstdout; then 84: # This is just like dashmstdout with a different argument. 85: dashmflag=-xM 86: depmode=dashmstdout 87: fi 88: 89: case "$depmode" in 90: gcc3) 91: ## gcc 3 implements dependency tracking that does exactly what 92: ## we want. Yay! Note: for some reason libtool 1.4 doesn't like 93: ## it if -MD -MP comes after the -MF stuff. Hmm. 94: "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" 95: stat=$? 96: if test $stat -eq 0; then : 97: else 98: rm -f "$tmpdepfile" 99: exit $stat 100: fi 101: mv "$tmpdepfile" "$depfile" 102: ;; 103: 104: gcc) 105: ## There are various ways to get dependency output from gcc. Here's 106: ## why we pick this rather obscure method: 107: ## - Don't want to use -MD because we'd like the dependencies to end 108: ## up in a subdir. Having to rename by hand is ugly. 109: ## (We might end up doing this anyway to support other compilers.) 110: ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 111: ## -MM, not -M (despite what the docs say). 112: ## - Using -M directly means running the compiler twice (even worse 113: ## than renaming). 114: if test -z "$gccflag"; then 115: gccflag=-MD, 116: fi 117: "$@" -Wp,"$gccflag$tmpdepfile" 118: stat=$? 119: if test $stat -eq 0; then : 120: else 121: rm -f "$tmpdepfile" 122: exit $stat 123: fi 124: rm -f "$depfile" 125: echo "$object : \\" > "$depfile" 126: alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 127: ## The second -e expression handles DOS-style file names with drive letters. 128: sed -e 's/^[^:]*: / /' \ 129: -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 130: ## This next piece of magic avoids the `deleted header file' problem. 131: ## The problem is that when a header file which appears in a .P file 132: ## is deleted, the dependency causes make to die (because there is 133: ## typically no way to rebuild the header). We avoid this by adding 134: ## dummy dependencies for each header file. Too bad gcc doesn't do 135: ## this for us directly. 136: tr ' ' ' 137: ' < "$tmpdepfile" | 138: ## Some versions of gcc put a space before the `:'. On the theory 139: ## that the space means something, we add a space to the output as 140: ## well. 141: ## Some versions of the HPUX 10.20 sed can't process this invocation 142: ## correctly. Breaking it into two sed invocations is a workaround. 143: sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 144: rm -f "$tmpdepfile" 145: ;; 146: 147: hp) 148: # This case exists only to let depend.m4 do its work. It works by 149: # looking at the text of this script. This case will never be run, 150: # since it is checked for above. 151: exit 1 152: ;; 153: 154: sgi) 155: if test "$libtool" = yes; then 156: "$@" "-Wp,-MDupdate,$tmpdepfile" 157: else 158: "$@" -MDupdate "$tmpdepfile" 159: fi 160: stat=$? 161: if test $stat -eq 0; then : 162: else 163: rm -f "$tmpdepfile" 164: exit $stat 165: fi 166: rm -f "$depfile" 167: 168: if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 169: echo "$object : \\" > "$depfile" 170: 171: # Clip off the initial element (the dependent). Don't try to be 172: # clever and replace this with sed code, as IRIX sed won't handle 173: # lines with more than a fixed number of characters (4096 in 174: # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 175: # the IRIX cc adds comments like `#:fec' to the end of the 176: # dependency line. 177: tr ' ' ' 178: ' < "$tmpdepfile" \ 179: | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ 180: tr ' 181: ' ' ' >> $depfile 182: echo >> $depfile 183: 184: # The second pass generates a dummy entry for each header file. 185: tr ' ' ' 186: ' < "$tmpdepfile" \ 187: | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 188: >> $depfile 189: else 190: # The sourcefile does not contain any dependencies, so just 191: # store a dummy comment line, to avoid errors with the Makefile 192: # "include basename.Plo" scheme. 193: echo "#dummy" > "$depfile" 194: fi 195: rm -f "$tmpdepfile" 196: ;; 197: 198: aix) 199: # The C for AIX Compiler uses -M and outputs the dependencies 200: # in a .u file. In older versions, this file always lives in the 201: # current directory. Also, the AIX compiler puts `$object:' at the 202: # start of each line; $object doesn't have directory information. 203: # Version 6 uses the directory in both cases. 204: stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` 205: tmpdepfile="$stripped.u" 206: if test "$libtool" = yes; then 207: "$@" -Wc,-M 208: else 209: "$@" -M 210: fi 211: stat=$? 212: 213: if test -f "$tmpdepfile"; then : 214: else 215: stripped=`echo "$stripped" | sed 's,^.*/,,'` 216: tmpdepfile="$stripped.u" 217: fi 218: 219: if test $stat -eq 0; then : 220: else 221: rm -f "$tmpdepfile" 222: exit $stat 223: fi 224: 225: if test -f "$tmpdepfile"; then 226: outname="$stripped.o" 227: # Each line is of the form `foo.o: dependent.h'. 228: # Do two passes, one to just change these to 229: # `$object: dependent.h' and one to simply `dependent.h:'. 230: sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" 231: sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" 232: else 233: # The sourcefile does not contain any dependencies, so just 234: # store a dummy comment line, to avoid errors with the Makefile 235: # "include basename.Plo" scheme. 236: echo "#dummy" > "$depfile" 237: fi 238: rm -f "$tmpdepfile" 239: ;; 240: 241: icc) 242: # Intel's C compiler understands `-MD -MF file'. However on 243: # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c 244: # ICC 7.0 will fill foo.d with something like 245: # foo.o: sub/foo.c 246: # foo.o: sub/foo.h 247: # which is wrong. We want: 248: # sub/foo.o: sub/foo.c 249: # sub/foo.o: sub/foo.h 250: # sub/foo.c: 251: # sub/foo.h: 252: # ICC 7.1 will output 253: # foo.o: sub/foo.c sub/foo.h 254: # and will wrap long lines using \ : 255: # foo.o: sub/foo.c ... \ 256: # sub/foo.h ... \ 257: # ... 258: 259: "$@" -MD -MF "$tmpdepfile" 260: stat=$? 261: if test $stat -eq 0; then : 262: else 263: rm -f "$tmpdepfile" 264: exit $stat 265: fi 266: rm -f "$depfile" 267: # Each line is of the form `foo.o: dependent.h', 268: # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 269: # Do two passes, one to just change these to 270: # `$object: dependent.h' and one to simply `dependent.h:'. 271: sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 272: # Some versions of the HPUX 10.20 sed can't process this invocation 273: # correctly. Breaking it into two sed invocations is a workaround. 274: sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | 275: sed -e 's/$/ :/' >> "$depfile" 276: rm -f "$tmpdepfile" 277: ;; 278: 279: ia64hp) 280: # The "hp" stanza above does not work with HP's ia64 compilers, 281: # which have integrated preprocessors. The correct option to use 282: # with these is +Maked; it writes dependencies to a file named 283: # 'foo.d', which lands next to the object file, wherever that 284: # happens to be. 285: tmpdepfile=`echo "$object" | sed -e 's/\.o$/.d/'` 286: "$@" +Maked 287: stat=$? 288: if test $stat -eq 0; then : 289: else 290: rm -f "$tmpdepfile" 291: exit $stat 292: fi 293: rm -f "$depfile" 294: 295: # The object file name is correct already. 296: cat "$tmpdepfile" > "$depfile" 297: # Add `dependent.h:' lines. 298: sed -ne '2,${; s/^ //; s/ \\*$//; s/$/:/; p; }' "$tmpdepfile" >> "$depfile" 299: rm -f "$tmpdepfile" 300: ;; 301: 302: tru64) 303: # The Tru64 compiler uses -MD to generate dependencies as a side 304: # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. 305: # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 306: # dependencies in `foo.d' instead, so we check for that too. 307: # Subdirectories are respected. 308: dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 309: test "x$dir" = "x$object" && dir= 310: base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 311: 312: if test "$libtool" = yes; then 313: # With Tru64 cc, shared objects can also be used to make a 314: # static library. This mecanism is used in libtool 1.4 series to 315: # handle both shared and static libraries in a single compilation. 316: # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. 317: # 318: # With libtool 1.5 this exception was removed, and libtool now 319: # generates 2 separate objects for the 2 libraries. These two 320: # compilations output dependencies in in $dir.libs/$base.o.d and 321: # in $dir$base.o.d. We have to check for both files, because 322: # one of the two compilations can be disabled. We should prefer 323: # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 324: # automatically cleaned when .libs/ is deleted, while ignoring 325: # the former would cause a distcleancheck panic. 326: tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 327: tmpdepfile2=$dir$base.o.d # libtool 1.5 328: tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 329: tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 330: "$@" -Wc,-MD 331: else 332: tmpdepfile1=$dir$base.o.d 333: tmpdepfile2=$dir$base.d 334: tmpdepfile3=$dir$base.d 335: tmpdepfile4=$dir$base.d 336: "$@" -MD 337: fi 338: 339: stat=$? 340: if test $stat -eq 0; then : 341: else 342: rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" 343: exit $stat 344: fi 345: 346: for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" 347: do 348: test -f "$tmpdepfile" && break 349: done 350: if test -f "$tmpdepfile"; then 351: sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" 352: # That's a tab and a space in the []. 353: sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" 354: else 355: echo "#dummy" > "$depfile" 356: fi 357: rm -f "$tmpdepfile" 358: ;; 359: 360: #nosideeffect) 361: # This comment above is used by automake to tell side-effect 362: # dependency tracking mechanisms from slower ones. 363: 364: dashmstdout) 365: # Important note: in order to support this mode, a compiler *must* 366: # always write the preprocessed file to stdout, regardless of -o. 367: "$@" || exit $? 368: 369: # Remove the call to Libtool. 370: if test "$libtool" = yes; then 371: while test $1 != '--mode=compile'; do 372: shift 373: done 374: shift 375: fi 376: 377: # Remove `-o $object'. 378: IFS=" " 379: for arg 380: do 381: case $arg in 382: -o) 383: shift 384: ;; 385: $object) 386: shift 387: ;; 388: *) 389: set fnord "$@" "$arg" 390: shift # fnord 391: shift # $arg 392: ;; 393: esac 394: done 395: 396: test -z "$dashmflag" && dashmflag=-M 397: # Require at least two characters before searching for `:' 398: # in the target name. This is to cope with DOS-style filenames: 399: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. 400: "$@" $dashmflag | 401: sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" 402: rm -f "$depfile" 403: cat < "$tmpdepfile" > "$depfile" 404: tr ' ' ' 405: ' < "$tmpdepfile" | \ 406: ## Some versions of the HPUX 10.20 sed can't process this invocation 407: ## correctly. Breaking it into two sed invocations is a workaround. 408: sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 409: rm -f "$tmpdepfile" 410: ;; 411: 412: dashXmstdout) 413: # This case only exists to satisfy depend.m4. It is never actually 414: # run, as this mode is specially recognized in the preamble. 415: exit 1 416: ;; 417: 418: makedepend) 419: "$@" || exit $? 420: # Remove any Libtool call 421: if test "$libtool" = yes; then 422: while test $1 != '--mode=compile'; do 423: shift 424: done 425: shift 426: fi 427: # X makedepend 428: shift 429: cleared=no 430: for arg in "$@"; do 431: case $cleared in 432: no) 433: set ""; shift 434: cleared=yes ;; 435: esac 436: case "$arg" in 437: -D*|-I*) 438: set fnord "$@" "$arg"; shift ;; 439: # Strip any option that makedepend may not understand. Remove 440: # the object too, otherwise makedepend will parse it as a source file. 441: -*|$object) 442: ;; 443: *) 444: set fnord "$@" "$arg"; shift ;; 445: esac 446: done 447: obj_suffix="`echo $object | sed 's/^.*\././'`" 448: touch "$tmpdepfile" 449: ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 450: rm -f "$depfile" 451: cat < "$tmpdepfile" > "$depfile" 452: sed '1,2d' "$tmpdepfile" | tr ' ' ' 453: ' | \ 454: ## Some versions of the HPUX 10.20 sed can't process this invocation 455: ## correctly. Breaking it into two sed invocations is a workaround. 456: sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 457: rm -f "$tmpdepfile" "$tmpdepfile".bak 458: ;; 459: 460: cpp) 461: # Important note: in order to support this mode, a compiler *must* 462: # always write the preprocessed file to stdout. 463: "$@" || exit $? 464: 465: # Remove the call to Libtool. 466: if test "$libtool" = yes; then 467: while test $1 != '--mode=compile'; do 468: shift 469: done 470: shift 471: fi 472: 473: # Remove `-o $object'. 474: IFS=" " 475: for arg 476: do 477: case $arg in 478: -o) 479: shift 480: ;; 481: $object) 482: shift 483: ;; 484: *) 485: set fnord "$@" "$arg" 486: shift # fnord 487: shift # $arg 488: ;; 489: esac 490: done 491: 492: "$@" -E | 493: sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 494: -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | 495: sed '$ s: \\$::' > "$tmpdepfile" 496: rm -f "$depfile" 497: echo "$object : \\" > "$depfile" 498: cat < "$tmpdepfile" >> "$depfile" 499: sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 500: rm -f "$tmpdepfile" 501: ;; 502: 503: msvisualcpp) 504: # Important note: in order to support this mode, a compiler *must* 505: # always write the preprocessed file to stdout, regardless of -o, 506: # because we must use -o when running libtool. 507: "$@" || exit $? 508: IFS=" " 509: for arg 510: do 511: case "$arg" in 512: "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 513: set fnord "$@" 514: shift 515: shift 516: ;; 517: *) 518: set fnord "$@" "$arg" 519: shift 520: shift 521: ;; 522: esac 523: done 524: "$@" -E | 525: sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" 526: rm -f "$depfile" 527: echo "$object : \\" > "$depfile" 528: . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" 529: echo " " >> "$depfile" 530: . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" 531: rm -f "$tmpdepfile" 532: ;; 533: 534: none) 535: exec "$@" 536: ;; 537: 538: *) 539: echo "Unknown depmode $depmode" 1>&2 540: exit 1 541: ;; 542: esac 543: 544: exit 0 545: 546: # Local Variables: 547: # mode: shell-script 548: # sh-indentation: 2 549: # eval: (add-hook 'write-file-hooks 'time-stamp) 550: # time-stamp-start: "scriptversion=" 551: # time-stamp-format: "%:y-%02m-%02d.%02H" 552: # time-stamp-end: "$" 553: # End: