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