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