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