include.sh
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. #! /bin/sh
  2. #
  3. # $Id: include.sh,v 1000.0 2003/10/29 14:24:48 gouriano Exp $
  4. # ===========================================================================
  5. #                            PUBLIC DOMAIN NOTICE
  6. #               National Center for Biotechnology Information
  7. #  This software/database is a "United States Government Work" under the
  8. #  terms of the United States Copyright Act.  It was written as part of
  9. #  the author's official duties as a United States Government employee and
  10. #  thus cannot be copyrighted.  This software/database is freely available
  11. #  to the public for use. The National Library of Medicine and the U.S.
  12. #  Government have not placed any restriction on its use or reproduction.
  13. #  Although all reasonable efforts have been taken to ensure the accuracy
  14. #  and reliability of the software and data, the NLM and the U.S.
  15. #  Government do not and cannot warrant the performance or results that
  16. #  may be obtained by using this software or data. The NLM and the U.S.
  17. #  Government disclaim all warranties, express or implied, including
  18. #  warranties of performance, merchantability or fitness for any particular
  19. #  purpose.
  20. #  Please cite the author in any work or product based on this material.
  21. #  
  22. # ===========================================================================
  23. # Author:  Anton Lavrentiev
  24. # MSVC project file patcher. Patch include file paths when the nesting
  25. # directory level changes.
  26. #
  27. # ===========================================================================
  28. include() {
  29. cat <<"EOF" >$1
  30. #!/bin/sh
  31. if [ _$1 = _ -o _$2 = _ ]; then
  32.   echo "ERROR: Incorrect call. Stop."
  33.   exit 3
  34. elif [ ! -f $1 ]; then
  35.   echo "ERROR: File "$1" inexistent. Stop."
  36.   exit 2
  37. fi
  38. orig=$1
  39. shift
  40. for d in $* ; do
  41.   if [ _`echo $d | sed -e 's|^/.*||'` != _ ]; then
  42.     echo "ERROR: "$d" is not an absolute path. Stop."
  43.     exit 2
  44.   fi
  45. done
  46. file=/tmp/$$_file
  47. # DOS-2-UNIX conversion (shouldn't be here, but just in case for sanity).
  48. #
  49. sed -e 's/ *$//' $orig >$file
  50. # Check signature.
  51. #
  52. cat <<-"EOF" >/tmp/$$_genusign
  53. # Microsoft Developer Studio Project File
  54. # Microsoft Developer Studio Generated Build File, Format Version 6.00
  55. # ** DO NOT EDIT **
  56. # TARGTYPE
  57. EOF
  58. cat /dev/null >/tmp/$$_filesign
  59. head -1 $file | sed -e 's/ -.*//' >>/tmp/$$_filesign
  60. head -3 $file | tail +2 >>/tmp/$$_filesign
  61. head -5 $file | tail +4 | sed -e 's/ *".*$//' >>/tmp/$$_filesign
  62. diff /tmp/$$_filesign /tmp/$$_genusign >/dev/null 2>&1
  63. exit=$?
  64. rm -f /tmp/$$_filesign /tmp/$$_genusign
  65. if [ $exit != 0 ]; then
  66.   echo "ERROR: $orig doesn't look like MSVC++ Project File. Stop."
  67.   rm -f $file
  68.   exit 2
  69. fi
  70. # Generic project?
  71. #
  72. if [ `grep -c '^# ADD .*CPP ' $file` = 0 ]; then
  73.   echo "${orig}: Nothing to do!"
  74.   rm -f $file
  75.   exit 0
  76. fi
  77. # Find existing include paths in the project.
  78. #
  79. cat <<-EOF >/tmp/$$_inc.sed
  80. /^# ADD .*CPP / {
  81.   s|/I *|/I_|g
  82.   s|\\|/|g
  83.   p
  84. }
  85. d
  86. EOF
  87. cat /dev/null >/tmp/$$_incl
  88. for k in `sed -n -f /tmp/$$_inc.sed $file` ; do
  89.   if [ `echo "$k" | grep -c /I_` != 0 ]; then
  90.     inc=`echo "$k" | sed -e 's|/I_||' -e 's|"||g'`
  91.     ince=`echo "$inc" | sed -e 's|\.|\\.|g'`
  92.     if [ `grep -c "^$ince\$" /tmp/$$_incl` = 0 ]; then
  93.       echo "$inc" >>/tmp/$$_incl
  94.     fi
  95.   fi
  96. done
  97. rm -f /tmp/$$_inc.sed
  98. if [ -s /tmp/$$_incl ]; then
  99.   echo "${orig}: The following include path(s) found:"
  100.   cat /tmp/$$_incl | sed -e 's/^/    /'
  101. fi
  102. # Build relative include paths, using current directory and given paths.
  103. #
  104. cat /dev/null >/tmp/$$_inc
  105. for d in $* ; do
  106.   dir=`echo $d | sed -e 's|/$||'`
  107.   if [ _$dir = _ ]; then
  108.     dir='/'
  109.   fi
  110.   cwd=`pwd`
  111.   root=''
  112.   for i in `echo $cwd | tr '/' ' '` ; do
  113.     newroot=$root/$i
  114.     if [ _`echo $dir | sed -e "s|^$newroot||"` = _$dir ]; then
  115.       break;
  116.     fi
  117.     root=$newroot
  118.   done
  119.   if [ _$root = _ ]; then
  120.     root='/'
  121.   fi
  122.   #echo Common root of $dir and $cwd is $root
  123.   newdir=`echo $dir | sed -e "s|^$root||"`
  124.   newcwd=`echo $cwd | sed -e "s|^$root||"`
  125.   include='.'
  126.   for i in `echo $newcwd | tr '/' ' '` ; do
  127.     include="${include}/.."
  128.   done
  129.   for i in `echo $newdir | tr '/' ' '` ; do
  130.     include="${include}/$i"
  131.   done
  132.   #echo Path to include files is $include
  133.   echo "$include" >>/tmp/$$_inc
  134. done
  135. # Now replace original include paths, if they resemble calculated paths.
  136. # Preserve rest of original paths.
  137. #
  138. cat /dev/null >/tmp/$$_include
  139. for i in `cat /tmp/$$_incl` ; do
  140.   replaced=0
  141.   for j in `cat /tmp/$$_inc` ; do
  142.     dir1=`echo $i | sed -e 's|^[/.]*||'`
  143.     dir2=`echo $j | sed -e 's|^[/.]*||'`
  144.     if [ _$dir1 = _$dir2 ]; then
  145.       if [ $i = $j ]; then
  146.         echo Unchanged directory ""$i""
  147.       else
  148.         echo Replacing directory ""$i"" with directory ""$j""
  149.       fi
  150.       inc="$j"
  151.       ince=`echo "$inc" | sed -e 's|\.|\\.|g'`
  152.       grep -v "^$ince$" /tmp/$$_inc >/tmp/$$_i
  153.       mv /tmp/$$_i /tmp/$$_inc
  154.       replaced=1
  155.       break
  156.     fi
  157.   done
  158.   if [ $replaced = 0 ]; then
  159.     echo Keeping directory ""$i""
  160.     inc="$i"
  161.   fi
  162.   inc=`echo "$inc" | sed -e 's|/|\\\\|g'`
  163.   echo '/I' ""$inc"" >>/tmp/$$_include
  164. done
  165. if [ -s /tmp/$$_inc ]; then
  166.   for i in `cat /tmp/$$_inc` ; do
  167.     echo Appending directory ""$i""
  168.     inc=`echo $i | sed -e 's|/|\\\\|g'`
  169.     echo '/I' ""$inc"" >>/tmp/$$_include
  170.   done
  171. fi
  172. #echo +++
  173. #cat /tmp/$$_include
  174. #echo ---
  175. rm -f /tmp/$$_incl /tmp/$$_inc
  176. # Form compiler "/I" options.
  177. #
  178. cat <<-EOF >/tmp/$$_inc.sed
  179. s|\\|\\\\|g
  180. /./ {
  181.   H
  182.   $ !d
  183. }
  184. $ {
  185.   x
  186.   s/n/ /g
  187.   s/^  *//
  188.   s/  *$//
  189.   p
  190.   q
  191. }
  192. EOF
  193. inc=`sed -n -f /tmp/$$_inc.sed /tmp/$$_include`
  194. rm -f /tmp/$$_inc.sed /tmp/$$_include
  195. #echo "$inc"
  196. # Incorporate compiler options into project file.
  197. # Output is always in UNIX text file format.
  198. #
  199. cat <<-EOF >/tmp/$$_comp.sed
  200. /^# ADD .*CPP / s|/I  *"{0,1}[^ ]*"{0,1}|@I|g
  201. /^# ADD CPP / {
  202.   s|@I|$inc|
  203.   t success
  204.   s| /D| $inc&|
  205.   t success
  206.   s| /Y| $inc&|
  207.   t success
  208.   s| /F| $inc&|
  209.   t success
  210.   s| /c| $inc&|
  211.   t success
  212.   s| *$| $inc|
  213.   :success
  214.   s| *@I||g
  215. }
  216. EOF
  217. #cat /tmp/$$_comp.sed
  218. mv $orig $orig.bak
  219. sed -f /tmp/$$_comp.sed $file >$orig
  220. rm -f /tmp/$$_comp.sed $file
  221. touch -r $orig.bak $orig
  222. exit 0
  223. EOF
  224.   chmod u+x $1
  225. }
  226. usage() {
  227.   echo 'Include path tracer for Microsoft Visual C++ Project File V 6.0'
  228.   echo 'Usage:'
  229.   echo `basename $0` "rel_path_to_include ..."
  230.   exit 1
  231. }
  232. dir=$*
  233. dir=${dir:-../../include}
  234. for d in "$dir" ; do
  235.   if [ _`echo "$d" | sed -e 's|^/.*||'` = _ ]; then
  236.     echo "ERROR: "$d" is not a relative path. Stop."
  237.     exit 2
  238.   fi
  239. done
  240. dirlist=''
  241. for d in "$dir" ; do
  242.   dir=`pwd`
  243.   for i in `echo "$d" | tr '/' ' '` ; do
  244.     if [ "$i" = ".." ]; then
  245.       dir=`echo "$dir" | sed -e 's|/[^/]*$||'`
  246.     elif [ "$i" != "." ]; then
  247.       dir="${dir}/$i"
  248.     fi
  249.   done
  250.   if [ _$dir = _ ]; then
  251.     dir='/'
  252.   fi
  253.   dirlist="$dirlist $dir"
  254. done
  255. include /tmp/$$_inc.sh
  256. cat <<EOF >/tmp/$$_cmd.sh
  257. #!/bin/sh
  258. for i in * ; do
  259.   if [ -d $i ]; then
  260.     cd $i
  261.     /tmp/$$_cmd.sh $1/$i
  262.     cd ..
  263.   elif [ -f $i -a `echo $i | grep -c '\\.dsp$'` != 0 ]; then
  264.     echo Analyzing $1/$i
  265.     /tmp/$$_inc.sh $i $dirlist
  266.     exit=$?
  267.     if [ $exit != 0 ]; then
  268.       exit $exit
  269.     fi
  270.     echo
  271.   fi
  272. done
  273. exit 0
  274. EOF
  275. chmod u+x /tmp/$$_cmd.sh
  276. /tmp/$$_cmd.sh .
  277. exit=$?
  278. rm -f /tmp/$$_cmd.sh /tmp/$$_inc.sh
  279. exit $exit
  280. #  ===========================================================================
  281. #  PRODUCTION $Log: include.sh,v $
  282. #  PRODUCTION Revision 1000.0  2003/10/29 14:24:48  gouriano
  283. #  PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  284. #  PRODUCTION
  285. #  ===========================================================================