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