diff options
Diffstat (limited to 'mdepend.cpp')
-rw-r--r-- | mdepend.cpp | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/mdepend.cpp b/mdepend.cpp new file mode 100644 index 0000000..a8311fc --- /dev/null +++ b/mdepend.cpp @@ -0,0 +1,286 @@ +XCOMM!/bin/sh +XCOMM +XCOMM $Xorg: mdepend.cpp,v 1.3 2000/08/17 19:41:52 cpqbld Exp $ +XCOMM $XdotOrg: util/imake/mdepend.cpp,v 1.4 2005/08/26 05:01:37 daniels Exp $ +XCOMM +XCOMM Do the equivalent of the 'makedepend' program, but do it right. +XCOMM +XCOMM Usage: +XCOMM +XCOMM makedepend [cpp-flags] [-w width] [-s magic-string] [-f makefile] +XCOMM [-o object-suffix] [-v] [-a] [-cc compiler] [-d dependencyflag] +XCOMM +XCOMM Notes: +XCOMM +XCOMM The C compiler used can be overridden with the environment +XCOMM variable "CC" or the command line flag -cc. +XCOMM +XCOMM The "-v" switch of the "makedepend" program is not supported. +XCOMM +XCOMM +XCOMM This script should +XCOMM work on both USG and BSD systems. However, when System V.4 comes out, +XCOMM USG users will probably have to change "silent" to "-s" instead of +XCOMM "-" (at least, that is what the documentation implies). +XCOMM +XCOMM $XFree86: xc/config/util/mdepend.cpp,v 3.9 2001/04/26 20:55:10 dawes Exp $ +XCOMM + +CC=PREPROC + +silent='-' + +TMP=`pwd`/.mdep$$ + +rm -rf ${TMP} +if ! mkdir -p ${TMP}; then + echo "$0: cannot create ${TMP}, exit." >&2 +fi + +CPPCMD=${TMP}/a +DEPENDLINES=${TMP}/b +TMPMAKEFILE=${TMP}/c +MAGICLINE=${TMP}/d +ARGS=${TMP}/e + +trap "rm -rf ${TMP}; exit 1" 1 2 15 +trap "rm -rf ${TMP}; exit 0" 1 2 13 + +echo " \c" > $CPPCMD +if [ `wc -c < $CPPCMD` -eq 1 ] +then + c="\c" + n= +else + c= + n="-n" +fi + +echo $n "$c" >$ARGS + +files= +makefile= +magic_string='# DO NOT DELETE' +objsuffix='.o' +width=78 +endmarker="" +verbose=n +append=n +compilerlistsdepends=n + +while [ $# != 0 ] +do + if [ "$endmarker"x != x ] && [ "$endmarker" = "$1" ]; then + endmarker="" + else + case "$1" in + -D*|-I*|-U*) + echo $n " '$1'$c" >> $ARGS + ;; + + -g|-O) # ignore so we can just pass $(CFLAGS) in + ;; + + *) + if [ "$endmarker"x = x ]; then + case "$1" in + -w) + width="$2" + shift + ;; + -s) + magic_string="$2" + shift + ;; + -f*) + if [ "$1" = "-f-" ]; then + makefile="-" + elif [ "$1" = "-f" ]; then + makefile="$2" + shift + else + echo "$1" | sed 's/^\-f//' >${TMP}arg + makefile="`cat ${TMP}arg`" + rm -f ${TMP}arg + fi + ;; + -o) + objsuffix="$2" + shift + ;; + + --*) + echo "$1" | sed 's/^\-\-//' >${TMP}end + endmarker="`cat ${TMP}end`" + rm -f ${TMP}end + if [ "$endmarker"x = x ]; then + endmarker="--" + fi + ;; + -v) + verbose="y" + ;; + + -a) + append="y" + ;; + + -cc) + CC="$2" + shift + ;; + + # Flag to tell compiler to output dependencies directly + # For example, with Sun compilers, -xM or -xM1 or + # with gcc, -M + -d) + compilerlistsdepends="y" + compilerlistdependsflag="$2" + shift + ;; + + -*) + echo "Unknown option '$1' ignored" 1>&2 + ;; + *) + files="$files $1" + ;; + esac + fi + ;; + esac + fi + shift +done +echo ' $*' >> $ARGS + +if [ "$compilerlistsdepends"x = "y"x ] ; then + CC="$CC $compilerlistdependsflag" +fi + +echo "#!/bin/sh" > $CPPCMD +echo "exec $CC `cat $ARGS`" >> $CPPCMD +chmod +x $CPPCMD +rm $ARGS + +case "$makefile" in + '') + if [ -r makefile ] + then + makefile=makefile + elif [ -r Makefile ] + then + makefile=Makefile + else + echo 'no makefile or Makefile found' 1>&2 + exit 1 + fi + ;; + -) + makefile=$TMPMAKEFILE + ;; +esac + +if [ "$verbose"x = "y"x ]; then + cat $CPPCMD +fi + +echo '' > $DEPENDLINES + +if [ "$compilerlistsdepends"x = "y"x ] ; then + for i in $files + do + $CPPCMD $i >> $DEPENDLINES + done +else +for i in $files +do + $CPPCMD $i \ + | sed -n "/^#/s;^;$i ;p" +done \ + | sed -e 's|/[^/.][^/]*/\.\.||g' -e 's|/\.[^.][^/]*/\.\.||g' \ + -e 's|"||g' -e 's| \./| |' \ + | awk '{ + if ($1 != $4 && $2 != "#ident" && $2 != "#pragma") + { + numparts = split( $1, ofileparts, "\." ) + ofile = "" + for ( i = 1; i < numparts; i = i+1 ) + { + if (i != 1 ) + ofile = ofile "." + ofile = ofile ofileparts[i] + } + print ofile "'"$objsuffix"'", $4 + } + }' \ + | sort -u \ + | awk ' + { + newrec = rec " " $2 + if ($1 != old1) + { + old1 = $1 + if (rec != "") + print rec + rec = $1 ": " $2 + } + else if (length (newrec) > '"$width"') + { + print rec + rec = $1 ": " $2 + } + else + rec = newrec + } + END \ + { + if (rec != "") + print rec + }' \ + | egrep -v '^[^:]*:[ ]*$' >> $DEPENDLINES +fi + +trap "" 1 2 13 15 # Now we are committed +case "$makefile" in + $TMPMAKEFILE) + ;; + *) + rm -f $makefile.bak + cp $makefile $makefile.bak + echo "Appending dependencies to $makefile" + ;; +esac + +XCOMM +XCOMM If not -a, append the magic string and a blank line so that +XCOMM /^$magic_string/+1,\$d can be used to delete everything from after +XCOMM the magic string to the end of the file. Then, append a blank +XCOMM line again and then the dependencies. +XCOMM +if [ "$append" = "n" ] +then + cat >> $makefile << END_OF_APPEND + +$magic_string + +END_OF_APPEND + ed $silent $makefile << END_OF_ED_SCRIPT +/^$magic_string/+1,\$d +w +q +END_OF_ED_SCRIPT + echo '' >>$makefile +fi + +cat $DEPENDLINES >>$makefile + +case "$makefile" in + $TMPMAKEFILE) + cat $TMPMAKEFILE + ;; + +esac + +rm -rf ${TMP}* +exit 0 |