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