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

生物技术

开发平台:

C/C++

  1. #! /bin/sh
  2. #
  3. # $Id: all2one.sh,v 1000.0 2003/10/29 14:24:39 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 converter. Make single-configuration project file from a
  25. # multi-configuration project file.
  26. #
  27. # ===========================================================================
  28. usage() {
  29.   echo 'Config extractor for Microsoft Visual C++ Project File V 6.0'
  30.   echo 'Usage:'
  31.   echo `basename $0` 'filename [config]'
  32.   exit 1
  33. }
  34. if [ _$1 = _ ]; then
  35.   usage
  36. elif [ ! -f $1 ]; then
  37.   echo "ERROR: File "$1" must exist. Stop."
  38.   exit 3
  39. fi
  40. if [ _$2 = _SecretWord ]; then
  41.   CVSUSE=1
  42.   CFG=""
  43. else
  44.   CVSUSE=0
  45.   CFG=${2:-""}
  46. fi
  47. file=/tmp/$$_file
  48. # DOS-2-UNIX conversion (shouldn't be here, but just in case for sanity).
  49. #
  50. sed -e 's/ *$//' $1 >$file
  51. # Check signature.
  52. #
  53. cat <<-"EOF" >/tmp/$$_genusign
  54. # Microsoft Developer Studio Project File
  55. # Microsoft Developer Studio Generated Build File, Format Version 6.00
  56. # ** DO NOT EDIT **
  57. # TARGTYPE
  58. EOF
  59. cat /dev/null >/tmp/$$_filesign
  60. head -1 $file | sed -e 's/ -.*//' >>/tmp/$$_filesign
  61. head -3 $file | tail +2 >>/tmp/$$_filesign
  62. head -5 $file | tail +4 | sed -e 's/ *".*$//' >>/tmp/$$_filesign
  63. diff /tmp/$$_filesign /tmp/$$_genusign >/dev/null 2>&1
  64. exit=$?
  65. rm -f /tmp/$$_filesign /tmp/$$_genusign
  66. if [ $exit != 0 ]; then
  67.   echo "ERROR: $1 doesn't look like MSVC++ Project File. Stop."
  68.   rm -f $file
  69.   exit 2
  70. fi
  71. # Extract configuration part of the project file and count configurations.
  72. #
  73. cat <<EOF >/tmp/$$_.sed
  74. /^!IF /,/^!ENDIF/ {
  75.   /^!ENDIF/ q
  76.   p
  77. }
  78. d
  79. EOF
  80. NCFG=`sed -n -f /tmp/$$_.sed $file | egrep -c '^[!ELS]+IF'`
  81. rm -f /tmp/$$_.sed
  82. if [ $CVSUSE = 0 ]; then
  83.   echo "${1}: $NCFG configuration(s) found"
  84. elif [ `grep '^# Name "' $file | sed -e 's/^# Name //g' | grep -c DebugDLL` = 0 ]; then
  85.   echo "ERROR: ${1}: Only DebugDLL configuration can be checked in to CVS. Stop."
  86.   rm -f $file
  87.   exit 2
  88. fi
  89. # Check number of configurations, in case of 1 and CVS - check standard paths.
  90. #
  91. if [ $NCFG -le 1 ]; then
  92.   # If not in CVS - just leave
  93.   #
  94.   if [ $CVSUSE = 0 ]; then
  95.     rm -f $file
  96.     exit 0
  97.   fi
  98.   echo "${1}: Analyzing include and library path(s)..."
  99.   # Standard relative path (from argument 3 if in CVS).
  100.   #
  101.   pr='./../../..'
  102.   if [ -n "$3" ]; then
  103.     for k in `echo $3 | sed -e 's|/| |g'` ; do
  104.       if [ "$k" != "." ]; then
  105.         if [ "$pr" != "." ]; then
  106.           if [ "$k" = ".." ]; then
  107.             pr=`echo "$pr" | sed -e 's|/..$||'`
  108.           else
  109.             pr="${pr}/.."
  110.           fi
  111.         fi
  112.       fi
  113.     done
  114.   fi
  115.   # Start preparing message file and sed script.
  116.   #
  117.   echo "${1}: The following path(s) modified:" >/tmp/$$_msg
  118.   cat /dev/null >/tmp/$$_path.sed
  119.   # Some helper functions.
  120.   # Make case-insensitive text pattern from given string.
  121.   #
  122.   expandcs() {
  123.     temp=""
  124.     for q in `echo $1 | sed -e 's|.|& |g'` ; do
  125.       if [ `echo $q | grep -c '[A-Za-z]'` != 0 ]; then
  126.         temp="${temp}[`echo $q | tr '[a-z]' '[A-Z]'``echo $q | tr '[A-Z]' '[a-z]'`]"
  127.       else
  128.         temp="${temp}$q"
  129.       fi
  130.     done
  131.     echo "$temp"
  132.   }
  133.   # In the given string replace slashes with backslashes.
  134.   #
  135.   backslash() {
  136.     echo $1 | sed -e 's|/|\\|g'
  137.   }
  138.   # Make slash-insensitive (back or forward) pattern from given string. 
  139.   #
  140.   slashify() {
  141.     echo $1 | sed -e 's|/|[/\\]|g'
  142.   }
  143.   # The loop for all packages we have to care about.
  144.   #
  145.   for k in "wxwin" "ncbi" "fltk" ; do
  146.     # Absolute path prefix (DIZZY).
  147.     #
  148.     pa='//DIZZY/public/'$k
  149.  
  150.     # Form all paths and convert them to ugly DOS format
  151.     # (backslashed and yet case-insensitive). Dragons here, careful!
  152.     # Don't forget to double all backslashes, as they will appear in shell
  153.     # substitutions and sed script (and thus must be escaped).
  154.     #
  155.     inca="${pa}/include"
  156.     incr="${pr}/${k}/include"
  157.     liba="${pa}/DebugDLL"
  158.     libr="${pr}/${k}/DebugDLL"
  159.     incas=`expandcs "$inca"`
  160.     tmp=`echo "$incr" | sed -e 's|^[/.]*||'`
  161.     incrs=`expandcs "$tmp"`
  162.     libas=`expandcs "$liba"`
  163.     tmp=`echo "$libr" | sed -e 's|^[/.]*||'`
  164.     librs=`expandcs "$tmp"`
  165.     inca=`backslash "$inca"`
  166.     incr=`backslash "$incr"`
  167.     liba=`backslash "$liba"`
  168.     libr=`backslash "$libr"`
  169.     incas=`slashify "$incas"`
  170.     incrs=`slashify "$incrs"`
  171.     libas=`slashify "$libas"`
  172.     librs=`slashify "$librs"`
  173.     # Continue to prepare message file (used afterwards).
  174.     #
  175.     echo /tmp/$$_stampi${k} Include: "$incr" and "$inca" >>/tmp/$$_msg
  176.     echo /tmp/$$_stampr${k} Resource: "$incr" and "$inca" >>/tmp/$$_msg
  177.     echo /tmp/$$_stampl${k} Library: "$libr" and "$liba" >>/tmp/$$_msg
  178.     #for q in $inca $incas $incr $incrs $liba $libas $libr $librs ; do
  179.     #  echo $q
  180.     #done
  181.     # Continue sed command script, which incorporates include and lib paths
  182.     # (if and only if resembling paths were in the project file), and,
  183.     # upon successful substitutions, leaves non-empty stamp files in /tmp.
  184.     #
  185.     cat <<-EOF >>/tmp/$$_path.sed
  186. /^# ADD .*CPP / {
  187.   s|/I  *[^ ]*${incrs}[^ ]*|@I|g
  188.   s|/I  *[^ ]*${incas}[^ ]*|@I|g
  189.   s|@I|/I "${incr}" /I "${inca}"|w /tmp/$$_stampi$k
  190.   s| *@I||g
  191. }
  192. /^# ADD .*RSC / {
  193.   s|/i  *[^ ]*${incrs}[^ ]*|@i|g
  194.   s|/i  *[^ ]*${incas}[^ ]*|@i|g
  195.   s|@i|/i "${incr}" /i "${inca}"|w /tmp/$$_stampr$k
  196.   s| *@i||g
  197. }
  198. /^# ADD .*LINK32 / {
  199.   s|/libpath:[^ ]*${librs}[^ ]*|@L|g
  200.   s|/libpath:[^ ]*${libas}[^ ]*|@L|g
  201.   s|@L|/libpath:"${libr}" /libpath:"${liba}"|w /tmp/$$_stampl$k
  202.   s| *@L||g
  203. }
  204. EOF
  205.   done
  206.   #cat /tmp/$$_path.sed
  207.   # Ok, time to run the sed script and make the dirty hacker's job...
  208.   #
  209.   sed -f /tmp/$$_path.sed $file >$file.new
  210.   # If the output file was changed, see what stamps are non-empty,
  211.   # then print the corresponding message(s) from message file.
  212.   #
  213.   diff $file $file.new >/dev/null 2>&1
  214.   if [ $? != 0 ]; then
  215.     head -1 /tmp/$$_msg
  216.     for q in "i" "r" "l" ; do
  217.       for k in /tmp/$$_stamp${q}* ; do
  218.         if [ -s $k ]; then
  219.           grep "$k" /tmp/$$_msg | sed -e "s|^$k ||"
  220.         fi
  221.       done
  222.     done
  223.     # Prepare backup copy. As the resulting file has to be checked in,
  224.     # it has to be in the UNIX text format. No conversion necessary.
  225.     #
  226.     mv $1 $1.bak
  227.     cp $file.new $1
  228.     touch -r $1.bak $1
  229.   fi
  230.   # Clean up and leave.
  231.   #
  232.   rm -f $file $file.new /tmp/$$_path.sed /tmp/$$_msg /tmp/$$_stamp*
  233.   exit 0
  234. fi
  235. # More than 1 configuration at this point.
  236. #
  237. if [ $CVSUSE = 1 ]; then
  238.   echo "ERROR: $1 contains $NCFG configurations, cannot be checked in. Stop."
  239.   rm -f $file
  240.   exit 2
  241. fi
  242. # Extract configuration names to check the project consistency.
  243. #
  244. grep '^!MESSAGE "' $file | sed -e 's/^!MESSAGE //' -e 's/  *(.*).*$//' >/tmp/$$_mnames
  245. grep '^# Name "' $file | sed -e 's/^# Name //g' >/tmp/$$_nnames
  246. # Check the consistency.
  247. #
  248. diff /tmp/$$_mnames /tmp/$$_nnames >/dev/null 2>&1
  249. if [ $? != 0 -o `cat /tmp/$$_nnames | wc -l` != $NCFG ]; then
  250.   ERROR=1
  251. else
  252.   ERROR=0
  253. fi
  254. rm -f /tmp/$$_mnames /tmp/$$_nnames
  255. if [ $ERROR = 1 ]; then
  256.   echo "ERROR: Project file inconsistency found in $1. Stop."
  257.   rm -f $file
  258.   exit 2
  259. fi
  260. # Check for per-config issues.
  261. #
  262. DEP=`grep -c '^# PROP  *AllowPerConfigDependencies  *1' $file`
  263. cat <<EOF >/tmp/$$_dep.sed
  264. /^# Begin Target/,$ p
  265. d
  266. EOF
  267. sed -n -f /tmp/$$_dep.sed $file | grep '^!IF' >/dev/null 2>&1
  268. if [ $DEP = 0 -o $? != 0 ]; then
  269.   DEP=0
  270. fi
  271. rm -f /tmp/$$_dep.sed $file
  272. # Query the user to choose a configuration.
  273. # Keep /tmp clean as the user may choose to cancel (Ctrl-C).
  274. #
  275. while true; do
  276.   if [ $DEP != 0 ]; then
  277.     echo "WARNING: $1 contains per-configuration dependencies,"
  278.     echo 'which may or may not be handled correctly by this script.'
  279.   fi
  280.   sed -e 's/ *$//' $1 | grep '^# Name "' | sed -e 's/^# Name //g' >/tmp/$$_cfg
  281.   cat /dev/null >/tmp/$$_cfglist
  282.   i=1
  283.   for j in `sed -e 'y/ "/~%/' /tmp/$$_cfg` ; do
  284.     echo ${i}: `echo $j | sed -e 'y/~/ /' -e 's/%//g'` >>/tmp/$$_cfglist
  285.     i=`expr "$i" + 1`
  286.   done
  287.   rm -f /tmp/$$_cfg
  288.   cat /tmp/$$_cfglist
  289.   if [ _$CFG = _ ]; then
  290.     rm -f /tmp/$$_cfglist
  291.     echo 'Please enter required configuration number'
  292.     read i
  293.     if [ ${i:=0} -ge 1 -a $i -le $NCFG ]; then
  294.       break
  295.     fi
  296.     echo "Invalid configuration number "$i""
  297.     echo "${1}: $NCFG configuration(s) found"
  298.   else
  299.     i=`grep "\\<$CFG\\>\$" /tmp/$$_cfglist | sed -e 's/:.*//'`
  300.     rm -f /tmp/$$_cfglist
  301.     if [ _$i = _ ]; then
  302.       echo "ERROR: Configuration "$CFG" not found in $1. Stop."
  303.       exit 2
  304.     fi
  305.     break
  306.   fi
  307. done
  308. # DOS-2-UNIX conversion once more and final.
  309. #
  310. sed -e 's/ *$//' $1 >$file
  311. # Find the chosen configuration.
  312. #
  313. CFG=`grep '^# Name "' $file | sed -e 's/^# Name //' | head -$i | tail -1`
  314. echo "Configuration ${i}: $CFG will be extracted"
  315. # Start extracting beginning of the file, changing configuration name.
  316. #
  317. cat <<EOF >/tmp/$$_head.sed
  318. /^!MESSAGE "/q
  319. /CFG/ s/=.*$/=$CFG/
  320. /^CFG=/ s/"//g
  321. p
  322. d
  323. EOF
  324. sed -n -f /tmp/$$_head.sed $file >/tmp/$$_head
  325. rm -f /tmp/$$_head.sed
  326. grep "$CFG" $file | grep -v 'CFG' | head -1 >>/tmp/$$_head
  327. echo '!MESSAGE ' >>/tmp/$$_head
  328. echo >>/tmp/$$_head
  329. # Now extract middle part (just before configurations begin).
  330. #
  331. cat <<EOF >/tmp/$$_mid.sed
  332. /^# Begin Project/,/^!IF/ {
  333.   /^# PROP  *AllowPerConfigDependencies / s/  *1/ 0/
  334.   /^!IF / q
  335.   p
  336. }
  337. d
  338. EOF
  339. sed -n -f /tmp/$$_mid.sed $file >>/tmp/$$_head
  340. rm -f /tmp/$$_mid.sed
  341. # Extract all configurations, and select the required among them.
  342. #
  343. cat <<EOF >/tmp/$$_cfg.sed
  344. /^!IF /,/^!ENDIF/ {
  345.   p
  346.   /^!ENDIF/ q
  347. }
  348. d
  349. EOF
  350. sed -n -f /tmp/$$_cfg.sed $file >/tmp/$$_cfg
  351. cat <<EOF >/tmp/$$_cfg.sed
  352. /^!.*CFG.*== *$CFG$/,/^!E/ p
  353. d
  354. EOF
  355. sed -n -f /tmp/$$_cfg.sed /tmp/$$_cfg >/tmp/$$_cfg1
  356. rm -f /tmp/$$_cfg.sed
  357. # Enclose extracted config in proper IF...ENDIF.
  358. #
  359. head -1 /tmp/$$_cfg1 | sed -e 's/^!ELSEIF /!IF /' >/tmp/$$_cfg
  360. tail +2 /tmp/$$_cfg1 | sed -e 's/^!ELSEIF .*/!ENDIF /' >>/tmp/$$_cfg
  361. rm -f /tmp/$$_cfg1
  362. # Concatenate extracted config with what has been extracted earlier.
  363. #
  364. cat /tmp/$$_head /tmp/$$_cfg >/tmp/$$_out
  365. rm -f /tmp/$$_head /tmp/$$_cfg
  366. echo >>/tmp/$$_out
  367. # Finalize the project file, adding Target and Source sections.
  368. #
  369. cat <<EOF >/tmp/$$_tail.sed
  370. /^# Begin Target/,/^# End Project/ {
  371.   /^!IF /,/^!ENDIF/ {
  372.     /^!.*CFG.*== *$CFG$/,/^!E/ {
  373.       s/^!ELSEIF (.*CFG.*== *$CFG)$/!IF 1/
  374.       s/^!ELSEIF .*/!ENDIF/
  375.       p
  376.     }
  377.     d
  378.   }
  379.   /^# Name / {
  380.     /^# Name $CFG/ !d
  381.   }
  382.   p
  383. }
  384. d
  385. EOF
  386. sed -n -f /tmp/$$_tail.sed $file >>/tmp/$$_out
  387. rm -f /tmp/$$_tail.sed
  388. # Remove consequent empty lines (could occur earlier in substitutions)
  389. # and replace original project file (backup kept in .bak).
  390. # Output is always in native (UNIX) text file format.
  391. #
  392. mv $1 $1.bak
  393. cat <<EOF >/tmp/$$_pretty.sed
  394. /./ {
  395.   p
  396.   d
  397. }
  398. /^$/ p
  399. :Empty
  400. /^$/ {
  401.   N
  402.   s/.//
  403.   b Empty
  404. }
  405. p
  406. EOF
  407. sed -n -f /tmp/$$_pretty.sed /tmp/$$_out >$1
  408. rm -f /tmp/$$_pretty.sed /tmp/$$_out $file
  409. touch -r $1.bak $1
  410. exit 0
  411. #  ===========================================================================
  412. #  PRODUCTION $Log: all2one.sh,v $
  413. #  PRODUCTION Revision 1000.0  2003/10/29 14:24:39  gouriano
  414. #  PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.19
  415. #  PRODUCTION
  416. #  ===========================================================================