1 1.1 christos #! /bin/sh 2 1.1 christos # depcomp - compile a program generating dependencies as side-effects 3 1.1 christos 4 1.1.1.2 christos scriptversion=2018-03-07.03; # UTC 5 1.1 christos 6 1.1.1.2 christos # Copyright (C) 1999-2021 Free Software Foundation, Inc. 7 1.1 christos 8 1.1 christos # This program is free software; you can redistribute it and/or modify 9 1.1 christos # it under the terms of the GNU General Public License as published by 10 1.1 christos # the Free Software Foundation; either version 2, or (at your option) 11 1.1 christos # any later version. 12 1.1 christos 13 1.1 christos # This program is distributed in the hope that it will be useful, 14 1.1 christos # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 1.1 christos # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 1.1 christos # GNU General Public License for more details. 17 1.1 christos 18 1.1 christos # You should have received a copy of the GNU General Public License 19 1.1.1.2 christos # along with this program. If not, see <https://www.gnu.org/licenses/>. 20 1.1 christos 21 1.1 christos # As a special exception to the GNU General Public License, if you 22 1.1 christos # distribute this file as part of a program that contains a 23 1.1 christos # configuration script generated by Autoconf, you may include it under 24 1.1 christos # the same distribution terms that you use for the rest of that program. 25 1.1 christos 26 1.1 christos # Originally written by Alexandre Oliva <oliva (at] dcc.unicamp.br>. 27 1.1 christos 28 1.1 christos case $1 in 29 1.1 christos '') 30 1.1 christos echo "$0: No command. Try '$0 --help' for more information." 1>&2 31 1.1 christos exit 1; 32 1.1 christos ;; 33 1.1 christos -h | --h*) 34 1.1 christos cat <<\EOF 35 1.1 christos Usage: depcomp [--help] [--version] PROGRAM [ARGS] 36 1.1 christos 37 1.1 christos Run PROGRAMS ARGS to compile a file, generating dependencies 38 1.1 christos as side-effects. 39 1.1 christos 40 1.1 christos Environment variables: 41 1.1 christos depmode Dependency tracking mode. 42 1.1 christos source Source file read by 'PROGRAMS ARGS'. 43 1.1 christos object Object file output by 'PROGRAMS ARGS'. 44 1.1 christos DEPDIR directory where to store dependencies. 45 1.1 christos depfile Dependency file to output. 46 1.1 christos tmpdepfile Temporary file to use when outputting dependencies. 47 1.1 christos libtool Whether libtool is used (yes/no). 48 1.1 christos 49 1.1 christos Report bugs to <bug-automake@gnu.org>. 50 1.1 christos EOF 51 1.1 christos exit $? 52 1.1 christos ;; 53 1.1 christos -v | --v*) 54 1.1 christos echo "depcomp $scriptversion" 55 1.1 christos exit $? 56 1.1 christos ;; 57 1.1 christos esac 58 1.1 christos 59 1.1 christos # Get the directory component of the given path, and save it in the 60 1.1 christos # global variables '$dir'. Note that this directory component will 61 1.1 christos # be either empty or ending with a '/' character. This is deliberate. 62 1.1 christos set_dir_from () 63 1.1 christos { 64 1.1 christos case $1 in 65 1.1 christos */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66 1.1 christos *) dir=;; 67 1.1 christos esac 68 1.1 christos } 69 1.1 christos 70 1.1 christos # Get the suffix-stripped basename of the given path, and save it the 71 1.1 christos # global variable '$base'. 72 1.1 christos set_base_from () 73 1.1 christos { 74 1.1 christos base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75 1.1 christos } 76 1.1 christos 77 1.1 christos # If no dependency file was actually created by the compiler invocation, 78 1.1 christos # we still have to create a dummy depfile, to avoid errors with the 79 1.1 christos # Makefile "include basename.Plo" scheme. 80 1.1 christos make_dummy_depfile () 81 1.1 christos { 82 1.1 christos echo "#dummy" > "$depfile" 83 1.1 christos } 84 1.1 christos 85 1.1 christos # Factor out some common post-processing of the generated depfile. 86 1.1 christos # Requires the auxiliary global variable '$tmpdepfile' to be set. 87 1.1 christos aix_post_process_depfile () 88 1.1 christos { 89 1.1 christos # If the compiler actually managed to produce a dependency file, 90 1.1 christos # post-process it. 91 1.1 christos if test -f "$tmpdepfile"; then 92 1.1 christos # Each line is of the form 'foo.o: dependency.h'. 93 1.1 christos # Do two passes, one to just change these to 94 1.1 christos # $object: dependency.h 95 1.1 christos # and one to simply output 96 1.1 christos # dependency.h: 97 1.1 christos # which is needed to avoid the deleted-header problem. 98 1.1 christos { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99 1.1 christos sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100 1.1 christos } > "$depfile" 101 1.1 christos rm -f "$tmpdepfile" 102 1.1 christos else 103 1.1 christos make_dummy_depfile 104 1.1 christos fi 105 1.1 christos } 106 1.1 christos 107 1.1 christos # A tabulation character. 108 1.1 christos tab=' ' 109 1.1 christos # A newline character. 110 1.1 christos nl=' 111 1.1 christos ' 112 1.1 christos # Character ranges might be problematic outside the C locale. 113 1.1 christos # These definitions help. 114 1.1 christos upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115 1.1 christos lower=abcdefghijklmnopqrstuvwxyz 116 1.1 christos digits=0123456789 117 1.1 christos alpha=${upper}${lower} 118 1.1 christos 119 1.1 christos if test -z "$depmode" || test -z "$source" || test -z "$object"; then 120 1.1 christos echo "depcomp: Variables source, object and depmode must be set" 1>&2 121 1.1 christos exit 1 122 1.1 christos fi 123 1.1 christos 124 1.1 christos # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125 1.1 christos depfile=${depfile-`echo "$object" | 126 1.1 christos sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127 1.1 christos tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128 1.1 christos 129 1.1 christos rm -f "$tmpdepfile" 130 1.1 christos 131 1.1 christos # Avoid interferences from the environment. 132 1.1 christos gccflag= dashmflag= 133 1.1 christos 134 1.1 christos # Some modes work just like other modes, but use different flags. We 135 1.1 christos # parameterize here, but still list the modes in the big case below, 136 1.1 christos # to make depend.m4 easier to write. Note that we *cannot* use a case 137 1.1 christos # here, because this file can only contain one case statement. 138 1.1 christos if test "$depmode" = hp; then 139 1.1 christos # HP compiler uses -M and no extra arg. 140 1.1 christos gccflag=-M 141 1.1 christos depmode=gcc 142 1.1 christos fi 143 1.1 christos 144 1.1 christos if test "$depmode" = dashXmstdout; then 145 1.1 christos # This is just like dashmstdout with a different argument. 146 1.1 christos dashmflag=-xM 147 1.1 christos depmode=dashmstdout 148 1.1 christos fi 149 1.1 christos 150 1.1 christos cygpath_u="cygpath -u -f -" 151 1.1 christos if test "$depmode" = msvcmsys; then 152 1.1 christos # This is just like msvisualcpp but w/o cygpath translation. 153 1.1 christos # Just convert the backslash-escaped backslashes to single forward 154 1.1 christos # slashes to satisfy depend.m4 155 1.1 christos cygpath_u='sed s,\\\\,/,g' 156 1.1 christos depmode=msvisualcpp 157 1.1 christos fi 158 1.1 christos 159 1.1 christos if test "$depmode" = msvc7msys; then 160 1.1 christos # This is just like msvc7 but w/o cygpath translation. 161 1.1 christos # Just convert the backslash-escaped backslashes to single forward 162 1.1 christos # slashes to satisfy depend.m4 163 1.1 christos cygpath_u='sed s,\\\\,/,g' 164 1.1 christos depmode=msvc7 165 1.1 christos fi 166 1.1 christos 167 1.1 christos if test "$depmode" = xlc; then 168 1.1 christos # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169 1.1 christos gccflag=-qmakedep=gcc,-MF 170 1.1 christos depmode=gcc 171 1.1 christos fi 172 1.1 christos 173 1.1 christos case "$depmode" in 174 1.1 christos gcc3) 175 1.1 christos ## gcc 3 implements dependency tracking that does exactly what 176 1.1 christos ## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177 1.1 christos ## it if -MD -MP comes after the -MF stuff. Hmm. 178 1.1 christos ## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179 1.1 christos ## the command line argument order; so add the flags where they 180 1.1 christos ## appear in depend2.am. Note that the slowdown incurred here 181 1.1 christos ## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182 1.1 christos for arg 183 1.1 christos do 184 1.1 christos case $arg in 185 1.1 christos -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186 1.1 christos *) set fnord "$@" "$arg" ;; 187 1.1 christos esac 188 1.1 christos shift # fnord 189 1.1 christos shift # $arg 190 1.1 christos done 191 1.1 christos "$@" 192 1.1 christos stat=$? 193 1.1 christos if test $stat -ne 0; then 194 1.1 christos rm -f "$tmpdepfile" 195 1.1 christos exit $stat 196 1.1 christos fi 197 1.1 christos mv "$tmpdepfile" "$depfile" 198 1.1 christos ;; 199 1.1 christos 200 1.1 christos gcc) 201 1.1 christos ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202 1.1 christos ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203 1.1 christos ## (see the conditional assignment to $gccflag above). 204 1.1 christos ## There are various ways to get dependency output from gcc. Here's 205 1.1 christos ## why we pick this rather obscure method: 206 1.1 christos ## - Don't want to use -MD because we'd like the dependencies to end 207 1.1 christos ## up in a subdir. Having to rename by hand is ugly. 208 1.1 christos ## (We might end up doing this anyway to support other compilers.) 209 1.1 christos ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210 1.1 christos ## -MM, not -M (despite what the docs say). Also, it might not be 211 1.1 christos ## supported by the other compilers which use the 'gcc' depmode. 212 1.1 christos ## - Using -M directly means running the compiler twice (even worse 213 1.1 christos ## than renaming). 214 1.1 christos if test -z "$gccflag"; then 215 1.1 christos gccflag=-MD, 216 1.1 christos fi 217 1.1 christos "$@" -Wp,"$gccflag$tmpdepfile" 218 1.1 christos stat=$? 219 1.1 christos if test $stat -ne 0; then 220 1.1 christos rm -f "$tmpdepfile" 221 1.1 christos exit $stat 222 1.1 christos fi 223 1.1 christos rm -f "$depfile" 224 1.1 christos echo "$object : \\" > "$depfile" 225 1.1 christos # The second -e expression handles DOS-style file names with drive 226 1.1 christos # letters. 227 1.1 christos sed -e 's/^[^:]*: / /' \ 228 1.1 christos -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229 1.1 christos ## This next piece of magic avoids the "deleted header file" problem. 230 1.1 christos ## The problem is that when a header file which appears in a .P file 231 1.1 christos ## is deleted, the dependency causes make to die (because there is 232 1.1 christos ## typically no way to rebuild the header). We avoid this by adding 233 1.1 christos ## dummy dependencies for each header file. Too bad gcc doesn't do 234 1.1 christos ## this for us directly. 235 1.1 christos ## Some versions of gcc put a space before the ':'. On the theory 236 1.1 christos ## that the space means something, we add a space to the output as 237 1.1 christos ## well. hp depmode also adds that space, but also prefixes the VPATH 238 1.1 christos ## to the object. Take care to not repeat it in the output. 239 1.1 christos ## Some versions of the HPUX 10.20 sed can't process this invocation 240 1.1 christos ## correctly. Breaking it into two sed invocations is a workaround. 241 1.1 christos tr ' ' "$nl" < "$tmpdepfile" \ 242 1.1 christos | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243 1.1 christos | sed -e 's/$/ :/' >> "$depfile" 244 1.1 christos rm -f "$tmpdepfile" 245 1.1 christos ;; 246 1.1 christos 247 1.1 christos hp) 248 1.1 christos # This case exists only to let depend.m4 do its work. It works by 249 1.1 christos # looking at the text of this script. This case will never be run, 250 1.1 christos # since it is checked for above. 251 1.1 christos exit 1 252 1.1 christos ;; 253 1.1 christos 254 1.1 christos sgi) 255 1.1 christos if test "$libtool" = yes; then 256 1.1 christos "$@" "-Wp,-MDupdate,$tmpdepfile" 257 1.1 christos else 258 1.1 christos "$@" -MDupdate "$tmpdepfile" 259 1.1 christos fi 260 1.1 christos stat=$? 261 1.1 christos if test $stat -ne 0; then 262 1.1 christos rm -f "$tmpdepfile" 263 1.1 christos exit $stat 264 1.1 christos fi 265 1.1 christos rm -f "$depfile" 266 1.1 christos 267 1.1 christos if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268 1.1 christos echo "$object : \\" > "$depfile" 269 1.1 christos # Clip off the initial element (the dependent). Don't try to be 270 1.1 christos # clever and replace this with sed code, as IRIX sed won't handle 271 1.1 christos # lines with more than a fixed number of characters (4096 in 272 1.1 christos # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273 1.1 christos # the IRIX cc adds comments like '#:fec' to the end of the 274 1.1 christos # dependency line. 275 1.1 christos tr ' ' "$nl" < "$tmpdepfile" \ 276 1.1 christos | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277 1.1 christos | tr "$nl" ' ' >> "$depfile" 278 1.1 christos echo >> "$depfile" 279 1.1 christos # The second pass generates a dummy entry for each header file. 280 1.1 christos tr ' ' "$nl" < "$tmpdepfile" \ 281 1.1 christos | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282 1.1 christos >> "$depfile" 283 1.1 christos else 284 1.1 christos make_dummy_depfile 285 1.1 christos fi 286 1.1 christos rm -f "$tmpdepfile" 287 1.1 christos ;; 288 1.1 christos 289 1.1 christos xlc) 290 1.1 christos # This case exists only to let depend.m4 do its work. It works by 291 1.1 christos # looking at the text of this script. This case will never be run, 292 1.1 christos # since it is checked for above. 293 1.1 christos exit 1 294 1.1 christos ;; 295 1.1 christos 296 1.1 christos aix) 297 1.1 christos # The C for AIX Compiler uses -M and outputs the dependencies 298 1.1 christos # in a .u file. In older versions, this file always lives in the 299 1.1 christos # current directory. Also, the AIX compiler puts '$object:' at the 300 1.1 christos # start of each line; $object doesn't have directory information. 301 1.1 christos # Version 6 uses the directory in both cases. 302 1.1 christos set_dir_from "$object" 303 1.1 christos set_base_from "$object" 304 1.1 christos if test "$libtool" = yes; then 305 1.1 christos tmpdepfile1=$dir$base.u 306 1.1 christos tmpdepfile2=$base.u 307 1.1 christos tmpdepfile3=$dir.libs/$base.u 308 1.1 christos "$@" -Wc,-M 309 1.1 christos else 310 1.1 christos tmpdepfile1=$dir$base.u 311 1.1 christos tmpdepfile2=$dir$base.u 312 1.1 christos tmpdepfile3=$dir$base.u 313 1.1 christos "$@" -M 314 1.1 christos fi 315 1.1 christos stat=$? 316 1.1 christos if test $stat -ne 0; then 317 1.1 christos rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318 1.1 christos exit $stat 319 1.1 christos fi 320 1.1 christos 321 1.1 christos for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322 1.1 christos do 323 1.1 christos test -f "$tmpdepfile" && break 324 1.1 christos done 325 1.1 christos aix_post_process_depfile 326 1.1 christos ;; 327 1.1 christos 328 1.1 christos tcc) 329 1.1 christos # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330 1.1 christos # FIXME: That version still under development at the moment of writing. 331 1.1 christos # Make that this statement remains true also for stable, released 332 1.1 christos # versions. 333 1.1 christos # It will wrap lines (doesn't matter whether long or short) with a 334 1.1 christos # trailing '\', as in: 335 1.1 christos # 336 1.1 christos # foo.o : \ 337 1.1 christos # foo.c \ 338 1.1 christos # foo.h \ 339 1.1 christos # 340 1.1 christos # It will put a trailing '\' even on the last line, and will use leading 341 1.1 christos # spaces rather than leading tabs (at least since its commit 0394caf7 342 1.1 christos # "Emit spaces for -MD"). 343 1.1 christos "$@" -MD -MF "$tmpdepfile" 344 1.1 christos stat=$? 345 1.1 christos if test $stat -ne 0; then 346 1.1 christos rm -f "$tmpdepfile" 347 1.1 christos exit $stat 348 1.1 christos fi 349 1.1 christos rm -f "$depfile" 350 1.1 christos # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351 1.1 christos # We have to change lines of the first kind to '$object: \'. 352 1.1 christos sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353 1.1 christos # And for each line of the second kind, we have to emit a 'dep.h:' 354 1.1 christos # dummy dependency, to avoid the deleted-header problem. 355 1.1 christos sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356 1.1 christos rm -f "$tmpdepfile" 357 1.1 christos ;; 358 1.1 christos 359 1.1 christos ## The order of this option in the case statement is important, since the 360 1.1 christos ## shell code in configure will try each of these formats in the order 361 1.1 christos ## listed in this file. A plain '-MD' option would be understood by many 362 1.1 christos ## compilers, so we must ensure this comes after the gcc and icc options. 363 1.1 christos pgcc) 364 1.1 christos # Portland's C compiler understands '-MD'. 365 1.1 christos # Will always output deps to 'file.d' where file is the root name of the 366 1.1 christos # source file under compilation, even if file resides in a subdirectory. 367 1.1 christos # The object file name does not affect the name of the '.d' file. 368 1.1 christos # pgcc 10.2 will output 369 1.1 christos # foo.o: sub/foo.c sub/foo.h 370 1.1 christos # and will wrap long lines using '\' : 371 1.1 christos # foo.o: sub/foo.c ... \ 372 1.1 christos # sub/foo.h ... \ 373 1.1 christos # ... 374 1.1 christos set_dir_from "$object" 375 1.1 christos # Use the source, not the object, to determine the base name, since 376 1.1 christos # that's sadly what pgcc will do too. 377 1.1 christos set_base_from "$source" 378 1.1 christos tmpdepfile=$base.d 379 1.1 christos 380 1.1 christos # For projects that build the same source file twice into different object 381 1.1 christos # files, the pgcc approach of using the *source* file root name can cause 382 1.1 christos # problems in parallel builds. Use a locking strategy to avoid stomping on 383 1.1 christos # the same $tmpdepfile. 384 1.1 christos lockdir=$base.d-lock 385 1.1 christos trap " 386 1.1 christos echo '$0: caught signal, cleaning up...' >&2 387 1.1 christos rmdir '$lockdir' 388 1.1 christos exit 1 389 1.1 christos " 1 2 13 15 390 1.1 christos numtries=100 391 1.1 christos i=$numtries 392 1.1 christos while test $i -gt 0; do 393 1.1 christos # mkdir is a portable test-and-set. 394 1.1 christos if mkdir "$lockdir" 2>/dev/null; then 395 1.1 christos # This process acquired the lock. 396 1.1 christos "$@" -MD 397 1.1 christos stat=$? 398 1.1 christos # Release the lock. 399 1.1 christos rmdir "$lockdir" 400 1.1 christos break 401 1.1 christos else 402 1.1 christos # If the lock is being held by a different process, wait 403 1.1 christos # until the winning process is done or we timeout. 404 1.1 christos while test -d "$lockdir" && test $i -gt 0; do 405 1.1 christos sleep 1 406 1.1 christos i=`expr $i - 1` 407 1.1 christos done 408 1.1 christos fi 409 1.1 christos i=`expr $i - 1` 410 1.1 christos done 411 1.1 christos trap - 1 2 13 15 412 1.1 christos if test $i -le 0; then 413 1.1 christos echo "$0: failed to acquire lock after $numtries attempts" >&2 414 1.1 christos echo "$0: check lockdir '$lockdir'" >&2 415 1.1 christos exit 1 416 1.1 christos fi 417 1.1 christos 418 1.1 christos if test $stat -ne 0; then 419 1.1 christos rm -f "$tmpdepfile" 420 1.1 christos exit $stat 421 1.1 christos fi 422 1.1 christos rm -f "$depfile" 423 1.1 christos # Each line is of the form `foo.o: dependent.h', 424 1.1 christos # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425 1.1 christos # Do two passes, one to just change these to 426 1.1 christos # `$object: dependent.h' and one to simply `dependent.h:'. 427 1.1 christos sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428 1.1 christos # Some versions of the HPUX 10.20 sed can't process this invocation 429 1.1 christos # correctly. Breaking it into two sed invocations is a workaround. 430 1.1 christos sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431 1.1 christos | sed -e 's/$/ :/' >> "$depfile" 432 1.1 christos rm -f "$tmpdepfile" 433 1.1 christos ;; 434 1.1 christos 435 1.1 christos hp2) 436 1.1 christos # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437 1.1 christos # compilers, which have integrated preprocessors. The correct option 438 1.1 christos # to use with these is +Maked; it writes dependencies to a file named 439 1.1 christos # 'foo.d', which lands next to the object file, wherever that 440 1.1 christos # happens to be. 441 1.1 christos # Much of this is similar to the tru64 case; see comments there. 442 1.1 christos set_dir_from "$object" 443 1.1 christos set_base_from "$object" 444 1.1 christos if test "$libtool" = yes; then 445 1.1 christos tmpdepfile1=$dir$base.d 446 1.1 christos tmpdepfile2=$dir.libs/$base.d 447 1.1 christos "$@" -Wc,+Maked 448 1.1 christos else 449 1.1 christos tmpdepfile1=$dir$base.d 450 1.1 christos tmpdepfile2=$dir$base.d 451 1.1 christos "$@" +Maked 452 1.1 christos fi 453 1.1 christos stat=$? 454 1.1 christos if test $stat -ne 0; then 455 1.1 christos rm -f "$tmpdepfile1" "$tmpdepfile2" 456 1.1 christos exit $stat 457 1.1 christos fi 458 1.1 christos 459 1.1 christos for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460 1.1 christos do 461 1.1 christos test -f "$tmpdepfile" && break 462 1.1 christos done 463 1.1 christos if test -f "$tmpdepfile"; then 464 1.1 christos sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465 1.1 christos # Add 'dependent.h:' lines. 466 1.1 christos sed -ne '2,${ 467 1.1 christos s/^ *// 468 1.1 christos s/ \\*$// 469 1.1 christos s/$/:/ 470 1.1 christos p 471 1.1 christos }' "$tmpdepfile" >> "$depfile" 472 1.1 christos else 473 1.1 christos make_dummy_depfile 474 1.1 christos fi 475 1.1 christos rm -f "$tmpdepfile" "$tmpdepfile2" 476 1.1 christos ;; 477 1.1 christos 478 1.1 christos tru64) 479 1.1 christos # The Tru64 compiler uses -MD to generate dependencies as a side 480 1.1 christos # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481 1.1 christos # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482 1.1 christos # dependencies in 'foo.d' instead, so we check for that too. 483 1.1 christos # Subdirectories are respected. 484 1.1 christos set_dir_from "$object" 485 1.1 christos set_base_from "$object" 486 1.1 christos 487 1.1 christos if test "$libtool" = yes; then 488 1.1 christos # Libtool generates 2 separate objects for the 2 libraries. These 489 1.1 christos # two compilations output dependencies in $dir.libs/$base.o.d and 490 1.1 christos # in $dir$base.o.d. We have to check for both files, because 491 1.1 christos # one of the two compilations can be disabled. We should prefer 492 1.1 christos # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493 1.1 christos # automatically cleaned when .libs/ is deleted, while ignoring 494 1.1 christos # the former would cause a distcleancheck panic. 495 1.1 christos tmpdepfile1=$dir$base.o.d # libtool 1.5 496 1.1 christos tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497 1.1 christos tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498 1.1 christos "$@" -Wc,-MD 499 1.1 christos else 500 1.1 christos tmpdepfile1=$dir$base.d 501 1.1 christos tmpdepfile2=$dir$base.d 502 1.1 christos tmpdepfile3=$dir$base.d 503 1.1 christos "$@" -MD 504 1.1 christos fi 505 1.1 christos 506 1.1 christos stat=$? 507 1.1 christos if test $stat -ne 0; then 508 1.1 christos rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509 1.1 christos exit $stat 510 1.1 christos fi 511 1.1 christos 512 1.1 christos for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513 1.1 christos do 514 1.1 christos test -f "$tmpdepfile" && break 515 1.1 christos done 516 1.1 christos # Same post-processing that is required for AIX mode. 517 1.1 christos aix_post_process_depfile 518 1.1 christos ;; 519 1.1 christos 520 1.1 christos msvc7) 521 1.1 christos if test "$libtool" = yes; then 522 1.1 christos showIncludes=-Wc,-showIncludes 523 1.1 christos else 524 1.1 christos showIncludes=-showIncludes 525 1.1 christos fi 526 1.1 christos "$@" $showIncludes > "$tmpdepfile" 527 1.1 christos stat=$? 528 1.1 christos grep -v '^Note: including file: ' "$tmpdepfile" 529 1.1 christos if test $stat -ne 0; then 530 1.1 christos rm -f "$tmpdepfile" 531 1.1 christos exit $stat 532 1.1 christos fi 533 1.1 christos rm -f "$depfile" 534 1.1 christos echo "$object : \\" > "$depfile" 535 1.1 christos # The first sed program below extracts the file names and escapes 536 1.1 christos # backslashes for cygpath. The second sed program outputs the file 537 1.1 christos # name when reading, but also accumulates all include files in the 538 1.1 christos # hold buffer in order to output them again at the end. This only 539 1.1 christos # works with sed implementations that can handle large buffers. 540 1.1 christos sed < "$tmpdepfile" -n ' 541 1.1 christos /^Note: including file: *\(.*\)/ { 542 1.1 christos s//\1/ 543 1.1 christos s/\\/\\\\/g 544 1.1 christos p 545 1.1 christos }' | $cygpath_u | sort -u | sed -n ' 546 1.1 christos s/ /\\ /g 547 1.1 christos s/\(.*\)/'"$tab"'\1 \\/p 548 1.1 christos s/.\(.*\) \\/\1:/ 549 1.1 christos H 550 1.1 christos $ { 551 1.1 christos s/.*/'"$tab"'/ 552 1.1 christos G 553 1.1 christos p 554 1.1 christos }' >> "$depfile" 555 1.1 christos echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556 1.1 christos rm -f "$tmpdepfile" 557 1.1 christos ;; 558 1.1 christos 559 1.1 christos msvc7msys) 560 1.1 christos # This case exists only to let depend.m4 do its work. It works by 561 1.1 christos # looking at the text of this script. This case will never be run, 562 1.1 christos # since it is checked for above. 563 1.1 christos exit 1 564 1.1 christos ;; 565 1.1 christos 566 1.1 christos #nosideeffect) 567 1.1 christos # This comment above is used by automake to tell side-effect 568 1.1 christos # dependency tracking mechanisms from slower ones. 569 1.1 christos 570 1.1 christos dashmstdout) 571 1.1 christos # Important note: in order to support this mode, a compiler *must* 572 1.1 christos # always write the preprocessed file to stdout, regardless of -o. 573 1.1 christos "$@" || exit $? 574 1.1 christos 575 1.1 christos # Remove the call to Libtool. 576 1.1 christos if test "$libtool" = yes; then 577 1.1 christos while test "X$1" != 'X--mode=compile'; do 578 1.1 christos shift 579 1.1 christos done 580 1.1 christos shift 581 1.1 christos fi 582 1.1 christos 583 1.1 christos # Remove '-o $object'. 584 1.1 christos IFS=" " 585 1.1 christos for arg 586 1.1 christos do 587 1.1 christos case $arg in 588 1.1 christos -o) 589 1.1 christos shift 590 1.1 christos ;; 591 1.1 christos $object) 592 1.1 christos shift 593 1.1 christos ;; 594 1.1 christos *) 595 1.1 christos set fnord "$@" "$arg" 596 1.1 christos shift # fnord 597 1.1 christos shift # $arg 598 1.1 christos ;; 599 1.1 christos esac 600 1.1 christos done 601 1.1 christos 602 1.1 christos test -z "$dashmflag" && dashmflag=-M 603 1.1 christos # Require at least two characters before searching for ':' 604 1.1 christos # in the target name. This is to cope with DOS-style filenames: 605 1.1 christos # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606 1.1 christos "$@" $dashmflag | 607 1.1 christos sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608 1.1 christos rm -f "$depfile" 609 1.1 christos cat < "$tmpdepfile" > "$depfile" 610 1.1 christos # Some versions of the HPUX 10.20 sed can't process this sed invocation 611 1.1 christos # correctly. Breaking it into two sed invocations is a workaround. 612 1.1 christos tr ' ' "$nl" < "$tmpdepfile" \ 613 1.1 christos | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614 1.1 christos | sed -e 's/$/ :/' >> "$depfile" 615 1.1 christos rm -f "$tmpdepfile" 616 1.1 christos ;; 617 1.1 christos 618 1.1 christos dashXmstdout) 619 1.1 christos # This case only exists to satisfy depend.m4. It is never actually 620 1.1 christos # run, as this mode is specially recognized in the preamble. 621 1.1 christos exit 1 622 1.1 christos ;; 623 1.1 christos 624 1.1 christos makedepend) 625 1.1 christos "$@" || exit $? 626 1.1 christos # Remove any Libtool call 627 1.1 christos if test "$libtool" = yes; then 628 1.1 christos while test "X$1" != 'X--mode=compile'; do 629 1.1 christos shift 630 1.1 christos done 631 1.1 christos shift 632 1.1 christos fi 633 1.1 christos # X makedepend 634 1.1 christos shift 635 1.1 christos cleared=no eat=no 636 1.1 christos for arg 637 1.1 christos do 638 1.1 christos case $cleared in 639 1.1 christos no) 640 1.1 christos set ""; shift 641 1.1 christos cleared=yes ;; 642 1.1 christos esac 643 1.1 christos if test $eat = yes; then 644 1.1 christos eat=no 645 1.1 christos continue 646 1.1 christos fi 647 1.1 christos case "$arg" in 648 1.1 christos -D*|-I*) 649 1.1 christos set fnord "$@" "$arg"; shift ;; 650 1.1 christos # Strip any option that makedepend may not understand. Remove 651 1.1 christos # the object too, otherwise makedepend will parse it as a source file. 652 1.1 christos -arch) 653 1.1 christos eat=yes ;; 654 1.1 christos -*|$object) 655 1.1 christos ;; 656 1.1 christos *) 657 1.1 christos set fnord "$@" "$arg"; shift ;; 658 1.1 christos esac 659 1.1 christos done 660 1.1 christos obj_suffix=`echo "$object" | sed 's/^.*\././'` 661 1.1 christos touch "$tmpdepfile" 662 1.1 christos ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663 1.1 christos rm -f "$depfile" 664 1.1 christos # makedepend may prepend the VPATH from the source file name to the object. 665 1.1 christos # No need to regex-escape $object, excess matching of '.' is harmless. 666 1.1 christos sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667 1.1 christos # Some versions of the HPUX 10.20 sed can't process the last invocation 668 1.1 christos # correctly. Breaking it into two sed invocations is a workaround. 669 1.1 christos sed '1,2d' "$tmpdepfile" \ 670 1.1 christos | tr ' ' "$nl" \ 671 1.1 christos | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672 1.1 christos | sed -e 's/$/ :/' >> "$depfile" 673 1.1 christos rm -f "$tmpdepfile" "$tmpdepfile".bak 674 1.1 christos ;; 675 1.1 christos 676 1.1 christos cpp) 677 1.1 christos # Important note: in order to support this mode, a compiler *must* 678 1.1 christos # always write the preprocessed file to stdout. 679 1.1 christos "$@" || exit $? 680 1.1 christos 681 1.1 christos # Remove the call to Libtool. 682 1.1 christos if test "$libtool" = yes; then 683 1.1 christos while test "X$1" != 'X--mode=compile'; do 684 1.1 christos shift 685 1.1 christos done 686 1.1 christos shift 687 1.1 christos fi 688 1.1 christos 689 1.1 christos # Remove '-o $object'. 690 1.1 christos IFS=" " 691 1.1 christos for arg 692 1.1 christos do 693 1.1 christos case $arg in 694 1.1 christos -o) 695 1.1 christos shift 696 1.1 christos ;; 697 1.1 christos $object) 698 1.1 christos shift 699 1.1 christos ;; 700 1.1 christos *) 701 1.1 christos set fnord "$@" "$arg" 702 1.1 christos shift # fnord 703 1.1 christos shift # $arg 704 1.1 christos ;; 705 1.1 christos esac 706 1.1 christos done 707 1.1 christos 708 1.1 christos "$@" -E \ 709 1.1 christos | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710 1.1 christos -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711 1.1 christos | sed '$ s: \\$::' > "$tmpdepfile" 712 1.1 christos rm -f "$depfile" 713 1.1 christos echo "$object : \\" > "$depfile" 714 1.1 christos cat < "$tmpdepfile" >> "$depfile" 715 1.1 christos sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716 1.1 christos rm -f "$tmpdepfile" 717 1.1 christos ;; 718 1.1 christos 719 1.1 christos msvisualcpp) 720 1.1 christos # Important note: in order to support this mode, a compiler *must* 721 1.1 christos # always write the preprocessed file to stdout. 722 1.1 christos "$@" || exit $? 723 1.1 christos 724 1.1 christos # Remove the call to Libtool. 725 1.1 christos if test "$libtool" = yes; then 726 1.1 christos while test "X$1" != 'X--mode=compile'; do 727 1.1 christos shift 728 1.1 christos done 729 1.1 christos shift 730 1.1 christos fi 731 1.1 christos 732 1.1 christos IFS=" " 733 1.1 christos for arg 734 1.1 christos do 735 1.1 christos case "$arg" in 736 1.1 christos -o) 737 1.1 christos shift 738 1.1 christos ;; 739 1.1 christos $object) 740 1.1 christos shift 741 1.1 christos ;; 742 1.1 christos "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743 1.1 christos set fnord "$@" 744 1.1 christos shift 745 1.1 christos shift 746 1.1 christos ;; 747 1.1 christos *) 748 1.1 christos set fnord "$@" "$arg" 749 1.1 christos shift 750 1.1 christos shift 751 1.1 christos ;; 752 1.1 christos esac 753 1.1 christos done 754 1.1 christos "$@" -E 2>/dev/null | 755 1.1 christos sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756 1.1 christos rm -f "$depfile" 757 1.1 christos echo "$object : \\" > "$depfile" 758 1.1 christos sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759 1.1 christos echo "$tab" >> "$depfile" 760 1.1 christos sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761 1.1 christos rm -f "$tmpdepfile" 762 1.1 christos ;; 763 1.1 christos 764 1.1 christos msvcmsys) 765 1.1 christos # This case exists only to let depend.m4 do its work. It works by 766 1.1 christos # looking at the text of this script. This case will never be run, 767 1.1 christos # since it is checked for above. 768 1.1 christos exit 1 769 1.1 christos ;; 770 1.1 christos 771 1.1 christos none) 772 1.1 christos exec "$@" 773 1.1 christos ;; 774 1.1 christos 775 1.1 christos *) 776 1.1 christos echo "Unknown depmode $depmode" 1>&2 777 1.1 christos exit 1 778 1.1 christos ;; 779 1.1 christos esac 780 1.1 christos 781 1.1 christos exit 0 782 1.1 christos 783 1.1 christos # Local Variables: 784 1.1 christos # mode: shell-script 785 1.1 christos # sh-indentation: 2 786 1.1.1.2 christos # eval: (add-hook 'before-save-hook 'time-stamp) 787 1.1 christos # time-stamp-start: "scriptversion=" 788 1.1 christos # time-stamp-format: "%:y-%02m-%02d.%02H" 789 1.1 christos # time-stamp-time-zone: "UTC0" 790 1.1 christos # time-stamp-end: "; # UTC" 791 1.1 christos # End: 792