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

生物技术

开发平台:

C/C++

  1. #! /bin/sh
  2. # $Id: check_make_unix.sh,v 1000.3 2004/06/01 16:51:28 gouriano Exp $
  3. # Author:  Vladimir Ivanov, NCBI 
  4. #
  5. ###########################################################################
  6. #
  7. # Compile a check script and copy necessary files to run tests in the 
  8. # UNIX build tree.
  9. #
  10. # Usage:
  11. #    check_make_unix.sh <test_list> <build_dir> <target_dir> <check_script>
  12. #
  13. #    test_list       - a list of tests (it build with "make check_r")
  14. #                      (default: "<build_dir>/check.sh.list")
  15. #    build_dir       - path to UNIX build tree like".../build/..."
  16. #                      (default: will try determine path from current work
  17. #                      directory -- root of build tree ) 
  18. #    top_srcdir      - path to the root src directory
  19. #                      (default: will try determine path from current work
  20. #                      directory -- root of build tree ) 
  21. #    target_dir      - path where the check script and logs will be created
  22. #                      (default: current dir) 
  23. #    check_script    - name of the check script (without path).
  24. #                      (default: "check.sh" / "<target_dir>/check.sh")
  25. #
  26. #    If any parameter is skipped that will be used default value for it.
  27. #
  28. # Note:
  29. #    Work with UNIX build tree only (any configuration).
  30. #
  31. ###########################################################################
  32. # Parameters
  33. res_out="check.sh"
  34. res_list="$res_out.list"
  35. # Fields delimiters in the list
  36. # (this symbols used directly in the "sed" command)
  37. x_delim=" ____ "
  38. x_delim_internal="~"
  39. x_tmp="/var/tmp"
  40. x_list=$1
  41. x_build_dir=$2
  42. x_top_srcdir=$3
  43. x_target_dir=$4
  44. x_out=$5
  45. # Check for build dir
  46. if [ ! -z "$x_build_dir" ]; then
  47.    if [ ! -d "$x_build_dir" ]; then
  48.       echo "Build directory "$x_build_dir" don't exist."
  49.       exit 1 
  50.    fi
  51.    x_build_dir=`(cd "$x_build_dir"; pwd | sed -e 's//$//g')`
  52. else
  53.    # Get build dir name from the current path
  54.    x_build_dir=`pwd | sed -e 's%/build.*$%%'`
  55.    if [ -d "$x_build_dir/build" ]; then
  56.       x_build_dir="$x_build_dir/build"
  57.    fi
  58. fi
  59. x_conf_dir=`dirname "$x_build_dir"`
  60. x_bin_dir=`(cd "$x_build_dir/../bin"; pwd | sed -e 's//$//g')`
  61. # Check for top_srcdir
  62. if [ ! -z "$x_top_srcdir" ]; then
  63.    if [ ! -d "$x_top_srcdir" ]; then
  64.       echo "Top source directory "$x_top_srcdir" don't exist."
  65.       exit 1 
  66.    fi
  67.    x_root_dir=`(cd "$x_top_srcdir"; pwd | sed -e 's//$//g')`
  68. else
  69.    # Get top src dir name from the build directory
  70.    x_root_dir=`dirname "$x_conf_dir"`
  71. fi
  72. # Check for target dir
  73. if [ ! -z "$x_target_dir" ]; then
  74.    if [ ! -d "$x_target_dir" ]; then
  75.       echo "Target directory "$x_target_dir" don't exist."
  76.       exit 1 
  77.    fi
  78.     x_target_dir=`(cd "$x_target_dir"; pwd | sed -e 's//$//g')`
  79. else
  80.    x_target_dir=`pwd`
  81. fi
  82. # Check for a imported project or intree project
  83. res=`pwd | grep "/internal/c++/src/"`
  84. if [ ! -z "$res" ] ; then
  85.    x_import_prj="yes"
  86.    x_compile_dir="`pwd | sed -e 's%/internal/c++/src.*$%%g'`/internal/c++/src"
  87. else
  88.    x_import_prj="no"
  89.    x_compile_dir="$x_build_dir"
  90. fi
  91. if [ -z "$x_list" ]; then
  92.    x_list="$x_target_dir/$res_list"
  93. fi
  94. if [ -z "$x_out" ]; then
  95.    x_out="$x_target_dir/$res_out"
  96. fi
  97. x_script_name=`echo "$x_out" | sed -e 's%^.*/%%'`
  98. # Check for a list file
  99. if [ ! -f "$x_list" ]; then
  100.    echo "Check list file "$x_list" not found."
  101.    exit 1 
  102. fi
  103. # Features detection
  104. x_features=""
  105. for f in $x_conf_dir/status/*.enabled; do
  106.    f=`echo $f | sed 's|^.*/status/(.*).enabled$|1|g'`
  107.    x_features=`echo "$x_features $f"`
  108. done
  109. x_features=`echo "$x_features" | sed 's|^ *||g'`
  110. #echo ----------------------------------------------------------------------
  111. #echo "Imported project  :" $x_import_prj
  112. #echo "C++ root dir      :" $x_root_dir
  113. #echo "Configuration dir :" $x_conf_dir
  114. #echo "Build dir         :" $x_build_dir
  115. #echo "Compile dir       :" $x_compile_dir
  116. #echo "Target dir        :" $x_target_dir
  117. #echo "Check script      :" $x_out
  118. #echo ----------------------------------------------------------------------
  119. #//////////////////////////////////////////////////////////////////////////
  120. cat > $x_out <<EOF
  121. #! /bin/sh
  122. res_journal="$x_out.journal"
  123. res_log="$x_out.log"
  124. res_list="$x_list"
  125. res_concat="$x_out.out"
  126. res_concat_err="$x_out.out_err"
  127. ##  Printout USAGE info and exit
  128. Usage() {
  129.    cat <<EOF_usage
  130. USAGE:  $x_script_name {run | clean | concat | concat_err}
  131.  run         Run the tests. Create output file ("*.test_out") for each test, 
  132.              plus journal and log files. 
  133.  clean       Remove all files created during the last "run" and this script 
  134.              itself.
  135.  concat      Concatenate all files created during the last "run" into one big 
  136.              file "$res_log".
  137.  concat_err  Like previous. But into the file "$res_concat_err" 
  138.              will be added outputs of failed tests only.
  139. ERROR:  $1
  140. EOF_usage
  141.     exit 1
  142. }
  143. if [ $# -ne 1 ]; then
  144.    Usage "Invalid number of arguments."
  145. fi
  146. ###  What to do (cmd-line arg)
  147. method="$1"
  148. ### Action
  149. case "$method" in
  150. #----------------------------------------------------------
  151.    run )
  152.       ;;
  153. #----------------------------------------------------------
  154.    clean )
  155.       x_files=`cat $res_journal | sed -e 's/ /%gj_s4%/g'`
  156.       for x_file in $x_files; do
  157.          x_file=`echo "$x_file" | sed -e 's/%gj_s4%/ /g'`
  158.          rm -f $x_file > /dev/null
  159.       done
  160.       rm -f $res_journal $res_log $res_list $res_concat $res_concat_err > /dev/null
  161.       rm -f $x_out > /dev/null
  162.       exit 0
  163.       ;;
  164. #----------------------------------------------------------
  165.    concat )
  166.       rm -f "$res_concat"
  167.       ( 
  168.       cat $res_log
  169.       x_files=`cat $res_journal | sed -e 's/ /%gj_s4%/g'`
  170.       for x_file in $x_files; do
  171.          x_file=`echo "$x_file" | sed -e 's/%gj_s4%/ /g'`
  172.          echo 
  173.          echo 
  174.          cat $x_file
  175.       done
  176.       ) >> $res_concat
  177.       exit 0
  178.       ;;
  179. #----------------------------------------------------------
  180.    concat_err )
  181.       rm -f "$res_concat_err"
  182.       ( 
  183.       cat $res_log | grep 'ERR ['
  184.       x_files=`cat $res_journal | sed -e 's/ /%gj_s4%/g'`
  185.       for x_file in $x_files; do
  186.          x_file=`echo "$x_file" | sed -e 's/%gj_s4%/ /g'`
  187.          x_code=`cat $x_file | grep -c '@@@ EXIT CODE:'`
  188.          test $x_code -ne 0 || continue
  189.          x_good=`cat $x_file | grep -c '@@@ EXIT CODE: 0'`
  190.          if [ $x_good -ne 1 ]; then
  191.             echo 
  192.             echo 
  193.             cat $x_file
  194.          fi
  195.       done
  196.       ) >> $res_concat_err
  197.       exit 0
  198.       ;;
  199. #----------------------------------------------------------
  200.    * )
  201.       Usage "Invalid method name."
  202.       ;;
  203. esac
  204. # Export some global vars
  205. top_srcdir="$x_root_dir"
  206. export top_srcdir
  207. features="$x_features"
  208. export features
  209. # Add current, build and scripts directories to PATH
  210. PATH=".:${x_build_dir}:${x_root_dir}/scripts:${PATH}"
  211. export PATH
  212. # Define time-guard script to run tests from other scripts
  213. CHECK_EXEC="${x_root_dir}/scripts/check/check_exec_test.sh"
  214. CHECK_EXEC_STDIN="$CHECK_EXEC -stdin"
  215. export CHECK_EXEC
  216. export CHECK_EXEC_STDIN
  217. EOF
  218. if [ -n "$x_conf_dir"  -a  -d "$x_conf_dir/lib" ];  then
  219.    cat >> $x_out <<EOF
  220. # Add a library path for running tests
  221. . $x_root_dir/scripts/common.sh
  222. COMMON_AddRunpath "$x_conf_dir/lib"
  223. EOF
  224. else
  225.    echo "WARNING:  Cannot find path to the library dir."
  226. fi
  227. cat >> $x_out <<EOF
  228. # Run
  229. count_ok=0
  230. count_err=0
  231. count_absent=0
  232. rm -f "$res_journal"
  233. rm -f "$res_log"
  234. ulimit -c 1000000
  235. ##  Run one test
  236. RunTest() {
  237.    # Parameters
  238.    x_work_dir_tail="$1"
  239.    x_work_dir="$x_compile_dir/$x_work_dir_tail"
  240.    x_test="$2"
  241.    x_app="$3"
  242.    x_run="$4"
  243.    x_test_out="$x_work_dir/$x_test.$5"
  244.    x_timeout="$6"
  245.    # Check existence of the test's application directory
  246.    if [ -d "$x_work_dir" ]; then
  247.       # Write header to output file 
  248.       echo "$x_test_out" >> $res_journal
  249.       (
  250.         echo "======================================================================"
  251.         echo "$x_run"
  252.         echo "======================================================================"
  253.         echo 
  254.       ) > $x_test_out 2>&1
  255.       # Remove old core file if it exist (for clarity of the test)
  256.       corefile="$x_work_dir/core"
  257.       rm -f "$corefile"  > /dev/null 2>&1
  258.       # Goto the test's directory 
  259.       cd "$x_work_dir"
  260.       x_cmd="[$x_work_dir_tail] $x_run"
  261.       # And run test if it exist
  262.       if [ -f "$x_app" ]; then
  263.          # Fix empty parameters (replace "" to "", '' to '')
  264.          x_run_fix=`echo "$x_run" | sed -e 's/""/\\\\\"\\\\\"/g' -e "s/''/\\\\\'\\\\\'/g"`
  265.          # Run check
  266.          CHECK_TIMEOUT="$x_timeout"
  267.          export CHECK_TIMEOUT
  268.          check_exec="$x_root_dir/scripts/check/check_exec.sh"
  269.          $check_exec time -p `eval echo $x_run_fix` >$x_tmp/$$.out 2>&1
  270.          result=$?
  271.          sed -e '/ ["][$][@]["].*$/ {
  272.             s/^.*: //
  273.             s/ ["][$][@]["].*$//
  274.             }' $x_tmp/$$.out >> $x_test_out
  275.          # Get application execution time
  276.          exec_time=`$x_build_dir/sysdep.sh tl 3 $x_tmp/$$.out`
  277.          exec_time=`echo $exec_time | tr 'n' '?'`
  278.          exec_time=`echo $exec_time | sed -e 's/?$//' -e 's/?/, /g' -e 's/[ ] */ /g'`
  279.          rm -f $x_tmp/$$.out
  280.          # Write result of the test into the his output file
  281.          echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" >> $x_test_out
  282.          echo "@@@ EXIT CODE: $result" >> $x_test_out
  283.          if [ -f "$corefile" ]; then
  284.             echo "@@@ CORE DUMPED" >> $x_test_out
  285.             if [ -d "$x_bin_dir" -a -f "$x_bin_dir/$x_test" ]; then
  286.                mv "$corefile" "$x_bin_dir/$x_test.core"
  287.             else
  288.                rm -f "$corefile"
  289.             fi
  290.          fi
  291.          # And write result also on the screen and into the log
  292.          if [ $result -eq 0 ]; then
  293.             echo "OK  --  $x_cmd     ($exec_time)"
  294.             echo "OK  --  $x_cmd     ($exec_time)" >> $res_log
  295.             count_ok=`expr $count_ok + 1`
  296.          else
  297.             echo "ERR --  $x_cmd     ($exec_time)"
  298.             echo "ERR [$result] --  $x_cmd     ($exec_time)" >> $res_log
  299.             count_err=`expr $count_err + 1`
  300.          fi
  301.       else
  302.          echo "ABS --  $x_cmd"
  303.          echo "ABS --  $x_cmd" >> $res_log
  304.          count_absent=`expr $count_absent + 1`
  305.       fi
  306.   else
  307.       # Test application is absent
  308.       echo "ABS -- $x_work_dir - $x_test"
  309.       echo "ABS -- $x_work_dir - $x_test" >> $res_log
  310.       count_absent=`expr $count_absent + 1`
  311.   fi
  312. }
  313. EOF
  314. #//////////////////////////////////////////////////////////////////////////
  315. # Read list with tests
  316. x_tests=`cat "$x_list" | sed -e 's/ /%gj_s4%/g'`
  317. x_test_prev=""
  318. # For all tests
  319. for x_row in $x_tests; do
  320.    # Get one row from list
  321.    x_row=`echo "$x_row" | sed -e 's/%gj_s4%/ /g' -e 's/^ *//' -e 's/ ____ /~/g'`
  322.    # Split it to parts
  323.    x_src_dir="$x_root_dir/src/`echo "$x_row" | sed -e 's/~.*$//'`"
  324.    x_test=`echo "$x_row" | sed -e 's/^[^~]*~//' -e 's/~.*$//'`
  325.    x_app=`echo "$x_row" | sed -e 's/^[^~]*~//' -e 's/^[^~]*~//' -e 's/~.*$//'`
  326.    x_cmd=`echo "$x_row" | sed -e 's/^[^~]*~//' -e 's/^[^~]*~//' -e 's/^[^~]*~//' -e 's/~.*$//'`
  327.    x_files=`echo "$x_row" | sed -e 's/^[^~]*~//' -e 's/^[^~]*~//' -e 's/^[^~]*~//' -e 's/^[^~]*~//' -e 's/~.*$//'`
  328.    x_timeout=`echo "$x_row" | sed -e 's/^[^~]*~//' -e 's/^[^~]*~//' -e 's/^[^~]*~//' -e 's/^[^~]*~//'  -e 's/^[^~]*~//' -e 's/~.*$//'`
  329.    x_requires=" `echo "$x_row" | sed -e 's/.*~//'` "
  330.    # Check application requirements
  331.    for x_req in $x_requires; do
  332.       test -f "$x_conf_dir/status/$x_req.enabled"  ||  continue 2
  333.    done
  334.    # Application base build directory
  335.    x_work_dir_tail="`echo "$x_row" | sed -e 's/~.*$//'`"
  336.    x_work_dir="$x_compile_dir/$x_work_dir_tail"
  337.    # Copy specified files to the build directory
  338.    if [ "$x_import_prj" = "no" ]; then
  339.       if [ ! -z "$x_files" ]; then
  340.          for i in $x_files ; do
  341.             x_copy="$x_src_dir/$i"
  342.             if [ -f "$x_copy"  -o  -d "$x_copy" ]; then
  343.                cp -prf "$x_copy" "$x_work_dir"
  344.             else
  345.                echo "Warning:  The copied object "$x_copy" should be a file or directory!"
  346.                continue 1
  347.             fi
  348.          done
  349.       fi
  350.    fi
  351.    # Generate extension for tests output file
  352.    if [ "$x_test" != "$x_test_prev" ]; then 
  353.       x_cnt=1
  354.       x_test_out="test_out"
  355.    else
  356.       x_cnt=`expr $x_cnt + 1`
  357.       x_test_out="test_out$x_cnt"
  358.    fi
  359.    x_test_prev="$x_test"
  360. #//////////////////////////////////////////////////////////////////////////
  361.    # Write test commands for current test into a shell script file
  362.    cat >> $x_out <<EOF
  363. ######################################################################
  364. RunTest "$x_work_dir_tail" \
  365.         "$x_test" \
  366.         "$x_app" \
  367.         "$x_cmd" \
  368.         "$x_test_out" \
  369.         "$x_timeout"
  370. EOF
  371. #//////////////////////////////////////////////////////////////////////////
  372. done # for x_row in x_tests
  373. # Write ending code into the script 
  374. cat >> $x_out <<EOF
  375. # Write result of the tests execution
  376. echo
  377. echo "Succeeded : $count_ok"
  378. echo "Failed    : $count_err"
  379. echo "Absent    : $count_absent"
  380. echo
  381. if [ $count_err -eq 0 ]; then
  382.    echo
  383.    echo "******** ALL TESTS COMPLETED SUCCESSFULLY ********"
  384.    echo
  385. fi
  386. exit $count_err
  387. EOF
  388. # Set execute mode to script
  389. chmod a+x "$x_out"
  390. exit 0
  391. #  ===========================================================================
  392. #  PRODUCTION $Log: check_make_unix.sh,v $
  393. #  PRODUCTION Revision 1000.3  2004/06/01 16:51:28  gouriano
  394. #  PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.38
  395. #  PRODUCTION
  396. #  ===========================================================================