Home | History | Annotate | Download | only in libffi
      1 #! /bin/sh
      2 # depcomp - compile a program generating dependencies as side-effects
      3 
      4 scriptversion=2006-10-15.18
      5 
      6 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software
      7 # Foundation, Inc.
      8 
      9 # This program is free software; you can redistribute it and/or modify
     10 # it under the terms of the GNU General Public License as published by
     11 # the Free Software Foundation; either version 2, or (at your option)
     12 # any later version.
     13 
     14 # This program is distributed in the hope that it will be useful,
     15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17 # GNU General Public License for more details.
     18 
     19 # You should have received a copy of the GNU General Public License
     20 # along with this program; if not, write to the Free Software
     21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     22 # 02110-1301, USA.
     23 
     24 # As a special exception to the GNU General Public License, if you
     25 # distribute this file as part of a program that contains a
     26 # configuration script generated by Autoconf, you may include it under
     27 # the same distribution terms that you use for the rest of that program.
     28 
     29 # Originally written by Alexandre Oliva <oliva (at] dcc.unicamp.br>.
     30 
     31 case $1 in
     32   '')
     33      echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
     34      exit 1;
     35      ;;
     36   -h | --h*)
     37     cat <<\EOF
     38 Usage: depcomp [--help] [--version] PROGRAM [ARGS]
     39 
     40 Run PROGRAMS ARGS to compile a file, generating dependencies
     41 as side-effects.
     42 
     43 Environment variables:
     44   depmode     Dependency tracking mode.
     45   source      Source file read by `PROGRAMS ARGS'.
     46   object      Object file output by `PROGRAMS ARGS'.
     47   DEPDIR      directory where to store dependencies.
     48   depfile     Dependency file to output.
     49   tmpdepfile  Temporary file to use when outputing dependencies.
     50   libtool     Whether libtool is used (yes/no).
     51 
     52 Report bugs to <bug-automake (at] gnu.org>.
     53 EOF
     54     exit $?
     55     ;;
     56   -v | --v*)
     57     echo "depcomp $scriptversion"
     58     exit $?
     59     ;;
     60 esac
     61 
     62 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
     63   echo "depcomp: Variables source, object and depmode must be set" 1>&2
     64   exit 1
     65 fi
     66 
     67 # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
     68 depfile=${depfile-`echo "$object" |
     69   sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
     70 tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
     71 
     72 rm -f "$tmpdepfile"
     73 
     74 # Some modes work just like other modes, but use different flags.  We
     75 # parameterize here, but still list the modes in the big case below,
     76 # to make depend.m4 easier to write.  Note that we *cannot* use a case
     77 # here, because this file can only contain one case statement.
     78 if test "$depmode" = hp; then
     79   # HP compiler uses -M and no extra arg.
     80   gccflag=-M
     81   depmode=gcc
     82 fi
     83 
     84 if test "$depmode" = dashXmstdout; then
     85    # This is just like dashmstdout with a different argument.
     86    dashmflag=-xM
     87    depmode=dashmstdout
     88 fi
     89 
     90 case "$depmode" in
     91 gcc3)
     92 ## gcc 3 implements dependency tracking that does exactly what
     93 ## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
     94 ## it if -MD -MP comes after the -MF stuff.  Hmm.
     95 ## Unfortunately, FreeBSD c89 acceptance of flags depends upon
     96 ## the command line argument order; so add the flags where they
     97 ## appear in depend2.am.  Note that the slowdown incurred here
     98 ## affects only configure: in makefiles, %FASTDEP% shortcuts this.
     99   for arg
    100   do
    101     case $arg in
    102     -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
    103     *)  set fnord "$@" "$arg" ;;
    104     esac
    105     shift # fnord
    106     shift # $arg
    107   done
    108   "$@"
    109   stat=$?
    110   if test $stat -eq 0; then :
    111   else
    112     rm -f "$tmpdepfile"
    113     exit $stat
    114   fi
    115   mv "$tmpdepfile" "$depfile"
    116   ;;
    117 
    118 gcc)
    119 ## There are various ways to get dependency output from gcc.  Here's
    120 ## why we pick this rather obscure method:
    121 ## - Don't want to use -MD because we'd like the dependencies to end
    122 ##   up in a subdir.  Having to rename by hand is ugly.
    123 ##   (We might end up doing this anyway to support other compilers.)
    124 ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
    125 ##   -MM, not -M (despite what the docs say).
    126 ## - Using -M directly means running the compiler twice (even worse
    127 ##   than renaming).
    128   if test -z "$gccflag"; then
    129     gccflag=-MD,
    130   fi
    131   "$@" -Wp,"$gccflag$tmpdepfile"
    132   stat=$?
    133   if test $stat -eq 0; then :
    134   else
    135     rm -f "$tmpdepfile"
    136     exit $stat
    137   fi
    138   rm -f "$depfile"
    139   echo "$object : \\" > "$depfile"
    140   alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    141 ## The second -e expression handles DOS-style file names with drive letters.
    142   sed -e 's/^[^:]*: / /' \
    143       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
    144 ## This next piece of magic avoids the `deleted header file' problem.
    145 ## The problem is that when a header file which appears in a .P file
    146 ## is deleted, the dependency causes make to die (because there is
    147 ## typically no way to rebuild the header).  We avoid this by adding
    148 ## dummy dependencies for each header file.  Too bad gcc doesn't do
    149 ## this for us directly.
    150   tr ' ' '
    151 ' < "$tmpdepfile" |
    152 ## Some versions of gcc put a space before the `:'.  On the theory
    153 ## that the space means something, we add a space to the output as
    154 ## well.
    155 ## Some versions of the HPUX 10.20 sed can't process this invocation
    156 ## correctly.  Breaking it into two sed invocations is a workaround.
    157     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
    158   rm -f "$tmpdepfile"
    159   ;;
    160 
    161 hp)
    162   # This case exists only to let depend.m4 do its work.  It works by
    163   # looking at the text of this script.  This case will never be run,
    164   # since it is checked for above.
    165   exit 1
    166   ;;
    167 
    168 sgi)
    169   if test "$libtool" = yes; then
    170     "$@" "-Wp,-MDupdate,$tmpdepfile"
    171   else
    172     "$@" -MDupdate "$tmpdepfile"
    173   fi
    174   stat=$?
    175   if test $stat -eq 0; then :
    176   else
    177     rm -f "$tmpdepfile"
    178     exit $stat
    179   fi
    180   rm -f "$depfile"
    181 
    182   if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
    183     echo "$object : \\" > "$depfile"
    184 
    185     # Clip off the initial element (the dependent).  Don't try to be
    186     # clever and replace this with sed code, as IRIX sed won't handle
    187     # lines with more than a fixed number of characters (4096 in
    188     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
    189     # the IRIX cc adds comments like `#:fec' to the end of the
    190     # dependency line.
    191     tr ' ' '
    192 ' < "$tmpdepfile" \
    193     | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
    194     tr '
    195 ' ' ' >> $depfile
    196     echo >> $depfile
    197 
    198     # The second pass generates a dummy entry for each header file.
    199     tr ' ' '
    200 ' < "$tmpdepfile" \
    201    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
    202    >> $depfile
    203   else
    204     # The sourcefile does not contain any dependencies, so just
    205     # store a dummy comment line, to avoid errors with the Makefile
    206     # "include basename.Plo" scheme.
    207     echo "#dummy" > "$depfile"
    208   fi
    209   rm -f "$tmpdepfile"
    210   ;;
    211 
    212 aix)
    213   # The C for AIX Compiler uses -M and outputs the dependencies
    214   # in a .u file.  In older versions, this file always lives in the
    215   # current directory.  Also, the AIX compiler puts `$object:' at the
    216   # start of each line; $object doesn't have directory information.
    217   # Version 6 uses the directory in both cases.
    218   stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
    219   tmpdepfile="$stripped.u"
    220   if test "$libtool" = yes; then
    221     "$@" -Wc,-M
    222   else
    223     "$@" -M
    224   fi
    225   stat=$?
    226 
    227   if test -f "$tmpdepfile"; then :
    228   else
    229     stripped=`echo "$stripped" | sed 's,^.*/,,'`
    230     tmpdepfile="$stripped.u"
    231   fi
    232 
    233   if test $stat -eq 0; then :
    234   else
    235     rm -f "$tmpdepfile"
    236     exit $stat
    237   fi
    238 
    239   if test -f "$tmpdepfile"; then
    240     outname="$stripped.o"
    241     # Each line is of the form `foo.o: dependent.h'.
    242     # Do two passes, one to just change these to
    243     # `$object: dependent.h' and one to simply `dependent.h:'.
    244     sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
    245     sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
    246   else
    247     # The sourcefile does not contain any dependencies, so just
    248     # store a dummy comment line, to avoid errors with the Makefile
    249     # "include basename.Plo" scheme.
    250     echo "#dummy" > "$depfile"
    251   fi
    252   rm -f "$tmpdepfile"
    253   ;;
    254 
    255 icc)
    256   # Intel's C compiler understands `-MD -MF file'.  However on
    257   #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
    258   # ICC 7.0 will fill foo.d with something like
    259   #    foo.o: sub/foo.c
    260   #    foo.o: sub/foo.h
    261   # which is wrong.  We want:
    262   #    sub/foo.o: sub/foo.c
    263   #    sub/foo.o: sub/foo.h
    264   #    sub/foo.c:
    265   #    sub/foo.h:
    266   # ICC 7.1 will output
    267   #    foo.o: sub/foo.c sub/foo.h
    268   # and will wrap long lines using \ :
    269   #    foo.o: sub/foo.c ... \
    270   #     sub/foo.h ... \
    271   #     ...
    272 
    273   "$@" -MD -MF "$tmpdepfile"
    274   stat=$?
    275   if test $stat -eq 0; then :
    276   else
    277     rm -f "$tmpdepfile"
    278     exit $stat
    279   fi
    280   rm -f "$depfile"
    281   # Each line is of the form `foo.o: dependent.h',
    282   # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
    283   # Do two passes, one to just change these to
    284   # `$object: dependent.h' and one to simply `dependent.h:'.
    285   sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
    286   # Some versions of the HPUX 10.20 sed can't process this invocation
    287   # correctly.  Breaking it into two sed invocations is a workaround.
    288   sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
    289     sed -e 's/$/ :/' >> "$depfile"
    290   rm -f "$tmpdepfile"
    291   ;;
    292 
    293 hp2)
    294   # The "hp" stanza above does not work with aCC (C++) and HP's ia64
    295   # compilers, which have integrated preprocessors.  The correct option
    296   # to use with these is +Maked; it writes dependencies to a file named
    297   # 'foo.d', which lands next to the object file, wherever that
    298   # happens to be.
    299   # Much of this is similar to the tru64 case; see comments there.
    300   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
    301   test "x$dir" = "x$object" && dir=
    302   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
    303   if test "$libtool" = yes; then
    304     tmpdepfile1=$dir$base.d
    305     tmpdepfile2=$dir.libs/$base.d
    306     "$@" -Wc,+Maked
    307   else
    308     tmpdepfile1=$dir$base.d
    309     tmpdepfile2=$dir$base.d
    310     "$@" +Maked
    311   fi
    312   stat=$?
    313   if test $stat -eq 0; then :
    314   else
    315      rm -f "$tmpdepfile1" "$tmpdepfile2"
    316      exit $stat
    317   fi
    318 
    319   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
    320   do
    321     test -f "$tmpdepfile" && break
    322   done
    323   if test -f "$tmpdepfile"; then
    324     sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
    325     # Add `dependent.h:' lines.
    326     sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
    327   else
    328     echo "#dummy" > "$depfile"
    329   fi
    330   rm -f "$tmpdepfile" "$tmpdepfile2"
    331   ;;
    332 
    333 tru64)
    334    # The Tru64 compiler uses -MD to generate dependencies as a side
    335    # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
    336    # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
    337    # dependencies in `foo.d' instead, so we check for that too.
    338    # Subdirectories are respected.
    339    dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
    340    test "x$dir" = "x$object" && dir=
    341    base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
    342 
    343    if test "$libtool" = yes; then
    344       # With Tru64 cc, shared objects can also be used to make a
    345       # static library.  This mechanism is used in libtool 1.4 series to
    346       # handle both shared and static libraries in a single compilation.
    347       # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
    348       #
    349       # With libtool 1.5 this exception was removed, and libtool now
    350       # generates 2 separate objects for the 2 libraries.  These two
    351       # compilations output dependencies in $dir.libs/$base.o.d and
    352       # in $dir$base.o.d.  We have to check for both files, because
    353       # one of the two compilations can be disabled.  We should prefer
    354       # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
    355       # automatically cleaned when .libs/ is deleted, while ignoring
    356       # the former would cause a distcleancheck panic.
    357       tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
    358       tmpdepfile2=$dir$base.o.d          # libtool 1.5
    359       tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
    360       tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
    361       "$@" -Wc,-MD
    362    else
    363       tmpdepfile1=$dir$base.o.d
    364       tmpdepfile2=$dir$base.d
    365       tmpdepfile3=$dir$base.d
    366       tmpdepfile4=$dir$base.d
    367       "$@" -MD
    368    fi
    369 
    370    stat=$?
    371    if test $stat -eq 0; then :
    372    else
    373       rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
    374       exit $stat
    375    fi
    376 
    377    for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
    378    do
    379      test -f "$tmpdepfile" && break
    380    done
    381    if test -f "$tmpdepfile"; then
    382       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
    383       # That's a tab and a space in the [].
    384       sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
    385    else
    386       echo "#dummy" > "$depfile"
    387    fi
    388    rm -f "$tmpdepfile"
    389    ;;
    390 
    391 #nosideeffect)
    392   # This comment above is used by automake to tell side-effect
    393   # dependency tracking mechanisms from slower ones.
    394 
    395 dashmstdout)
    396   # Important note: in order to support this mode, a compiler *must*
    397   # always write the preprocessed file to stdout, regardless of -o.
    398   "$@" || exit $?
    399 
    400   # Remove the call to Libtool.
    401   if test "$libtool" = yes; then
    402     while test $1 != '--mode=compile'; do
    403       shift
    404     done
    405     shift
    406   fi
    407 
    408   # Remove `-o $object'.
    409   IFS=" "
    410   for arg
    411   do
    412     case $arg in
    413     -o)
    414       shift
    415       ;;
    416     $object)
    417       shift
    418       ;;
    419     *)
    420       set fnord "$@" "$arg"
    421       shift # fnord
    422       shift # $arg
    423       ;;
    424     esac
    425   done
    426 
    427   test -z "$dashmflag" && dashmflag=-M
    428   # Require at least two characters before searching for `:'
    429   # in the target name.  This is to cope with DOS-style filenames:
    430   # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
    431   "$@" $dashmflag |
    432     sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
    433   rm -f "$depfile"
    434   cat < "$tmpdepfile" > "$depfile"
    435   tr ' ' '
    436 ' < "$tmpdepfile" | \
    437 ## Some versions of the HPUX 10.20 sed can't process this invocation
    438 ## correctly.  Breaking it into two sed invocations is a workaround.
    439     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
    440   rm -f "$tmpdepfile"
    441   ;;
    442 
    443 dashXmstdout)
    444   # This case only exists to satisfy depend.m4.  It is never actually
    445   # run, as this mode is specially recognized in the preamble.
    446   exit 1
    447   ;;
    448 
    449 makedepend)
    450   "$@" || exit $?
    451   # Remove any Libtool call
    452   if test "$libtool" = yes; then
    453     while test $1 != '--mode=compile'; do
    454       shift
    455     done
    456     shift
    457   fi
    458   # X makedepend
    459   shift
    460   cleared=no
    461   for arg in "$@"; do
    462     case $cleared in
    463     no)
    464       set ""; shift
    465       cleared=yes ;;
    466     esac
    467     case "$arg" in
    468     -D*|-I*)
    469       set fnord "$@" "$arg"; shift ;;
    470     # Strip any option that makedepend may not understand.  Remove
    471     # the object too, otherwise makedepend will parse it as a source file.
    472     -*|$object)
    473       ;;
    474     *)
    475       set fnord "$@" "$arg"; shift ;;
    476     esac
    477   done
    478   obj_suffix="`echo $object | sed 's/^.*\././'`"
    479   touch "$tmpdepfile"
    480   ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
    481   rm -f "$depfile"
    482   cat < "$tmpdepfile" > "$depfile"
    483   sed '1,2d' "$tmpdepfile" | tr ' ' '
    484 ' | \
    485 ## Some versions of the HPUX 10.20 sed can't process this invocation
    486 ## correctly.  Breaking it into two sed invocations is a workaround.
    487     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
    488   rm -f "$tmpdepfile" "$tmpdepfile".bak
    489   ;;
    490 
    491 cpp)
    492   # Important note: in order to support this mode, a compiler *must*
    493   # always write the preprocessed file to stdout.
    494   "$@" || exit $?
    495 
    496   # Remove the call to Libtool.
    497   if test "$libtool" = yes; then
    498     while test $1 != '--mode=compile'; do
    499       shift
    500     done
    501     shift
    502   fi
    503 
    504   # Remove `-o $object'.
    505   IFS=" "
    506   for arg
    507   do
    508     case $arg in
    509     -o)
    510       shift
    511       ;;
    512     $object)
    513       shift
    514       ;;
    515     *)
    516       set fnord "$@" "$arg"
    517       shift # fnord
    518       shift # $arg
    519       ;;
    520     esac
    521   done
    522 
    523   "$@" -E |
    524     sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
    525        -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
    526     sed '$ s: \\$::' > "$tmpdepfile"
    527   rm -f "$depfile"
    528   echo "$object : \\" > "$depfile"
    529   cat < "$tmpdepfile" >> "$depfile"
    530   sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
    531   rm -f "$tmpdepfile"
    532   ;;
    533 
    534 msvisualcpp)
    535   # Important note: in order to support this mode, a compiler *must*
    536   # always write the preprocessed file to stdout, regardless of -o,
    537   # because we must use -o when running libtool.
    538   "$@" || exit $?
    539   IFS=" "
    540   for arg
    541   do
    542     case "$arg" in
    543     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
    544 	set fnord "$@"
    545 	shift
    546 	shift
    547 	;;
    548     *)
    549 	set fnord "$@" "$arg"
    550 	shift
    551 	shift
    552 	;;
    553     esac
    554   done
    555   "$@" -E |
    556   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
    557   rm -f "$depfile"
    558   echo "$object : \\" > "$depfile"
    559   . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
    560   echo "	" >> "$depfile"
    561   . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
    562   rm -f "$tmpdepfile"
    563   ;;
    564 
    565 none)
    566   exec "$@"
    567   ;;
    568 
    569 *)
    570   echo "Unknown depmode $depmode" 1>&2
    571   exit 1
    572   ;;
    573 esac
    574 
    575 exit 0
    576 
    577 # Local Variables:
    578 # mode: shell-script
    579 # sh-indentation: 2
    580 # eval: (add-hook 'write-file-hooks 'time-stamp)
    581 # time-stamp-start: "scriptversion="
    582 # time-stamp-format: "%:y-%02m-%02d.%02H"
    583 # time-stamp-end: "$"
    584 # End:
    585