depcomp revision 1.1
1#! /bin/sh 2# depcomp - compile a program generating dependencies as side-effects 3 4scriptversion=2007-03-29.01 5 6# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 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 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 90case "$depmode" in 91gcc3) 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 118gcc) 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 161hp) 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 168sgi) 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 212aix) 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 dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 219 test "x$dir" = "x$object" && dir= 220 base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 221 if test "$libtool" = yes; then 222 tmpdepfile1=$dir$base.u 223 tmpdepfile2=$base.u 224 tmpdepfile3=$dir.libs/$base.u 225 "$@" -Wc,-M 226 else 227 tmpdepfile1=$dir$base.u 228 tmpdepfile2=$dir$base.u 229 tmpdepfile3=$dir$base.u 230 "$@" -M 231 fi 232 stat=$? 233 234 if test $stat -eq 0; then : 235 else 236 rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 237 exit $stat 238 fi 239 240 for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 241 do 242 test -f "$tmpdepfile" && break 243 done 244 if test -f "$tmpdepfile"; then 245 # Each line is of the form `foo.o: dependent.h'. 246 # Do two passes, one to just change these to 247 # `$object: dependent.h' and one to simply `dependent.h:'. 248 sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" 249 # That's a tab and a space in the []. 250 sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" 251 else 252 # The sourcefile does not contain any dependencies, so just 253 # store a dummy comment line, to avoid errors with the Makefile 254 # "include basename.Plo" scheme. 255 echo "#dummy" > "$depfile" 256 fi 257 rm -f "$tmpdepfile" 258 ;; 259 260icc) 261 # Intel's C compiler understands `-MD -MF file'. However on 262 # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c 263 # ICC 7.0 will fill foo.d with something like 264 # foo.o: sub/foo.c 265 # foo.o: sub/foo.h 266 # which is wrong. We want: 267 # sub/foo.o: sub/foo.c 268 # sub/foo.o: sub/foo.h 269 # sub/foo.c: 270 # sub/foo.h: 271 # ICC 7.1 will output 272 # foo.o: sub/foo.c sub/foo.h 273 # and will wrap long lines using \ : 274 # foo.o: sub/foo.c ... \ 275 # sub/foo.h ... \ 276 # ... 277 278 "$@" -MD -MF "$tmpdepfile" 279 stat=$? 280 if test $stat -eq 0; then : 281 else 282 rm -f "$tmpdepfile" 283 exit $stat 284 fi 285 rm -f "$depfile" 286 # Each line is of the form `foo.o: dependent.h', 287 # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 288 # Do two passes, one to just change these to 289 # `$object: dependent.h' and one to simply `dependent.h:'. 290 sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 291 # Some versions of the HPUX 10.20 sed can't process this invocation 292 # correctly. Breaking it into two sed invocations is a workaround. 293 sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | 294 sed -e 's/$/ :/' >> "$depfile" 295 rm -f "$tmpdepfile" 296 ;; 297 298hp2) 299 # The "hp" stanza above does not work with aCC (C++) and HP's ia64 300 # compilers, which have integrated preprocessors. The correct option 301 # to use with these is +Maked; it writes dependencies to a file named 302 # 'foo.d', which lands next to the object file, wherever that 303 # happens to be. 304 # Much of this is similar to the tru64 case; see comments there. 305 dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 306 test "x$dir" = "x$object" && dir= 307 base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 308 if test "$libtool" = yes; then 309 tmpdepfile1=$dir$base.d 310 tmpdepfile2=$dir.libs/$base.d 311 "$@" -Wc,+Maked 312 else 313 tmpdepfile1=$dir$base.d 314 tmpdepfile2=$dir$base.d 315 "$@" +Maked 316 fi 317 stat=$? 318 if test $stat -eq 0; then : 319 else 320 rm -f "$tmpdepfile1" "$tmpdepfile2" 321 exit $stat 322 fi 323 324 for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 325 do 326 test -f "$tmpdepfile" && break 327 done 328 if test -f "$tmpdepfile"; then 329 sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" 330 # Add `dependent.h:' lines. 331 sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" 332 else 333 echo "#dummy" > "$depfile" 334 fi 335 rm -f "$tmpdepfile" "$tmpdepfile2" 336 ;; 337 338tru64) 339 # The Tru64 compiler uses -MD to generate dependencies as a side 340 # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. 341 # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 342 # dependencies in `foo.d' instead, so we check for that too. 343 # Subdirectories are respected. 344 dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 345 test "x$dir" = "x$object" && dir= 346 base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 347 348 if test "$libtool" = yes; then 349 # With Tru64 cc, shared objects can also be used to make a 350 # static library. This mechanism is used in libtool 1.4 series to 351 # handle both shared and static libraries in a single compilation. 352 # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. 353 # 354 # With libtool 1.5 this exception was removed, and libtool now 355 # generates 2 separate objects for the 2 libraries. These two 356 # compilations output dependencies in $dir.libs/$base.o.d and 357 # in $dir$base.o.d. We have to check for both files, because 358 # one of the two compilations can be disabled. We should prefer 359 # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 360 # automatically cleaned when .libs/ is deleted, while ignoring 361 # the former would cause a distcleancheck panic. 362 tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 363 tmpdepfile2=$dir$base.o.d # libtool 1.5 364 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 365 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 366 "$@" -Wc,-MD 367 else 368 tmpdepfile1=$dir$base.o.d 369 tmpdepfile2=$dir$base.d 370 tmpdepfile3=$dir$base.d 371 tmpdepfile4=$dir$base.d 372 "$@" -MD 373 fi 374 375 stat=$? 376 if test $stat -eq 0; then : 377 else 378 rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" 379 exit $stat 380 fi 381 382 for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" 383 do 384 test -f "$tmpdepfile" && break 385 done 386 if test -f "$tmpdepfile"; then 387 sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" 388 # That's a tab and a space in the []. 389 sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" 390 else 391 echo "#dummy" > "$depfile" 392 fi 393 rm -f "$tmpdepfile" 394 ;; 395 396#nosideeffect) 397 # This comment above is used by automake to tell side-effect 398 # dependency tracking mechanisms from slower ones. 399 400dashmstdout) 401 # Important note: in order to support this mode, a compiler *must* 402 # always write the preprocessed file to stdout, regardless of -o. 403 "$@" || exit $? 404 405 # Remove the call to Libtool. 406 if test "$libtool" = yes; then 407 while test $1 != '--mode=compile'; do 408 shift 409 done 410 shift 411 fi 412 413 # Remove `-o $object'. 414 IFS=" " 415 for arg 416 do 417 case $arg in 418 -o) 419 shift 420 ;; 421 $object) 422 shift 423 ;; 424 *) 425 set fnord "$@" "$arg" 426 shift # fnord 427 shift # $arg 428 ;; 429 esac 430 done 431 432 test -z "$dashmflag" && dashmflag=-M 433 # Require at least two characters before searching for `:' 434 # in the target name. This is to cope with DOS-style filenames: 435 # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. 436 "$@" $dashmflag | 437 sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" 438 rm -f "$depfile" 439 cat < "$tmpdepfile" > "$depfile" 440 tr ' ' ' 441' < "$tmpdepfile" | \ 442## Some versions of the HPUX 10.20 sed can't process this invocation 443## correctly. Breaking it into two sed invocations is a workaround. 444 sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 445 rm -f "$tmpdepfile" 446 ;; 447 448dashXmstdout) 449 # This case only exists to satisfy depend.m4. It is never actually 450 # run, as this mode is specially recognized in the preamble. 451 exit 1 452 ;; 453 454makedepend) 455 "$@" || exit $? 456 # Remove any Libtool call 457 if test "$libtool" = yes; then 458 while test $1 != '--mode=compile'; do 459 shift 460 done 461 shift 462 fi 463 # X makedepend 464 shift 465 cleared=no 466 for arg in "$@"; do 467 case $cleared in 468 no) 469 set ""; shift 470 cleared=yes ;; 471 esac 472 case "$arg" in 473 -D*|-I*) 474 set fnord "$@" "$arg"; shift ;; 475 # Strip any option that makedepend may not understand. Remove 476 # the object too, otherwise makedepend will parse it as a source file. 477 -*|$object) 478 ;; 479 *) 480 set fnord "$@" "$arg"; shift ;; 481 esac 482 done 483 obj_suffix="`echo $object | sed 's/^.*\././'`" 484 touch "$tmpdepfile" 485 ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 486 rm -f "$depfile" 487 cat < "$tmpdepfile" > "$depfile" 488 sed '1,2d' "$tmpdepfile" | tr ' ' ' 489' | \ 490## Some versions of the HPUX 10.20 sed can't process this invocation 491## correctly. Breaking it into two sed invocations is a workaround. 492 sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 493 rm -f "$tmpdepfile" "$tmpdepfile".bak 494 ;; 495 496cpp) 497 # Important note: in order to support this mode, a compiler *must* 498 # always write the preprocessed file to stdout. 499 "$@" || exit $? 500 501 # Remove the call to Libtool. 502 if test "$libtool" = yes; then 503 while test $1 != '--mode=compile'; do 504 shift 505 done 506 shift 507 fi 508 509 # Remove `-o $object'. 510 IFS=" " 511 for arg 512 do 513 case $arg in 514 -o) 515 shift 516 ;; 517 $object) 518 shift 519 ;; 520 *) 521 set fnord "$@" "$arg" 522 shift # fnord 523 shift # $arg 524 ;; 525 esac 526 done 527 528 "$@" -E | 529 sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 530 -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | 531 sed '$ s: \\$::' > "$tmpdepfile" 532 rm -f "$depfile" 533 echo "$object : \\" > "$depfile" 534 cat < "$tmpdepfile" >> "$depfile" 535 sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 536 rm -f "$tmpdepfile" 537 ;; 538 539msvisualcpp) 540 # Important note: in order to support this mode, a compiler *must* 541 # always write the preprocessed file to stdout, regardless of -o, 542 # because we must use -o when running libtool. 543 "$@" || exit $? 544 IFS=" " 545 for arg 546 do 547 case "$arg" in 548 "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 549 set fnord "$@" 550 shift 551 shift 552 ;; 553 *) 554 set fnord "$@" "$arg" 555 shift 556 shift 557 ;; 558 esac 559 done 560 "$@" -E | 561 sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" 562 rm -f "$depfile" 563 echo "$object : \\" > "$depfile" 564 . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" 565 echo " " >> "$depfile" 566 . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" 567 rm -f "$tmpdepfile" 568 ;; 569 570none) 571 exec "$@" 572 ;; 573 574*) 575 echo "Unknown depmode $depmode" 1>&2 576 exit 1 577 ;; 578esac 579 580exit 0 581 582# Local Variables: 583# mode: shell-script 584# sh-indentation: 2 585# eval: (add-hook 'write-file-hooks 'time-stamp) 586# time-stamp-start: "scriptversion=" 587# time-stamp-format: "%:y-%02m-%02d.%02H" 588# time-stamp-end: "$" 589# End: 590