1fe5e51b7Smrg#! /bin/sh 2fe5e51b7Smrg# depcomp - compile a program generating dependencies as side-effects 3fe5e51b7Smrg 41e423a8fSmrgscriptversion=2018-03-07.03; # UTC 5fe5e51b7Smrg 61e423a8fSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 7fe5e51b7Smrg 8fe5e51b7Smrg# This program is free software; you can redistribute it and/or modify 9fe5e51b7Smrg# it under the terms of the GNU General Public License as published by 10fe5e51b7Smrg# the Free Software Foundation; either version 2, or (at your option) 11fe5e51b7Smrg# any later version. 12fe5e51b7Smrg 13fe5e51b7Smrg# This program is distributed in the hope that it will be useful, 14fe5e51b7Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15fe5e51b7Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16fe5e51b7Smrg# GNU General Public License for more details. 17fe5e51b7Smrg 18fe5e51b7Smrg# You should have received a copy of the GNU General Public License 191e423a8fSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 20fe5e51b7Smrg 21fe5e51b7Smrg# As a special exception to the GNU General Public License, if you 22fe5e51b7Smrg# distribute this file as part of a program that contains a 23fe5e51b7Smrg# configuration script generated by Autoconf, you may include it under 24fe5e51b7Smrg# the same distribution terms that you use for the rest of that program. 25fe5e51b7Smrg 26fe5e51b7Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27fe5e51b7Smrg 28fe5e51b7Smrgcase $1 in 29fe5e51b7Smrg '') 30493f84f4Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31493f84f4Smrg exit 1; 32493f84f4Smrg ;; 33fe5e51b7Smrg -h | --h*) 34fe5e51b7Smrg cat <<\EOF 35fe5e51b7SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36fe5e51b7Smrg 37fe5e51b7SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38fe5e51b7Smrgas side-effects. 39fe5e51b7Smrg 40fe5e51b7SmrgEnvironment variables: 41fe5e51b7Smrg depmode Dependency tracking mode. 42acd6767fSmrg source Source file read by 'PROGRAMS ARGS'. 43acd6767fSmrg object Object file output by 'PROGRAMS ARGS'. 44fe5e51b7Smrg DEPDIR directory where to store dependencies. 45fe5e51b7Smrg depfile Dependency file to output. 460bb88ba4Smrg tmpdepfile Temporary file to use when outputting dependencies. 47fe5e51b7Smrg libtool Whether libtool is used (yes/no). 48fe5e51b7Smrg 49fe5e51b7SmrgReport bugs to <bug-automake@gnu.org>. 50fe5e51b7SmrgEOF 51fe5e51b7Smrg exit $? 52fe5e51b7Smrg ;; 53fe5e51b7Smrg -v | --v*) 54fe5e51b7Smrg echo "depcomp $scriptversion" 55fe5e51b7Smrg exit $? 56fe5e51b7Smrg ;; 57fe5e51b7Smrgesac 58fe5e51b7Smrg 59493f84f4Smrg# Get the directory component of the given path, and save it in the 60493f84f4Smrg# global variables '$dir'. Note that this directory component will 61493f84f4Smrg# be either empty or ending with a '/' character. This is deliberate. 62493f84f4Smrgset_dir_from () 63493f84f4Smrg{ 64493f84f4Smrg case $1 in 65493f84f4Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66493f84f4Smrg *) dir=;; 67493f84f4Smrg esac 68493f84f4Smrg} 69493f84f4Smrg 70493f84f4Smrg# Get the suffix-stripped basename of the given path, and save it the 71493f84f4Smrg# global variable '$base'. 72493f84f4Smrgset_base_from () 73493f84f4Smrg{ 74493f84f4Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75493f84f4Smrg} 76493f84f4Smrg 77493f84f4Smrg# If no dependency file was actually created by the compiler invocation, 78493f84f4Smrg# we still have to create a dummy depfile, to avoid errors with the 79493f84f4Smrg# Makefile "include basename.Plo" scheme. 80493f84f4Smrgmake_dummy_depfile () 81493f84f4Smrg{ 82493f84f4Smrg echo "#dummy" > "$depfile" 83493f84f4Smrg} 84493f84f4Smrg 85493f84f4Smrg# Factor out some common post-processing of the generated depfile. 86493f84f4Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87493f84f4Smrgaix_post_process_depfile () 88493f84f4Smrg{ 89493f84f4Smrg # If the compiler actually managed to produce a dependency file, 90493f84f4Smrg # post-process it. 91493f84f4Smrg if test -f "$tmpdepfile"; then 92493f84f4Smrg # Each line is of the form 'foo.o: dependency.h'. 93493f84f4Smrg # Do two passes, one to just change these to 94493f84f4Smrg # $object: dependency.h 95493f84f4Smrg # and one to simply output 96493f84f4Smrg # dependency.h: 97493f84f4Smrg # which is needed to avoid the deleted-header problem. 98493f84f4Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99493f84f4Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100493f84f4Smrg } > "$depfile" 101493f84f4Smrg rm -f "$tmpdepfile" 102493f84f4Smrg else 103493f84f4Smrg make_dummy_depfile 104493f84f4Smrg fi 105493f84f4Smrg} 106493f84f4Smrg 107acd6767fSmrg# A tabulation character. 108acd6767fSmrgtab=' ' 109acd6767fSmrg# A newline character. 110acd6767fSmrgnl=' 111acd6767fSmrg' 112493f84f4Smrg# Character ranges might be problematic outside the C locale. 113493f84f4Smrg# These definitions help. 114493f84f4Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115493f84f4Smrglower=abcdefghijklmnopqrstuvwxyz 116493f84f4Smrgdigits=0123456789 117493f84f4Smrgalpha=${upper}${lower} 118acd6767fSmrg 119fe5e51b7Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 120fe5e51b7Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 121fe5e51b7Smrg exit 1 122fe5e51b7Smrgfi 123fe5e51b7Smrg 124fe5e51b7Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 125fe5e51b7Smrgdepfile=${depfile-`echo "$object" | 126fe5e51b7Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 127fe5e51b7Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 128fe5e51b7Smrg 129fe5e51b7Smrgrm -f "$tmpdepfile" 130fe5e51b7Smrg 131493f84f4Smrg# Avoid interferences from the environment. 132493f84f4Smrggccflag= dashmflag= 133493f84f4Smrg 134fe5e51b7Smrg# Some modes work just like other modes, but use different flags. We 135fe5e51b7Smrg# parameterize here, but still list the modes in the big case below, 136fe5e51b7Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 137fe5e51b7Smrg# here, because this file can only contain one case statement. 138fe5e51b7Smrgif test "$depmode" = hp; then 139fe5e51b7Smrg # HP compiler uses -M and no extra arg. 140fe5e51b7Smrg gccflag=-M 141fe5e51b7Smrg depmode=gcc 142fe5e51b7Smrgfi 143fe5e51b7Smrg 144fe5e51b7Smrgif test "$depmode" = dashXmstdout; then 145493f84f4Smrg # This is just like dashmstdout with a different argument. 146493f84f4Smrg dashmflag=-xM 147493f84f4Smrg depmode=dashmstdout 148fe5e51b7Smrgfi 149fe5e51b7Smrg 1500bb88ba4Smrgcygpath_u="cygpath -u -f -" 1510bb88ba4Smrgif test "$depmode" = msvcmsys; then 152493f84f4Smrg # This is just like msvisualcpp but w/o cygpath translation. 153493f84f4Smrg # Just convert the backslash-escaped backslashes to single forward 154493f84f4Smrg # slashes to satisfy depend.m4 155493f84f4Smrg cygpath_u='sed s,\\\\,/,g' 156493f84f4Smrg depmode=msvisualcpp 1570bb88ba4Smrgfi 1580bb88ba4Smrg 1590bb88ba4Smrgif test "$depmode" = msvc7msys; then 160493f84f4Smrg # This is just like msvc7 but w/o cygpath translation. 161493f84f4Smrg # Just convert the backslash-escaped backslashes to single forward 162493f84f4Smrg # slashes to satisfy depend.m4 163493f84f4Smrg cygpath_u='sed s,\\\\,/,g' 164493f84f4Smrg depmode=msvc7 1650bb88ba4Smrgfi 1660bb88ba4Smrg 167acd6767fSmrgif test "$depmode" = xlc; then 168493f84f4Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169493f84f4Smrg gccflag=-qmakedep=gcc,-MF 170493f84f4Smrg depmode=gcc 171acd6767fSmrgfi 172acd6767fSmrg 173fe5e51b7Smrgcase "$depmode" in 174fe5e51b7Smrggcc3) 175fe5e51b7Smrg## gcc 3 implements dependency tracking that does exactly what 176fe5e51b7Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 177fe5e51b7Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 178fe5e51b7Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 179fe5e51b7Smrg## the command line argument order; so add the flags where they 180fe5e51b7Smrg## appear in depend2.am. Note that the slowdown incurred here 181fe5e51b7Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 182fe5e51b7Smrg for arg 183fe5e51b7Smrg do 184fe5e51b7Smrg case $arg in 185fe5e51b7Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 186fe5e51b7Smrg *) set fnord "$@" "$arg" ;; 187fe5e51b7Smrg esac 188fe5e51b7Smrg shift # fnord 189fe5e51b7Smrg shift # $arg 190fe5e51b7Smrg done 191fe5e51b7Smrg "$@" 192fe5e51b7Smrg stat=$? 193493f84f4Smrg if test $stat -ne 0; then 194fe5e51b7Smrg rm -f "$tmpdepfile" 195fe5e51b7Smrg exit $stat 196fe5e51b7Smrg fi 197fe5e51b7Smrg mv "$tmpdepfile" "$depfile" 198fe5e51b7Smrg ;; 199fe5e51b7Smrg 200fe5e51b7Smrggcc) 201493f84f4Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202493f84f4Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203493f84f4Smrg## (see the conditional assignment to $gccflag above). 204fe5e51b7Smrg## There are various ways to get dependency output from gcc. Here's 205fe5e51b7Smrg## why we pick this rather obscure method: 206fe5e51b7Smrg## - Don't want to use -MD because we'd like the dependencies to end 207fe5e51b7Smrg## up in a subdir. Having to rename by hand is ugly. 208fe5e51b7Smrg## (We might end up doing this anyway to support other compilers.) 209fe5e51b7Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210493f84f4Smrg## -MM, not -M (despite what the docs say). Also, it might not be 211493f84f4Smrg## supported by the other compilers which use the 'gcc' depmode. 212fe5e51b7Smrg## - Using -M directly means running the compiler twice (even worse 213fe5e51b7Smrg## than renaming). 214fe5e51b7Smrg if test -z "$gccflag"; then 215fe5e51b7Smrg gccflag=-MD, 216fe5e51b7Smrg fi 217fe5e51b7Smrg "$@" -Wp,"$gccflag$tmpdepfile" 218fe5e51b7Smrg stat=$? 219493f84f4Smrg if test $stat -ne 0; then 220fe5e51b7Smrg rm -f "$tmpdepfile" 221fe5e51b7Smrg exit $stat 222fe5e51b7Smrg fi 223fe5e51b7Smrg rm -f "$depfile" 224fe5e51b7Smrg echo "$object : \\" > "$depfile" 225493f84f4Smrg # The second -e expression handles DOS-style file names with drive 226493f84f4Smrg # letters. 227fe5e51b7Smrg sed -e 's/^[^:]*: / /' \ 228fe5e51b7Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229acd6767fSmrg## This next piece of magic avoids the "deleted header file" problem. 230fe5e51b7Smrg## The problem is that when a header file which appears in a .P file 231fe5e51b7Smrg## is deleted, the dependency causes make to die (because there is 232fe5e51b7Smrg## typically no way to rebuild the header). We avoid this by adding 233fe5e51b7Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 234fe5e51b7Smrg## this for us directly. 235acd6767fSmrg## Some versions of gcc put a space before the ':'. On the theory 236fe5e51b7Smrg## that the space means something, we add a space to the output as 2370bb88ba4Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 2380bb88ba4Smrg## to the object. Take care to not repeat it in the output. 239fe5e51b7Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 240fe5e51b7Smrg## correctly. Breaking it into two sed invocations is a workaround. 241493f84f4Smrg tr ' ' "$nl" < "$tmpdepfile" \ 242493f84f4Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243493f84f4Smrg | sed -e 's/$/ :/' >> "$depfile" 244fe5e51b7Smrg rm -f "$tmpdepfile" 245fe5e51b7Smrg ;; 246fe5e51b7Smrg 247fe5e51b7Smrghp) 248fe5e51b7Smrg # This case exists only to let depend.m4 do its work. It works by 249fe5e51b7Smrg # looking at the text of this script. This case will never be run, 250fe5e51b7Smrg # since it is checked for above. 251fe5e51b7Smrg exit 1 252fe5e51b7Smrg ;; 253fe5e51b7Smrg 254fe5e51b7Smrgsgi) 255fe5e51b7Smrg if test "$libtool" = yes; then 256fe5e51b7Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 257fe5e51b7Smrg else 258fe5e51b7Smrg "$@" -MDupdate "$tmpdepfile" 259fe5e51b7Smrg fi 260fe5e51b7Smrg stat=$? 261493f84f4Smrg if test $stat -ne 0; then 262fe5e51b7Smrg rm -f "$tmpdepfile" 263fe5e51b7Smrg exit $stat 264fe5e51b7Smrg fi 265fe5e51b7Smrg rm -f "$depfile" 266fe5e51b7Smrg 267fe5e51b7Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268fe5e51b7Smrg echo "$object : \\" > "$depfile" 269fe5e51b7Smrg # Clip off the initial element (the dependent). Don't try to be 270fe5e51b7Smrg # clever and replace this with sed code, as IRIX sed won't handle 271fe5e51b7Smrg # lines with more than a fixed number of characters (4096 in 272fe5e51b7Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273acd6767fSmrg # the IRIX cc adds comments like '#:fec' to the end of the 274fe5e51b7Smrg # dependency line. 275acd6767fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 276493f84f4Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277493f84f4Smrg | tr "$nl" ' ' >> "$depfile" 2780bb88ba4Smrg echo >> "$depfile" 279fe5e51b7Smrg # The second pass generates a dummy entry for each header file. 280acd6767fSmrg tr ' ' "$nl" < "$tmpdepfile" \ 281493f84f4Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282493f84f4Smrg >> "$depfile" 283fe5e51b7Smrg else 284493f84f4Smrg make_dummy_depfile 285fe5e51b7Smrg fi 286fe5e51b7Smrg rm -f "$tmpdepfile" 287fe5e51b7Smrg ;; 288fe5e51b7Smrg 289acd6767fSmrgxlc) 290acd6767fSmrg # This case exists only to let depend.m4 do its work. It works by 291acd6767fSmrg # looking at the text of this script. This case will never be run, 292acd6767fSmrg # since it is checked for above. 293acd6767fSmrg exit 1 294acd6767fSmrg ;; 295acd6767fSmrg 296fe5e51b7Smrgaix) 297fe5e51b7Smrg # The C for AIX Compiler uses -M and outputs the dependencies 298fe5e51b7Smrg # in a .u file. In older versions, this file always lives in the 299acd6767fSmrg # current directory. Also, the AIX compiler puts '$object:' at the 300fe5e51b7Smrg # start of each line; $object doesn't have directory information. 301fe5e51b7Smrg # Version 6 uses the directory in both cases. 302493f84f4Smrg set_dir_from "$object" 303493f84f4Smrg set_base_from "$object" 304fe5e51b7Smrg if test "$libtool" = yes; then 305eda3803bSmrg tmpdepfile1=$dir$base.u 306eda3803bSmrg tmpdepfile2=$base.u 307eda3803bSmrg tmpdepfile3=$dir.libs/$base.u 308fe5e51b7Smrg "$@" -Wc,-M 309fe5e51b7Smrg else 310eda3803bSmrg tmpdepfile1=$dir$base.u 311eda3803bSmrg tmpdepfile2=$dir$base.u 312eda3803bSmrg tmpdepfile3=$dir$base.u 313fe5e51b7Smrg "$@" -M 314fe5e51b7Smrg fi 315fe5e51b7Smrg stat=$? 316493f84f4Smrg if test $stat -ne 0; then 317eda3803bSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318fe5e51b7Smrg exit $stat 319fe5e51b7Smrg fi 320fe5e51b7Smrg 321eda3803bSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 322eda3803bSmrg do 323eda3803bSmrg test -f "$tmpdepfile" && break 324eda3803bSmrg done 325493f84f4Smrg aix_post_process_depfile 326493f84f4Smrg ;; 327493f84f4Smrg 328493f84f4Smrgtcc) 329493f84f4Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330493f84f4Smrg # FIXME: That version still under development at the moment of writing. 331493f84f4Smrg # Make that this statement remains true also for stable, released 332493f84f4Smrg # versions. 333493f84f4Smrg # It will wrap lines (doesn't matter whether long or short) with a 334493f84f4Smrg # trailing '\', as in: 335493f84f4Smrg # 336493f84f4Smrg # foo.o : \ 337493f84f4Smrg # foo.c \ 338493f84f4Smrg # foo.h \ 339493f84f4Smrg # 340493f84f4Smrg # It will put a trailing '\' even on the last line, and will use leading 341493f84f4Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 342493f84f4Smrg # "Emit spaces for -MD"). 343493f84f4Smrg "$@" -MD -MF "$tmpdepfile" 344493f84f4Smrg stat=$? 345493f84f4Smrg if test $stat -ne 0; then 346493f84f4Smrg rm -f "$tmpdepfile" 347493f84f4Smrg exit $stat 348fe5e51b7Smrg fi 349493f84f4Smrg rm -f "$depfile" 350493f84f4Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351493f84f4Smrg # We have to change lines of the first kind to '$object: \'. 352493f84f4Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353493f84f4Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 354493f84f4Smrg # dummy dependency, to avoid the deleted-header problem. 355493f84f4Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356fe5e51b7Smrg rm -f "$tmpdepfile" 357fe5e51b7Smrg ;; 358fe5e51b7Smrg 359493f84f4Smrg## The order of this option in the case statement is important, since the 360493f84f4Smrg## shell code in configure will try each of these formats in the order 361493f84f4Smrg## listed in this file. A plain '-MD' option would be understood by many 362493f84f4Smrg## compilers, so we must ensure this comes after the gcc and icc options. 363493f84f4Smrgpgcc) 364493f84f4Smrg # Portland's C compiler understands '-MD'. 365493f84f4Smrg # Will always output deps to 'file.d' where file is the root name of the 366493f84f4Smrg # source file under compilation, even if file resides in a subdirectory. 367493f84f4Smrg # The object file name does not affect the name of the '.d' file. 368493f84f4Smrg # pgcc 10.2 will output 369fe5e51b7Smrg # foo.o: sub/foo.c sub/foo.h 370493f84f4Smrg # and will wrap long lines using '\' : 371fe5e51b7Smrg # foo.o: sub/foo.c ... \ 372fe5e51b7Smrg # sub/foo.h ... \ 373fe5e51b7Smrg # ... 374493f84f4Smrg set_dir_from "$object" 375493f84f4Smrg # Use the source, not the object, to determine the base name, since 376493f84f4Smrg # that's sadly what pgcc will do too. 377493f84f4Smrg set_base_from "$source" 378493f84f4Smrg tmpdepfile=$base.d 379493f84f4Smrg 380493f84f4Smrg # For projects that build the same source file twice into different object 381493f84f4Smrg # files, the pgcc approach of using the *source* file root name can cause 382493f84f4Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383493f84f4Smrg # the same $tmpdepfile. 384493f84f4Smrg lockdir=$base.d-lock 385493f84f4Smrg trap " 386493f84f4Smrg echo '$0: caught signal, cleaning up...' >&2 387493f84f4Smrg rmdir '$lockdir' 388493f84f4Smrg exit 1 389493f84f4Smrg " 1 2 13 15 390493f84f4Smrg numtries=100 391493f84f4Smrg i=$numtries 392493f84f4Smrg while test $i -gt 0; do 393493f84f4Smrg # mkdir is a portable test-and-set. 394493f84f4Smrg if mkdir "$lockdir" 2>/dev/null; then 395493f84f4Smrg # This process acquired the lock. 396493f84f4Smrg "$@" -MD 397493f84f4Smrg stat=$? 398493f84f4Smrg # Release the lock. 399493f84f4Smrg rmdir "$lockdir" 400493f84f4Smrg break 401493f84f4Smrg else 402493f84f4Smrg # If the lock is being held by a different process, wait 403493f84f4Smrg # until the winning process is done or we timeout. 404493f84f4Smrg while test -d "$lockdir" && test $i -gt 0; do 405493f84f4Smrg sleep 1 406493f84f4Smrg i=`expr $i - 1` 407493f84f4Smrg done 408493f84f4Smrg fi 409493f84f4Smrg i=`expr $i - 1` 410493f84f4Smrg done 411493f84f4Smrg trap - 1 2 13 15 412493f84f4Smrg if test $i -le 0; then 413493f84f4Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414493f84f4Smrg echo "$0: check lockdir '$lockdir'" >&2 415493f84f4Smrg exit 1 416493f84f4Smrg fi 417493f84f4Smrg 418493f84f4Smrg if test $stat -ne 0; then 419fe5e51b7Smrg rm -f "$tmpdepfile" 420fe5e51b7Smrg exit $stat 421fe5e51b7Smrg fi 422fe5e51b7Smrg rm -f "$depfile" 423493f84f4Smrg # Each line is of the form `foo.o: dependent.h', 424493f84f4Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 425fe5e51b7Smrg # Do two passes, one to just change these to 426493f84f4Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 427493f84f4Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 428493f84f4Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 429493f84f4Smrg # correctly. Breaking it into two sed invocations is a workaround. 430493f84f4Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431493f84f4Smrg | sed -e 's/$/ :/' >> "$depfile" 432fe5e51b7Smrg rm -f "$tmpdepfile" 433fe5e51b7Smrg ;; 434fe5e51b7Smrg 435fe5e51b7Smrghp2) 436fe5e51b7Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 437fe5e51b7Smrg # compilers, which have integrated preprocessors. The correct option 438fe5e51b7Smrg # to use with these is +Maked; it writes dependencies to a file named 439fe5e51b7Smrg # 'foo.d', which lands next to the object file, wherever that 440fe5e51b7Smrg # happens to be. 441fe5e51b7Smrg # Much of this is similar to the tru64 case; see comments there. 442493f84f4Smrg set_dir_from "$object" 443493f84f4Smrg set_base_from "$object" 444fe5e51b7Smrg if test "$libtool" = yes; then 445fe5e51b7Smrg tmpdepfile1=$dir$base.d 446fe5e51b7Smrg tmpdepfile2=$dir.libs/$base.d 447fe5e51b7Smrg "$@" -Wc,+Maked 448fe5e51b7Smrg else 449fe5e51b7Smrg tmpdepfile1=$dir$base.d 450fe5e51b7Smrg tmpdepfile2=$dir$base.d 451fe5e51b7Smrg "$@" +Maked 452fe5e51b7Smrg fi 453fe5e51b7Smrg stat=$? 454493f84f4Smrg if test $stat -ne 0; then 455fe5e51b7Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 456fe5e51b7Smrg exit $stat 457fe5e51b7Smrg fi 458fe5e51b7Smrg 459fe5e51b7Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 460fe5e51b7Smrg do 461fe5e51b7Smrg test -f "$tmpdepfile" && break 462fe5e51b7Smrg done 463fe5e51b7Smrg if test -f "$tmpdepfile"; then 464493f84f4Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465acd6767fSmrg # Add 'dependent.h:' lines. 4660bb88ba4Smrg sed -ne '2,${ 467493f84f4Smrg s/^ *// 468493f84f4Smrg s/ \\*$// 469493f84f4Smrg s/$/:/ 470493f84f4Smrg p 471493f84f4Smrg }' "$tmpdepfile" >> "$depfile" 472fe5e51b7Smrg else 473493f84f4Smrg make_dummy_depfile 474fe5e51b7Smrg fi 475fe5e51b7Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 476fe5e51b7Smrg ;; 477fe5e51b7Smrg 478fe5e51b7Smrgtru64) 479493f84f4Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 480493f84f4Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481493f84f4Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482493f84f4Smrg # dependencies in 'foo.d' instead, so we check for that too. 483493f84f4Smrg # Subdirectories are respected. 484493f84f4Smrg set_dir_from "$object" 485493f84f4Smrg set_base_from "$object" 486493f84f4Smrg 487493f84f4Smrg if test "$libtool" = yes; then 488493f84f4Smrg # Libtool generates 2 separate objects for the 2 libraries. These 489493f84f4Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 490493f84f4Smrg # in $dir$base.o.d. We have to check for both files, because 491493f84f4Smrg # one of the two compilations can be disabled. We should prefer 492493f84f4Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493493f84f4Smrg # automatically cleaned when .libs/ is deleted, while ignoring 494493f84f4Smrg # the former would cause a distcleancheck panic. 495493f84f4Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496493f84f4Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497493f84f4Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498493f84f4Smrg "$@" -Wc,-MD 499493f84f4Smrg else 500493f84f4Smrg tmpdepfile1=$dir$base.d 501493f84f4Smrg tmpdepfile2=$dir$base.d 502493f84f4Smrg tmpdepfile3=$dir$base.d 503493f84f4Smrg "$@" -MD 504493f84f4Smrg fi 505493f84f4Smrg 506493f84f4Smrg stat=$? 507493f84f4Smrg if test $stat -ne 0; then 508493f84f4Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509493f84f4Smrg exit $stat 510493f84f4Smrg fi 511493f84f4Smrg 512493f84f4Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513493f84f4Smrg do 514493f84f4Smrg test -f "$tmpdepfile" && break 515493f84f4Smrg done 516493f84f4Smrg # Same post-processing that is required for AIX mode. 517493f84f4Smrg aix_post_process_depfile 518493f84f4Smrg ;; 519fe5e51b7Smrg 5200bb88ba4Smrgmsvc7) 5210bb88ba4Smrg if test "$libtool" = yes; then 5220bb88ba4Smrg showIncludes=-Wc,-showIncludes 5230bb88ba4Smrg else 5240bb88ba4Smrg showIncludes=-showIncludes 5250bb88ba4Smrg fi 5260bb88ba4Smrg "$@" $showIncludes > "$tmpdepfile" 5270bb88ba4Smrg stat=$? 5280bb88ba4Smrg grep -v '^Note: including file: ' "$tmpdepfile" 529493f84f4Smrg if test $stat -ne 0; then 5300bb88ba4Smrg rm -f "$tmpdepfile" 5310bb88ba4Smrg exit $stat 5320bb88ba4Smrg fi 5330bb88ba4Smrg rm -f "$depfile" 5340bb88ba4Smrg echo "$object : \\" > "$depfile" 5350bb88ba4Smrg # The first sed program below extracts the file names and escapes 5360bb88ba4Smrg # backslashes for cygpath. The second sed program outputs the file 5370bb88ba4Smrg # name when reading, but also accumulates all include files in the 5380bb88ba4Smrg # hold buffer in order to output them again at the end. This only 5390bb88ba4Smrg # works with sed implementations that can handle large buffers. 5400bb88ba4Smrg sed < "$tmpdepfile" -n ' 5410bb88ba4Smrg/^Note: including file: *\(.*\)/ { 5420bb88ba4Smrg s//\1/ 5430bb88ba4Smrg s/\\/\\\\/g 5440bb88ba4Smrg p 5450bb88ba4Smrg}' | $cygpath_u | sort -u | sed -n ' 5460bb88ba4Smrgs/ /\\ /g 547acd6767fSmrgs/\(.*\)/'"$tab"'\1 \\/p 5480bb88ba4Smrgs/.\(.*\) \\/\1:/ 5490bb88ba4SmrgH 5500bb88ba4Smrg$ { 551acd6767fSmrg s/.*/'"$tab"'/ 5520bb88ba4Smrg G 5530bb88ba4Smrg p 5540bb88ba4Smrg}' >> "$depfile" 555493f84f4Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 5560bb88ba4Smrg rm -f "$tmpdepfile" 5570bb88ba4Smrg ;; 5580bb88ba4Smrg 5590bb88ba4Smrgmsvc7msys) 5600bb88ba4Smrg # This case exists only to let depend.m4 do its work. It works by 5610bb88ba4Smrg # looking at the text of this script. This case will never be run, 5620bb88ba4Smrg # since it is checked for above. 5630bb88ba4Smrg exit 1 5640bb88ba4Smrg ;; 5650bb88ba4Smrg 566fe5e51b7Smrg#nosideeffect) 567fe5e51b7Smrg # This comment above is used by automake to tell side-effect 568fe5e51b7Smrg # dependency tracking mechanisms from slower ones. 569fe5e51b7Smrg 570fe5e51b7Smrgdashmstdout) 571fe5e51b7Smrg # Important note: in order to support this mode, a compiler *must* 572fe5e51b7Smrg # always write the preprocessed file to stdout, regardless of -o. 573fe5e51b7Smrg "$@" || exit $? 574fe5e51b7Smrg 575fe5e51b7Smrg # Remove the call to Libtool. 576fe5e51b7Smrg if test "$libtool" = yes; then 5770bb88ba4Smrg while test "X$1" != 'X--mode=compile'; do 578fe5e51b7Smrg shift 579fe5e51b7Smrg done 580fe5e51b7Smrg shift 581fe5e51b7Smrg fi 582fe5e51b7Smrg 583acd6767fSmrg # Remove '-o $object'. 584fe5e51b7Smrg IFS=" " 585fe5e51b7Smrg for arg 586fe5e51b7Smrg do 587fe5e51b7Smrg case $arg in 588fe5e51b7Smrg -o) 589fe5e51b7Smrg shift 590fe5e51b7Smrg ;; 591fe5e51b7Smrg $object) 592fe5e51b7Smrg shift 593fe5e51b7Smrg ;; 594fe5e51b7Smrg *) 595fe5e51b7Smrg set fnord "$@" "$arg" 596fe5e51b7Smrg shift # fnord 597fe5e51b7Smrg shift # $arg 598fe5e51b7Smrg ;; 599fe5e51b7Smrg esac 600fe5e51b7Smrg done 601fe5e51b7Smrg 602fe5e51b7Smrg test -z "$dashmflag" && dashmflag=-M 603acd6767fSmrg # Require at least two characters before searching for ':' 604fe5e51b7Smrg # in the target name. This is to cope with DOS-style filenames: 605acd6767fSmrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 606fe5e51b7Smrg "$@" $dashmflag | 607493f84f4Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 608fe5e51b7Smrg rm -f "$depfile" 609fe5e51b7Smrg cat < "$tmpdepfile" > "$depfile" 610493f84f4Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611493f84f4Smrg # correctly. Breaking it into two sed invocations is a workaround. 612493f84f4Smrg tr ' ' "$nl" < "$tmpdepfile" \ 613493f84f4Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614493f84f4Smrg | sed -e 's/$/ :/' >> "$depfile" 615fe5e51b7Smrg rm -f "$tmpdepfile" 616fe5e51b7Smrg ;; 617fe5e51b7Smrg 618fe5e51b7SmrgdashXmstdout) 619fe5e51b7Smrg # This case only exists to satisfy depend.m4. It is never actually 620fe5e51b7Smrg # run, as this mode is specially recognized in the preamble. 621fe5e51b7Smrg exit 1 622fe5e51b7Smrg ;; 623fe5e51b7Smrg 624fe5e51b7Smrgmakedepend) 625fe5e51b7Smrg "$@" || exit $? 626fe5e51b7Smrg # Remove any Libtool call 627fe5e51b7Smrg if test "$libtool" = yes; then 6280bb88ba4Smrg while test "X$1" != 'X--mode=compile'; do 629fe5e51b7Smrg shift 630fe5e51b7Smrg done 631fe5e51b7Smrg shift 632fe5e51b7Smrg fi 633fe5e51b7Smrg # X makedepend 634fe5e51b7Smrg shift 6350bb88ba4Smrg cleared=no eat=no 6360bb88ba4Smrg for arg 6370bb88ba4Smrg do 638fe5e51b7Smrg case $cleared in 639fe5e51b7Smrg no) 640fe5e51b7Smrg set ""; shift 641fe5e51b7Smrg cleared=yes ;; 642fe5e51b7Smrg esac 6430bb88ba4Smrg if test $eat = yes; then 6440bb88ba4Smrg eat=no 6450bb88ba4Smrg continue 6460bb88ba4Smrg fi 647fe5e51b7Smrg case "$arg" in 648fe5e51b7Smrg -D*|-I*) 649fe5e51b7Smrg set fnord "$@" "$arg"; shift ;; 650fe5e51b7Smrg # Strip any option that makedepend may not understand. Remove 651fe5e51b7Smrg # the object too, otherwise makedepend will parse it as a source file. 6520bb88ba4Smrg -arch) 6530bb88ba4Smrg eat=yes ;; 654fe5e51b7Smrg -*|$object) 655fe5e51b7Smrg ;; 656fe5e51b7Smrg *) 657fe5e51b7Smrg set fnord "$@" "$arg"; shift ;; 658fe5e51b7Smrg esac 659fe5e51b7Smrg done 6600bb88ba4Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 661fe5e51b7Smrg touch "$tmpdepfile" 662fe5e51b7Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 663fe5e51b7Smrg rm -f "$depfile" 6640bb88ba4Smrg # makedepend may prepend the VPATH from the source file name to the object. 6650bb88ba4Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 6660bb88ba4Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667493f84f4Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668493f84f4Smrg # correctly. Breaking it into two sed invocations is a workaround. 669493f84f4Smrg sed '1,2d' "$tmpdepfile" \ 670493f84f4Smrg | tr ' ' "$nl" \ 671493f84f4Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672493f84f4Smrg | sed -e 's/$/ :/' >> "$depfile" 673fe5e51b7Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 674fe5e51b7Smrg ;; 675fe5e51b7Smrg 676fe5e51b7Smrgcpp) 677fe5e51b7Smrg # Important note: in order to support this mode, a compiler *must* 678fe5e51b7Smrg # always write the preprocessed file to stdout. 679fe5e51b7Smrg "$@" || exit $? 680fe5e51b7Smrg 681fe5e51b7Smrg # Remove the call to Libtool. 682fe5e51b7Smrg if test "$libtool" = yes; then 6830bb88ba4Smrg while test "X$1" != 'X--mode=compile'; do 684fe5e51b7Smrg shift 685fe5e51b7Smrg done 686fe5e51b7Smrg shift 687fe5e51b7Smrg fi 688fe5e51b7Smrg 689acd6767fSmrg # Remove '-o $object'. 690fe5e51b7Smrg IFS=" " 691fe5e51b7Smrg for arg 692fe5e51b7Smrg do 693fe5e51b7Smrg case $arg in 694fe5e51b7Smrg -o) 695fe5e51b7Smrg shift 696fe5e51b7Smrg ;; 697fe5e51b7Smrg $object) 698fe5e51b7Smrg shift 699fe5e51b7Smrg ;; 700fe5e51b7Smrg *) 701fe5e51b7Smrg set fnord "$@" "$arg" 702fe5e51b7Smrg shift # fnord 703fe5e51b7Smrg shift # $arg 704fe5e51b7Smrg ;; 705fe5e51b7Smrg esac 706fe5e51b7Smrg done 707fe5e51b7Smrg 708493f84f4Smrg "$@" -E \ 709493f84f4Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710493f84f4Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711493f84f4Smrg | sed '$ s: \\$::' > "$tmpdepfile" 712fe5e51b7Smrg rm -f "$depfile" 713fe5e51b7Smrg echo "$object : \\" > "$depfile" 714fe5e51b7Smrg cat < "$tmpdepfile" >> "$depfile" 715fe5e51b7Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 716fe5e51b7Smrg rm -f "$tmpdepfile" 717fe5e51b7Smrg ;; 718fe5e51b7Smrg 719fe5e51b7Smrgmsvisualcpp) 720fe5e51b7Smrg # Important note: in order to support this mode, a compiler *must* 7210bb88ba4Smrg # always write the preprocessed file to stdout. 722fe5e51b7Smrg "$@" || exit $? 7230bb88ba4Smrg 7240bb88ba4Smrg # Remove the call to Libtool. 7250bb88ba4Smrg if test "$libtool" = yes; then 7260bb88ba4Smrg while test "X$1" != 'X--mode=compile'; do 7270bb88ba4Smrg shift 7280bb88ba4Smrg done 7290bb88ba4Smrg shift 7300bb88ba4Smrg fi 7310bb88ba4Smrg 732fe5e51b7Smrg IFS=" " 733fe5e51b7Smrg for arg 734fe5e51b7Smrg do 735fe5e51b7Smrg case "$arg" in 7360bb88ba4Smrg -o) 7370bb88ba4Smrg shift 7380bb88ba4Smrg ;; 7390bb88ba4Smrg $object) 7400bb88ba4Smrg shift 7410bb88ba4Smrg ;; 742fe5e51b7Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743493f84f4Smrg set fnord "$@" 744493f84f4Smrg shift 745493f84f4Smrg shift 746493f84f4Smrg ;; 747fe5e51b7Smrg *) 748493f84f4Smrg set fnord "$@" "$arg" 749493f84f4Smrg shift 750493f84f4Smrg shift 751493f84f4Smrg ;; 752fe5e51b7Smrg esac 753fe5e51b7Smrg done 7540bb88ba4Smrg "$@" -E 2>/dev/null | 7550bb88ba4Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 756fe5e51b7Smrg rm -f "$depfile" 757fe5e51b7Smrg echo "$object : \\" > "$depfile" 758acd6767fSmrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759acd6767fSmrg echo "$tab" >> "$depfile" 7600bb88ba4Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761fe5e51b7Smrg rm -f "$tmpdepfile" 762fe5e51b7Smrg ;; 763fe5e51b7Smrg 7640bb88ba4Smrgmsvcmsys) 7650bb88ba4Smrg # This case exists only to let depend.m4 do its work. It works by 7660bb88ba4Smrg # looking at the text of this script. This case will never be run, 7670bb88ba4Smrg # since it is checked for above. 7680bb88ba4Smrg exit 1 7690bb88ba4Smrg ;; 7700bb88ba4Smrg 771fe5e51b7Smrgnone) 772fe5e51b7Smrg exec "$@" 773fe5e51b7Smrg ;; 774fe5e51b7Smrg 775fe5e51b7Smrg*) 776fe5e51b7Smrg echo "Unknown depmode $depmode" 1>&2 777fe5e51b7Smrg exit 1 778fe5e51b7Smrg ;; 779fe5e51b7Smrgesac 780fe5e51b7Smrg 781fe5e51b7Smrgexit 0 782fe5e51b7Smrg 783fe5e51b7Smrg# Local Variables: 784fe5e51b7Smrg# mode: shell-script 785fe5e51b7Smrg# sh-indentation: 2 7861e423a8fSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 787fe5e51b7Smrg# time-stamp-start: "scriptversion=" 788fe5e51b7Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7891e423a8fSmrg# time-stamp-time-zone: "UTC0" 7900bb88ba4Smrg# time-stamp-end: "; # UTC" 791fe5e51b7Smrg# End: 792