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