1266e564dSmrg#! /bin/sh 2266e564dSmrg# depcomp - compile a program generating dependencies as side-effects 3266e564dSmrg 43bf3b463Smrgscriptversion=2024-06-19.01; # UTC 5266e564dSmrg 63bf3b463Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc. 7266e564dSmrg 8266e564dSmrg# This program is free software; you can redistribute it and/or modify 9266e564dSmrg# it under the terms of the GNU General Public License as published by 10266e564dSmrg# the Free Software Foundation; either version 2, or (at your option) 11266e564dSmrg# any later version. 12266e564dSmrg 13266e564dSmrg# This program is distributed in the hope that it will be useful, 14266e564dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 15266e564dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16266e564dSmrg# GNU General Public License for more details. 17266e564dSmrg 18266e564dSmrg# You should have received a copy of the GNU General Public License 191009a292Smrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 20266e564dSmrg 21266e564dSmrg# As a special exception to the GNU General Public License, if you 22266e564dSmrg# distribute this file as part of a program that contains a 23266e564dSmrg# configuration script generated by Autoconf, you may include it under 24266e564dSmrg# the same distribution terms that you use for the rest of that program. 25266e564dSmrg 26266e564dSmrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 27266e564dSmrg 28266e564dSmrgcase $1 in 29266e564dSmrg '') 30fb5e8d76Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31fb5e8d76Smrg exit 1; 32fb5e8d76Smrg ;; 33266e564dSmrg -h | --h*) 34266e564dSmrg cat <<\EOF 35266e564dSmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 36266e564dSmrg 37266e564dSmrgRun PROGRAMS ARGS to compile a file, generating dependencies 38266e564dSmrgas side-effects. 39266e564dSmrg 40266e564dSmrgEnvironment variables: 41266e564dSmrg depmode Dependency tracking mode. 42fb5e8d76Smrg source Source file read by 'PROGRAMS ARGS'. 43fb5e8d76Smrg object Object file output by 'PROGRAMS ARGS'. 44266e564dSmrg DEPDIR directory where to store dependencies. 45266e564dSmrg depfile Dependency file to output. 46fb5e8d76Smrg tmpdepfile Temporary file to use when outputting dependencies. 47266e564dSmrg libtool Whether libtool is used (yes/no). 48266e564dSmrg 49266e564dSmrgReport bugs to <bug-automake@gnu.org>. 503bf3b463SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>. 513bf3b463SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>. 52266e564dSmrgEOF 53266e564dSmrg exit $? 54266e564dSmrg ;; 55266e564dSmrg -v | --v*) 563bf3b463Smrg echo "depcomp (GNU Automake) $scriptversion" 57266e564dSmrg exit $? 58266e564dSmrg ;; 59266e564dSmrgesac 60266e564dSmrg 61fb5e8d76Smrg# Get the directory component of the given path, and save it in the 62fb5e8d76Smrg# global variables '$dir'. Note that this directory component will 63fb5e8d76Smrg# be either empty or ending with a '/' character. This is deliberate. 64fb5e8d76Smrgset_dir_from () 65fb5e8d76Smrg{ 66fb5e8d76Smrg case $1 in 67fb5e8d76Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 68fb5e8d76Smrg *) dir=;; 69fb5e8d76Smrg esac 70fb5e8d76Smrg} 71fb5e8d76Smrg 72fb5e8d76Smrg# Get the suffix-stripped basename of the given path, and save it the 73fb5e8d76Smrg# global variable '$base'. 74fb5e8d76Smrgset_base_from () 75fb5e8d76Smrg{ 76fb5e8d76Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 77fb5e8d76Smrg} 78fb5e8d76Smrg 79fb5e8d76Smrg# If no dependency file was actually created by the compiler invocation, 80fb5e8d76Smrg# we still have to create a dummy depfile, to avoid errors with the 81fb5e8d76Smrg# Makefile "include basename.Plo" scheme. 82fb5e8d76Smrgmake_dummy_depfile () 83fb5e8d76Smrg{ 84fb5e8d76Smrg echo "#dummy" > "$depfile" 85fb5e8d76Smrg} 86fb5e8d76Smrg 87fb5e8d76Smrg# Factor out some common post-processing of the generated depfile. 88fb5e8d76Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 89fb5e8d76Smrgaix_post_process_depfile () 90fb5e8d76Smrg{ 91fb5e8d76Smrg # If the compiler actually managed to produce a dependency file, 92fb5e8d76Smrg # post-process it. 93fb5e8d76Smrg if test -f "$tmpdepfile"; then 94fb5e8d76Smrg # Each line is of the form 'foo.o: dependency.h'. 95fb5e8d76Smrg # Do two passes, one to just change these to 96fb5e8d76Smrg # $object: dependency.h 97fb5e8d76Smrg # and one to simply output 98fb5e8d76Smrg # dependency.h: 99fb5e8d76Smrg # which is needed to avoid the deleted-header problem. 100fb5e8d76Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 101fb5e8d76Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 102fb5e8d76Smrg } > "$depfile" 103fb5e8d76Smrg rm -f "$tmpdepfile" 104fb5e8d76Smrg else 105fb5e8d76Smrg make_dummy_depfile 106fb5e8d76Smrg fi 107fb5e8d76Smrg} 108fb5e8d76Smrg 109fb5e8d76Smrg# A tabulation character. 110fb5e8d76Smrgtab=' ' 111fb5e8d76Smrg# A newline character. 112fb5e8d76Smrgnl=' 113fb5e8d76Smrg' 114fb5e8d76Smrg# Character ranges might be problematic outside the C locale. 115fb5e8d76Smrg# These definitions help. 116fb5e8d76Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 117fb5e8d76Smrglower=abcdefghijklmnopqrstuvwxyz 118fb5e8d76Smrgalpha=${upper}${lower} 119fb5e8d76Smrg 120266e564dSmrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 121266e564dSmrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 122266e564dSmrg exit 1 123266e564dSmrgfi 124266e564dSmrg 125266e564dSmrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 126266e564dSmrgdepfile=${depfile-`echo "$object" | 127266e564dSmrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 128266e564dSmrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 129266e564dSmrg 130266e564dSmrgrm -f "$tmpdepfile" 131266e564dSmrg 1323bf3b463Smrg# Avoid interference from the environment. 133fb5e8d76Smrggccflag= dashmflag= 134fb5e8d76Smrg 135266e564dSmrg# Some modes work just like other modes, but use different flags. We 136266e564dSmrg# parameterize here, but still list the modes in the big case below, 137266e564dSmrg# to make depend.m4 easier to write. Note that we *cannot* use a case 138266e564dSmrg# here, because this file can only contain one case statement. 139266e564dSmrgif test "$depmode" = hp; then 140266e564dSmrg # HP compiler uses -M and no extra arg. 141266e564dSmrg gccflag=-M 142266e564dSmrg depmode=gcc 143266e564dSmrgfi 144266e564dSmrg 145266e564dSmrgif test "$depmode" = dashXmstdout; then 146fb5e8d76Smrg # This is just like dashmstdout with a different argument. 147fb5e8d76Smrg dashmflag=-xM 148fb5e8d76Smrg depmode=dashmstdout 149266e564dSmrgfi 150266e564dSmrg 151d17cd367Smrgcygpath_u="cygpath -u -f -" 152d17cd367Smrgif test "$depmode" = msvcmsys; then 153fb5e8d76Smrg # This is just like msvisualcpp but w/o cygpath translation. 154fb5e8d76Smrg # Just convert the backslash-escaped backslashes to single forward 155fb5e8d76Smrg # slashes to satisfy depend.m4 156fb5e8d76Smrg cygpath_u='sed s,\\\\,/,g' 157fb5e8d76Smrg depmode=msvisualcpp 158fb5e8d76Smrgfi 159fb5e8d76Smrg 160fb5e8d76Smrgif test "$depmode" = msvc7msys; then 161fb5e8d76Smrg # This is just like msvc7 but w/o cygpath translation. 162fb5e8d76Smrg # Just convert the backslash-escaped backslashes to single forward 163fb5e8d76Smrg # slashes to satisfy depend.m4 164fb5e8d76Smrg cygpath_u='sed s,\\\\,/,g' 165fb5e8d76Smrg depmode=msvc7 166fb5e8d76Smrgfi 167fb5e8d76Smrg 168fb5e8d76Smrgif test "$depmode" = xlc; then 169fb5e8d76Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 170fb5e8d76Smrg gccflag=-qmakedep=gcc,-MF 171fb5e8d76Smrg depmode=gcc 172d17cd367Smrgfi 173d17cd367Smrg 174266e564dSmrgcase "$depmode" in 175266e564dSmrggcc3) 176266e564dSmrg## gcc 3 implements dependency tracking that does exactly what 177266e564dSmrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 178266e564dSmrg## it if -MD -MP comes after the -MF stuff. Hmm. 179266e564dSmrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 180266e564dSmrg## the command line argument order; so add the flags where they 181266e564dSmrg## appear in depend2.am. Note that the slowdown incurred here 182266e564dSmrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 183266e564dSmrg for arg 184266e564dSmrg do 185266e564dSmrg case $arg in 186266e564dSmrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 187266e564dSmrg *) set fnord "$@" "$arg" ;; 188266e564dSmrg esac 189266e564dSmrg shift # fnord 190266e564dSmrg shift # $arg 191266e564dSmrg done 192266e564dSmrg "$@" 193266e564dSmrg stat=$? 194fb5e8d76Smrg if test $stat -ne 0; then 195266e564dSmrg rm -f "$tmpdepfile" 196266e564dSmrg exit $stat 197266e564dSmrg fi 198266e564dSmrg mv "$tmpdepfile" "$depfile" 199266e564dSmrg ;; 200266e564dSmrg 201266e564dSmrggcc) 2023bf3b463Smrg## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. 2033bf3b463Smrg## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. 204fb5e8d76Smrg## (see the conditional assignment to $gccflag above). 205266e564dSmrg## There are various ways to get dependency output from gcc. Here's 206266e564dSmrg## why we pick this rather obscure method: 207266e564dSmrg## - Don't want to use -MD because we'd like the dependencies to end 208266e564dSmrg## up in a subdir. Having to rename by hand is ugly. 209266e564dSmrg## (We might end up doing this anyway to support other compilers.) 210266e564dSmrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 211fb5e8d76Smrg## -MM, not -M (despite what the docs say). Also, it might not be 212fb5e8d76Smrg## supported by the other compilers which use the 'gcc' depmode. 213266e564dSmrg## - Using -M directly means running the compiler twice (even worse 214266e564dSmrg## than renaming). 215266e564dSmrg if test -z "$gccflag"; then 216266e564dSmrg gccflag=-MD, 217266e564dSmrg fi 218266e564dSmrg "$@" -Wp,"$gccflag$tmpdepfile" 219266e564dSmrg stat=$? 220fb5e8d76Smrg if test $stat -ne 0; then 221266e564dSmrg rm -f "$tmpdepfile" 222266e564dSmrg exit $stat 223266e564dSmrg fi 224266e564dSmrg rm -f "$depfile" 225266e564dSmrg echo "$object : \\" > "$depfile" 226fb5e8d76Smrg # The second -e expression handles DOS-style file names with drive 227fb5e8d76Smrg # letters. 228266e564dSmrg sed -e 's/^[^:]*: / /' \ 229266e564dSmrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 230fb5e8d76Smrg## This next piece of magic avoids the "deleted header file" problem. 231266e564dSmrg## The problem is that when a header file which appears in a .P file 232266e564dSmrg## is deleted, the dependency causes make to die (because there is 233266e564dSmrg## typically no way to rebuild the header). We avoid this by adding 234266e564dSmrg## dummy dependencies for each header file. Too bad gcc doesn't do 235266e564dSmrg## this for us directly. 236fb5e8d76Smrg## Some versions of gcc put a space before the ':'. On the theory 237266e564dSmrg## that the space means something, we add a space to the output as 238fb5e8d76Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 239fb5e8d76Smrg## to the object. Take care to not repeat it in the output. 240266e564dSmrg## Some versions of the HPUX 10.20 sed can't process this invocation 241266e564dSmrg## correctly. Breaking it into two sed invocations is a workaround. 242fb5e8d76Smrg tr ' ' "$nl" < "$tmpdepfile" \ 243fb5e8d76Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 244fb5e8d76Smrg | sed -e 's/$/ :/' >> "$depfile" 245266e564dSmrg rm -f "$tmpdepfile" 246266e564dSmrg ;; 247266e564dSmrg 248266e564dSmrghp) 249266e564dSmrg # This case exists only to let depend.m4 do its work. It works by 250266e564dSmrg # looking at the text of this script. This case will never be run, 251266e564dSmrg # since it is checked for above. 252266e564dSmrg exit 1 253266e564dSmrg ;; 254266e564dSmrg 255266e564dSmrgsgi) 256266e564dSmrg if test "$libtool" = yes; then 257266e564dSmrg "$@" "-Wp,-MDupdate,$tmpdepfile" 258266e564dSmrg else 259266e564dSmrg "$@" -MDupdate "$tmpdepfile" 260266e564dSmrg fi 261266e564dSmrg stat=$? 262fb5e8d76Smrg if test $stat -ne 0; then 263266e564dSmrg rm -f "$tmpdepfile" 264266e564dSmrg exit $stat 265266e564dSmrg fi 266266e564dSmrg rm -f "$depfile" 267266e564dSmrg 268266e564dSmrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 269266e564dSmrg echo "$object : \\" > "$depfile" 270266e564dSmrg # Clip off the initial element (the dependent). Don't try to be 271266e564dSmrg # clever and replace this with sed code, as IRIX sed won't handle 272266e564dSmrg # lines with more than a fixed number of characters (4096 in 273266e564dSmrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 274fb5e8d76Smrg # the IRIX cc adds comments like '#:fec' to the end of the 275266e564dSmrg # dependency line. 276fb5e8d76Smrg tr ' ' "$nl" < "$tmpdepfile" \ 277fb5e8d76Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 278fb5e8d76Smrg | tr "$nl" ' ' >> "$depfile" 279d17cd367Smrg echo >> "$depfile" 280266e564dSmrg # The second pass generates a dummy entry for each header file. 281fb5e8d76Smrg tr ' ' "$nl" < "$tmpdepfile" \ 282fb5e8d76Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 283fb5e8d76Smrg >> "$depfile" 284266e564dSmrg else 285fb5e8d76Smrg make_dummy_depfile 286266e564dSmrg fi 287266e564dSmrg rm -f "$tmpdepfile" 288266e564dSmrg ;; 289266e564dSmrg 290fb5e8d76Smrgxlc) 291fb5e8d76Smrg # This case exists only to let depend.m4 do its work. It works by 292fb5e8d76Smrg # looking at the text of this script. This case will never be run, 293fb5e8d76Smrg # since it is checked for above. 294fb5e8d76Smrg exit 1 295fb5e8d76Smrg ;; 296fb5e8d76Smrg 297266e564dSmrgaix) 298266e564dSmrg # The C for AIX Compiler uses -M and outputs the dependencies 299266e564dSmrg # in a .u file. In older versions, this file always lives in the 300fb5e8d76Smrg # current directory. Also, the AIX compiler puts '$object:' at the 301266e564dSmrg # start of each line; $object doesn't have directory information. 302266e564dSmrg # Version 6 uses the directory in both cases. 303fb5e8d76Smrg set_dir_from "$object" 304fb5e8d76Smrg set_base_from "$object" 305266e564dSmrg if test "$libtool" = yes; then 306c5629e66Smrg tmpdepfile1=$dir$base.u 307c5629e66Smrg tmpdepfile2=$base.u 308c5629e66Smrg tmpdepfile3=$dir.libs/$base.u 309266e564dSmrg "$@" -Wc,-M 310266e564dSmrg else 311c5629e66Smrg tmpdepfile1=$dir$base.u 312c5629e66Smrg tmpdepfile2=$dir$base.u 313c5629e66Smrg tmpdepfile3=$dir$base.u 314266e564dSmrg "$@" -M 315266e564dSmrg fi 316266e564dSmrg stat=$? 317fb5e8d76Smrg if test $stat -ne 0; then 318c5629e66Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 319266e564dSmrg exit $stat 320266e564dSmrg fi 321266e564dSmrg 322c5629e66Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 323c5629e66Smrg do 324c5629e66Smrg test -f "$tmpdepfile" && break 325c5629e66Smrg done 326fb5e8d76Smrg aix_post_process_depfile 327fb5e8d76Smrg ;; 328fb5e8d76Smrg 329fb5e8d76Smrgtcc) 330fb5e8d76Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 331fb5e8d76Smrg # FIXME: That version still under development at the moment of writing. 332fb5e8d76Smrg # Make that this statement remains true also for stable, released 333fb5e8d76Smrg # versions. 334fb5e8d76Smrg # It will wrap lines (doesn't matter whether long or short) with a 335fb5e8d76Smrg # trailing '\', as in: 336fb5e8d76Smrg # 337fb5e8d76Smrg # foo.o : \ 338fb5e8d76Smrg # foo.c \ 339fb5e8d76Smrg # foo.h \ 340fb5e8d76Smrg # 341fb5e8d76Smrg # It will put a trailing '\' even on the last line, and will use leading 342fb5e8d76Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 343fb5e8d76Smrg # "Emit spaces for -MD"). 344fb5e8d76Smrg "$@" -MD -MF "$tmpdepfile" 345fb5e8d76Smrg stat=$? 346fb5e8d76Smrg if test $stat -ne 0; then 347fb5e8d76Smrg rm -f "$tmpdepfile" 348fb5e8d76Smrg exit $stat 349266e564dSmrg fi 350fb5e8d76Smrg rm -f "$depfile" 351fb5e8d76Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 352fb5e8d76Smrg # We have to change lines of the first kind to '$object: \'. 353fb5e8d76Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 354fb5e8d76Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 355fb5e8d76Smrg # dummy dependency, to avoid the deleted-header problem. 356fb5e8d76Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 357266e564dSmrg rm -f "$tmpdepfile" 358266e564dSmrg ;; 359266e564dSmrg 360fb5e8d76Smrg## The order of this option in the case statement is important, since the 361fb5e8d76Smrg## shell code in configure will try each of these formats in the order 362fb5e8d76Smrg## listed in this file. A plain '-MD' option would be understood by many 363fb5e8d76Smrg## compilers, so we must ensure this comes after the gcc and icc options. 364fb5e8d76Smrgpgcc) 365fb5e8d76Smrg # Portland's C compiler understands '-MD'. 366fb5e8d76Smrg # Will always output deps to 'file.d' where file is the root name of the 367fb5e8d76Smrg # source file under compilation, even if file resides in a subdirectory. 368fb5e8d76Smrg # The object file name does not affect the name of the '.d' file. 369fb5e8d76Smrg # pgcc 10.2 will output 370266e564dSmrg # foo.o: sub/foo.c sub/foo.h 371fb5e8d76Smrg # and will wrap long lines using '\' : 372266e564dSmrg # foo.o: sub/foo.c ... \ 373266e564dSmrg # sub/foo.h ... \ 374266e564dSmrg # ... 375fb5e8d76Smrg set_dir_from "$object" 376fb5e8d76Smrg # Use the source, not the object, to determine the base name, since 377fb5e8d76Smrg # that's sadly what pgcc will do too. 378fb5e8d76Smrg set_base_from "$source" 379fb5e8d76Smrg tmpdepfile=$base.d 380fb5e8d76Smrg 381fb5e8d76Smrg # For projects that build the same source file twice into different object 382fb5e8d76Smrg # files, the pgcc approach of using the *source* file root name can cause 383fb5e8d76Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 384fb5e8d76Smrg # the same $tmpdepfile. 385fb5e8d76Smrg lockdir=$base.d-lock 386fb5e8d76Smrg trap " 387fb5e8d76Smrg echo '$0: caught signal, cleaning up...' >&2 388fb5e8d76Smrg rmdir '$lockdir' 389fb5e8d76Smrg exit 1 390fb5e8d76Smrg " 1 2 13 15 391fb5e8d76Smrg numtries=100 392fb5e8d76Smrg i=$numtries 393fb5e8d76Smrg while test $i -gt 0; do 394fb5e8d76Smrg # mkdir is a portable test-and-set. 395fb5e8d76Smrg if mkdir "$lockdir" 2>/dev/null; then 396fb5e8d76Smrg # This process acquired the lock. 397fb5e8d76Smrg "$@" -MD 398fb5e8d76Smrg stat=$? 399fb5e8d76Smrg # Release the lock. 400fb5e8d76Smrg rmdir "$lockdir" 401fb5e8d76Smrg break 402fb5e8d76Smrg else 403fb5e8d76Smrg # If the lock is being held by a different process, wait 404fb5e8d76Smrg # until the winning process is done or we timeout. 405fb5e8d76Smrg while test -d "$lockdir" && test $i -gt 0; do 406fb5e8d76Smrg sleep 1 407fb5e8d76Smrg i=`expr $i - 1` 408fb5e8d76Smrg done 409fb5e8d76Smrg fi 410fb5e8d76Smrg i=`expr $i - 1` 411fb5e8d76Smrg done 412fb5e8d76Smrg trap - 1 2 13 15 413fb5e8d76Smrg if test $i -le 0; then 414fb5e8d76Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 415fb5e8d76Smrg echo "$0: check lockdir '$lockdir'" >&2 416fb5e8d76Smrg exit 1 417fb5e8d76Smrg fi 418266e564dSmrg 419fb5e8d76Smrg if test $stat -ne 0; then 420266e564dSmrg rm -f "$tmpdepfile" 421266e564dSmrg exit $stat 422266e564dSmrg fi 423266e564dSmrg rm -f "$depfile" 424266e564dSmrg # Each line is of the form `foo.o: dependent.h', 425266e564dSmrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 426266e564dSmrg # Do two passes, one to just change these to 427266e564dSmrg # `$object: dependent.h' and one to simply `dependent.h:'. 428266e564dSmrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 429266e564dSmrg # Some versions of the HPUX 10.20 sed can't process this invocation 430266e564dSmrg # correctly. Breaking it into two sed invocations is a workaround. 431fb5e8d76Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 432fb5e8d76Smrg | sed -e 's/$/ :/' >> "$depfile" 433266e564dSmrg rm -f "$tmpdepfile" 434266e564dSmrg ;; 435266e564dSmrg 436266e564dSmrghp2) 437266e564dSmrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 438266e564dSmrg # compilers, which have integrated preprocessors. The correct option 439266e564dSmrg # to use with these is +Maked; it writes dependencies to a file named 440266e564dSmrg # 'foo.d', which lands next to the object file, wherever that 441266e564dSmrg # happens to be. 442266e564dSmrg # Much of this is similar to the tru64 case; see comments there. 443fb5e8d76Smrg set_dir_from "$object" 444fb5e8d76Smrg set_base_from "$object" 445266e564dSmrg if test "$libtool" = yes; then 446266e564dSmrg tmpdepfile1=$dir$base.d 447266e564dSmrg tmpdepfile2=$dir.libs/$base.d 448266e564dSmrg "$@" -Wc,+Maked 449266e564dSmrg else 450266e564dSmrg tmpdepfile1=$dir$base.d 451266e564dSmrg tmpdepfile2=$dir$base.d 452266e564dSmrg "$@" +Maked 453266e564dSmrg fi 454266e564dSmrg stat=$? 455fb5e8d76Smrg if test $stat -ne 0; then 456266e564dSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" 457266e564dSmrg exit $stat 458266e564dSmrg fi 459266e564dSmrg 460266e564dSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 461266e564dSmrg do 462266e564dSmrg test -f "$tmpdepfile" && break 463266e564dSmrg done 464266e564dSmrg if test -f "$tmpdepfile"; then 465fb5e8d76Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 466fb5e8d76Smrg # Add 'dependent.h:' lines. 467d17cd367Smrg sed -ne '2,${ 468fb5e8d76Smrg s/^ *// 469fb5e8d76Smrg s/ \\*$// 470fb5e8d76Smrg s/$/:/ 471fb5e8d76Smrg p 472fb5e8d76Smrg }' "$tmpdepfile" >> "$depfile" 473266e564dSmrg else 474fb5e8d76Smrg make_dummy_depfile 475266e564dSmrg fi 476266e564dSmrg rm -f "$tmpdepfile" "$tmpdepfile2" 477266e564dSmrg ;; 478266e564dSmrg 479266e564dSmrgtru64) 480fb5e8d76Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 481fb5e8d76Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 482fb5e8d76Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 483fb5e8d76Smrg # dependencies in 'foo.d' instead, so we check for that too. 484fb5e8d76Smrg # Subdirectories are respected. 485fb5e8d76Smrg set_dir_from "$object" 486fb5e8d76Smrg set_base_from "$object" 487fb5e8d76Smrg 488fb5e8d76Smrg if test "$libtool" = yes; then 489fb5e8d76Smrg # Libtool generates 2 separate objects for the 2 libraries. These 490fb5e8d76Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 491fb5e8d76Smrg # in $dir$base.o.d. We have to check for both files, because 492fb5e8d76Smrg # one of the two compilations can be disabled. We should prefer 493fb5e8d76Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 494fb5e8d76Smrg # automatically cleaned when .libs/ is deleted, while ignoring 495fb5e8d76Smrg # the former would cause a distcleancheck panic. 496fb5e8d76Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 497fb5e8d76Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 498fb5e8d76Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 499fb5e8d76Smrg "$@" -Wc,-MD 500fb5e8d76Smrg else 501fb5e8d76Smrg tmpdepfile1=$dir$base.d 502fb5e8d76Smrg tmpdepfile2=$dir$base.d 503fb5e8d76Smrg tmpdepfile3=$dir$base.d 504fb5e8d76Smrg "$@" -MD 505fb5e8d76Smrg fi 506fb5e8d76Smrg 507fb5e8d76Smrg stat=$? 508fb5e8d76Smrg if test $stat -ne 0; then 509fb5e8d76Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 510fb5e8d76Smrg exit $stat 511fb5e8d76Smrg fi 512fb5e8d76Smrg 513fb5e8d76Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 514fb5e8d76Smrg do 515fb5e8d76Smrg test -f "$tmpdepfile" && break 516fb5e8d76Smrg done 517fb5e8d76Smrg # Same post-processing that is required for AIX mode. 518fb5e8d76Smrg aix_post_process_depfile 519fb5e8d76Smrg ;; 520fb5e8d76Smrg 521fb5e8d76Smrgmsvc7) 522fb5e8d76Smrg if test "$libtool" = yes; then 523fb5e8d76Smrg showIncludes=-Wc,-showIncludes 524fb5e8d76Smrg else 525fb5e8d76Smrg showIncludes=-showIncludes 526fb5e8d76Smrg fi 527fb5e8d76Smrg "$@" $showIncludes > "$tmpdepfile" 528fb5e8d76Smrg stat=$? 529fb5e8d76Smrg grep -v '^Note: including file: ' "$tmpdepfile" 530fb5e8d76Smrg if test $stat -ne 0; then 531fb5e8d76Smrg rm -f "$tmpdepfile" 532fb5e8d76Smrg exit $stat 533fb5e8d76Smrg fi 534fb5e8d76Smrg rm -f "$depfile" 535fb5e8d76Smrg echo "$object : \\" > "$depfile" 536fb5e8d76Smrg # The first sed program below extracts the file names and escapes 537fb5e8d76Smrg # backslashes for cygpath. The second sed program outputs the file 538fb5e8d76Smrg # name when reading, but also accumulates all include files in the 539fb5e8d76Smrg # hold buffer in order to output them again at the end. This only 540fb5e8d76Smrg # works with sed implementations that can handle large buffers. 541fb5e8d76Smrg sed < "$tmpdepfile" -n ' 542fb5e8d76Smrg/^Note: including file: *\(.*\)/ { 543fb5e8d76Smrg s//\1/ 544fb5e8d76Smrg s/\\/\\\\/g 545fb5e8d76Smrg p 546fb5e8d76Smrg}' | $cygpath_u | sort -u | sed -n ' 547fb5e8d76Smrgs/ /\\ /g 548fb5e8d76Smrgs/\(.*\)/'"$tab"'\1 \\/p 549fb5e8d76Smrgs/.\(.*\) \\/\1:/ 550fb5e8d76SmrgH 551fb5e8d76Smrg$ { 552fb5e8d76Smrg s/.*/'"$tab"'/ 553fb5e8d76Smrg G 554fb5e8d76Smrg p 555fb5e8d76Smrg}' >> "$depfile" 556fb5e8d76Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 557fb5e8d76Smrg rm -f "$tmpdepfile" 558fb5e8d76Smrg ;; 559fb5e8d76Smrg 560fb5e8d76Smrgmsvc7msys) 561fb5e8d76Smrg # This case exists only to let depend.m4 do its work. It works by 562fb5e8d76Smrg # looking at the text of this script. This case will never be run, 563fb5e8d76Smrg # since it is checked for above. 564fb5e8d76Smrg exit 1 565fb5e8d76Smrg ;; 566266e564dSmrg 567266e564dSmrg#nosideeffect) 568266e564dSmrg # This comment above is used by automake to tell side-effect 569266e564dSmrg # dependency tracking mechanisms from slower ones. 570266e564dSmrg 571266e564dSmrgdashmstdout) 572266e564dSmrg # Important note: in order to support this mode, a compiler *must* 573266e564dSmrg # always write the preprocessed file to stdout, regardless of -o. 574266e564dSmrg "$@" || exit $? 575266e564dSmrg 576266e564dSmrg # Remove the call to Libtool. 577266e564dSmrg if test "$libtool" = yes; then 578d17cd367Smrg while test "X$1" != 'X--mode=compile'; do 579266e564dSmrg shift 580266e564dSmrg done 581266e564dSmrg shift 582266e564dSmrg fi 583266e564dSmrg 584fb5e8d76Smrg # Remove '-o $object'. 585266e564dSmrg IFS=" " 586266e564dSmrg for arg 587266e564dSmrg do 588266e564dSmrg case $arg in 589266e564dSmrg -o) 590266e564dSmrg shift 591266e564dSmrg ;; 592266e564dSmrg $object) 593266e564dSmrg shift 594266e564dSmrg ;; 595266e564dSmrg *) 596266e564dSmrg set fnord "$@" "$arg" 597266e564dSmrg shift # fnord 598266e564dSmrg shift # $arg 599266e564dSmrg ;; 600266e564dSmrg esac 601266e564dSmrg done 602266e564dSmrg 603266e564dSmrg test -z "$dashmflag" && dashmflag=-M 604fb5e8d76Smrg # Require at least two characters before searching for ':' 605266e564dSmrg # in the target name. This is to cope with DOS-style filenames: 606fb5e8d76Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 607266e564dSmrg "$@" $dashmflag | 608fb5e8d76Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 609266e564dSmrg rm -f "$depfile" 610266e564dSmrg cat < "$tmpdepfile" > "$depfile" 611fb5e8d76Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 612fb5e8d76Smrg # correctly. Breaking it into two sed invocations is a workaround. 613fb5e8d76Smrg tr ' ' "$nl" < "$tmpdepfile" \ 614fb5e8d76Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 615fb5e8d76Smrg | sed -e 's/$/ :/' >> "$depfile" 616266e564dSmrg rm -f "$tmpdepfile" 617266e564dSmrg ;; 618266e564dSmrg 619266e564dSmrgdashXmstdout) 620266e564dSmrg # This case only exists to satisfy depend.m4. It is never actually 621266e564dSmrg # run, as this mode is specially recognized in the preamble. 622266e564dSmrg exit 1 623266e564dSmrg ;; 624266e564dSmrg 625266e564dSmrgmakedepend) 626266e564dSmrg "$@" || exit $? 627266e564dSmrg # Remove any Libtool call 628266e564dSmrg if test "$libtool" = yes; then 629d17cd367Smrg while test "X$1" != 'X--mode=compile'; do 630266e564dSmrg shift 631266e564dSmrg done 632266e564dSmrg shift 633266e564dSmrg fi 634266e564dSmrg # X makedepend 635266e564dSmrg shift 636d17cd367Smrg cleared=no eat=no 637d17cd367Smrg for arg 638d17cd367Smrg do 639266e564dSmrg case $cleared in 640266e564dSmrg no) 641266e564dSmrg set ""; shift 642266e564dSmrg cleared=yes ;; 643266e564dSmrg esac 644d17cd367Smrg if test $eat = yes; then 645d17cd367Smrg eat=no 646d17cd367Smrg continue 647d17cd367Smrg fi 648266e564dSmrg case "$arg" in 649266e564dSmrg -D*|-I*) 650266e564dSmrg set fnord "$@" "$arg"; shift ;; 651266e564dSmrg # Strip any option that makedepend may not understand. Remove 652266e564dSmrg # the object too, otherwise makedepend will parse it as a source file. 653d17cd367Smrg -arch) 654d17cd367Smrg eat=yes ;; 655266e564dSmrg -*|$object) 656266e564dSmrg ;; 657266e564dSmrg *) 658266e564dSmrg set fnord "$@" "$arg"; shift ;; 659266e564dSmrg esac 660266e564dSmrg done 661d17cd367Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 662266e564dSmrg touch "$tmpdepfile" 663266e564dSmrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 664266e564dSmrg rm -f "$depfile" 665fb5e8d76Smrg # makedepend may prepend the VPATH from the source file name to the object. 666fb5e8d76Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 667fb5e8d76Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 668fb5e8d76Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 669fb5e8d76Smrg # correctly. Breaking it into two sed invocations is a workaround. 670fb5e8d76Smrg sed '1,2d' "$tmpdepfile" \ 671fb5e8d76Smrg | tr ' ' "$nl" \ 672fb5e8d76Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 673fb5e8d76Smrg | sed -e 's/$/ :/' >> "$depfile" 674266e564dSmrg rm -f "$tmpdepfile" "$tmpdepfile".bak 675266e564dSmrg ;; 676266e564dSmrg 677266e564dSmrgcpp) 678266e564dSmrg # Important note: in order to support this mode, a compiler *must* 679266e564dSmrg # always write the preprocessed file to stdout. 680266e564dSmrg "$@" || exit $? 681266e564dSmrg 682266e564dSmrg # Remove the call to Libtool. 683266e564dSmrg if test "$libtool" = yes; then 684d17cd367Smrg while test "X$1" != 'X--mode=compile'; do 685266e564dSmrg shift 686266e564dSmrg done 687266e564dSmrg shift 688266e564dSmrg fi 689266e564dSmrg 690fb5e8d76Smrg # Remove '-o $object'. 691266e564dSmrg IFS=" " 692266e564dSmrg for arg 693266e564dSmrg do 694266e564dSmrg case $arg in 695266e564dSmrg -o) 696266e564dSmrg shift 697266e564dSmrg ;; 698266e564dSmrg $object) 699266e564dSmrg shift 700266e564dSmrg ;; 701266e564dSmrg *) 702266e564dSmrg set fnord "$@" "$arg" 703266e564dSmrg shift # fnord 704266e564dSmrg shift # $arg 705266e564dSmrg ;; 706266e564dSmrg esac 707266e564dSmrg done 708266e564dSmrg 709fb5e8d76Smrg "$@" -E \ 710fb5e8d76Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711fb5e8d76Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 712fb5e8d76Smrg | sed '$ s: \\$::' > "$tmpdepfile" 713266e564dSmrg rm -f "$depfile" 714266e564dSmrg echo "$object : \\" > "$depfile" 715266e564dSmrg cat < "$tmpdepfile" >> "$depfile" 716266e564dSmrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 717266e564dSmrg rm -f "$tmpdepfile" 718266e564dSmrg ;; 719266e564dSmrg 720266e564dSmrgmsvisualcpp) 721266e564dSmrg # Important note: in order to support this mode, a compiler *must* 722d17cd367Smrg # always write the preprocessed file to stdout. 723266e564dSmrg "$@" || exit $? 724d17cd367Smrg 725d17cd367Smrg # Remove the call to Libtool. 726d17cd367Smrg if test "$libtool" = yes; then 727d17cd367Smrg while test "X$1" != 'X--mode=compile'; do 728d17cd367Smrg shift 729d17cd367Smrg done 730d17cd367Smrg shift 731d17cd367Smrg fi 732d17cd367Smrg 733266e564dSmrg IFS=" " 734266e564dSmrg for arg 735266e564dSmrg do 736266e564dSmrg case "$arg" in 737d17cd367Smrg -o) 738d17cd367Smrg shift 739d17cd367Smrg ;; 740d17cd367Smrg $object) 741d17cd367Smrg shift 742d17cd367Smrg ;; 743266e564dSmrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 744fb5e8d76Smrg set fnord "$@" 745fb5e8d76Smrg shift 746fb5e8d76Smrg shift 747fb5e8d76Smrg ;; 748266e564dSmrg *) 749fb5e8d76Smrg set fnord "$@" "$arg" 750fb5e8d76Smrg shift 751fb5e8d76Smrg shift 752fb5e8d76Smrg ;; 753266e564dSmrg esac 754266e564dSmrg done 755d17cd367Smrg "$@" -E 2>/dev/null | 756d17cd367Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 757266e564dSmrg rm -f "$depfile" 758266e564dSmrg echo "$object : \\" > "$depfile" 759fb5e8d76Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 760fb5e8d76Smrg echo "$tab" >> "$depfile" 761d17cd367Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 762266e564dSmrg rm -f "$tmpdepfile" 763266e564dSmrg ;; 764266e564dSmrg 765d17cd367Smrgmsvcmsys) 766d17cd367Smrg # This case exists only to let depend.m4 do its work. It works by 767d17cd367Smrg # looking at the text of this script. This case will never be run, 768d17cd367Smrg # since it is checked for above. 769d17cd367Smrg exit 1 770d17cd367Smrg ;; 771d17cd367Smrg 772266e564dSmrgnone) 773266e564dSmrg exec "$@" 774266e564dSmrg ;; 775266e564dSmrg 776266e564dSmrg*) 777266e564dSmrg echo "Unknown depmode $depmode" 1>&2 778266e564dSmrg exit 1 779266e564dSmrg ;; 780266e564dSmrgesac 781266e564dSmrg 782266e564dSmrgexit 0 783266e564dSmrg 784266e564dSmrg# Local Variables: 785266e564dSmrg# mode: shell-script 786266e564dSmrg# sh-indentation: 2 7871009a292Smrg# eval: (add-hook 'before-save-hook 'time-stamp) 788266e564dSmrg# time-stamp-start: "scriptversion=" 789266e564dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7901009a292Smrg# time-stamp-time-zone: "UTC0" 791d17cd367Smrg# time-stamp-end: "; # UTC" 792266e564dSmrg# End: 793