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