190a8ff21Smrg#!/bin/sh 290a8ff21Smrg# depcomp - compile a program generating dependencies as side-effects 390a8ff21Smrg 490a8ff21Smrgscriptversion=2018-03-07.03; # UTC 590a8ff21Smrg 6*367b8279Smrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 790a8ff21Smrg 890a8ff21Smrg# This program is free software; you can redistribute it and/or modify 990a8ff21Smrg# it under the terms of the GNU General Public License as published by 1090a8ff21Smrg# the Free Software Foundation; either version 2, or (at your option) 1190a8ff21Smrg# any later version. 1290a8ff21Smrg 1390a8ff21Smrg# This program is distributed in the hope that it will be useful, 1490a8ff21Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 1590a8ff21Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1690a8ff21Smrg# GNU General Public License for more details. 1790a8ff21Smrg 1890a8ff21Smrg# You should have received a copy of the GNU General Public License 1990a8ff21Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 2090a8ff21Smrg 2190a8ff21Smrg# As a special exception to the GNU General Public License, if you 2290a8ff21Smrg# distribute this file as part of a program that contains a 2390a8ff21Smrg# configuration script generated by Autoconf, you may include it under 2490a8ff21Smrg# the same distribution terms that you use for the rest of that program. 2590a8ff21Smrg 2690a8ff21Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 2790a8ff21Smrg 2890a8ff21Smrgcase $1 in 2990a8ff21Smrg '') 3090a8ff21Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 3190a8ff21Smrg exit 1; 3290a8ff21Smrg ;; 3390a8ff21Smrg -h | --h*) 3490a8ff21Smrg cat <<\EOF 3590a8ff21SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 3690a8ff21Smrg 3790a8ff21SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 3890a8ff21Smrgas side-effects. 3990a8ff21Smrg 4090a8ff21SmrgEnvironment variables: 4190a8ff21Smrg depmode Dependency tracking mode. 4290a8ff21Smrg source Source file read by 'PROGRAMS ARGS'. 4390a8ff21Smrg object Object file output by 'PROGRAMS ARGS'. 4490a8ff21Smrg DEPDIR directory where to store dependencies. 4590a8ff21Smrg depfile Dependency file to output. 4690a8ff21Smrg tmpdepfile Temporary file to use when outputting dependencies. 4790a8ff21Smrg libtool Whether libtool is used (yes/no). 4890a8ff21Smrg 4990a8ff21SmrgReport bugs to <bug-automake@gnu.org>. 5090a8ff21SmrgEOF 5190a8ff21Smrg exit $? 5290a8ff21Smrg ;; 5390a8ff21Smrg -v | --v*) 5490a8ff21Smrg echo "depcomp $scriptversion" 5590a8ff21Smrg exit $? 5690a8ff21Smrg ;; 5790a8ff21Smrgesac 5890a8ff21Smrg 5990a8ff21Smrg# Get the directory component of the given path, and save it in the 6090a8ff21Smrg# global variables '$dir'. Note that this directory component will 6190a8ff21Smrg# be either empty or ending with a '/' character. This is deliberate. 6290a8ff21Smrgset_dir_from () 6390a8ff21Smrg{ 6490a8ff21Smrg case $1 in 6590a8ff21Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 6690a8ff21Smrg *) dir=;; 6790a8ff21Smrg esac 6890a8ff21Smrg} 6990a8ff21Smrg 7090a8ff21Smrg# Get the suffix-stripped basename of the given path, and save it the 7190a8ff21Smrg# global variable '$base'. 7290a8ff21Smrgset_base_from () 7390a8ff21Smrg{ 7490a8ff21Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 7590a8ff21Smrg} 7690a8ff21Smrg 7790a8ff21Smrg# If no dependency file was actually created by the compiler invocation, 7890a8ff21Smrg# we still have to create a dummy depfile, to avoid errors with the 7990a8ff21Smrg# Makefile "include basename.Plo" scheme. 8090a8ff21Smrgmake_dummy_depfile () 8190a8ff21Smrg{ 8290a8ff21Smrg echo "#dummy" > "$depfile" 8390a8ff21Smrg} 8490a8ff21Smrg 8590a8ff21Smrg# Factor out some common post-processing of the generated depfile. 8690a8ff21Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 8790a8ff21Smrgaix_post_process_depfile () 8890a8ff21Smrg{ 8990a8ff21Smrg # If the compiler actually managed to produce a dependency file, 9090a8ff21Smrg # post-process it. 9190a8ff21Smrg if test -f "$tmpdepfile"; then 9290a8ff21Smrg # Each line is of the form 'foo.o: dependency.h'. 9390a8ff21Smrg # Do two passes, one to just change these to 9490a8ff21Smrg # $object: dependency.h 9590a8ff21Smrg # and one to simply output 9690a8ff21Smrg # dependency.h: 9790a8ff21Smrg # which is needed to avoid the deleted-header problem. 9890a8ff21Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 9990a8ff21Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 10090a8ff21Smrg } > "$depfile" 10190a8ff21Smrg rm -f "$tmpdepfile" 10290a8ff21Smrg else 10390a8ff21Smrg make_dummy_depfile 10490a8ff21Smrg fi 10590a8ff21Smrg} 10690a8ff21Smrg 10790a8ff21Smrg# A tabulation character. 10890a8ff21Smrgtab=' ' 10990a8ff21Smrg# A newline character. 11090a8ff21Smrgnl=' 11190a8ff21Smrg' 11290a8ff21Smrg# Character ranges might be problematic outside the C locale. 11390a8ff21Smrg# These definitions help. 11490a8ff21Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 11590a8ff21Smrglower=abcdefghijklmnopqrstuvwxyz 11690a8ff21Smrgdigits=0123456789 11790a8ff21Smrgalpha=${upper}${lower} 11890a8ff21Smrg 11990a8ff21Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 12090a8ff21Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 12190a8ff21Smrg exit 1 12290a8ff21Smrgfi 12390a8ff21Smrg 12490a8ff21Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 12590a8ff21Smrgdepfile=${depfile-`echo "$object" | 12690a8ff21Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 12790a8ff21Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 12890a8ff21Smrg 12990a8ff21Smrgrm -f "$tmpdepfile" 13090a8ff21Smrg 13190a8ff21Smrg# Avoid interferences from the environment. 13290a8ff21Smrggccflag= dashmflag= 13390a8ff21Smrg 13490a8ff21Smrg# Some modes work just like other modes, but use different flags. We 13590a8ff21Smrg# parameterize here, but still list the modes in the big case below, 13690a8ff21Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 13790a8ff21Smrg# here, because this file can only contain one case statement. 13890a8ff21Smrgif test "$depmode" = hp; then 13990a8ff21Smrg # HP compiler uses -M and no extra arg. 14090a8ff21Smrg gccflag=-M 14190a8ff21Smrg depmode=gcc 14290a8ff21Smrgfi 14390a8ff21Smrg 14490a8ff21Smrgif test "$depmode" = dashXmstdout; then 14590a8ff21Smrg # This is just like dashmstdout with a different argument. 14690a8ff21Smrg dashmflag=-xM 14790a8ff21Smrg depmode=dashmstdout 14890a8ff21Smrgfi 14990a8ff21Smrg 15090a8ff21Smrgcygpath_u="cygpath -u -f -" 15190a8ff21Smrgif test "$depmode" = msvcmsys; then 15290a8ff21Smrg # This is just like msvisualcpp but w/o cygpath translation. 15390a8ff21Smrg # Just convert the backslash-escaped backslashes to single forward 15490a8ff21Smrg # slashes to satisfy depend.m4 15590a8ff21Smrg cygpath_u='sed s,\\\\,/,g' 15690a8ff21Smrg depmode=msvisualcpp 15790a8ff21Smrgfi 15890a8ff21Smrg 15990a8ff21Smrgif test "$depmode" = msvc7msys; then 16090a8ff21Smrg # This is just like msvc7 but w/o cygpath translation. 16190a8ff21Smrg # Just convert the backslash-escaped backslashes to single forward 16290a8ff21Smrg # slashes to satisfy depend.m4 16390a8ff21Smrg cygpath_u='sed s,\\\\,/,g' 16490a8ff21Smrg depmode=msvc7 16590a8ff21Smrgfi 16690a8ff21Smrg 16790a8ff21Smrgif test "$depmode" = xlc; then 16890a8ff21Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 16990a8ff21Smrg gccflag=-qmakedep=gcc,-MF 17090a8ff21Smrg depmode=gcc 17190a8ff21Smrgfi 17290a8ff21Smrg 17390a8ff21Smrgcase "$depmode" in 17490a8ff21Smrggcc3) 17590a8ff21Smrg## gcc 3 implements dependency tracking that does exactly what 17690a8ff21Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 17790a8ff21Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 17890a8ff21Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 17990a8ff21Smrg## the command line argument order; so add the flags where they 18090a8ff21Smrg## appear in depend2.am. Note that the slowdown incurred here 18190a8ff21Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 18290a8ff21Smrg for arg 18390a8ff21Smrg do 18490a8ff21Smrg case $arg in 18590a8ff21Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 18690a8ff21Smrg *) set fnord "$@" "$arg" ;; 18790a8ff21Smrg esac 18890a8ff21Smrg shift # fnord 18990a8ff21Smrg shift # $arg 19090a8ff21Smrg done 19190a8ff21Smrg "$@" 19290a8ff21Smrg stat=$? 19390a8ff21Smrg if test $stat -ne 0; then 19490a8ff21Smrg rm -f "$tmpdepfile" 19590a8ff21Smrg exit $stat 19690a8ff21Smrg fi 19790a8ff21Smrg mv "$tmpdepfile" "$depfile" 19890a8ff21Smrg ;; 19990a8ff21Smrg 20090a8ff21Smrggcc) 20190a8ff21Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 20290a8ff21Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 20390a8ff21Smrg## (see the conditional assignment to $gccflag above). 20490a8ff21Smrg## There are various ways to get dependency output from gcc. Here's 20590a8ff21Smrg## why we pick this rather obscure method: 20690a8ff21Smrg## - Don't want to use -MD because we'd like the dependencies to end 20790a8ff21Smrg## up in a subdir. Having to rename by hand is ugly. 20890a8ff21Smrg## (We might end up doing this anyway to support other compilers.) 20990a8ff21Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 21090a8ff21Smrg## -MM, not -M (despite what the docs say). Also, it might not be 21190a8ff21Smrg## supported by the other compilers which use the 'gcc' depmode. 21290a8ff21Smrg## - Using -M directly means running the compiler twice (even worse 21390a8ff21Smrg## than renaming). 21490a8ff21Smrg if test -z "$gccflag"; then 21590a8ff21Smrg gccflag=-MD, 21690a8ff21Smrg fi 21790a8ff21Smrg "$@" -Wp,"$gccflag$tmpdepfile" 21890a8ff21Smrg stat=$? 21990a8ff21Smrg if test $stat -ne 0; then 22090a8ff21Smrg rm -f "$tmpdepfile" 22190a8ff21Smrg exit $stat 22290a8ff21Smrg fi 22390a8ff21Smrg rm -f "$depfile" 22490a8ff21Smrg echo "$object : \\" > "$depfile" 22590a8ff21Smrg # The second -e expression handles DOS-style file names with drive 22690a8ff21Smrg # letters. 22790a8ff21Smrg sed -e 's/^[^:]*: / /' \ 22890a8ff21Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 22990a8ff21Smrg## This next piece of magic avoids the "deleted header file" problem. 23090a8ff21Smrg## The problem is that when a header file which appears in a .P file 23190a8ff21Smrg## is deleted, the dependency causes make to die (because there is 23290a8ff21Smrg## typically no way to rebuild the header). We avoid this by adding 23390a8ff21Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 23490a8ff21Smrg## this for us directly. 23590a8ff21Smrg## Some versions of gcc put a space before the ':'. On the theory 23690a8ff21Smrg## that the space means something, we add a space to the output as 23790a8ff21Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 23890a8ff21Smrg## to the object. Take care to not repeat it in the output. 23990a8ff21Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 24090a8ff21Smrg## correctly. Breaking it into two sed invocations is a workaround. 24190a8ff21Smrg tr ' ' "$nl" < "$tmpdepfile" \ 24290a8ff21Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 24390a8ff21Smrg | sed -e 's/$/ :/' >> "$depfile" 24490a8ff21Smrg rm -f "$tmpdepfile" 24590a8ff21Smrg ;; 24690a8ff21Smrg 24790a8ff21Smrghp) 24890a8ff21Smrg # This case exists only to let depend.m4 do its work. It works by 24990a8ff21Smrg # looking at the text of this script. This case will never be run, 25090a8ff21Smrg # since it is checked for above. 25190a8ff21Smrg exit 1 25290a8ff21Smrg ;; 25390a8ff21Smrg 25490a8ff21Smrgsgi) 25590a8ff21Smrg if test "$libtool" = yes; then 25690a8ff21Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 25790a8ff21Smrg else 25890a8ff21Smrg "$@" -MDupdate "$tmpdepfile" 25990a8ff21Smrg fi 26090a8ff21Smrg stat=$? 26190a8ff21Smrg if test $stat -ne 0; then 26290a8ff21Smrg rm -f "$tmpdepfile" 26390a8ff21Smrg exit $stat 26490a8ff21Smrg fi 26590a8ff21Smrg rm -f "$depfile" 26690a8ff21Smrg 26790a8ff21Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 26890a8ff21Smrg echo "$object : \\" > "$depfile" 26990a8ff21Smrg # Clip off the initial element (the dependent). Don't try to be 27090a8ff21Smrg # clever and replace this with sed code, as IRIX sed won't handle 27190a8ff21Smrg # lines with more than a fixed number of characters (4096 in 27290a8ff21Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 27390a8ff21Smrg # the IRIX cc adds comments like '#:fec' to the end of the 27490a8ff21Smrg # dependency line. 27590a8ff21Smrg tr ' ' "$nl" < "$tmpdepfile" \ 27690a8ff21Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 27790a8ff21Smrg | tr "$nl" ' ' >> "$depfile" 27890a8ff21Smrg echo >> "$depfile" 27990a8ff21Smrg # The second pass generates a dummy entry for each header file. 28090a8ff21Smrg tr ' ' "$nl" < "$tmpdepfile" \ 28190a8ff21Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 28290a8ff21Smrg >> "$depfile" 28390a8ff21Smrg else 28490a8ff21Smrg make_dummy_depfile 28590a8ff21Smrg fi 28690a8ff21Smrg rm -f "$tmpdepfile" 28790a8ff21Smrg ;; 28890a8ff21Smrg 28990a8ff21Smrgxlc) 29090a8ff21Smrg # This case exists only to let depend.m4 do its work. It works by 29190a8ff21Smrg # looking at the text of this script. This case will never be run, 29290a8ff21Smrg # since it is checked for above. 29390a8ff21Smrg exit 1 29490a8ff21Smrg ;; 29590a8ff21Smrg 29690a8ff21Smrgaix) 29790a8ff21Smrg # The C for AIX Compiler uses -M and outputs the dependencies 29890a8ff21Smrg # in a .u file. In older versions, this file always lives in the 29990a8ff21Smrg # current directory. Also, the AIX compiler puts '$object:' at the 30090a8ff21Smrg # start of each line; $object doesn't have directory information. 30190a8ff21Smrg # Version 6 uses the directory in both cases. 30290a8ff21Smrg set_dir_from "$object" 30390a8ff21Smrg set_base_from "$object" 30490a8ff21Smrg if test "$libtool" = yes; then 30590a8ff21Smrg tmpdepfile1=$dir$base.u 30690a8ff21Smrg tmpdepfile2=$base.u 30790a8ff21Smrg tmpdepfile3=$dir.libs/$base.u 30890a8ff21Smrg "$@" -Wc,-M 30990a8ff21Smrg else 31090a8ff21Smrg tmpdepfile1=$dir$base.u 31190a8ff21Smrg tmpdepfile2=$dir$base.u 31290a8ff21Smrg tmpdepfile3=$dir$base.u 31390a8ff21Smrg "$@" -M 31490a8ff21Smrg fi 31590a8ff21Smrg stat=$? 31690a8ff21Smrg if test $stat -ne 0; then 31790a8ff21Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 31890a8ff21Smrg exit $stat 31990a8ff21Smrg fi 32090a8ff21Smrg 32190a8ff21Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 32290a8ff21Smrg do 32390a8ff21Smrg test -f "$tmpdepfile" && break 32490a8ff21Smrg done 32590a8ff21Smrg aix_post_process_depfile 32690a8ff21Smrg ;; 32790a8ff21Smrg 32890a8ff21Smrgtcc) 32990a8ff21Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 33090a8ff21Smrg # FIXME: That version still under development at the moment of writing. 33190a8ff21Smrg # Make that this statement remains true also for stable, released 33290a8ff21Smrg # versions. 33390a8ff21Smrg # It will wrap lines (doesn't matter whether long or short) with a 33490a8ff21Smrg # trailing '\', as in: 33590a8ff21Smrg # 33690a8ff21Smrg # foo.o : \ 33790a8ff21Smrg # foo.c \ 33890a8ff21Smrg # foo.h \ 33990a8ff21Smrg # 34090a8ff21Smrg # It will put a trailing '\' even on the last line, and will use leading 34190a8ff21Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 34290a8ff21Smrg # "Emit spaces for -MD"). 34390a8ff21Smrg "$@" -MD -MF "$tmpdepfile" 34490a8ff21Smrg stat=$? 34590a8ff21Smrg if test $stat -ne 0; then 34690a8ff21Smrg rm -f "$tmpdepfile" 34790a8ff21Smrg exit $stat 34890a8ff21Smrg fi 34990a8ff21Smrg rm -f "$depfile" 35090a8ff21Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 35190a8ff21Smrg # We have to change lines of the first kind to '$object: \'. 35290a8ff21Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 35390a8ff21Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 35490a8ff21Smrg # dummy dependency, to avoid the deleted-header problem. 35590a8ff21Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 35690a8ff21Smrg rm -f "$tmpdepfile" 35790a8ff21Smrg ;; 35890a8ff21Smrg 35990a8ff21Smrg## The order of this option in the case statement is important, since the 36090a8ff21Smrg## shell code in configure will try each of these formats in the order 36190a8ff21Smrg## listed in this file. A plain '-MD' option would be understood by many 36290a8ff21Smrg## compilers, so we must ensure this comes after the gcc and icc options. 36390a8ff21Smrgpgcc) 36490a8ff21Smrg # Portland's C compiler understands '-MD'. 36590a8ff21Smrg # Will always output deps to 'file.d' where file is the root name of the 36690a8ff21Smrg # source file under compilation, even if file resides in a subdirectory. 36790a8ff21Smrg # The object file name does not affect the name of the '.d' file. 36890a8ff21Smrg # pgcc 10.2 will output 36990a8ff21Smrg # foo.o: sub/foo.c sub/foo.h 37090a8ff21Smrg # and will wrap long lines using '\' : 37190a8ff21Smrg # foo.o: sub/foo.c ... \ 37290a8ff21Smrg # sub/foo.h ... \ 37390a8ff21Smrg # ... 37490a8ff21Smrg set_dir_from "$object" 37590a8ff21Smrg # Use the source, not the object, to determine the base name, since 37690a8ff21Smrg # that's sadly what pgcc will do too. 37790a8ff21Smrg set_base_from "$source" 37890a8ff21Smrg tmpdepfile=$base.d 37990a8ff21Smrg 38090a8ff21Smrg # For projects that build the same source file twice into different object 38190a8ff21Smrg # files, the pgcc approach of using the *source* file root name can cause 38290a8ff21Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 38390a8ff21Smrg # the same $tmpdepfile. 38490a8ff21Smrg lockdir=$base.d-lock 38590a8ff21Smrg trap " 38690a8ff21Smrg echo '$0: caught signal, cleaning up...' >&2 38790a8ff21Smrg rmdir '$lockdir' 38890a8ff21Smrg exit 1 38990a8ff21Smrg " 1 2 13 15 39090a8ff21Smrg numtries=100 39190a8ff21Smrg i=$numtries 39290a8ff21Smrg while test $i -gt 0; do 39390a8ff21Smrg # mkdir is a portable test-and-set. 39490a8ff21Smrg if mkdir "$lockdir" 2>/dev/null; then 39590a8ff21Smrg # This process acquired the lock. 39690a8ff21Smrg "$@" -MD 39790a8ff21Smrg stat=$? 39890a8ff21Smrg # Release the lock. 39990a8ff21Smrg rmdir "$lockdir" 40090a8ff21Smrg break 40190a8ff21Smrg else 40290a8ff21Smrg # If the lock is being held by a different process, wait 40390a8ff21Smrg # until the winning process is done or we timeout. 40490a8ff21Smrg while test -d "$lockdir" && test $i -gt 0; do 40590a8ff21Smrg sleep 1 40690a8ff21Smrg i=`expr $i - 1` 40790a8ff21Smrg done 40890a8ff21Smrg fi 40990a8ff21Smrg i=`expr $i - 1` 41090a8ff21Smrg done 41190a8ff21Smrg trap - 1 2 13 15 41290a8ff21Smrg if test $i -le 0; then 41390a8ff21Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 41490a8ff21Smrg echo "$0: check lockdir '$lockdir'" >&2 41590a8ff21Smrg exit 1 41690a8ff21Smrg fi 41790a8ff21Smrg 41890a8ff21Smrg if test $stat -ne 0; then 41990a8ff21Smrg rm -f "$tmpdepfile" 42090a8ff21Smrg exit $stat 42190a8ff21Smrg fi 42290a8ff21Smrg rm -f "$depfile" 42390a8ff21Smrg # Each line is of the form `foo.o: dependent.h', 42490a8ff21Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 42590a8ff21Smrg # Do two passes, one to just change these to 42690a8ff21Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 42790a8ff21Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 42890a8ff21Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 42990a8ff21Smrg # correctly. Breaking it into two sed invocations is a workaround. 43090a8ff21Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 43190a8ff21Smrg | sed -e 's/$/ :/' >> "$depfile" 43290a8ff21Smrg rm -f "$tmpdepfile" 43390a8ff21Smrg ;; 43490a8ff21Smrg 43590a8ff21Smrghp2) 43690a8ff21Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 43790a8ff21Smrg # compilers, which have integrated preprocessors. The correct option 43890a8ff21Smrg # to use with these is +Maked; it writes dependencies to a file named 43990a8ff21Smrg # 'foo.d', which lands next to the object file, wherever that 44090a8ff21Smrg # happens to be. 44190a8ff21Smrg # Much of this is similar to the tru64 case; see comments there. 44290a8ff21Smrg set_dir_from "$object" 44390a8ff21Smrg set_base_from "$object" 44490a8ff21Smrg if test "$libtool" = yes; then 44590a8ff21Smrg tmpdepfile1=$dir$base.d 44690a8ff21Smrg tmpdepfile2=$dir.libs/$base.d 44790a8ff21Smrg "$@" -Wc,+Maked 44890a8ff21Smrg else 44990a8ff21Smrg tmpdepfile1=$dir$base.d 45090a8ff21Smrg tmpdepfile2=$dir$base.d 45190a8ff21Smrg "$@" +Maked 45290a8ff21Smrg fi 45390a8ff21Smrg stat=$? 45490a8ff21Smrg if test $stat -ne 0; then 45590a8ff21Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 45690a8ff21Smrg exit $stat 45790a8ff21Smrg fi 45890a8ff21Smrg 45990a8ff21Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 46090a8ff21Smrg do 46190a8ff21Smrg test -f "$tmpdepfile" && break 46290a8ff21Smrg done 46390a8ff21Smrg if test -f "$tmpdepfile"; then 46490a8ff21Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 46590a8ff21Smrg # Add 'dependent.h:' lines. 46690a8ff21Smrg sed -ne '2,${ 46790a8ff21Smrg s/^ *// 46890a8ff21Smrg s/ \\*$// 46990a8ff21Smrg s/$/:/ 47090a8ff21Smrg p 47190a8ff21Smrg }' "$tmpdepfile" >> "$depfile" 47290a8ff21Smrg else 47390a8ff21Smrg make_dummy_depfile 47490a8ff21Smrg fi 47590a8ff21Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 47690a8ff21Smrg ;; 47790a8ff21Smrg 47890a8ff21Smrgtru64) 47990a8ff21Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 48090a8ff21Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 48190a8ff21Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 48290a8ff21Smrg # dependencies in 'foo.d' instead, so we check for that too. 48390a8ff21Smrg # Subdirectories are respected. 48490a8ff21Smrg set_dir_from "$object" 48590a8ff21Smrg set_base_from "$object" 48690a8ff21Smrg 48790a8ff21Smrg if test "$libtool" = yes; then 48890a8ff21Smrg # Libtool generates 2 separate objects for the 2 libraries. These 48990a8ff21Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 49090a8ff21Smrg # in $dir$base.o.d. We have to check for both files, because 49190a8ff21Smrg # one of the two compilations can be disabled. We should prefer 49290a8ff21Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 49390a8ff21Smrg # automatically cleaned when .libs/ is deleted, while ignoring 49490a8ff21Smrg # the former would cause a distcleancheck panic. 49590a8ff21Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 49690a8ff21Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 49790a8ff21Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 49890a8ff21Smrg "$@" -Wc,-MD 49990a8ff21Smrg else 50090a8ff21Smrg tmpdepfile1=$dir$base.d 50190a8ff21Smrg tmpdepfile2=$dir$base.d 50290a8ff21Smrg tmpdepfile3=$dir$base.d 50390a8ff21Smrg "$@" -MD 50490a8ff21Smrg fi 50590a8ff21Smrg 50690a8ff21Smrg stat=$? 50790a8ff21Smrg if test $stat -ne 0; then 50890a8ff21Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 50990a8ff21Smrg exit $stat 51090a8ff21Smrg fi 51190a8ff21Smrg 51290a8ff21Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 51390a8ff21Smrg do 51490a8ff21Smrg test -f "$tmpdepfile" && break 51590a8ff21Smrg done 51690a8ff21Smrg # Same post-processing that is required for AIX mode. 51790a8ff21Smrg aix_post_process_depfile 51890a8ff21Smrg ;; 51990a8ff21Smrg 52090a8ff21Smrgmsvc7) 52190a8ff21Smrg if test "$libtool" = yes; then 52290a8ff21Smrg showIncludes=-Wc,-showIncludes 52390a8ff21Smrg else 52490a8ff21Smrg showIncludes=-showIncludes 52590a8ff21Smrg fi 52690a8ff21Smrg "$@" $showIncludes > "$tmpdepfile" 52790a8ff21Smrg stat=$? 52890a8ff21Smrg grep -v '^Note: including file: ' "$tmpdepfile" 52990a8ff21Smrg if test $stat -ne 0; then 53090a8ff21Smrg rm -f "$tmpdepfile" 53190a8ff21Smrg exit $stat 53290a8ff21Smrg fi 53390a8ff21Smrg rm -f "$depfile" 53490a8ff21Smrg echo "$object : \\" > "$depfile" 53590a8ff21Smrg # The first sed program below extracts the file names and escapes 53690a8ff21Smrg # backslashes for cygpath. The second sed program outputs the file 53790a8ff21Smrg # name when reading, but also accumulates all include files in the 53890a8ff21Smrg # hold buffer in order to output them again at the end. This only 53990a8ff21Smrg # works with sed implementations that can handle large buffers. 54090a8ff21Smrg sed < "$tmpdepfile" -n ' 54190a8ff21Smrg/^Note: including file: *\(.*\)/ { 54290a8ff21Smrg s//\1/ 54390a8ff21Smrg s/\\/\\\\/g 54490a8ff21Smrg p 54590a8ff21Smrg}' | $cygpath_u | sort -u | sed -n ' 54690a8ff21Smrgs/ /\\ /g 54790a8ff21Smrgs/\(.*\)/'"$tab"'\1 \\/p 54890a8ff21Smrgs/.\(.*\) \\/\1:/ 54990a8ff21SmrgH 55090a8ff21Smrg$ { 55190a8ff21Smrg s/.*/'"$tab"'/ 55290a8ff21Smrg G 55390a8ff21Smrg p 55490a8ff21Smrg}' >> "$depfile" 55590a8ff21Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 55690a8ff21Smrg rm -f "$tmpdepfile" 55790a8ff21Smrg ;; 55890a8ff21Smrg 55990a8ff21Smrgmsvc7msys) 56090a8ff21Smrg # This case exists only to let depend.m4 do its work. It works by 56190a8ff21Smrg # looking at the text of this script. This case will never be run, 56290a8ff21Smrg # since it is checked for above. 56390a8ff21Smrg exit 1 56490a8ff21Smrg ;; 56590a8ff21Smrg 56690a8ff21Smrg#nosideeffect) 56790a8ff21Smrg # This comment above is used by automake to tell side-effect 56890a8ff21Smrg # dependency tracking mechanisms from slower ones. 56990a8ff21Smrg 57090a8ff21Smrgdashmstdout) 57190a8ff21Smrg # Important note: in order to support this mode, a compiler *must* 57290a8ff21Smrg # always write the preprocessed file to stdout, regardless of -o. 57390a8ff21Smrg "$@" || exit $? 57490a8ff21Smrg 57590a8ff21Smrg # Remove the call to Libtool. 57690a8ff21Smrg if test "$libtool" = yes; then 57790a8ff21Smrg while test "X$1" != 'X--mode=compile'; do 57890a8ff21Smrg shift 57990a8ff21Smrg done 58090a8ff21Smrg shift 58190a8ff21Smrg fi 58290a8ff21Smrg 58390a8ff21Smrg # Remove '-o $object'. 58490a8ff21Smrg IFS=" " 58590a8ff21Smrg for arg 58690a8ff21Smrg do 58790a8ff21Smrg case $arg in 58890a8ff21Smrg -o) 58990a8ff21Smrg shift 59090a8ff21Smrg ;; 59190a8ff21Smrg $object) 59290a8ff21Smrg shift 59390a8ff21Smrg ;; 59490a8ff21Smrg *) 59590a8ff21Smrg set fnord "$@" "$arg" 59690a8ff21Smrg shift # fnord 59790a8ff21Smrg shift # $arg 59890a8ff21Smrg ;; 59990a8ff21Smrg esac 60090a8ff21Smrg done 60190a8ff21Smrg 60290a8ff21Smrg test -z "$dashmflag" && dashmflag=-M 60390a8ff21Smrg # Require at least two characters before searching for ':' 60490a8ff21Smrg # in the target name. This is to cope with DOS-style filenames: 60590a8ff21Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 60690a8ff21Smrg "$@" $dashmflag | 60790a8ff21Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 60890a8ff21Smrg rm -f "$depfile" 60990a8ff21Smrg cat < "$tmpdepfile" > "$depfile" 61090a8ff21Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 61190a8ff21Smrg # correctly. Breaking it into two sed invocations is a workaround. 61290a8ff21Smrg tr ' ' "$nl" < "$tmpdepfile" \ 61390a8ff21Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 61490a8ff21Smrg | sed -e 's/$/ :/' >> "$depfile" 61590a8ff21Smrg rm -f "$tmpdepfile" 61690a8ff21Smrg ;; 61790a8ff21Smrg 61890a8ff21SmrgdashXmstdout) 61990a8ff21Smrg # This case only exists to satisfy depend.m4. It is never actually 62090a8ff21Smrg # run, as this mode is specially recognized in the preamble. 62190a8ff21Smrg exit 1 62290a8ff21Smrg ;; 62390a8ff21Smrg 62490a8ff21Smrgmakedepend) 62590a8ff21Smrg "$@" || exit $? 62690a8ff21Smrg # Remove any Libtool call 62790a8ff21Smrg if test "$libtool" = yes; then 62890a8ff21Smrg while test "X$1" != 'X--mode=compile'; do 62990a8ff21Smrg shift 63090a8ff21Smrg done 63190a8ff21Smrg shift 63290a8ff21Smrg fi 63390a8ff21Smrg # X makedepend 63490a8ff21Smrg shift 63590a8ff21Smrg cleared=no eat=no 63690a8ff21Smrg for arg 63790a8ff21Smrg do 63890a8ff21Smrg case $cleared in 63990a8ff21Smrg no) 64090a8ff21Smrg set ""; shift 64190a8ff21Smrg cleared=yes ;; 64290a8ff21Smrg esac 64390a8ff21Smrg if test $eat = yes; then 64490a8ff21Smrg eat=no 64590a8ff21Smrg continue 64690a8ff21Smrg fi 64790a8ff21Smrg case "$arg" in 64890a8ff21Smrg -D*|-I*) 64990a8ff21Smrg set fnord "$@" "$arg"; shift ;; 65090a8ff21Smrg # Strip any option that makedepend may not understand. Remove 65190a8ff21Smrg # the object too, otherwise makedepend will parse it as a source file. 65290a8ff21Smrg -arch) 65390a8ff21Smrg eat=yes ;; 65490a8ff21Smrg -*|$object) 65590a8ff21Smrg ;; 65690a8ff21Smrg *) 65790a8ff21Smrg set fnord "$@" "$arg"; shift ;; 65890a8ff21Smrg esac 65990a8ff21Smrg done 66090a8ff21Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 66190a8ff21Smrg touch "$tmpdepfile" 66290a8ff21Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 66390a8ff21Smrg rm -f "$depfile" 66490a8ff21Smrg # makedepend may prepend the VPATH from the source file name to the object. 66590a8ff21Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 66690a8ff21Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 66790a8ff21Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 66890a8ff21Smrg # correctly. Breaking it into two sed invocations is a workaround. 66990a8ff21Smrg sed '1,2d' "$tmpdepfile" \ 67090a8ff21Smrg | tr ' ' "$nl" \ 67190a8ff21Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 67290a8ff21Smrg | sed -e 's/$/ :/' >> "$depfile" 67390a8ff21Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 67490a8ff21Smrg ;; 67590a8ff21Smrg 67690a8ff21Smrgcpp) 67790a8ff21Smrg # Important note: in order to support this mode, a compiler *must* 67890a8ff21Smrg # always write the preprocessed file to stdout. 67990a8ff21Smrg "$@" || exit $? 68090a8ff21Smrg 68190a8ff21Smrg # Remove the call to Libtool. 68290a8ff21Smrg if test "$libtool" = yes; then 68390a8ff21Smrg while test "X$1" != 'X--mode=compile'; do 68490a8ff21Smrg shift 68590a8ff21Smrg done 68690a8ff21Smrg shift 68790a8ff21Smrg fi 68890a8ff21Smrg 68990a8ff21Smrg # Remove '-o $object'. 69090a8ff21Smrg IFS=" " 69190a8ff21Smrg for arg 69290a8ff21Smrg do 69390a8ff21Smrg case $arg in 69490a8ff21Smrg -o) 69590a8ff21Smrg shift 69690a8ff21Smrg ;; 69790a8ff21Smrg $object) 69890a8ff21Smrg shift 69990a8ff21Smrg ;; 70090a8ff21Smrg *) 70190a8ff21Smrg set fnord "$@" "$arg" 70290a8ff21Smrg shift # fnord 70390a8ff21Smrg shift # $arg 70490a8ff21Smrg ;; 70590a8ff21Smrg esac 70690a8ff21Smrg done 70790a8ff21Smrg 70890a8ff21Smrg "$@" -E \ 70990a8ff21Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71090a8ff21Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 71190a8ff21Smrg | sed '$ s: \\$::' > "$tmpdepfile" 71290a8ff21Smrg rm -f "$depfile" 71390a8ff21Smrg echo "$object : \\" > "$depfile" 71490a8ff21Smrg cat < "$tmpdepfile" >> "$depfile" 71590a8ff21Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 71690a8ff21Smrg rm -f "$tmpdepfile" 71790a8ff21Smrg ;; 71890a8ff21Smrg 71990a8ff21Smrgmsvisualcpp) 72090a8ff21Smrg # Important note: in order to support this mode, a compiler *must* 72190a8ff21Smrg # always write the preprocessed file to stdout. 72290a8ff21Smrg "$@" || exit $? 72390a8ff21Smrg 72490a8ff21Smrg # Remove the call to Libtool. 72590a8ff21Smrg if test "$libtool" = yes; then 72690a8ff21Smrg while test "X$1" != 'X--mode=compile'; do 72790a8ff21Smrg shift 72890a8ff21Smrg done 72990a8ff21Smrg shift 73090a8ff21Smrg fi 73190a8ff21Smrg 73290a8ff21Smrg IFS=" " 73390a8ff21Smrg for arg 73490a8ff21Smrg do 73590a8ff21Smrg case "$arg" in 73690a8ff21Smrg -o) 73790a8ff21Smrg shift 73890a8ff21Smrg ;; 73990a8ff21Smrg $object) 74090a8ff21Smrg shift 74190a8ff21Smrg ;; 74290a8ff21Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 74390a8ff21Smrg set fnord "$@" 74490a8ff21Smrg shift 74590a8ff21Smrg shift 74690a8ff21Smrg ;; 74790a8ff21Smrg *) 74890a8ff21Smrg set fnord "$@" "$arg" 74990a8ff21Smrg shift 75090a8ff21Smrg shift 75190a8ff21Smrg ;; 75290a8ff21Smrg esac 75390a8ff21Smrg done 75490a8ff21Smrg "$@" -E 2>/dev/null | 75590a8ff21Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 75690a8ff21Smrg rm -f "$depfile" 75790a8ff21Smrg echo "$object : \\" > "$depfile" 75890a8ff21Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 75990a8ff21Smrg echo "$tab" >> "$depfile" 76090a8ff21Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 76190a8ff21Smrg rm -f "$tmpdepfile" 76290a8ff21Smrg ;; 76390a8ff21Smrg 76490a8ff21Smrgmsvcmsys) 76590a8ff21Smrg # This case exists only to let depend.m4 do its work. It works by 76690a8ff21Smrg # looking at the text of this script. This case will never be run, 76790a8ff21Smrg # since it is checked for above. 76890a8ff21Smrg exit 1 76990a8ff21Smrg ;; 77090a8ff21Smrg 77190a8ff21Smrgnone) 77290a8ff21Smrg exec "$@" 77390a8ff21Smrg ;; 77490a8ff21Smrg 77590a8ff21Smrg*) 77690a8ff21Smrg echo "Unknown depmode $depmode" 1>&2 77790a8ff21Smrg exit 1 77890a8ff21Smrg ;; 77990a8ff21Smrgesac 78090a8ff21Smrg 78190a8ff21Smrgexit 0 78290a8ff21Smrg 78390a8ff21Smrg# Local Variables: 78490a8ff21Smrg# mode: shell-script 78590a8ff21Smrg# sh-indentation: 2 78690a8ff21Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 78790a8ff21Smrg# time-stamp-start: "scriptversion=" 78890a8ff21Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 78990a8ff21Smrg# time-stamp-time-zone: "UTC0" 79090a8ff21Smrg# time-stamp-end: "; # UTC" 79190a8ff21Smrg# End: 792