1 #! /bin/sh 2 3 # depcomp - compile a program generating dependencies as side-effects 4 # Copyright 1999, 2000 Free Software Foundation, Inc. 5 6 # This program is free software; you can redistribute it and/or modify 7 # it under the terms of the GNU General Public License as published by 8 # the Free Software Foundation; either version 2, or (at your option) 9 # any later version. 10 11 # This program is distributed in the hope that it will be useful, 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 # GNU General Public License for more details. 15 16 # You should have received a copy of the GNU General Public License 17 # along with this program; if not, write to the Free Software 18 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 19 # 02111-1307, USA. 20 21 # As a special exception to the GNU General Public License, if you 22 # distribute this file as part of a program that contains a 23 # configuration script generated by Autoconf, you may include it under 24 # the same distribution terms that you use for the rest of that program. 25 26 # Originally written by Alexandre Oliva <oliva (at] dcc.unicamp.br>. 27 28 if test -z "$depmode" || test -z "$source" || test -z "$object"; then 29 echo "depcomp: Variables source, object and depmode must be set" 1>&2 30 exit 1 31 fi 32 # `libtool' can also be set to `yes' or `no'. 33 34 if test -z "$depfile"; then 35 base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` 36 dir=`echo "$object" | sed 's,/.*$,/,'` 37 if test "$dir" = "$object"; then 38 dir= 39 fi 40 # FIXME: should be _deps on DOS. 41 depfile="$dir.deps/$base" 42 fi 43 44 tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 45 46 rm -f "$tmpdepfile" 47 48 # Some modes work just like other modes, but use different flags. We 49 # parameterize here, but still list the modes in the big case below, 50 # to make depend.m4 easier to write. Note that we *cannot* use a case 51 # here, because this file can only contain one case statement. 52 if test "$depmode" = hp; then 53 # HP compiler uses -M and no extra arg. 54 gccflag=-M 55 depmode=gcc 56 fi 57 58 if test "$depmode" = dashXmstdout; then 59 # This is just like dashmstdout with a different argument. 60 dashmflag=-xM 61 depmode=dashmstdout 62 fi 63 64 case "$depmode" in 65 gcc3) 66 ## gcc 3 implements dependency tracking that does exactly what 67 ## we want. Yay! Note: for some reason libtool 1.4 doesn't like 68 ## it if -MD -MP comes after the -MF stuff. Hmm. 69 "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" 70 stat=$? 71 if test $stat -eq 0; then : 72 else 73 rm -f "$tmpdepfile" 74 exit $stat 75 fi 76 mv "$tmpdepfile" "$depfile" 77 ;; 78 79 gcc) 80 ## There are various ways to get dependency output from gcc. Here's 81 ## why we pick this rather obscure method: 82 ## - Don't want to use -MD because we'd like the dependencies to end 83 ## up in a subdir. Having to rename by hand is ugly. 84 ## (We might end up doing this anyway to support other compilers.) 85 ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 86 ## -MM, not -M (despite what the docs say). 87 ## - Using -M directly means running the compiler twice (even worse 88 ## than renaming). 89 if test -z "$gccflag"; then 90 gccflag=-MD, 91 fi 92 "$@" -Wp,"$gccflag$tmpdepfile" 93 stat=$? 94 if test $stat -eq 0; then : 95 else 96 rm -f "$tmpdepfile" 97 exit $stat 98 fi 99 rm -f "$depfile" 100 echo "$object : \\" > "$depfile" 101 alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 102 ## The second -e expression handles DOS-style file names with drive letters. 103 sed -e 's/^[^:]*: / /' \ 104 -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 105 ## This next piece of magic avoids the `deleted header file' problem. 106 ## The problem is that when a header file which appears in a .P file 107 ## is deleted, the dependency causes make to die (because there is 108 ## typically no way to rebuild the header). We avoid this by adding 109 ## dummy dependencies for each header file. Too bad gcc doesn't do 110 ## this for us directly. 111 tr ' ' ' 112 ' < "$tmpdepfile" | 113 ## Some versions of gcc put a space before the `:'. On the theory 114 ## that the space means something, we add a space to the output as 115 ## well. 116 ## Some versions of the HPUX 10.20 sed can't process this invocation 117 ## correctly. Breaking it into two sed invocations is a workaround. 118 sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 119 rm -f "$tmpdepfile" 120 ;; 121 122 hp) 123 # This case exists only to let depend.m4 do its work. It works by 124 # looking at the text of this script. This case will never be run, 125 # since it is checked for above. 126 exit 1 127 ;; 128 129 sgi) 130 if test "$libtool" = yes; then 131 "$@" "-Wp,-MDupdate,$tmpdepfile" 132 else 133 "$@" -MDupdate "$tmpdepfile" 134 fi 135 stat=$? 136 if test $stat -eq 0; then : 137 else 138 rm -f "$tmpdepfile" 139 exit $stat 140 fi 141 rm -f "$depfile" 142 143 if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 144 echo "$object : \\" > "$depfile" 145 146 # Clip off the initial element (the dependent). Don't try to be 147 # clever and replace this with sed code, as IRIX sed won't handle 148 # lines with more than a fixed number of characters (4096 in 149 # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 150 # the IRIX cc adds comments like `#:fec' to the end of the 151 # dependency line. 152 tr ' ' ' 153 ' < "$tmpdepfile" \ 154 | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ 155 tr ' 156 ' ' ' >> $depfile 157 echo >> $depfile 158 159 # The second pass generates a dummy entry for each header file. 160 tr ' ' ' 161 ' < "$tmpdepfile" \ 162 | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 163 >> $depfile 164 else 165 # The sourcefile does not contain any dependencies, so just 166 # store a dummy comment line, to avoid errors with the Makefile 167 # "include basename.Plo" scheme. 168 echo "#dummy" > "$depfile" 169 fi 170 rm -f "$tmpdepfile" 171 ;; 172 173 aix) 174 # The C for AIX Compiler uses -M and outputs the dependencies 175 # in a .u file. This file always lives in the current directory. 176 # Also, the AIX compiler puts `$object:' at the start of each line; 177 # $object doesn't have directory information. 178 stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` 179 tmpdepfile="$stripped.u" 180 outname="$stripped.o" 181 if test "$libtool" = yes; then 182 "$@" -Wc,-M 183 else 184 "$@" -M 185 fi 186 187 stat=$? 188 if test $stat -eq 0; then : 189 else 190 rm -f "$tmpdepfile" 191 exit $stat 192 fi 193 194 if test -f "$tmpdepfile"; then 195 # Each line is of the form `foo.o: dependent.h'. 196 # Do two passes, one to just change these to 197 # `$object: dependent.h' and one to simply `dependent.h:'. 198 sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" 199 sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" 200 else 201 # The sourcefile does not contain any dependencies, so just 202 # store a dummy comment line, to avoid errors with the Makefile 203 # "include basename.Plo" scheme. 204 echo "#dummy" > "$depfile" 205 fi 206 rm -f "$tmpdepfile" 207 ;; 208 209 tru64) 210 # The Tru64 AIX compiler uses -MD to generate dependencies as a side 211 # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. 212 # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 213 # dependencies in `foo.d' instead, so we check for that too. 214 # Subdirectories are respected. 215 216 base=`echo "$object" | sed -e 's/\.o$/.d/' -e 's/\.lo$/.d/'` 217 tmpdepfile1="$base.o.d" 218 tmpdepfile2="$base.d" 219 if test "$libtool" = yes; then 220 "$@" -Wc,-MD 221 else 222 "$@" -MD 223 fi 224 225 stat=$? 226 if test $stat -eq 0; then : 227 else 228 rm -f "$tmpdepfile1" "$tmpdepfile2" 229 exit $stat 230 fi 231 232 if test -f "$tmpdepfile1"; then 233 tmpdepfile="$tmpdepfile1" 234 else 235 tmpdepfile="$tmpdepfile2" 236 fi 237 if test -f "$tmpdepfile"; then 238 sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" 239 # That's a space and a tab in the []. 240 sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" 241 else 242 echo "#dummy" > "$depfile" 243 fi 244 rm -f "$tmpdepfile" 245 ;; 246 247 #nosideeffect) 248 # This comment above is used by automake to tell side-effect 249 # dependency tracking mechanisms from slower ones. 250 251 dashmstdout) 252 # Important note: in order to support this mode, a compiler *must* 253 # always write the proprocessed file to stdout, regardless of -o, 254 # because we must use -o when running libtool. 255 test -z "$dashmflag" && dashmflag=-M 256 ( IFS=" " 257 case " $* " in 258 *" --mode=compile "*) # this is libtool, let us make it quiet 259 for arg 260 do # cycle over the arguments 261 case "$arg" in 262 "--mode=compile") 263 # insert --quiet before "--mode=compile" 264 set fnord "$@" --quiet 265 shift # fnord 266 ;; 267 esac 268 set fnord "$@" "$arg" 269 shift # fnord 270 shift # "$arg" 271 done 272 ;; 273 esac 274 "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" 275 ) & 276 proc=$! 277 "$@" 278 stat=$? 279 wait "$proc" 280 if test "$stat" != 0; then exit $stat; fi 281 rm -f "$depfile" 282 cat < "$tmpdepfile" > "$depfile" 283 tr ' ' ' 284 ' < "$tmpdepfile" | \ 285 ## Some versions of the HPUX 10.20 sed can't process this invocation 286 ## correctly. Breaking it into two sed invocations is a workaround. 287 sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 288 rm -f "$tmpdepfile" 289 ;; 290 291 dashXmstdout) 292 # This case only exists to satisfy depend.m4. It is never actually 293 # run, as this mode is specially recognized in the preamble. 294 exit 1 295 ;; 296 297 makedepend) 298 # X makedepend 299 ( 300 shift 301 cleared=no 302 for arg in "$@"; do 303 case $cleared in no) 304 set ""; shift 305 cleared=yes 306 esac 307 case "$arg" in 308 -D*|-I*) 309 set fnord "$@" "$arg"; shift;; 310 -*) 311 ;; 312 *) 313 set fnord "$@" "$arg"; shift;; 314 esac 315 done 316 obj_suffix="`echo $object | sed 's/^.*\././'`" 317 touch "$tmpdepfile" 318 ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" 319 ) & 320 proc=$! 321 "$@" 322 stat=$? 323 wait "$proc" 324 if test "$stat" != 0; then exit $stat; fi 325 rm -f "$depfile" 326 cat < "$tmpdepfile" > "$depfile" 327 sed '1,2d' "$tmpdepfile" | tr ' ' ' 328 ' | \ 329 ## Some versions of the HPUX 10.20 sed can't process this invocation 330 ## correctly. Breaking it into two sed invocations is a workaround. 331 sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 332 rm -f "$tmpdepfile" "$tmpdepfile".bak 333 ;; 334 335 cpp) 336 # Important note: in order to support this mode, a compiler *must* 337 # always write the proprocessed file to stdout, regardless of -o, 338 # because we must use -o when running libtool. 339 ( IFS=" " 340 case " $* " in 341 *" --mode=compile "*) 342 for arg 343 do # cycle over the arguments 344 case $arg in 345 "--mode=compile") 346 # insert --quiet before "--mode=compile" 347 set fnord "$@" --quiet 348 shift # fnord 349 ;; 350 esac 351 set fnord "$@" "$arg" 352 shift # fnord 353 shift # "$arg" 354 done 355 ;; 356 esac 357 "$@" -E | 358 sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | 359 sed '$ s: \\$::' > "$tmpdepfile" 360 ) & 361 proc=$! 362 "$@" 363 stat=$? 364 wait "$proc" 365 if test "$stat" != 0; then exit $stat; fi 366 rm -f "$depfile" 367 echo "$object : \\" > "$depfile" 368 cat < "$tmpdepfile" >> "$depfile" 369 sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 370 rm -f "$tmpdepfile" 371 ;; 372 373 msvisualcpp) 374 # Important note: in order to support this mode, a compiler *must* 375 # always write the proprocessed file to stdout, regardless of -o, 376 # because we must use -o when running libtool. 377 ( IFS=" " 378 case " $* " in 379 *" --mode=compile "*) 380 for arg 381 do # cycle over the arguments 382 case $arg in 383 "--mode=compile") 384 # insert --quiet before "--mode=compile" 385 set fnord "$@" --quiet 386 shift # fnord 387 ;; 388 esac 389 set fnord "$@" "$arg" 390 shift # fnord 391 shift # "$arg" 392 done 393 ;; 394 esac 395 for arg 396 do 397 case "$arg" in 398 "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 399 set fnord "$@" 400 shift 401 shift 402 ;; 403 *) 404 set fnord "$@" "$arg" 405 shift 406 shift 407 ;; 408 esac 409 done 410 "$@" -E | 411 sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" 412 ) & 413 proc=$! 414 "$@" 415 stat=$? 416 wait "$proc" 417 if test "$stat" != 0; then exit $stat; fi 418 rm -f "$depfile" 419 echo "$object : \\" > "$depfile" 420 . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" 421 echo " " >> "$depfile" 422 . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" 423 rm -f "$tmpdepfile" 424 ;; 425 426 none) 427 exec "$@" 428 ;; 429 430 *) 431 echo "Unknown depmode $depmode" 1>&2 432 exit 1 433 ;; 434 esac 435 436 exit 0 437