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