make-dist
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:19k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. #!/bin/sh
  2. #### make-dist: create an GNU SQL Server distribution tar file from the current
  3. #### source tree.  This basically creates a duplicate directory
  4. #### structure, and then hard links into it only those files that should
  5. #### be distributed.  This means that if you add a file with an odd name,
  6. #### you should make sure that this script will include it.
  7. #
  8. # This file is part of GNU SQL Server.
  9. #
  10. # Copyright (C) 1996 Free Software Foundation, Inc
  11. # Wriiten at Institute for System Programming of Russian Academy of Science
  12. #
  13. # GNU SQL Server is free software; you can redistribute it and/or modify
  14. # it under the terms of the GNU General Public License as published by
  15. # the Free Software Foundation; either version 2, or (at your option)
  16. # any later version.
  17. #
  18. # GNU SQL Server is distributed in the hope that it will be useful,
  19. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21. # GNU General Public License for more details.
  22. #
  23. # You should have received a copy of the GNU General Public License
  24. # along with GNU SQL Server; see the file COPYING.  If not, write to
  25. # the Free Software Foundation, 59 Temple Place - Suite 330,
  26. # Boston, MA 02111-1307, USA.
  27. #
  28. # Contacts: gss@ispras.ru
  29. #
  30. progname="$0"
  31. ### Exit if a command fails.
  32. ### set -e
  33. ### Print out each line we read, for debugging's sake.
  34. ### set -ex
  35. clean_up=yes
  36. make_tar=yes
  37. newer=""
  38. with_RCS=no
  39. make_diff=yes
  40. gsshead="gnusql-"
  41. md_usage() {
  42. cat  >&2 <<EOF
  43. $1
  44. Usage: make-dist [options]           
  45. Options:
  46. --no-clean-up    This option tells make-dist not to delete the staging directory
  47.                  after it is done making the tar file.
  48. --version Ver_ID This option tells make-dist to use a given version number for created 
  49.                  tar instead of default value, stored in file 'version'
  50. --no-tar         This option tells make-dist not to make a tar file.  Since it is 
  51.                  rather pointless to build the whole staging directory and then
  52.                  nuke it, using this option also selects '--no-clean-up'.
  53. --dist-dir DIR   This option tells make-dist where distribution archives are collected.
  54.                  By default it tries to find it in '. .. ../.. ../../..' trees.
  55. --diff-with vers This option tells make-dist to create diff file. New distribution 
  56.                  compared with gnusql version 'vers'. If you omit this option make-dist 
  57.                  finds latest archive.  
  58. --no-diff        This option tells make-dist not to make a diff file.
  59. --newer filename This option tells make-dist to make the distribution normally, then
  60.                  remove all files older than the given timestamp file.  This is useful
  61.                  for creating incremental or patch distributions.
  62. --compress       This option tells make-dist to use 'compress' instead of gzip.
  63.                  Normally, make-dist uses gzip whenever it is present.
  64. --with-RCS       This option tells make-dist to include RCS archive in distribution.
  65.                  It works only on maintained source tree so it it seems useless for
  66.                  anybody else.
  67. --help           Show this help
  68. --verbose        Turn on 'set -x' mode
  69. EOF
  70. }
  71. while [ $# -gt 0 ]; do
  72.   case "$1" in
  73.     ## This option tells make-dist not to delete the staging directory
  74.     ## after it's done making the tar file.
  75.     "--no-clean-up" )
  76.         clean_up=no
  77.     ;;
  78.     ## This option tells make-dist to use a given version number for created 
  79.     ## tar instead of default value, stored in file 'version'
  80.     "--version" | "-V" )
  81.         version="$2"
  82.         shift
  83.     ;;
  84.     ## This option tells make-dist not to make a tar file.  Since it's 
  85.     ## rather pointless to build the whole staging directory and then
  86.     ## nuke it, using this option also selects '--no-clean-up'.
  87.     "--no-tar" | "-t-")
  88.         make_tar=no
  89.         clean_up=no
  90.     ;;
  91.     "--no-diff" | "-d-" )
  92.         make_diff=no
  93.     ;;
  94.     ## This option tells make-dist to make the distribution normally, then
  95.     ## remove all files older than the given timestamp file.  This is useful
  96.     ## for creating incremental or patch distributions.
  97.     "--newer" | "-n" )
  98.         newer="$2"
  99.         new_extension=".new"
  100.         shift
  101.     ;;
  102.     ## This option tells make-dist to use `compress' instead of gzip.
  103.     ## Normally, make-dist uses gzip whenever it is present.
  104.     "--compress")
  105.         default_gzip="compress"
  106.     ;;
  107.     ## This option tells make-dist to include RCS archive in distribution
  108.     "--with-RCS" | "-R" )
  109.         if [ ! -d RCS ] ; then ## which RCS do you want ??!
  110.           md_usage "incorrect usage '--with-RCS' option -- there is no RCS subdirectory"
  111.           exit 1
  112.         fi
  113.         with_RCS=yes
  114.         RCS=RCS
  115.     ;;
  116.     ## set distribution archive collection directory
  117.     "--dist-dir" | "--dir" | "-d" )
  118.         dist_dir="`(cd $2; pwd)`"
  119.         shift
  120.     ;; 
  121.     ## set previous revision id to create diff
  122.     "--diff-with"| "--diff" | "-p" )
  123.         diff_vers="$2"
  124.         shift
  125.     ;;
  126.     ## show help
  127.     "--help" | "-h" )
  128.         md_usage "make-dist: help"
  129.         exit 0
  130.     ;;
  131.     ## turn on verbose mode
  132.     "--verbose" | "-v" )
  133.         set -x
  134.     ;;
  135.     * )
  136.         md_usage "${progname}: Unrecognized argument: $1" 
  137.         exit 1
  138.     ;;
  139.   esac
  140.   shift
  141. done
  142. check_settings() {
  143.   ### Make sure we're running in the right place.
  144.   if [ ( ! -d src -a ! -d RCS ) -o ! -f etc/dq.in -o ! -f version ]; then
  145.     echo "${progname}: Can't find neither 'RCS' nor 'src'." >&2
  146.     echo "${progname} must be run in the top directory of the GSS" >&2
  147.     echo "distribution tree.  cd to that directory and try again." >&2
  148.     exit 1
  149.   fi
  150.   
  151.   ### Find out which version of GSS this is.
  152.   if [ "x$version" = x ]; then
  153.     version=`cat version`                         ## read current version id
  154.     minor_v=`expr $version : '.*([0-9]+)$'`     ## and  increment minor id
  155.     version=`expr $version : '(.*)[0-9]+$'``expr $minor_v + 1` ## of version
  156.   fi
  157.   echo $version >version                          ## store version  id
  158.   
  159.   if [ ! "${version}" ]; then
  160.     echo "${progname}: can't find current GSS version in `./version'." >&2
  161.     exit 1
  162.   fi
  163.   shortversion=`echo $version | sed -e 's/^([0-9][0-9]*.[0-9][0-9]*).*$/1/'`
  164.   
  165.   ### Make sure that given distr directory and diff_vers ae correct
  166.   if [ "x${dist_dir}" != "x" -a "${make_diff}" = "yes" -a "x${diff_vers}" != "x" ]; then
  167.     archive="${dist_dir}/${gsshead}${diff_vers}"
  168.     for extn in ".tar" ".tar.gz" ".tar.Z" ".tgz" ".tz" ; do
  169.       [ ! -f ${archive}${extn} ] || break;
  170.     done
  171.     if [ ! -f ${archive}${extn} -a ! -d ${archive} ]; then
  172.       extn=""
  173.     else
  174.         echo "${progname}: Can't find ${diff_vers} version of GNU SQL Server.    " >&2
  175.         md_usage "${progname}: either --dist-dir or --diff-with options was incorrect" 
  176.         exit 1
  177.     fi
  178.   fi
  179.   
  180.   echo $version and $shortversion
  181.   
  182.   if grep -s "GNU SQL Server version ${shortversion}" ./etc/gss.texi > /dev/null; then
  183.     true
  184.   else
  185.     echo "You must update the version number in `./etc/gss.texi'"
  186.     sleep 5
  187.   fi
  188.   
  189.   ### Make sure we don't already have a directory  gnusql-${version}.
  190.   
  191.   gssname="${gsshead}${version}${new_extension}"
  192.   
  193.   if [ -d ${gssname} ]
  194.   then
  195.     echo Directory "${gssname}" already exists >&2
  196.     exit 1
  197.   fi
  198.   
  199.   ### Make sure the subdirectory is available.
  200.   tempparent="make-dist.tmp.$$"
  201.   if [ -d ${tempparent} ]; then
  202.     echo "${progname}: staging directory `${tempparent}' already exists.
  203.   Perhaps a previous invocation of `${progname}' failed to clean up after
  204.   itself.  Check that directories whose names are of the form
  205.   `make-dist.tmp.NNNNN' don't contain any important information, remove
  206.   them, and try again." >&2
  207.     exit 1
  208.   fi
  209.   
  210.   ### Make sure configure is newer than configure.in.
  211.   if [ "x`ls -t configure configure.in | head -1`" != "xconfigure" ]; then
  212.     echo "`./configure.in' seems to be newer than `./configure.'" >&2
  213.     echo "Attempting to run autoconf." >&2
  214.     autoconf
  215.   fi
  216. }
  217. update_system() { 
  218.   echo "------------------"
  219.   echo " Updating system  "
  220.   echo "------------------"
  221.   ### Update:
  222.   if [ -f config.status ]; then
  223.     config.status --recheck
  224.     config.status
  225.   else
  226.    configure
  227.   fi
  228.   make -k
  229. }
  230. create_distribution() {
  231.   echo "--------------------------------------------"
  232.   echo "Creating staging directory: `${tempparent}'"
  233.   
  234.   mkdir ${tempparent}
  235.   tempdir="${tempparent}/${gssname}"
  236.   
  237.   echo "Creating top directory: `${tempdir}'"
  238.   mkdir ${tempdir}
  239.   
  240.   ### We copy in the top-level files before creating the subdirectories in
  241.   ### hopes that this will make the top-level files appear first in the
  242.   ### tar file; this means that people can start reading the INSTALL and
  243.   ### README while the rest of the tar file is still unpacking.  Whoopee.
  244.   echo "Making links to top-level files." 
  245.   ln GETTING.GNU.SOFTWARE INSTALL PROBLEMS README BUGS make-dist ${tempdir}
  246.   ln ChangeLog* Makefile COPYING configure                       ${tempdir}
  247.   ln configure.in config.h.in acconfig.h aclocal.m4              ${tempdir}
  248.   ln stamp-h stamp-h.in                                          ${tempdir}
  249.   if [ "${with_RCS}" != "yes" ]; then
  250.     cp Makefile.in ${tempdir}
  251.   fi
  252.   ### Copy these files; they can be cross-filesystem symlinks.
  253.   cp config.sub ${tempdir}
  254.   cp config.guess ${tempdir}
  255.   cp install-sh ${tempdir}
  256.   
  257.   echo "Updating version number in README."
  258.   (cd ${tempdir}
  259.    awk 
  260.      '$1 " " $2 " " $3 " " $4 " " $5 == "This directory tree holds version" { $6 = version; print $0 }
  261.       $1 " " $2 " " $3 " " $4 " " $5 != "This directory tree holds version"' 
  262.      version=${version} README > tmp.README
  263.    mv tmp.README README
  264.    echo $version >version 
  265.   )
  266.   
  267.   echo "Creating subdirectories and copy data"
  268.   for subdir in etc test src ${RCS} ; do
  269.     for dir in `find ${subdir} -type d -print` ; do
  270.       [ -d ${tempdir}/$dir ] || mkdir -p ${tempdir}/$dir
  271.     done
  272.     for fn in `find ${subdir}  -type f -print` ; do
  273.       ln $fn ${tempdir}/$fn
  274.     done
  275.     for fn in `find ${subdir}  -type l -print` ; do
  276.       lfn=`basename $fn`
  277.       case $lfn in
  278.         RCS)
  279.             if [ "${with_RCS}" = "yes" ]; then
  280.               ln -s ${tempdir}/RCS ${tempdir}/$fn
  281.             fi
  282.             ;;
  283.         Makefile.in | Makefile_h.in )
  284.             if [ "${with_RCS}" != "yes" ]; then
  285.               cp $fn ${tempdir}/$fn
  286.             fi
  287.             ;;
  288.         gnusql) ## nothing to do with it
  289.             ;;
  290.         *)
  291.             echo "unexpected symbolic link '$fn ($lfn)' was found"
  292.             exit 1
  293.         esac 
  294.     done
  295.   done
  296.   
  297.   #### Make sure that there aren't any hard links between files in the
  298.   #### distribution; people with afs can't deal with that.  Okay,
  299.   #### actually we just re-copy anything with a link count greater
  300.   #### than two.  (Yes, strictly greater than 2 is correct; since we
  301.   #### created these files by linking them in from the original tree,
  302.   #### they'll have exactly two links normally.)
  303.   echo "Breaking intra-tree links."
  304.   for fn in `find ${tempdir} -type f -links +2 -print` ; do
  305.      cp -p $fn $$
  306.      rm -f $fn
  307.      mv    $$ $fn 
  308.   done
  309.   
  310.   #### preserve files, generated by language level tools, to not bother 
  311.   #### people by need of installing of all of these stuff.
  312.   #### (1) bison (2) flex (3) rpcgen
  313.   echo "preserving generated files."
  314.   find ${tempdir} -name '*.y' -exec etc/preserve save --bison  {} ;
  315.   find ${tempdir} -name '*.l' -exec etc/preserve save --flex   {} ;
  316.   find ${tempdir} -name '*.x' -exec etc/preserve save --rpcgen {} ;
  317.   
  318.   if [ "${with_RCS}" = "yes" ];  then
  319.     echo "refreshing RCS dependencies."
  320.     ( cd ${tempdir}; etc/RCSdeps )
  321.   else
  322.     echo "cleaning RCS dependencies from makefiles"
  323.     ## delete RCS dependencies check
  324.     for fn in `find ${tempdir} -name 'Makefile*' -type f -print` ; do
  325.       sed 's/^include[ ]*RCS[/].*$//g' $fn >$$
  326.       rm -f $fn
  327.       mv $$ $fn
  328.     done
  329.   fi
  330.   
  331.   ## let's clean distribution
  332.   echo "Cleaning distribution"
  333.   ( 
  334.     cd ${tempdir}
  335.     ./configure
  336.     make clean
  337.     find . -name Makefile -exec rm -f {} ; 
  338.     rm src/Makefile_h
  339.   )
  340.   
  341.   if [ "${with_RCS}" = "no" -a -d RCS ];  then
  342.     ## fix modes of distributed files
  343.     for fn in `find ${tempparent} -type f -print`; do
  344.       cp -p $fn $$
  345.       rm -f $fn
  346.       mv    $$  $fn
  347.     done
  348.     find ${tempparent}   -perm -100 -exec chmod 755 {} ;
  349.     find ${tempparent} ! -perm -100 -exec chmod 644 {} ;
  350.   fi
  351. }
  352. ####--------------------------------------------------------------------------------------------------
  353. ####----- shipment directory       -------------------------------------------------------------------
  354. ####--------------------------------------------------------------------------------------------------
  355. ####--------------------------------------------------------------------------------------------------
  356. assert() {
  357.    if [ "$1" != "$2" ] ; then
  358.      echo "$0: Assertation failed : '$1 = $2' "
  359.      exit 1
  360.    fi
  361. }
  362. find_arcs() {
  363.   ## we should guess shipment directory and, if required, version to compare
  364.   ## set archive, extn, dist_dir and diff_vers
  365.   dist_dir=""
  366.   diff_vers=""
  367.   for dd in $1 . .. ../.. ../../.. ; do
  368.     [ "x${archive}" = "x" ] || break
  369.     list="`find $dd -name "${gsshead}$2*" -follow -print`"
  370.     [ "x${list}" != "x" ] || continue
  371.     for ff in ${list} ; do
  372.       dir=`dirname $ff` ; dir=`( cd $dir; pwd )`
  373.       arctail=`basename $ff | sed "s/${gsshead}//g;"`
  374.       echo -n " $arctail found... "
  375.       extn1=""
  376.       for ext in ".tgz" ".tz" ".gz" ".Z" ".tar" ; do
  377.         case $arctail in
  378.           *diff   )
  379.                     echo "diff file... skipped"
  380.                     arctail=""
  381.                     break 
  382.                     ;;
  383.           *${ext} )
  384.                     extn1="${ext}${extn1}"
  385.                     arctail=`basename $arctail ${ext}`
  386.                     ;;
  387.         
  388.         esac
  389.       done
  390.       ## diff file or no version case
  391.       [ "x$arctail" != "x" ] || continue
  392.       if [ "$arctail" = "${version}" ] ; then
  393.         echo "is current... skipped" 
  394.         continue
  395.       fi
  396.       diff_vers=$arctail
  397.       echo -n "version (${diff_vers})... "
  398.       if [ "x${archive}" = "x" ] ; then
  399.         dist_dir=$dir
  400.         archive="${dist_dir}/${gsshead}${diff_vers}"
  401.         extn=${extn1}
  402.         echo "choosed to compare"
  403.       elif [ `ls -t ${archive}${extn} $ff | head -1` = $ff ] ; then
  404.         dist_dir=$dir
  405.         archive="${dist_dir}/${gsshead}${diff_vers}"
  406.         extn=${extn1}
  407.         echo "better for patch"
  408.       else
  409.         echo "skipped"
  410.       fi
  411.     done
  412.   done
  413. }
  414. choose_dest_dir() {
  415.   dir_save="${dist_dir}"
  416.   vers_save="${diff_vers}"
  417.   
  418.   
  419.   if [ "x${archive}" = "x" -a "x${vers_save}" != "x" ] ; then 
  420.       ## we need to find some particular version
  421.       assert "${make_diff}" "yes"
  422.       echo "Looking for version ${vers_save} archive..."
  423.       find_arcs "${dist_dir}" "${diff_vers}"
  424.       if [ "x${archive}" = "x" ] ; then
  425.         echo "$0: Warning: can't find ${vers_save} version  to make a diff. skipping..." >&2 
  426.         make_diff="no"
  427.       elif [ "x${dir_save}" != "x" -a "${dist_dir}" != "${dir_save}" ] ; then
  428.         echo "$0: Warning: required version found at another directory"   >&2 
  429.         echo "             default shipment directory set to ${dist_dir}" >&2 
  430.       fi
  431.   fi
  432.   if [ "x${archive}" = "x" -a "${make_diff}" = "yes" ] ; then
  433.       ## we need to find just some version
  434.       echo "Looking for previous versions' archives..."
  435.       find_arcs "${dir_save}" ""
  436.       if [ "x${archive}" = "x" ] ; then
  437.         echo "$0: Warning: can't find any previous version to make a diff. skipping..." >&2 
  438.         make_diff="no"
  439.       elif [ "x${dir_save}" != "x" -a "${dist_dir}" != "${dir_save}" ] ; then
  440.         echo "$0: Warning: required version found at another directory"   >&2 
  441.         echo "             default shipment directory set to ${dist_dir}" >&2 
  442.       fi
  443.   fi
  444.   
  445.   if [ "x${archive}" = "x" ]; then
  446.     assert "${make_diff}" "no"
  447.     if [ "x${dir_save}" != "x" ] ; then
  448.       dist_dir="${dir_save}"
  449.     else ## if no shipped version are found and no defaults are set
  450.       if [ "${make_tar}" = "yes" ]; then
  451.         dist_dir=`( cd .. ; pwd)`
  452.         echo "setting deliviry directory to ${dist_dir}"
  453.       fi
  454.     fi
  455.     [ "x${dizt_dir}" = "x" ] || mkdir -p ${dist_dir}
  456.   fi
  457. }
  458. create_diff() {
  459.   (
  460.     cd ${tempparent}
  461.     for extn in ".tar" ".tar.gz" ".tar.Z" ".tgz" ".tz" ; do
  462.       if [ -f ${archive}${extn} ] ; then
  463.         case $extn in
  464.         ".tar" )    
  465.                 tar xf ${archive}${extn}
  466.                 ;;
  467.         ".tar.gz" | ".tgz" )
  468.                 gzip -d -c ${archive}${extn} | tar xf - 
  469.                 ;;
  470.         ".tar.Z" | ".tz")
  471.                 cp ${archive}${extn} a.Z
  472.                 uncompress -c ${archive}${extn} | tar xf - 
  473.                 ;;
  474.         esac
  475.         break
  476.       fi
  477.     done
  478.     if [ ! -d ${gsshead}${diff_vers} -a -d ${archive} ] ; then
  479.       ln -s ${archive} ${gsshead}${diff_vers}
  480.     fi
  481.     if [ -f ${gsshead}${diff_vers}/README ]; then
  482.       diff -rc ${gsshead}${diff_vers} ${gssname} >${diff_vers}-${version}.diff
  483.     else
  484.       echo "$0: Error: can't extract archive ${archive} to diff..." >&2 
  485.     fi
  486.   )
  487. }
  488. make_arc() {
  489.   if [ "${newer}" ]; then
  490.     echo "Removing files older than $newer."
  491.     find ${tempparent} ! -newer ${newer} -exec rm -f {} ;
  492.   fi
  493.   if [ "${make_tar}" = yes ]; then
  494.     if [ "${default_gzip}" = "" ]; then
  495.       echo "Looking for gzip."
  496.       temppath=`echo $PATH | sed 's/^:/.:/;s/::/:.:/g;s/:$/:./;s/:/ /g'`
  497.       default_gzip=`(
  498.         for dir in ${temppath}; do
  499.           if [ -f ${dir}/gzip ]; then echo 'gzip --best'; exit 0; fi
  500.         done
  501.         echo compress
  502.       )`
  503.     fi
  504.     case "${default_gzip}" in
  505.       compress* ) gzip_extension=.Z ;;
  506.       * )         gzip_extension=.gz ;;
  507.     esac
  508.     echo "Creating tar file."
  509.     arcname="${dist_dir}/${gssname}.tar${gzip_extension}"
  510.     (cd ${tempparent} ; tar cvf - ${gssname} ) 
  511.       | ${default_gzip} 
  512.       > ${arcname}.$$
  513.     [ ! -f ${arcname} ] || rm -f ${arcname}
  514.     mv ${arcname}.$$ ${arcname}
  515.     if [ "${make_diff}" = yes ]; then
  516.       gss_diff=${dist_dir}/${gsshead}${diff_vers}-${version}.diff${gzip_extension}
  517.       [ ! -f ${gss_diff} ] || rm -f ${gss_diff}
  518.       ( cd ${tempparent} ; cat ${diff_vers}-${version}.diff ) | ${default_gzip} > ${gss_diff}
  519.     fi
  520.   fi
  521. }
  522. ######################################
  523. ###########  main routine  ###########
  524. ######################################
  525. check_settings
  526. update_system
  527. ### This trap ensures that the staging directory will be cleaned up even
  528. ### when the script is interrupted in mid-career.
  529. if [ "${clean_up}" = yes ]; then
  530.   trap "echo 'Interrupted...cleaning up the staging directory.'; rm -rf ${tempparent}; exit 1" 1 2 15
  531. fi
  532.   
  533. create_distribution
  534. choose_dest_dir
  535. if [ "${make_diff}" = yes ]; then
  536.   create_diff
  537. fi
  538. make_arc
  539. if [ "${clean_up}" = yes ]; then
  540.   echo "Cleaning up the staging directory."
  541.   rm -rf ${tempparent}
  542. fi
  543. ### make-dist ends here