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