17d5e3a19Smrg#! /bin/sh 27d5e3a19Smrg# depcomp - compile a program generating dependencies as side-effects 37d5e3a19Smrg 45212f86fSmrgscriptversion=2018-03-07.03; # UTC 57d5e3a19Smrg 65212f86fSmrg# Copyright (C) 1999-2021 Free Software Foundation, Inc. 77d5e3a19Smrg 87d5e3a19Smrg# This program is free software; you can redistribute it and/or modify 97d5e3a19Smrg# it under the terms of the GNU General Public License as published by 107d5e3a19Smrg# the Free Software Foundation; either version 2, or (at your option) 117d5e3a19Smrg# any later version. 127d5e3a19Smrg 137d5e3a19Smrg# This program is distributed in the hope that it will be useful, 147d5e3a19Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 157d5e3a19Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 167d5e3a19Smrg# GNU General Public License for more details. 177d5e3a19Smrg 187d5e3a19Smrg# You should have received a copy of the GNU General Public License 195212f86fSmrg# along with this program. If not, see <https://www.gnu.org/licenses/>. 207d5e3a19Smrg 217d5e3a19Smrg# As a special exception to the GNU General Public License, if you 227d5e3a19Smrg# distribute this file as part of a program that contains a 237d5e3a19Smrg# configuration script generated by Autoconf, you may include it under 247d5e3a19Smrg# the same distribution terms that you use for the rest of that program. 257d5e3a19Smrg 267d5e3a19Smrg# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 277d5e3a19Smrg 287d5e3a19Smrgcase $1 in 297d5e3a19Smrg '') 30b8414663Smrg echo "$0: No command. Try '$0 --help' for more information." 1>&2 31b8414663Smrg exit 1; 32b8414663Smrg ;; 337d5e3a19Smrg -h | --h*) 347d5e3a19Smrg cat <<\EOF 357d5e3a19SmrgUsage: depcomp [--help] [--version] PROGRAM [ARGS] 367d5e3a19Smrg 377d5e3a19SmrgRun PROGRAMS ARGS to compile a file, generating dependencies 387d5e3a19Smrgas side-effects. 397d5e3a19Smrg 407d5e3a19SmrgEnvironment variables: 417d5e3a19Smrg depmode Dependency tracking mode. 42b8414663Smrg source Source file read by 'PROGRAMS ARGS'. 43b8414663Smrg object Object file output by 'PROGRAMS ARGS'. 447d5e3a19Smrg DEPDIR directory where to store dependencies. 457d5e3a19Smrg depfile Dependency file to output. 46b8414663Smrg tmpdepfile Temporary file to use when outputting dependencies. 477d5e3a19Smrg libtool Whether libtool is used (yes/no). 487d5e3a19Smrg 497d5e3a19SmrgReport bugs to <bug-automake@gnu.org>. 507d5e3a19SmrgEOF 517d5e3a19Smrg exit $? 527d5e3a19Smrg ;; 537d5e3a19Smrg -v | --v*) 547d5e3a19Smrg echo "depcomp $scriptversion" 557d5e3a19Smrg exit $? 567d5e3a19Smrg ;; 577d5e3a19Smrgesac 587d5e3a19Smrg 59b8414663Smrg# Get the directory component of the given path, and save it in the 60b8414663Smrg# global variables '$dir'. Note that this directory component will 61b8414663Smrg# be either empty or ending with a '/' character. This is deliberate. 62b8414663Smrgset_dir_from () 63b8414663Smrg{ 64b8414663Smrg case $1 in 65b8414663Smrg */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; 66b8414663Smrg *) dir=;; 67b8414663Smrg esac 68b8414663Smrg} 69b8414663Smrg 70b8414663Smrg# Get the suffix-stripped basename of the given path, and save it the 71b8414663Smrg# global variable '$base'. 72b8414663Smrgset_base_from () 73b8414663Smrg{ 74b8414663Smrg base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` 75b8414663Smrg} 76b8414663Smrg 77b8414663Smrg# If no dependency file was actually created by the compiler invocation, 78b8414663Smrg# we still have to create a dummy depfile, to avoid errors with the 79b8414663Smrg# Makefile "include basename.Plo" scheme. 80b8414663Smrgmake_dummy_depfile () 81b8414663Smrg{ 82b8414663Smrg echo "#dummy" > "$depfile" 83b8414663Smrg} 84b8414663Smrg 85b8414663Smrg# Factor out some common post-processing of the generated depfile. 86b8414663Smrg# Requires the auxiliary global variable '$tmpdepfile' to be set. 87b8414663Smrgaix_post_process_depfile () 88b8414663Smrg{ 89b8414663Smrg # If the compiler actually managed to produce a dependency file, 90b8414663Smrg # post-process it. 91b8414663Smrg if test -f "$tmpdepfile"; then 92b8414663Smrg # Each line is of the form 'foo.o: dependency.h'. 93b8414663Smrg # Do two passes, one to just change these to 94b8414663Smrg # $object: dependency.h 95b8414663Smrg # and one to simply output 96b8414663Smrg # dependency.h: 97b8414663Smrg # which is needed to avoid the deleted-header problem. 98b8414663Smrg { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" 99b8414663Smrg sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" 100b8414663Smrg } > "$depfile" 101b8414663Smrg rm -f "$tmpdepfile" 102b8414663Smrg else 103b8414663Smrg make_dummy_depfile 104b8414663Smrg fi 105b8414663Smrg} 106b8414663Smrg 107b8414663Smrg# A tabulation character. 108b8414663Smrgtab=' ' 109b8414663Smrg# A newline character. 110b8414663Smrgnl=' 111b8414663Smrg' 112b8414663Smrg# Character ranges might be problematic outside the C locale. 113b8414663Smrg# These definitions help. 114b8414663Smrgupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ 115b8414663Smrglower=abcdefghijklmnopqrstuvwxyz 116b8414663Smrgdigits=0123456789 117b8414663Smrgalpha=${upper}${lower} 118b8414663Smrg 1197d5e3a19Smrgif test -z "$depmode" || test -z "$source" || test -z "$object"; then 1207d5e3a19Smrg echo "depcomp: Variables source, object and depmode must be set" 1>&2 1217d5e3a19Smrg exit 1 1227d5e3a19Smrgfi 1237d5e3a19Smrg 1247d5e3a19Smrg# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 1257d5e3a19Smrgdepfile=${depfile-`echo "$object" | 1267d5e3a19Smrg sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 1277d5e3a19Smrgtmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 1287d5e3a19Smrg 1297d5e3a19Smrgrm -f "$tmpdepfile" 1307d5e3a19Smrg 131b8414663Smrg# Avoid interferences from the environment. 132b8414663Smrggccflag= dashmflag= 133b8414663Smrg 1347d5e3a19Smrg# Some modes work just like other modes, but use different flags. We 1357d5e3a19Smrg# parameterize here, but still list the modes in the big case below, 1367d5e3a19Smrg# to make depend.m4 easier to write. Note that we *cannot* use a case 1377d5e3a19Smrg# here, because this file can only contain one case statement. 1387d5e3a19Smrgif test "$depmode" = hp; then 1397d5e3a19Smrg # HP compiler uses -M and no extra arg. 1407d5e3a19Smrg gccflag=-M 1417d5e3a19Smrg depmode=gcc 1427d5e3a19Smrgfi 1437d5e3a19Smrg 1447d5e3a19Smrgif test "$depmode" = dashXmstdout; then 145b8414663Smrg # This is just like dashmstdout with a different argument. 146b8414663Smrg dashmflag=-xM 147b8414663Smrg depmode=dashmstdout 1487d5e3a19Smrgfi 1497d5e3a19Smrg 150765486e8Smrgcygpath_u="cygpath -u -f -" 151765486e8Smrgif test "$depmode" = msvcmsys; then 152b8414663Smrg # This is just like msvisualcpp but w/o cygpath translation. 153b8414663Smrg # Just convert the backslash-escaped backslashes to single forward 154b8414663Smrg # slashes to satisfy depend.m4 155b8414663Smrg cygpath_u='sed s,\\\\,/,g' 156b8414663Smrg depmode=msvisualcpp 157b8414663Smrgfi 158b8414663Smrg 159b8414663Smrgif test "$depmode" = msvc7msys; then 160b8414663Smrg # This is just like msvc7 but w/o cygpath translation. 161b8414663Smrg # Just convert the backslash-escaped backslashes to single forward 162b8414663Smrg # slashes to satisfy depend.m4 163b8414663Smrg cygpath_u='sed s,\\\\,/,g' 164b8414663Smrg depmode=msvc7 165b8414663Smrgfi 166b8414663Smrg 167b8414663Smrgif test "$depmode" = xlc; then 168b8414663Smrg # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169b8414663Smrg gccflag=-qmakedep=gcc,-MF 170b8414663Smrg depmode=gcc 171765486e8Smrgfi 172765486e8Smrg 1737d5e3a19Smrgcase "$depmode" in 1747d5e3a19Smrggcc3) 1757d5e3a19Smrg## gcc 3 implements dependency tracking that does exactly what 1767d5e3a19Smrg## we want. Yay! Note: for some reason libtool 1.4 doesn't like 1777d5e3a19Smrg## it if -MD -MP comes after the -MF stuff. Hmm. 1787d5e3a19Smrg## Unfortunately, FreeBSD c89 acceptance of flags depends upon 1797d5e3a19Smrg## the command line argument order; so add the flags where they 1807d5e3a19Smrg## appear in depend2.am. Note that the slowdown incurred here 1817d5e3a19Smrg## affects only configure: in makefiles, %FASTDEP% shortcuts this. 1827d5e3a19Smrg for arg 1837d5e3a19Smrg do 1847d5e3a19Smrg case $arg in 1857d5e3a19Smrg -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 1867d5e3a19Smrg *) set fnord "$@" "$arg" ;; 1877d5e3a19Smrg esac 1887d5e3a19Smrg shift # fnord 1897d5e3a19Smrg shift # $arg 1907d5e3a19Smrg done 1917d5e3a19Smrg "$@" 1927d5e3a19Smrg stat=$? 193b8414663Smrg if test $stat -ne 0; then 1947d5e3a19Smrg rm -f "$tmpdepfile" 1957d5e3a19Smrg exit $stat 1967d5e3a19Smrg fi 1977d5e3a19Smrg mv "$tmpdepfile" "$depfile" 1987d5e3a19Smrg ;; 1997d5e3a19Smrg 2007d5e3a19Smrggcc) 201b8414663Smrg## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. 202b8414663Smrg## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. 203b8414663Smrg## (see the conditional assignment to $gccflag above). 2047d5e3a19Smrg## There are various ways to get dependency output from gcc. Here's 2057d5e3a19Smrg## why we pick this rather obscure method: 2067d5e3a19Smrg## - Don't want to use -MD because we'd like the dependencies to end 2077d5e3a19Smrg## up in a subdir. Having to rename by hand is ugly. 2087d5e3a19Smrg## (We might end up doing this anyway to support other compilers.) 2097d5e3a19Smrg## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210b8414663Smrg## -MM, not -M (despite what the docs say). Also, it might not be 211b8414663Smrg## supported by the other compilers which use the 'gcc' depmode. 2127d5e3a19Smrg## - Using -M directly means running the compiler twice (even worse 2137d5e3a19Smrg## than renaming). 2147d5e3a19Smrg if test -z "$gccflag"; then 2157d5e3a19Smrg gccflag=-MD, 2167d5e3a19Smrg fi 2177d5e3a19Smrg "$@" -Wp,"$gccflag$tmpdepfile" 2187d5e3a19Smrg stat=$? 219b8414663Smrg if test $stat -ne 0; then 2207d5e3a19Smrg rm -f "$tmpdepfile" 2217d5e3a19Smrg exit $stat 2227d5e3a19Smrg fi 2237d5e3a19Smrg rm -f "$depfile" 2247d5e3a19Smrg echo "$object : \\" > "$depfile" 225b8414663Smrg # The second -e expression handles DOS-style file names with drive 226b8414663Smrg # letters. 2277d5e3a19Smrg sed -e 's/^[^:]*: / /' \ 2287d5e3a19Smrg -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229b8414663Smrg## This next piece of magic avoids the "deleted header file" problem. 2307d5e3a19Smrg## The problem is that when a header file which appears in a .P file 2317d5e3a19Smrg## is deleted, the dependency causes make to die (because there is 2327d5e3a19Smrg## typically no way to rebuild the header). We avoid this by adding 2337d5e3a19Smrg## dummy dependencies for each header file. Too bad gcc doesn't do 2347d5e3a19Smrg## this for us directly. 235b8414663Smrg## Some versions of gcc put a space before the ':'. On the theory 2367d5e3a19Smrg## that the space means something, we add a space to the output as 237b8414663Smrg## well. hp depmode also adds that space, but also prefixes the VPATH 238b8414663Smrg## to the object. Take care to not repeat it in the output. 2397d5e3a19Smrg## Some versions of the HPUX 10.20 sed can't process this invocation 2407d5e3a19Smrg## correctly. Breaking it into two sed invocations is a workaround. 241b8414663Smrg tr ' ' "$nl" < "$tmpdepfile" \ 242b8414663Smrg | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243b8414663Smrg | sed -e 's/$/ :/' >> "$depfile" 2447d5e3a19Smrg rm -f "$tmpdepfile" 2457d5e3a19Smrg ;; 2467d5e3a19Smrg 2477d5e3a19Smrghp) 2487d5e3a19Smrg # This case exists only to let depend.m4 do its work. It works by 2497d5e3a19Smrg # looking at the text of this script. This case will never be run, 2507d5e3a19Smrg # since it is checked for above. 2517d5e3a19Smrg exit 1 2527d5e3a19Smrg ;; 2537d5e3a19Smrg 2547d5e3a19Smrgsgi) 2557d5e3a19Smrg if test "$libtool" = yes; then 2567d5e3a19Smrg "$@" "-Wp,-MDupdate,$tmpdepfile" 2577d5e3a19Smrg else 2587d5e3a19Smrg "$@" -MDupdate "$tmpdepfile" 2597d5e3a19Smrg fi 2607d5e3a19Smrg stat=$? 261b8414663Smrg if test $stat -ne 0; then 2627d5e3a19Smrg rm -f "$tmpdepfile" 2637d5e3a19Smrg exit $stat 2647d5e3a19Smrg fi 2657d5e3a19Smrg rm -f "$depfile" 2667d5e3a19Smrg 2677d5e3a19Smrg if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 2687d5e3a19Smrg echo "$object : \\" > "$depfile" 2697d5e3a19Smrg # Clip off the initial element (the dependent). Don't try to be 2707d5e3a19Smrg # clever and replace this with sed code, as IRIX sed won't handle 2717d5e3a19Smrg # lines with more than a fixed number of characters (4096 in 2727d5e3a19Smrg # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273b8414663Smrg # the IRIX cc adds comments like '#:fec' to the end of the 2747d5e3a19Smrg # dependency line. 275b8414663Smrg tr ' ' "$nl" < "$tmpdepfile" \ 276b8414663Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277b8414663Smrg | tr "$nl" ' ' >> "$depfile" 278765486e8Smrg echo >> "$depfile" 2797d5e3a19Smrg # The second pass generates a dummy entry for each header file. 280b8414663Smrg tr ' ' "$nl" < "$tmpdepfile" \ 281b8414663Smrg | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282b8414663Smrg >> "$depfile" 2837d5e3a19Smrg else 284b8414663Smrg make_dummy_depfile 2857d5e3a19Smrg fi 2867d5e3a19Smrg rm -f "$tmpdepfile" 2877d5e3a19Smrg ;; 2887d5e3a19Smrg 289b8414663Smrgxlc) 290b8414663Smrg # This case exists only to let depend.m4 do its work. It works by 291b8414663Smrg # looking at the text of this script. This case will never be run, 292b8414663Smrg # since it is checked for above. 293b8414663Smrg exit 1 294b8414663Smrg ;; 295b8414663Smrg 2967d5e3a19Smrgaix) 2977d5e3a19Smrg # The C for AIX Compiler uses -M and outputs the dependencies 2987d5e3a19Smrg # in a .u file. In older versions, this file always lives in the 299b8414663Smrg # current directory. Also, the AIX compiler puts '$object:' at the 3007d5e3a19Smrg # start of each line; $object doesn't have directory information. 3017d5e3a19Smrg # Version 6 uses the directory in both cases. 302b8414663Smrg set_dir_from "$object" 303b8414663Smrg set_base_from "$object" 3047d5e3a19Smrg if test "$libtool" = yes; then 3051568b75bSmrg tmpdepfile1=$dir$base.u 3061568b75bSmrg tmpdepfile2=$base.u 3071568b75bSmrg tmpdepfile3=$dir.libs/$base.u 3087d5e3a19Smrg "$@" -Wc,-M 3097d5e3a19Smrg else 3101568b75bSmrg tmpdepfile1=$dir$base.u 3111568b75bSmrg tmpdepfile2=$dir$base.u 3121568b75bSmrg tmpdepfile3=$dir$base.u 3137d5e3a19Smrg "$@" -M 3147d5e3a19Smrg fi 3157d5e3a19Smrg stat=$? 316b8414663Smrg if test $stat -ne 0; then 3171568b75bSmrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3187d5e3a19Smrg exit $stat 3197d5e3a19Smrg fi 3207d5e3a19Smrg 3211568b75bSmrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 3221568b75bSmrg do 3231568b75bSmrg test -f "$tmpdepfile" && break 3241568b75bSmrg done 325b8414663Smrg aix_post_process_depfile 326b8414663Smrg ;; 327b8414663Smrg 328b8414663Smrgtcc) 329b8414663Smrg # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330b8414663Smrg # FIXME: That version still under development at the moment of writing. 331b8414663Smrg # Make that this statement remains true also for stable, released 332b8414663Smrg # versions. 333b8414663Smrg # It will wrap lines (doesn't matter whether long or short) with a 334b8414663Smrg # trailing '\', as in: 335b8414663Smrg # 336b8414663Smrg # foo.o : \ 337b8414663Smrg # foo.c \ 338b8414663Smrg # foo.h \ 339b8414663Smrg # 340b8414663Smrg # It will put a trailing '\' even on the last line, and will use leading 341b8414663Smrg # spaces rather than leading tabs (at least since its commit 0394caf7 342b8414663Smrg # "Emit spaces for -MD"). 343b8414663Smrg "$@" -MD -MF "$tmpdepfile" 344b8414663Smrg stat=$? 345b8414663Smrg if test $stat -ne 0; then 346b8414663Smrg rm -f "$tmpdepfile" 347b8414663Smrg exit $stat 3487d5e3a19Smrg fi 349b8414663Smrg rm -f "$depfile" 350b8414663Smrg # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351b8414663Smrg # We have to change lines of the first kind to '$object: \'. 352b8414663Smrg sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353b8414663Smrg # And for each line of the second kind, we have to emit a 'dep.h:' 354b8414663Smrg # dummy dependency, to avoid the deleted-header problem. 355b8414663Smrg sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 3567d5e3a19Smrg rm -f "$tmpdepfile" 3577d5e3a19Smrg ;; 3587d5e3a19Smrg 359b8414663Smrg## The order of this option in the case statement is important, since the 360b8414663Smrg## shell code in configure will try each of these formats in the order 361b8414663Smrg## listed in this file. A plain '-MD' option would be understood by many 362b8414663Smrg## compilers, so we must ensure this comes after the gcc and icc options. 363b8414663Smrgpgcc) 364b8414663Smrg # Portland's C compiler understands '-MD'. 365b8414663Smrg # Will always output deps to 'file.d' where file is the root name of the 366b8414663Smrg # source file under compilation, even if file resides in a subdirectory. 367b8414663Smrg # The object file name does not affect the name of the '.d' file. 368b8414663Smrg # pgcc 10.2 will output 3697d5e3a19Smrg # foo.o: sub/foo.c sub/foo.h 370b8414663Smrg # and will wrap long lines using '\' : 3717d5e3a19Smrg # foo.o: sub/foo.c ... \ 3727d5e3a19Smrg # sub/foo.h ... \ 3737d5e3a19Smrg # ... 374b8414663Smrg set_dir_from "$object" 375b8414663Smrg # Use the source, not the object, to determine the base name, since 376b8414663Smrg # that's sadly what pgcc will do too. 377b8414663Smrg set_base_from "$source" 378b8414663Smrg tmpdepfile=$base.d 379b8414663Smrg 380b8414663Smrg # For projects that build the same source file twice into different object 381b8414663Smrg # files, the pgcc approach of using the *source* file root name can cause 382b8414663Smrg # problems in parallel builds. Use a locking strategy to avoid stomping on 383b8414663Smrg # the same $tmpdepfile. 384b8414663Smrg lockdir=$base.d-lock 385b8414663Smrg trap " 386b8414663Smrg echo '$0: caught signal, cleaning up...' >&2 387b8414663Smrg rmdir '$lockdir' 388b8414663Smrg exit 1 389b8414663Smrg " 1 2 13 15 390b8414663Smrg numtries=100 391b8414663Smrg i=$numtries 392b8414663Smrg while test $i -gt 0; do 393b8414663Smrg # mkdir is a portable test-and-set. 394b8414663Smrg if mkdir "$lockdir" 2>/dev/null; then 395b8414663Smrg # This process acquired the lock. 396b8414663Smrg "$@" -MD 397b8414663Smrg stat=$? 398b8414663Smrg # Release the lock. 399b8414663Smrg rmdir "$lockdir" 400b8414663Smrg break 401b8414663Smrg else 402b8414663Smrg # If the lock is being held by a different process, wait 403b8414663Smrg # until the winning process is done or we timeout. 404b8414663Smrg while test -d "$lockdir" && test $i -gt 0; do 405b8414663Smrg sleep 1 406b8414663Smrg i=`expr $i - 1` 407b8414663Smrg done 408b8414663Smrg fi 409b8414663Smrg i=`expr $i - 1` 410b8414663Smrg done 411b8414663Smrg trap - 1 2 13 15 412b8414663Smrg if test $i -le 0; then 413b8414663Smrg echo "$0: failed to acquire lock after $numtries attempts" >&2 414b8414663Smrg echo "$0: check lockdir '$lockdir'" >&2 415b8414663Smrg exit 1 416b8414663Smrg fi 4177d5e3a19Smrg 418b8414663Smrg if test $stat -ne 0; then 4197d5e3a19Smrg rm -f "$tmpdepfile" 4207d5e3a19Smrg exit $stat 4217d5e3a19Smrg fi 4227d5e3a19Smrg rm -f "$depfile" 4237d5e3a19Smrg # Each line is of the form `foo.o: dependent.h', 4247d5e3a19Smrg # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. 4257d5e3a19Smrg # Do two passes, one to just change these to 4267d5e3a19Smrg # `$object: dependent.h' and one to simply `dependent.h:'. 4277d5e3a19Smrg sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" 4287d5e3a19Smrg # Some versions of the HPUX 10.20 sed can't process this invocation 4297d5e3a19Smrg # correctly. Breaking it into two sed invocations is a workaround. 430b8414663Smrg sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ 431b8414663Smrg | sed -e 's/$/ :/' >> "$depfile" 4327d5e3a19Smrg rm -f "$tmpdepfile" 4337d5e3a19Smrg ;; 4347d5e3a19Smrg 4357d5e3a19Smrghp2) 4367d5e3a19Smrg # The "hp" stanza above does not work with aCC (C++) and HP's ia64 4377d5e3a19Smrg # compilers, which have integrated preprocessors. The correct option 4387d5e3a19Smrg # to use with these is +Maked; it writes dependencies to a file named 4397d5e3a19Smrg # 'foo.d', which lands next to the object file, wherever that 4407d5e3a19Smrg # happens to be. 4417d5e3a19Smrg # Much of this is similar to the tru64 case; see comments there. 442b8414663Smrg set_dir_from "$object" 443b8414663Smrg set_base_from "$object" 4447d5e3a19Smrg if test "$libtool" = yes; then 4457d5e3a19Smrg tmpdepfile1=$dir$base.d 4467d5e3a19Smrg tmpdepfile2=$dir.libs/$base.d 4477d5e3a19Smrg "$@" -Wc,+Maked 4487d5e3a19Smrg else 4497d5e3a19Smrg tmpdepfile1=$dir$base.d 4507d5e3a19Smrg tmpdepfile2=$dir$base.d 4517d5e3a19Smrg "$@" +Maked 4527d5e3a19Smrg fi 4537d5e3a19Smrg stat=$? 454b8414663Smrg if test $stat -ne 0; then 4557d5e3a19Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" 4567d5e3a19Smrg exit $stat 4577d5e3a19Smrg fi 4587d5e3a19Smrg 4597d5e3a19Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 4607d5e3a19Smrg do 4617d5e3a19Smrg test -f "$tmpdepfile" && break 4627d5e3a19Smrg done 4637d5e3a19Smrg if test -f "$tmpdepfile"; then 464b8414663Smrg sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" 465b8414663Smrg # Add 'dependent.h:' lines. 466765486e8Smrg sed -ne '2,${ 467b8414663Smrg s/^ *// 468b8414663Smrg s/ \\*$// 469b8414663Smrg s/$/:/ 470b8414663Smrg p 471b8414663Smrg }' "$tmpdepfile" >> "$depfile" 4727d5e3a19Smrg else 473b8414663Smrg make_dummy_depfile 4747d5e3a19Smrg fi 4757d5e3a19Smrg rm -f "$tmpdepfile" "$tmpdepfile2" 4767d5e3a19Smrg ;; 4777d5e3a19Smrg 4787d5e3a19Smrgtru64) 479b8414663Smrg # The Tru64 compiler uses -MD to generate dependencies as a side 480b8414663Smrg # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481b8414663Smrg # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482b8414663Smrg # dependencies in 'foo.d' instead, so we check for that too. 483b8414663Smrg # Subdirectories are respected. 484b8414663Smrg set_dir_from "$object" 485b8414663Smrg set_base_from "$object" 486b8414663Smrg 487b8414663Smrg if test "$libtool" = yes; then 488b8414663Smrg # Libtool generates 2 separate objects for the 2 libraries. These 489b8414663Smrg # two compilations output dependencies in $dir.libs/$base.o.d and 490b8414663Smrg # in $dir$base.o.d. We have to check for both files, because 491b8414663Smrg # one of the two compilations can be disabled. We should prefer 492b8414663Smrg # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493b8414663Smrg # automatically cleaned when .libs/ is deleted, while ignoring 494b8414663Smrg # the former would cause a distcleancheck panic. 495b8414663Smrg tmpdepfile1=$dir$base.o.d # libtool 1.5 496b8414663Smrg tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497b8414663Smrg tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498b8414663Smrg "$@" -Wc,-MD 499b8414663Smrg else 500b8414663Smrg tmpdepfile1=$dir$base.d 501b8414663Smrg tmpdepfile2=$dir$base.d 502b8414663Smrg tmpdepfile3=$dir$base.d 503b8414663Smrg "$@" -MD 504b8414663Smrg fi 505b8414663Smrg 506b8414663Smrg stat=$? 507b8414663Smrg if test $stat -ne 0; then 508b8414663Smrg rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509b8414663Smrg exit $stat 510b8414663Smrg fi 511b8414663Smrg 512b8414663Smrg for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513b8414663Smrg do 514b8414663Smrg test -f "$tmpdepfile" && break 515b8414663Smrg done 516b8414663Smrg # Same post-processing that is required for AIX mode. 517b8414663Smrg aix_post_process_depfile 518b8414663Smrg ;; 519b8414663Smrg 520b8414663Smrgmsvc7) 521b8414663Smrg if test "$libtool" = yes; then 522b8414663Smrg showIncludes=-Wc,-showIncludes 523b8414663Smrg else 524b8414663Smrg showIncludes=-showIncludes 525b8414663Smrg fi 526b8414663Smrg "$@" $showIncludes > "$tmpdepfile" 527b8414663Smrg stat=$? 528b8414663Smrg grep -v '^Note: including file: ' "$tmpdepfile" 529b8414663Smrg if test $stat -ne 0; then 530b8414663Smrg rm -f "$tmpdepfile" 531b8414663Smrg exit $stat 532b8414663Smrg fi 533b8414663Smrg rm -f "$depfile" 534b8414663Smrg echo "$object : \\" > "$depfile" 535b8414663Smrg # The first sed program below extracts the file names and escapes 536b8414663Smrg # backslashes for cygpath. The second sed program outputs the file 537b8414663Smrg # name when reading, but also accumulates all include files in the 538b8414663Smrg # hold buffer in order to output them again at the end. This only 539b8414663Smrg # works with sed implementations that can handle large buffers. 540b8414663Smrg sed < "$tmpdepfile" -n ' 541b8414663Smrg/^Note: including file: *\(.*\)/ { 542b8414663Smrg s//\1/ 543b8414663Smrg s/\\/\\\\/g 544b8414663Smrg p 545b8414663Smrg}' | $cygpath_u | sort -u | sed -n ' 546b8414663Smrgs/ /\\ /g 547b8414663Smrgs/\(.*\)/'"$tab"'\1 \\/p 548b8414663Smrgs/.\(.*\) \\/\1:/ 549b8414663SmrgH 550b8414663Smrg$ { 551b8414663Smrg s/.*/'"$tab"'/ 552b8414663Smrg G 553b8414663Smrg p 554b8414663Smrg}' >> "$depfile" 555b8414663Smrg echo >> "$depfile" # make sure the fragment doesn't end with a backslash 556b8414663Smrg rm -f "$tmpdepfile" 557b8414663Smrg ;; 558b8414663Smrg 559b8414663Smrgmsvc7msys) 560b8414663Smrg # This case exists only to let depend.m4 do its work. It works by 561b8414663Smrg # looking at the text of this script. This case will never be run, 562b8414663Smrg # since it is checked for above. 563b8414663Smrg exit 1 564b8414663Smrg ;; 5657d5e3a19Smrg 5667d5e3a19Smrg#nosideeffect) 5677d5e3a19Smrg # This comment above is used by automake to tell side-effect 5687d5e3a19Smrg # dependency tracking mechanisms from slower ones. 5697d5e3a19Smrg 5707d5e3a19Smrgdashmstdout) 5717d5e3a19Smrg # Important note: in order to support this mode, a compiler *must* 5727d5e3a19Smrg # always write the preprocessed file to stdout, regardless of -o. 5737d5e3a19Smrg "$@" || exit $? 5747d5e3a19Smrg 5757d5e3a19Smrg # Remove the call to Libtool. 5767d5e3a19Smrg if test "$libtool" = yes; then 577765486e8Smrg while test "X$1" != 'X--mode=compile'; do 5787d5e3a19Smrg shift 5797d5e3a19Smrg done 5807d5e3a19Smrg shift 5817d5e3a19Smrg fi 5827d5e3a19Smrg 583b8414663Smrg # Remove '-o $object'. 5847d5e3a19Smrg IFS=" " 5857d5e3a19Smrg for arg 5867d5e3a19Smrg do 5877d5e3a19Smrg case $arg in 5887d5e3a19Smrg -o) 5897d5e3a19Smrg shift 5907d5e3a19Smrg ;; 5917d5e3a19Smrg $object) 5927d5e3a19Smrg shift 5937d5e3a19Smrg ;; 5947d5e3a19Smrg *) 5957d5e3a19Smrg set fnord "$@" "$arg" 5967d5e3a19Smrg shift # fnord 5977d5e3a19Smrg shift # $arg 5987d5e3a19Smrg ;; 5997d5e3a19Smrg esac 6007d5e3a19Smrg done 6017d5e3a19Smrg 6027d5e3a19Smrg test -z "$dashmflag" && dashmflag=-M 603b8414663Smrg # Require at least two characters before searching for ':' 6047d5e3a19Smrg # in the target name. This is to cope with DOS-style filenames: 605b8414663Smrg # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 6067d5e3a19Smrg "$@" $dashmflag | 607b8414663Smrg sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" 6087d5e3a19Smrg rm -f "$depfile" 6097d5e3a19Smrg cat < "$tmpdepfile" > "$depfile" 610b8414663Smrg # Some versions of the HPUX 10.20 sed can't process this sed invocation 611b8414663Smrg # correctly. Breaking it into two sed invocations is a workaround. 612b8414663Smrg tr ' ' "$nl" < "$tmpdepfile" \ 613b8414663Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614b8414663Smrg | sed -e 's/$/ :/' >> "$depfile" 6157d5e3a19Smrg rm -f "$tmpdepfile" 6167d5e3a19Smrg ;; 6177d5e3a19Smrg 6187d5e3a19SmrgdashXmstdout) 6197d5e3a19Smrg # This case only exists to satisfy depend.m4. It is never actually 6207d5e3a19Smrg # run, as this mode is specially recognized in the preamble. 6217d5e3a19Smrg exit 1 6227d5e3a19Smrg ;; 6237d5e3a19Smrg 6247d5e3a19Smrgmakedepend) 6257d5e3a19Smrg "$@" || exit $? 6267d5e3a19Smrg # Remove any Libtool call 6277d5e3a19Smrg if test "$libtool" = yes; then 628765486e8Smrg while test "X$1" != 'X--mode=compile'; do 6297d5e3a19Smrg shift 6307d5e3a19Smrg done 6317d5e3a19Smrg shift 6327d5e3a19Smrg fi 6337d5e3a19Smrg # X makedepend 6347d5e3a19Smrg shift 635765486e8Smrg cleared=no eat=no 636765486e8Smrg for arg 637765486e8Smrg do 6387d5e3a19Smrg case $cleared in 6397d5e3a19Smrg no) 6407d5e3a19Smrg set ""; shift 6417d5e3a19Smrg cleared=yes ;; 6427d5e3a19Smrg esac 643765486e8Smrg if test $eat = yes; then 644765486e8Smrg eat=no 645765486e8Smrg continue 646765486e8Smrg fi 6477d5e3a19Smrg case "$arg" in 6487d5e3a19Smrg -D*|-I*) 6497d5e3a19Smrg set fnord "$@" "$arg"; shift ;; 6507d5e3a19Smrg # Strip any option that makedepend may not understand. Remove 6517d5e3a19Smrg # the object too, otherwise makedepend will parse it as a source file. 652765486e8Smrg -arch) 653765486e8Smrg eat=yes ;; 6547d5e3a19Smrg -*|$object) 6557d5e3a19Smrg ;; 6567d5e3a19Smrg *) 6577d5e3a19Smrg set fnord "$@" "$arg"; shift ;; 6587d5e3a19Smrg esac 6597d5e3a19Smrg done 660765486e8Smrg obj_suffix=`echo "$object" | sed 's/^.*\././'` 6617d5e3a19Smrg touch "$tmpdepfile" 6627d5e3a19Smrg ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 6637d5e3a19Smrg rm -f "$depfile" 664b8414663Smrg # makedepend may prepend the VPATH from the source file name to the object. 665b8414663Smrg # No need to regex-escape $object, excess matching of '.' is harmless. 666b8414663Smrg sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667b8414663Smrg # Some versions of the HPUX 10.20 sed can't process the last invocation 668b8414663Smrg # correctly. Breaking it into two sed invocations is a workaround. 669b8414663Smrg sed '1,2d' "$tmpdepfile" \ 670b8414663Smrg | tr ' ' "$nl" \ 671b8414663Smrg | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672b8414663Smrg | sed -e 's/$/ :/' >> "$depfile" 6737d5e3a19Smrg rm -f "$tmpdepfile" "$tmpdepfile".bak 6747d5e3a19Smrg ;; 6757d5e3a19Smrg 6767d5e3a19Smrgcpp) 6777d5e3a19Smrg # Important note: in order to support this mode, a compiler *must* 6787d5e3a19Smrg # always write the preprocessed file to stdout. 6797d5e3a19Smrg "$@" || exit $? 6807d5e3a19Smrg 6817d5e3a19Smrg # Remove the call to Libtool. 6827d5e3a19Smrg if test "$libtool" = yes; then 683765486e8Smrg while test "X$1" != 'X--mode=compile'; do 6847d5e3a19Smrg shift 6857d5e3a19Smrg done 6867d5e3a19Smrg shift 6877d5e3a19Smrg fi 6887d5e3a19Smrg 689b8414663Smrg # Remove '-o $object'. 6907d5e3a19Smrg IFS=" " 6917d5e3a19Smrg for arg 6927d5e3a19Smrg do 6937d5e3a19Smrg case $arg in 6947d5e3a19Smrg -o) 6957d5e3a19Smrg shift 6967d5e3a19Smrg ;; 6977d5e3a19Smrg $object) 6987d5e3a19Smrg shift 6997d5e3a19Smrg ;; 7007d5e3a19Smrg *) 7017d5e3a19Smrg set fnord "$@" "$arg" 7027d5e3a19Smrg shift # fnord 7037d5e3a19Smrg shift # $arg 7047d5e3a19Smrg ;; 7057d5e3a19Smrg esac 7067d5e3a19Smrg done 7077d5e3a19Smrg 708b8414663Smrg "$@" -E \ 709b8414663Smrg | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 710b8414663Smrg -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 711b8414663Smrg | sed '$ s: \\$::' > "$tmpdepfile" 7127d5e3a19Smrg rm -f "$depfile" 7137d5e3a19Smrg echo "$object : \\" > "$depfile" 7147d5e3a19Smrg cat < "$tmpdepfile" >> "$depfile" 7157d5e3a19Smrg sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 7167d5e3a19Smrg rm -f "$tmpdepfile" 7177d5e3a19Smrg ;; 7187d5e3a19Smrg 7197d5e3a19Smrgmsvisualcpp) 7207d5e3a19Smrg # Important note: in order to support this mode, a compiler *must* 721765486e8Smrg # always write the preprocessed file to stdout. 7227d5e3a19Smrg "$@" || exit $? 723765486e8Smrg 724765486e8Smrg # Remove the call to Libtool. 725765486e8Smrg if test "$libtool" = yes; then 726765486e8Smrg while test "X$1" != 'X--mode=compile'; do 727765486e8Smrg shift 728765486e8Smrg done 729765486e8Smrg shift 730765486e8Smrg fi 731765486e8Smrg 7327d5e3a19Smrg IFS=" " 7337d5e3a19Smrg for arg 7347d5e3a19Smrg do 7357d5e3a19Smrg case "$arg" in 736765486e8Smrg -o) 737765486e8Smrg shift 738765486e8Smrg ;; 739765486e8Smrg $object) 740765486e8Smrg shift 741765486e8Smrg ;; 7427d5e3a19Smrg "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743b8414663Smrg set fnord "$@" 744b8414663Smrg shift 745b8414663Smrg shift 746b8414663Smrg ;; 7477d5e3a19Smrg *) 748b8414663Smrg set fnord "$@" "$arg" 749b8414663Smrg shift 750b8414663Smrg shift 751b8414663Smrg ;; 7527d5e3a19Smrg esac 7537d5e3a19Smrg done 754765486e8Smrg "$@" -E 2>/dev/null | 755765486e8Smrg sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 7567d5e3a19Smrg rm -f "$depfile" 7577d5e3a19Smrg echo "$object : \\" > "$depfile" 758b8414663Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 759b8414663Smrg echo "$tab" >> "$depfile" 760765486e8Smrg sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 7617d5e3a19Smrg rm -f "$tmpdepfile" 7627d5e3a19Smrg ;; 7637d5e3a19Smrg 764765486e8Smrgmsvcmsys) 765765486e8Smrg # This case exists only to let depend.m4 do its work. It works by 766765486e8Smrg # looking at the text of this script. This case will never be run, 767765486e8Smrg # since it is checked for above. 768765486e8Smrg exit 1 769765486e8Smrg ;; 770765486e8Smrg 7717d5e3a19Smrgnone) 7727d5e3a19Smrg exec "$@" 7737d5e3a19Smrg ;; 7747d5e3a19Smrg 7757d5e3a19Smrg*) 7767d5e3a19Smrg echo "Unknown depmode $depmode" 1>&2 7777d5e3a19Smrg exit 1 7787d5e3a19Smrg ;; 7797d5e3a19Smrgesac 7807d5e3a19Smrg 7817d5e3a19Smrgexit 0 7827d5e3a19Smrg 7837d5e3a19Smrg# Local Variables: 7847d5e3a19Smrg# mode: shell-script 7857d5e3a19Smrg# sh-indentation: 2 7865212f86fSmrg# eval: (add-hook 'before-save-hook 'time-stamp) 7877d5e3a19Smrg# time-stamp-start: "scriptversion=" 7887d5e3a19Smrg# time-stamp-format: "%:y-%02m-%02d.%02H" 7895212f86fSmrg# time-stamp-time-zone: "UTC0" 790765486e8Smrg# time-stamp-end: "; # UTC" 7917d5e3a19Smrg# End: 792