1191cded7Smrg#! /bin/sh 2191cded7Smrg# depcomp - compile a program generating dependencies as side-effects 3191cded7Smrg 48f9fac4aSmrgscriptversion=2024-06-19.01; # UTC 5191cded7Smrg 68f9fac4aSmrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 7191cded7Smrg 8191cded7Smrg# This program is free software; you can redistribute it and/or modify 9191cded7Smrg# it under the terms of the GNU General Public License as published by 10191cded7Smrg# the Free Software Foundation; either version 2, or (at your option) 11191cded7Smrg# any later version. 12191cded7Smrg 13191cded7Smrg# This program is distributed in the hope that it will be useful, 14191cded7Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15191cded7Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16191cded7Smrg# GNU General Public License for more details. 17191cded7Smrg 18191cded7Smrg# You should have received a copy of the GNU General Public License 19ee3e8c14Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 20191cded7Smrg 21191cded7Smrg# As a special exception to the GNU General Public License, if you 22191cded7Smrg# distribute this file as part of a program that contains a 23191cded7Smrg# configuration script generated by Autoconf, you may include it under 24191cded7Smrg# the same distribution terms that you use for the rest of that program. 25191cded7Smrg 26191cded7Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27191cded7Smrg 28191cded7Smrgcase $1 in 29191cded7Smrg '') 30d9dcd5aeSmrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31d9dcd5aeSmrg exit 1; 32d9dcd5aeSmrg ;; 33191cded7Smrg -h | --h*) 34191cded7Smrg cat <<\EOF 35191cded7SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36191cded7Smrg 37191cded7SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38191cded7Smrgas side-effects. 39191cded7Smrg 40191cded7SmrgEnvironment variables: 41191cded7Smrg depmode Dependency tracking mode. 42d9dcd5aeSmrg source Source file read by 'PROGRAMS ARGS'. 43d9dcd5aeSmrg object Object file output by 'PROGRAMS ARGS'. 44191cded7Smrg DEPDIR directory where to store dependencies. 45191cded7Smrg depfile Dependency file to output. 46d9dcd5aeSmrg tmpdepfile Temporary file to use when outputting dependencies. 47191cded7Smrg libtool Whether libtool is used (yes/no). 48191cded7Smrg 49191cded7SmrgReport bugs to <bug-automake@gnu.org>. 508f9fac4aSmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 518f9fac4aSmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 52191cded7SmrgEOF 53191cded7Smrg exit $? 54191cded7Smrg ;; 55191cded7Smrg -v | --v*) 568f9fac4aSmrg echo "depcomp (GNU Automake) $scriptversion" 57191cded7Smrg exit $? 58191cded7Smrg ;; 59191cded7Smrgesac 60191cded7Smrg 61d9dcd5aeSmrg# Get the directory component of the given path, and save it in the 62d9dcd5aeSmrg# global variables '$dir'. Note that this directory component will 63d9dcd5aeSmrg# be either empty or ending with a '/' character. This is deliberate. 64d9dcd5aeSmrgset_dir_from () 65d9dcd5aeSmrg{ 66d9dcd5aeSmrg case $1 in 67d9dcd5aeSmrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 68d9dcd5aeSmrg *) dir=;; 69d9dcd5aeSmrg esac 70d9dcd5aeSmrg} 71d9dcd5aeSmrg 72d9dcd5aeSmrg# Get the suffix-stripped basename of the given path, and save it the 73d9dcd5aeSmrg# global variable '$base'. 74d9dcd5aeSmrgset_base_from () 75d9dcd5aeSmrg{ 76d9dcd5aeSmrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 77d9dcd5aeSmrg} 78d9dcd5aeSmrg 79d9dcd5aeSmrg# If no dependency file was actually created by the compiler invocation, 80d9dcd5aeSmrg# we still have to create a dummy depfile, to avoid errors with the 81d9dcd5aeSmrg# Makefile "include basename.Plo" scheme. 82d9dcd5aeSmrgmake_dummy_depfile () 83d9dcd5aeSmrg{ 84d9dcd5aeSmrg echo "#dummy" > "$depfile" 85d9dcd5aeSmrg} 86d9dcd5aeSmrg 87d9dcd5aeSmrg# Factor out some common post-processing of the generated depfile. 88d9dcd5aeSmrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 89d9dcd5aeSmrgaix_post_process_depfile () 90d9dcd5aeSmrg{ 91d9dcd5aeSmrg # If the compiler actually managed to produce a dependency file, 92d9dcd5aeSmrg # post-process it. 93d9dcd5aeSmrg if test -f "$tmpdepfile"; then 94d9dcd5aeSmrg # Each line is of the form 'foo.o: dependency.h'. 95d9dcd5aeSmrg # Do two passes, one to just change these to 96d9dcd5aeSmrg # $object: dependency.h 97d9dcd5aeSmrg # and one to simply output 98d9dcd5aeSmrg # dependency.h: 99d9dcd5aeSmrg # which is needed to avoid the deleted-header problem. 100d9dcd5aeSmrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 101d9dcd5aeSmrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 102d9dcd5aeSmrg } > "$depfile" 103d9dcd5aeSmrg rm -f "$tmpdepfile" 104d9dcd5aeSmrg else 105d9dcd5aeSmrg make_dummy_depfile 106d9dcd5aeSmrg fi 107d9dcd5aeSmrg} 108d9dcd5aeSmrg 109d9dcd5aeSmrg# A tabulation character. 110d9dcd5aeSmrgtab=' ' 111d9dcd5aeSmrg# A newline character. 112d9dcd5aeSmrgnl=' 113d9dcd5aeSmrg' 114d9dcd5aeSmrg# Character ranges might be problematic outside the C locale. 115d9dcd5aeSmrg# These definitions help. 116d9dcd5aeSmrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 117d9dcd5aeSmrglower=abcdefghijklmnopqrstuvwxyz 118d9dcd5aeSmrgalpha=${upper}${lower} 119d9dcd5aeSmrg 120191cded7Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 121191cded7Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 122191cded7Smrg exit 1 123191cded7Smrgfi 124191cded7Smrg 125191cded7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 126191cded7Smrgdepfile=${depfile-`echo "$object" | 127191cded7Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 128191cded7Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 129191cded7Smrg 130191cded7Smrgrm -f "$tmpdepfile" 131191cded7Smrg 1328f9fac4aSmrg# Avoid interference from the environment. 133d9dcd5aeSmrggccflag= dashmflag= 134d9dcd5aeSmrg 135191cded7Smrg# Some modes work just like other modes, but use different flags. We 136191cded7Smrg# parameterize here, but still list the modes in the big case below, 137191cded7Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 138191cded7Smrg# here, because this file can only contain one case statement. 139191cded7Smrgif test "$depmode" = hp; then 140191cded7Smrg # HP compiler uses -M and no extra arg. 141191cded7Smrg gccflag=-M 142191cded7Smrg depmode=gcc 143191cded7Smrgfi 144191cded7Smrg 145191cded7Smrgif test "$depmode" = dashXmstdout; then 146d9dcd5aeSmrg # This is just like dashmstdout with a different argument. 147d9dcd5aeSmrg dashmflag=-xM 148d9dcd5aeSmrg depmode=dashmstdout 149191cded7Smrgfi 150191cded7Smrg 151ba064abeSmrgcygpath_u="cygpath -u -f -" 152ba064abeSmrgif test "$depmode" = msvcmsys; then 153d9dcd5aeSmrg # This is just like msvisualcpp but w/o cygpath translation. 154d9dcd5aeSmrg # Just convert the backslash-escaped backslashes to single forward 155d9dcd5aeSmrg # slashes to satisfy depend.m4 156d9dcd5aeSmrg cygpath_u='sed s,\\\\,/,g' 157d9dcd5aeSmrg depmode=msvisualcpp 158d9dcd5aeSmrgfi 159d9dcd5aeSmrg 160d9dcd5aeSmrgif test "$depmode" = msvc7msys; then 161d9dcd5aeSmrg # This is just like msvc7 but w/o cygpath translation. 162d9dcd5aeSmrg # Just convert the backslash-escaped backslashes to single forward 163d9dcd5aeSmrg # slashes to satisfy depend.m4 164d9dcd5aeSmrg cygpath_u='sed s,\\\\,/,g' 165d9dcd5aeSmrg depmode=msvc7 166d9dcd5aeSmrgfi 167d9dcd5aeSmrg 168d9dcd5aeSmrgif test "$depmode" = xlc; then 169d9dcd5aeSmrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 170d9dcd5aeSmrg gccflag=-qmakedep=gcc,-MF 171d9dcd5aeSmrg depmode=gcc 172ba064abeSmrgfi 173ba064abeSmrg 174191cded7Smrgcase "$depmode" in 175191cded7Smrggcc3) 176191cded7Smrg## gcc 3 implements dependency tracking that does exactly what 177191cded7Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 178191cded7Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 179b290cf36Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 180b290cf36Smrg## the command line argument order; so add the flags where they 181b290cf36Smrg## appear in depend2.am. Note that the slowdown incurred here 182b290cf36Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 183b290cf36Smrg for arg 184b290cf36Smrg do 185b290cf36Smrg case $arg in 186b290cf36Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 187b290cf36Smrg *) set fnord "$@" "$arg" ;; 188b290cf36Smrg esac 189b290cf36Smrg shift # fnord 190b290cf36Smrg shift # $arg 191b290cf36Smrg done 192b290cf36Smrg "$@" 193191cded7Smrg stat=$? 194d9dcd5aeSmrg if test $stat -ne 0; then 195191cded7Smrg rm -f "$tmpdepfile" 196191cded7Smrg exit $stat 197191cded7Smrg fi 198191cded7Smrg mv "$tmpdepfile" "$depfile" 199191cded7Smrg ;; 200191cded7Smrg 201191cded7Smrggcc) 2028f9fac4aSmrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 2038f9fac4aSmrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 204d9dcd5aeSmrg## (see the conditional assignment to $gccflag above). 205191cded7Smrg## There are various ways to get dependency output from gcc. Here's 206191cded7Smrg## why we pick this rather obscure method: 207191cded7Smrg## - Don't want to use -MD because we'd like the dependencies to end 208191cded7Smrg## up in a subdir. Having to rename by hand is ugly. 209191cded7Smrg## (We might end up doing this anyway to support other compilers.) 210191cded7Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 211d9dcd5aeSmrg## -MM, not -M (despite what the docs say). Also, it might not be 212d9dcd5aeSmrg## supported by the other compilers which use the 'gcc' depmode. 213191cded7Smrg## - Using -M directly means running the compiler twice (even worse 214191cded7Smrg## than renaming). 215191cded7Smrg if test -z "$gccflag"; then 216191cded7Smrg gccflag=-MD, 217191cded7Smrg fi 218191cded7Smrg "$@" -Wp,"$gccflag$tmpdepfile" 219191cded7Smrg stat=$? 220d9dcd5aeSmrg if test $stat -ne 0; then 221191cded7Smrg rm -f "$tmpdepfile" 222191cded7Smrg exit $stat 223191cded7Smrg fi 224191cded7Smrg rm -f "$depfile" 225191cded7Smrg echo "$object : \\" > "$depfile" 226d9dcd5aeSmrg # The second -e expression handles DOS-style file names with drive 227d9dcd5aeSmrg # letters. 228191cded7Smrg sed -e 's/^[^:]*: / /' \ 229191cded7Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 230d9dcd5aeSmrg## This next piece of magic avoids the "deleted header file" problem. 231191cded7Smrg## The problem is that when a header file which appears in a .P file 232191cded7Smrg## is deleted, the dependency causes make to die (because there is 233191cded7Smrg## typically no way to rebuild the header). We avoid this by adding 234191cded7Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 235191cded7Smrg## this for us directly. 236d9dcd5aeSmrg## Some versions of gcc put a space before the ':'. On the theory 237191cded7Smrg## that the space means something, we add a space to the output as 238d9dcd5aeSmrg## well. hp depmode also adds that space, but also prefixes the VPATH 239d9dcd5aeSmrg## to the object. Take care to not repeat it in the output. 240191cded7Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 241191cded7Smrg## correctly. Breaking it into two sed invocations is a workaround. 242d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 243d9dcd5aeSmrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 244d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 245191cded7Smrg rm -f "$tmpdepfile" 246191cded7Smrg ;; 247191cded7Smrg 248191cded7Smrghp) 249191cded7Smrg # This case exists only to let depend.m4 do its work. It works by 250191cded7Smrg # looking at the text of this script. This case will never be run, 251191cded7Smrg # since it is checked for above. 252191cded7Smrg exit 1 253191cded7Smrg ;; 254191cded7Smrg 255191cded7Smrgsgi) 256191cded7Smrg if test "$libtool" = yes; then 257191cded7Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 258191cded7Smrg else 259191cded7Smrg "$@" -MDupdate "$tmpdepfile" 260191cded7Smrg fi 261191cded7Smrg stat=$? 262d9dcd5aeSmrg if test $stat -ne 0; then 263191cded7Smrg rm -f "$tmpdepfile" 264191cded7Smrg exit $stat 265191cded7Smrg fi 266191cded7Smrg rm -f "$depfile" 267191cded7Smrg 268191cded7Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 269191cded7Smrg echo "$object : \\" > "$depfile" 270191cded7Smrg # Clip off the initial element (the dependent). Don't try to be 271191cded7Smrg # clever and replace this with sed code, as IRIX sed won't handle 272191cded7Smrg # lines with more than a fixed number of characters (4096 in 273191cded7Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 274d9dcd5aeSmrg # the IRIX cc adds comments like '#:fec' to the end of the 275191cded7Smrg # dependency line. 276d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 277d9dcd5aeSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 278d9dcd5aeSmrg | tr "$nl" ' ' >> "$depfile" 279ba064abeSmrg echo >> "$depfile" 280191cded7Smrg # The second pass generates a dummy entry for each header file. 281d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 282d9dcd5aeSmrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 283d9dcd5aeSmrg >> "$depfile" 284191cded7Smrg else 285d9dcd5aeSmrg make_dummy_depfile 286191cded7Smrg fi 287191cded7Smrg rm -f "$tmpdepfile" 288191cded7Smrg ;; 289191cded7Smrg 290d9dcd5aeSmrgxlc) 291d9dcd5aeSmrg # This case exists only to let depend.m4 do its work. It works by 292d9dcd5aeSmrg # looking at the text of this script. This case will never be run, 293d9dcd5aeSmrg # since it is checked for above. 294d9dcd5aeSmrg exit 1 295d9dcd5aeSmrg ;; 296d9dcd5aeSmrg 297191cded7Smrgaix) 298191cded7Smrg # The C for AIX Compiler uses -M and outputs the dependencies 299191cded7Smrg # in a .u file. In older versions, this file always lives in the 300d9dcd5aeSmrg # current directory. Also, the AIX compiler puts '$object:' at the 301191cded7Smrg # start of each line; $object doesn't have directory information. 302191cded7Smrg # Version 6 uses the directory in both cases. 303d9dcd5aeSmrg set_dir_from "$object" 304d9dcd5aeSmrg set_base_from "$object" 305191cded7Smrg if test "$libtool" = yes; then 306b290cf36Smrg tmpdepfile1=$dir$base.u 307b290cf36Smrg tmpdepfile2=$base.u 308b290cf36Smrg tmpdepfile3=$dir.libs/$base.u 309191cded7Smrg "$@" -Wc,-M 310191cded7Smrg else 311b290cf36Smrg tmpdepfile1=$dir$base.u 312b290cf36Smrg tmpdepfile2=$dir$base.u 313b290cf36Smrg tmpdepfile3=$dir$base.u 314191cded7Smrg "$@" -M 315191cded7Smrg fi 316191cded7Smrg stat=$? 317d9dcd5aeSmrg if test $stat -ne 0; then 318b290cf36Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 319191cded7Smrg exit $stat 320191cded7Smrg fi 321191cded7Smrg 322b290cf36Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 323b290cf36Smrg do 324b290cf36Smrg test -f "$tmpdepfile" && break 325b290cf36Smrg done 326d9dcd5aeSmrg aix_post_process_depfile 327d9dcd5aeSmrg ;; 328d9dcd5aeSmrg 329d9dcd5aeSmrgtcc) 330d9dcd5aeSmrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 331d9dcd5aeSmrg # FIXME: That version still under development at the moment of writing. 332d9dcd5aeSmrg # Make that this statement remains true also for stable, released 333d9dcd5aeSmrg # versions. 334d9dcd5aeSmrg # It will wrap lines (doesn't matter whether long or short) with a 335d9dcd5aeSmrg # trailing '\', as in: 336d9dcd5aeSmrg # 337d9dcd5aeSmrg # foo.o : \ 338d9dcd5aeSmrg # foo.c \ 339d9dcd5aeSmrg # foo.h \ 340d9dcd5aeSmrg # 341d9dcd5aeSmrg # It will put a trailing '\' even on the last line, and will use leading 342d9dcd5aeSmrg # spaces rather than leading tabs (at least since its commit 0394caf7 343d9dcd5aeSmrg # "Emit spaces for -MD"). 344d9dcd5aeSmrg "$@" -MD -MF "$tmpdepfile" 345d9dcd5aeSmrg stat=$? 346d9dcd5aeSmrg if test $stat -ne 0; then 347d9dcd5aeSmrg rm -f "$tmpdepfile" 348d9dcd5aeSmrg exit $stat 349191cded7Smrg fi 350d9dcd5aeSmrg rm -f "$depfile" 351d9dcd5aeSmrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 352d9dcd5aeSmrg # We have to change lines of the first kind to '$object: \'. 353d9dcd5aeSmrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 354d9dcd5aeSmrg # And for each line of the second kind, we have to emit a 'dep.h:' 355d9dcd5aeSmrg # dummy dependency, to avoid the deleted-header problem. 356d9dcd5aeSmrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 357191cded7Smrg rm -f "$tmpdepfile" 358191cded7Smrg ;; 359191cded7Smrg 360d9dcd5aeSmrg## The order of this option in the case statement is important, since the 361d9dcd5aeSmrg## shell code in configure will try each of these formats in the order 362d9dcd5aeSmrg## listed in this file. A plain '-MD' option would be understood by many 363d9dcd5aeSmrg## compilers, so we must ensure this comes after the gcc and icc options. 364d9dcd5aeSmrgpgcc) 365d9dcd5aeSmrg # Portland's C compiler understands '-MD'. 366d9dcd5aeSmrg # Will always output deps to 'file.d' where file is the root name of the 367d9dcd5aeSmrg # source file under compilation, even if file resides in a subdirectory. 368d9dcd5aeSmrg # The object file name does not affect the name of the '.d' file. 369d9dcd5aeSmrg # pgcc 10.2 will output 370191cded7Smrg # foo.o: sub/foo.c sub/foo.h 371d9dcd5aeSmrg # and will wrap long lines using '\' : 372191cded7Smrg # foo.o: sub/foo.c ... \ 373191cded7Smrg # sub/foo.h ... \ 374191cded7Smrg # ... 375d9dcd5aeSmrg set_dir_from "$object" 376d9dcd5aeSmrg # Use the source, not the object, to determine the base name, since 377d9dcd5aeSmrg # that's sadly what pgcc will do too. 378d9dcd5aeSmrg set_base_from "$source" 379d9dcd5aeSmrg tmpdepfile=$base.d 380d9dcd5aeSmrg 381d9dcd5aeSmrg # For projects that build the same source file twice into different object 382d9dcd5aeSmrg # files, the pgcc approach of using the *source* file root name can cause 383d9dcd5aeSmrg # problems in parallel builds. Use a locking strategy to avoid stomping on 384d9dcd5aeSmrg # the same $tmpdepfile. 385d9dcd5aeSmrg lockdir=$base.d-lock 386d9dcd5aeSmrg trap " 387d9dcd5aeSmrg echo '$0: caught signal, cleaning up...' >&2 388d9dcd5aeSmrg rmdir '$lockdir' 389d9dcd5aeSmrg exit 1 390d9dcd5aeSmrg " 1 2 13 15 391d9dcd5aeSmrg numtries=100 392d9dcd5aeSmrg i=$numtries 393d9dcd5aeSmrg while test $i -gt 0; do 394d9dcd5aeSmrg # mkdir is a portable test-and-set. 395d9dcd5aeSmrg if mkdir "$lockdir" 2>/dev/null; then 396d9dcd5aeSmrg # This process acquired the lock. 397d9dcd5aeSmrg "$@" -MD 398d9dcd5aeSmrg stat=$? 399d9dcd5aeSmrg # Release the lock. 400d9dcd5aeSmrg rmdir "$lockdir" 401d9dcd5aeSmrg break 402d9dcd5aeSmrg else 403d9dcd5aeSmrg # If the lock is being held by a different process, wait 404d9dcd5aeSmrg # until the winning process is done or we timeout. 405d9dcd5aeSmrg while test -d "$lockdir" && test $i -gt 0; do 406d9dcd5aeSmrg sleep 1 407d9dcd5aeSmrg i=`expr $i - 1` 408d9dcd5aeSmrg done 409d9dcd5aeSmrg fi 410d9dcd5aeSmrg i=`expr $i - 1` 411d9dcd5aeSmrg done 412d9dcd5aeSmrg trap - 1 2 13 15 413d9dcd5aeSmrg if test $i -le 0; then 414d9dcd5aeSmrg echo "$0: failed to acquire lock after $numtries attempts" >&2 415d9dcd5aeSmrg echo "$0: check lockdir '$lockdir'" >&2 416d9dcd5aeSmrg exit 1 417d9dcd5aeSmrg fi 418191cded7Smrg 419d9dcd5aeSmrg if test $stat -ne 0; then 420191cded7Smrg rm -f "$tmpdepfile" 421191cded7Smrg exit $stat 422191cded7Smrg fi 423191cded7Smrg rm -f "$depfile" 424191cded7Smrg # Each line is of the form `foo.o: dependent.h', 425191cded7Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 426191cded7Smrg # Do two passes, one to just change these to 427191cded7Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 428191cded7Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 429191cded7Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 430191cded7Smrg # correctly. Breaking it into two sed invocations is a workaround. 431d9dcd5aeSmrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 432d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 433191cded7Smrg rm -f "$tmpdepfile" 434191cded7Smrg ;; 435191cded7Smrg 436b290cf36Smrghp2) 437b290cf36Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 438b290cf36Smrg # compilers, which have integrated preprocessors. The correct option 439b290cf36Smrg # to use with these is +Maked; it writes dependencies to a file named 440b290cf36Smrg # 'foo.d', which lands next to the object file, wherever that 441b290cf36Smrg # happens to be. 442b290cf36Smrg # Much of this is similar to the tru64 case; see comments there. 443d9dcd5aeSmrg set_dir_from "$object" 444d9dcd5aeSmrg set_base_from "$object" 445b290cf36Smrg if test "$libtool" = yes; then 446b290cf36Smrg tmpdepfile1=$dir$base.d 447b290cf36Smrg tmpdepfile2=$dir.libs/$base.d 448b290cf36Smrg "$@" -Wc,+Maked 449b290cf36Smrg else 450b290cf36Smrg tmpdepfile1=$dir$base.d 451b290cf36Smrg tmpdepfile2=$dir$base.d 452b290cf36Smrg "$@" +Maked 453b290cf36Smrg fi 454b290cf36Smrg stat=$? 455d9dcd5aeSmrg if test $stat -ne 0; then 456b290cf36Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 457b290cf36Smrg exit $stat 458b290cf36Smrg fi 459b290cf36Smrg 460b290cf36Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 461b290cf36Smrg do 462b290cf36Smrg test -f "$tmpdepfile" && break 463b290cf36Smrg done 464b290cf36Smrg if test -f "$tmpdepfile"; then 465d9dcd5aeSmrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 466d9dcd5aeSmrg # Add 'dependent.h:' lines. 467ba064abeSmrg sed -ne '2,${ 468d9dcd5aeSmrg s/^ *// 469d9dcd5aeSmrg s/ \\*$// 470d9dcd5aeSmrg s/$/:/ 471d9dcd5aeSmrg p 472d9dcd5aeSmrg }' "$tmpdepfile" >> "$depfile" 473b290cf36Smrg else 474d9dcd5aeSmrg make_dummy_depfile 475b290cf36Smrg fi 476b290cf36Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 477b290cf36Smrg ;; 478b290cf36Smrg 479191cded7Smrgtru64) 480d9dcd5aeSmrg # The Tru64 compiler uses -MD to generate dependencies as a side 481d9dcd5aeSmrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 482d9dcd5aeSmrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 483d9dcd5aeSmrg # dependencies in 'foo.d' instead, so we check for that too. 484d9dcd5aeSmrg # Subdirectories are respected. 485d9dcd5aeSmrg set_dir_from "$object" 486d9dcd5aeSmrg set_base_from "$object" 487d9dcd5aeSmrg 488d9dcd5aeSmrg if test "$libtool" = yes; then 489d9dcd5aeSmrg # Libtool generates 2 separate objects for the 2 libraries. These 490d9dcd5aeSmrg # two compilations output dependencies in $dir.libs/$base.o.d and 491d9dcd5aeSmrg # in $dir$base.o.d. We have to check for both files, because 492d9dcd5aeSmrg # one of the two compilations can be disabled. We should prefer 493d9dcd5aeSmrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 494d9dcd5aeSmrg # automatically cleaned when .libs/ is deleted, while ignoring 495d9dcd5aeSmrg # the former would cause a distcleancheck panic. 496d9dcd5aeSmrg tmpdepfile1=$dir$base.o.d # libtool 1.5 497d9dcd5aeSmrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 498d9dcd5aeSmrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 499d9dcd5aeSmrg "$@" -Wc,-MD 500d9dcd5aeSmrg else 501d9dcd5aeSmrg tmpdepfile1=$dir$base.d 502d9dcd5aeSmrg tmpdepfile2=$dir$base.d 503d9dcd5aeSmrg tmpdepfile3=$dir$base.d 504d9dcd5aeSmrg "$@" -MD 505d9dcd5aeSmrg fi 506d9dcd5aeSmrg 507d9dcd5aeSmrg stat=$? 508d9dcd5aeSmrg if test $stat -ne 0; then 509d9dcd5aeSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 510d9dcd5aeSmrg exit $stat 511d9dcd5aeSmrg fi 512d9dcd5aeSmrg 513d9dcd5aeSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 514d9dcd5aeSmrg do 515d9dcd5aeSmrg test -f "$tmpdepfile" && break 516d9dcd5aeSmrg done 517d9dcd5aeSmrg # Same post-processing that is required for AIX mode. 518d9dcd5aeSmrg aix_post_process_depfile 519d9dcd5aeSmrg ;; 520d9dcd5aeSmrg 521d9dcd5aeSmrgmsvc7) 522d9dcd5aeSmrg if test "$libtool" = yes; then 523d9dcd5aeSmrg showIncludes=-Wc,-showIncludes 524d9dcd5aeSmrg else 525d9dcd5aeSmrg showIncludes=-showIncludes 526d9dcd5aeSmrg fi 527d9dcd5aeSmrg "$@" $showIncludes > "$tmpdepfile" 528d9dcd5aeSmrg stat=$? 529d9dcd5aeSmrg grep -v '^Note: including file: ' "$tmpdepfile" 530d9dcd5aeSmrg if test $stat -ne 0; then 531d9dcd5aeSmrg rm -f "$tmpdepfile" 532d9dcd5aeSmrg exit $stat 533d9dcd5aeSmrg fi 534d9dcd5aeSmrg rm -f "$depfile" 535d9dcd5aeSmrg echo "$object : \\" > "$depfile" 536d9dcd5aeSmrg # The first sed program below extracts the file names and escapes 537d9dcd5aeSmrg # backslashes for cygpath. The second sed program outputs the file 538d9dcd5aeSmrg # name when reading, but also accumulates all include files in the 539d9dcd5aeSmrg # hold buffer in order to output them again at the end. This only 540d9dcd5aeSmrg # works with sed implementations that can handle large buffers. 541d9dcd5aeSmrg sed < "$tmpdepfile" -n ' 542d9dcd5aeSmrg/^Note: including file: *\(.*\)/ { 543d9dcd5aeSmrg s//\1/ 544d9dcd5aeSmrg s/\\/\\\\/g 545d9dcd5aeSmrg p 546d9dcd5aeSmrg}' | $cygpath_u | sort -u | sed -n ' 547d9dcd5aeSmrgs/ /\\ /g 548d9dcd5aeSmrgs/\(.*\)/'"$tab"'\1 \\/p 549d9dcd5aeSmrgs/.\(.*\) \\/\1:/ 550d9dcd5aeSmrgH 551d9dcd5aeSmrg$ { 552d9dcd5aeSmrg s/.*/'"$tab"'/ 553d9dcd5aeSmrg G 554d9dcd5aeSmrg p 555d9dcd5aeSmrg}' >> "$depfile" 55658deefebSmrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 557d9dcd5aeSmrg rm -f "$tmpdepfile" 558d9dcd5aeSmrg ;; 559d9dcd5aeSmrg 560d9dcd5aeSmrgmsvc7msys) 561d9dcd5aeSmrg # This case exists only to let depend.m4 do its work. It works by 562d9dcd5aeSmrg # looking at the text of this script. This case will never be run, 563d9dcd5aeSmrg # since it is checked for above. 564d9dcd5aeSmrg exit 1 565d9dcd5aeSmrg ;; 566191cded7Smrg 567191cded7Smrg#nosideeffect) 568191cded7Smrg # This comment above is used by automake to tell side-effect 569191cded7Smrg # dependency tracking mechanisms from slower ones. 570191cded7Smrg 571191cded7Smrgdashmstdout) 572191cded7Smrg # Important note: in order to support this mode, a compiler *must* 573191cded7Smrg # always write the preprocessed file to stdout, regardless of -o. 574191cded7Smrg "$@" || exit $? 575191cded7Smrg 576191cded7Smrg # Remove the call to Libtool. 577191cded7Smrg if test "$libtool" = yes; then 578ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 579191cded7Smrg shift 580191cded7Smrg done 581191cded7Smrg shift 582191cded7Smrg fi 583191cded7Smrg 584d9dcd5aeSmrg # Remove '-o $object'. 585191cded7Smrg IFS=" " 586191cded7Smrg for arg 587191cded7Smrg do 588191cded7Smrg case $arg in 589191cded7Smrg -o) 590191cded7Smrg shift 591191cded7Smrg ;; 592191cded7Smrg $object) 593191cded7Smrg shift 594191cded7Smrg ;; 595191cded7Smrg *) 596191cded7Smrg set fnord "$@" "$arg" 597191cded7Smrg shift # fnord 598191cded7Smrg shift # $arg 599191cded7Smrg ;; 600191cded7Smrg esac 601191cded7Smrg done 602191cded7Smrg 603191cded7Smrg test -z "$dashmflag" && dashmflag=-M 604d9dcd5aeSmrg # Require at least two characters before searching for ':' 605191cded7Smrg # in the target name. This is to cope with DOS-style filenames: 606d9dcd5aeSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 607191cded7Smrg "$@" $dashmflag | 608d9dcd5aeSmrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 609191cded7Smrg rm -f "$depfile" 610191cded7Smrg cat < "$tmpdepfile" > "$depfile" 611d9dcd5aeSmrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 612d9dcd5aeSmrg # correctly. Breaking it into two sed invocations is a workaround. 613d9dcd5aeSmrg tr ' ' "$nl" < "$tmpdepfile" \ 614d9dcd5aeSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 615d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 616191cded7Smrg rm -f "$tmpdepfile" 617191cded7Smrg ;; 618191cded7Smrg 619191cded7SmrgdashXmstdout) 620191cded7Smrg # This case only exists to satisfy depend.m4. It is never actually 621191cded7Smrg # run, as this mode is specially recognized in the preamble. 622191cded7Smrg exit 1 623191cded7Smrg ;; 624191cded7Smrg 625191cded7Smrgmakedepend) 626191cded7Smrg "$@" || exit $? 627191cded7Smrg # Remove any Libtool call 628191cded7Smrg if test "$libtool" = yes; then 629ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 630191cded7Smrg shift 631191cded7Smrg done 632191cded7Smrg shift 633191cded7Smrg fi 634191cded7Smrg # X makedepend 635191cded7Smrg shift 636ba064abeSmrg cleared=no eat=no 637ba064abeSmrg for arg 638ba064abeSmrg do 639191cded7Smrg case $cleared in 640191cded7Smrg no) 641191cded7Smrg set ""; shift 642191cded7Smrg cleared=yes ;; 643191cded7Smrg esac 644ba064abeSmrg if test $eat = yes; then 645ba064abeSmrg eat=no 646ba064abeSmrg continue 647ba064abeSmrg fi 648191cded7Smrg case "$arg" in 649191cded7Smrg -D*|-I*) 650191cded7Smrg set fnord "$@" "$arg"; shift ;; 651191cded7Smrg # Strip any option that makedepend may not understand. Remove 652191cded7Smrg # the object too, otherwise makedepend will parse it as a source file. 653ba064abeSmrg -arch) 654ba064abeSmrg eat=yes ;; 655191cded7Smrg -*|$object) 656191cded7Smrg ;; 657191cded7Smrg *) 658191cded7Smrg set fnord "$@" "$arg"; shift ;; 659191cded7Smrg esac 660191cded7Smrg done 661ba064abeSmrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 662191cded7Smrg touch "$tmpdepfile" 663191cded7Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 664191cded7Smrg rm -f "$depfile" 665d9dcd5aeSmrg # makedepend may prepend the VPATH from the source file name to the object. 666d9dcd5aeSmrg # No need to regex-escape $object, excess matching of '.' is harmless. 667d9dcd5aeSmrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 668d9dcd5aeSmrg # Some versions of the HPUX 10.20 sed can't process the last invocation 669d9dcd5aeSmrg # correctly. Breaking it into two sed invocations is a workaround. 670d9dcd5aeSmrg sed '1,2d' "$tmpdepfile" \ 671d9dcd5aeSmrg | tr ' ' "$nl" \ 672d9dcd5aeSmrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 673d9dcd5aeSmrg | sed -e 's/$/ :/' >> "$depfile" 674191cded7Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 675191cded7Smrg ;; 676191cded7Smrg 677191cded7Smrgcpp) 678191cded7Smrg # Important note: in order to support this mode, a compiler *must* 679191cded7Smrg # always write the preprocessed file to stdout. 680191cded7Smrg "$@" || exit $? 681191cded7Smrg 682191cded7Smrg # Remove the call to Libtool. 683191cded7Smrg if test "$libtool" = yes; then 684ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 685191cded7Smrg shift 686191cded7Smrg done 687191cded7Smrg shift 688191cded7Smrg fi 689191cded7Smrg 690d9dcd5aeSmrg # Remove '-o $object'. 691191cded7Smrg IFS=" " 692191cded7Smrg for arg 693191cded7Smrg do 694191cded7Smrg case $arg in 695191cded7Smrg -o) 696191cded7Smrg shift 697191cded7Smrg ;; 698191cded7Smrg $object) 699191cded7Smrg shift 700191cded7Smrg ;; 701191cded7Smrg *) 702191cded7Smrg set fnord "$@" "$arg" 703191cded7Smrg shift # fnord 704191cded7Smrg shift # $arg 705191cded7Smrg ;; 706191cded7Smrg esac 707191cded7Smrg done 708191cded7Smrg 709d9dcd5aeSmrg "$@" -E \ 710d9dcd5aeSmrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711d9dcd5aeSmrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 712d9dcd5aeSmrg | sed '$ s: \\$::' > "$tmpdepfile" 713191cded7Smrg rm -f "$depfile" 714191cded7Smrg echo "$object : \\" > "$depfile" 715191cded7Smrg cat < "$tmpdepfile" >> "$depfile" 716191cded7Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 717191cded7Smrg rm -f "$tmpdepfile" 718191cded7Smrg ;; 719191cded7Smrg 720191cded7Smrgmsvisualcpp) 721191cded7Smrg # Important note: in order to support this mode, a compiler *must* 722ba064abeSmrg # always write the preprocessed file to stdout. 723191cded7Smrg "$@" || exit $? 724ba064abeSmrg 725ba064abeSmrg # Remove the call to Libtool. 726ba064abeSmrg if test "$libtool" = yes; then 727ba064abeSmrg while test "X$1" != 'X--mode=compile'; do 728ba064abeSmrg shift 729ba064abeSmrg done 730ba064abeSmrg shift 731ba064abeSmrg fi 732ba064abeSmrg 733191cded7Smrg IFS=" " 734191cded7Smrg for arg 735191cded7Smrg do 736191cded7Smrg case "$arg" in 737ba064abeSmrg -o) 738ba064abeSmrg shift 739ba064abeSmrg ;; 740ba064abeSmrg $object) 741ba064abeSmrg shift 742ba064abeSmrg ;; 743191cded7Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 744d9dcd5aeSmrg set fnord "$@" 745d9dcd5aeSmrg shift 746d9dcd5aeSmrg shift 747d9dcd5aeSmrg ;; 748191cded7Smrg *) 749d9dcd5aeSmrg set fnord "$@" "$arg" 750d9dcd5aeSmrg shift 751d9dcd5aeSmrg shift 752d9dcd5aeSmrg ;; 753191cded7Smrg esac 754191cded7Smrg done 755ba064abeSmrg "$@" -E 2>/dev/null | 756ba064abeSmrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 757191cded7Smrg rm -f "$depfile" 758191cded7Smrg echo "$object : \\" > "$depfile" 759d9dcd5aeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 760d9dcd5aeSmrg echo "$tab" >> "$depfile" 761ba064abeSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 762191cded7Smrg rm -f "$tmpdepfile" 763191cded7Smrg ;; 764191cded7Smrg 765ba064abeSmrgmsvcmsys) 766ba064abeSmrg # This case exists only to let depend.m4 do its work. It works by 767ba064abeSmrg # looking at the text of this script. This case will never be run, 768ba064abeSmrg # since it is checked for above. 769ba064abeSmrg exit 1 770ba064abeSmrg ;; 771ba064abeSmrg 772191cded7Smrgnone) 773191cded7Smrg exec "$@" 774191cded7Smrg ;; 775191cded7Smrg 776191cded7Smrg*) 777191cded7Smrg echo "Unknown depmode $depmode" 1>&2 778191cded7Smrg exit 1 779191cded7Smrg ;; 780191cded7Smrgesac 781191cded7Smrg 782191cded7Smrgexit 0 783191cded7Smrg 784191cded7Smrg# Local Variables: 785191cded7Smrg# mode: shell-script 786191cded7Smrg# sh-indentation: 2 787ee3e8c14Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 788191cded7Smrg# time-stamp-start: "scriptversion=" 789191cded7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 790ee3e8c14Smrg# time-stamp-time-zone: "UTC0" 791ba064abeSmrg# time-stamp-end: "; # UTC" 792191cded7Smrg# End: 793