mkdepend.in
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:7k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. #! @SCRIPT_SH@
  2. # $Id: mkdepend.in,v 1.1.1.1 2005/11/11 21:32:03 faxguy Exp $
  3. #
  4. # @WARNING@
  5. #
  6. # HylaFAX Facsimile Software
  7. #
  8. # Copyright (c) 1990-1996 Sam Leffler
  9. # Copyright (c) 1991-1996 Silicon Graphics, Inc.
  10. # HylaFAX is a trademark of Silicon Graphics
  11. # Permission to use, copy, modify, distribute, and sell this software and 
  12. # its documentation for any purpose is hereby granted without fee, provided
  13. # that (i) the above copyright notices and this permission notice appear in
  14. # all copies of the software and related documentation, and (ii) the names of
  15. # Sam Leffler and Silicon Graphics may not be used in any advertising or
  16. # publicity relating to the software without the specific, prior written
  17. # permission of Sam Leffler and Silicon Graphics.
  18. # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  19. # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  20. # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  21. # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  22. # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  23. # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  24. # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  25. # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  26. # OF THIS SOFTWARE.
  27. #
  28. #
  29. # VERSION: @VERSION@
  30. # DATE: @DATE@
  31. # TARGET: @TARGET@
  32. # CCOMPILER: @CCOMPILER@
  33. # CXXCOMPILER: @CXXCOMPILER@
  34. #
  35. #
  36. # NAME
  37. # mkdepend - compute header file dependencies
  38. # SYNOPSIS
  39. # mkdepend [-c compiler] [-e sedprog] [-f force] [-ipr] [-s sentinel]
  40. # depfile file ...
  41. CC=@CCOMPILER@
  42. SED=@SED@
  43. AWK=@AWK@
  44. # turn off noclobber, if set, for bash users
  45. test "${noclobber-}" && { unset noclobber >/dev/null 2>&1; }
  46. me=$0
  47. usage="usage: $me [-c compiler] [-e sedprog] [-f force] [-ipr]nt[-s sentinel] depfile [file ...]"
  48. depgen="$CC -M"
  49. incremental=no
  50. rawdepinput=no
  51. #
  52. # Process options and arguments.  We put quotes around the edit (-e) arguments
  53. # and use eval "sed -e ..." later, to preserve spaces in the edit command.
  54. #
  55. set -- "$@"
  56. while [ $# -gt 0 ] ; do
  57. case $1 in
  58.   -c) depgen=$2; shift;;
  59.   -e) sedprog="$sedprog -e '$2'"; shift;;
  60.   -f) force="$force $2"; shift;;
  61.   -i) incremental=yes;;
  62.   -p) depgen=collapse pcount=$2 rawdepinput=yes; shift;;
  63.   -r) depgen=cat rawdepinput=yes;;
  64.   -s) sentinel=$2 ; shift;;
  65.   -*) echo $usage; exit 2;;
  66.   *) break;;
  67. esac
  68. shift
  69. done
  70. if [ $# -eq 0 ] ; then
  71.     echo $usage; exit 2
  72. fi
  73. newdepfile=$1
  74. depfiledir=`dirname $1`
  75. olddepfile=$depfiledir/#`basename $1`
  76. shift
  77. #
  78. # A shell function to collapse dependencies of targets in subdirectories
  79. # on common rightsides.
  80. #
  81. collapse() {
  82. $SED -e 's@/([^/:]*): @/%1: @' $* |
  83. (sort -t% -k 2 2>/dev/null || sort -t% +1) |
  84. uniq |
  85. $AWK -F: '
  86. BEGIN {
  87. total = '$pcount'
  88. }
  89. function flush(group, lastdir, dirname, count) {
  90. for (dirname in group)
  91. count++
  92. if (count == total) {
  93. print group[lastdir]
  94. } else {
  95. for (dirname in group)
  96. print dirname group[dirname]
  97. }
  98. for (dirname in group)
  99. delete group[dirname]
  100. }
  101. {
  102. percent = index($1, "%")
  103. name = substr($1, percent + 1)
  104. if (name != basename || $2 != rightside) {
  105. flush(group, dirname)
  106. basename = name
  107. rightside = $2
  108. }
  109. dirname = substr($1, 1, percent - 1)
  110. group[dirname] = basename ":" rightside
  111. }
  112. END {
  113. flush(group, dirname)
  114. }' |
  115. sort
  116. }
  117. #
  118. # An awk script to compress and pretty-print dependencies.
  119. #
  120. awkprog='
  121. BEGIN {
  122. FS = ":"
  123. INDENT = "t"
  124. INDENTSIZE = 8
  125. MAXLINE = 72
  126. MAXINDENTEDLINE = MAXLINE - INDENTSIZE - 1
  127. }
  128. #
  129. # For each line of the form "target1 ... targetN: dependent", where the
  130. # spaces are literal blanks, do the following:
  131. #
  132. {
  133. if ($1 != target) {
  134. if (depline) print depline
  135. target = $1
  136. depline= $0 "'"$force"'"
  137. lim = MAXLINE
  138. } else {
  139. if (length(depline) + length($2) > lim) {
  140. print depline " \"
  141. depline = INDENT
  142. lim = MAXINDENTEDLINE
  143. }
  144. depline = depline $2
  145. }
  146. }
  147. END {
  148. if (depline) print depline 
  149. }'
  150. #
  151. # Save the old file in case of problems.  Define some temporary files for
  152. # incremental make depend.  Clean up if interrupted.
  153. #
  154. olddeps=/tmp/olddeps.$$
  155. newdeps=/tmp/newdeps.$$
  156. tmpdeps=$depfiledir/tmpdeps.$$
  157. if test "$incremental" = yes; then
  158. trapcmds="rm -f $olddeps $newdeps $tmpdeps;"
  159. fi
  160. if test -f "$newdepfile"; then
  161. trapcmds="$trapcmds mv -f \$olddepfile \$newdepfile;"
  162. ln $newdepfile $olddepfile
  163. echo "# placeholder in case make includes me" > $tmpdeps
  164. mv -f $tmpdeps $newdepfile
  165. fi
  166. trap "$trapcmds exit 0" 1 2 15
  167. #
  168. # Remove any old dependencies from the file.
  169. #
  170. firstline="#$sentinel DO NOT DELETE THIS LINE -- make depend uses it"
  171. lastline="#$sentinel DO NOT DELETE THIS 2nd LINE -- make depend uses it"
  172. if test -f "$olddepfile"; then
  173. sed -e "/^$firstline/,/^$lastline/d" $olddepfile
  174. fi > $newdepfile
  175. #
  176. # Delimit the beginning of the dependencies.  Save the old dependencies
  177. # in incremental mode.
  178. #
  179. echo $firstline >> $newdepfile
  180. if test $incremental = yes; then
  181. #
  182. # XXX Workaround for this sed bug: 1,/pat/d deletes 1,$ if line 1
  183. # XXX and only line 1 matches pat.
  184. #
  185. (echo '# food for sed bug to eat'; cat $olddepfile 2> /dev/null) |
  186.     sed -e "1,/^$firstline/d" -e "/^$lastline/"',$d' > $olddeps
  187. #
  188. # Compose an awk program that deletes pretty-printed dependencies
  189. # from $olddeps that involve basenames of objects (in the raw input)
  190. # or sources (arguments) whose dependencies are being updated.
  191. #
  192. awkinc='/^[^  ]/ { deleting = 0; }'
  193. if test $rawdepinput = yes; then
  194. cat $* > $newdeps
  195. for f in `sed -e 's@^([^:/]*).[^:/]*: .*@1@' 
  196.       -e 's@^[^:]*/([^:/]*).[^:/]*: .*@1@' 
  197.       $newdeps |
  198.   sort -u`; do
  199. list="$list $f"
  200. done
  201. set -- $newdeps
  202. else
  203. for f in $*; do
  204. list="$list `expr ./$f : '.*/(.*)..*'`"
  205. done
  206. fi
  207. for f in $list; do
  208. # NB: don't use || here 'cuz some awks get confused
  209. awkinc="$awkinc
  210.     /^$f./ { deleting = 1; }
  211.     /^[^  :]*/$f./ { deleting = 1; }"
  212. done
  213. awkinc="$awkinc
  214.     { if (!deleting) print $0; }
  215. "
  216. $AWK "$awkinc" $olddeps >> $newdepfile
  217. rm -f $olddeps
  218. fi
  219. #
  220. # Process source files - the sed commands and their functions are: 
  221. # s:[^./][^./]*/../::g rewrite "dir/../path" to be "path"
  222. # s:([/ ])./:1:g rewrite " ./path" to be " path" and
  223. # remove the "./" from  ".././h/x.h"
  224. #
  225. # (must escape some metacharacters for systems with busted shells)
  226. #$depgen $* |
  227. depgenxx=`echo $depgen|sed -e s/'//g -e 's/(/\(/g' -e 's/)/\)/g'`
  228. $depgenxx $* |
  229.     eval "sed 
  230. -e 's:^: :' 
  231. -e 's:([/ ]).//*:1:g' 
  232. -e 's:^ ::' 
  233. $sedprog" |
  234.     $AWK "$awkprog" >> $newdepfile
  235. echo $lastline >> $newdepfile
  236. rm -f $olddepfile $newdeps