#!/bin/sh # # make-dist: create an Emacs distribution tar file from the current # source tree. This basically creates a duplicate directory # structure, and then hard links into it only those files that should # be distributed. This means that if you add a file with an odd name, # you should make sure that this script will include it. progname="$0" # Exit if a command fails. # set -e # Print out each line we read, for debugging's sake. # set -v clean_up=yes make_tar=yes newer="" while [ $# -gt 0 ]; do case "$1" in # This option tells make-dist not to delete the staging directory # after it's done making the tar file. "--no-clean-up" ) clean_up=no ;; # This option tells make-dist not to make a tar file. Since it's # rather pointless to build the whole staging directory and then # nuke it, using this option also selects '--no-clean-up'. "--no-tar" ) make_tar=no clean_up=no ;; # This option tells make-dist to make the distribution normally, then # remove all files newer than the given timestamp file. This is useful # for creating incremental or patch distributions "--newer") newer="$2" new_extension=".new" shift ;; * ) echo "${progname}: Unrecognized argument: $1" >&2 exit 1 ;; esac shift done # Make sure we're running in the right place. if [ ! -d src -o ! -f src/lisp.h -o ! -d lisp -o ! -f lisp/version.el ]; then echo "${progname}: Can't find \`src/lisp.h' and \`lisp/version.el'." >&2 echo "${progname} must be run in the top directory of the Emacs" >&2 echo "distribution tree. Cd to that directory and try again." >&2 exit 1 fi # Find out which version of Emacs this is. version=`grep 'defconst[ ]*emacs-version' lisp/version.el \ | sed -e 's/^.*"\([0-9][0-9]*\.[0-9][0-9]*\)\..*$/\1/'` if [ ! "${version}" ]; then echo "${progname}: can't find current emacs version in \`./lisp/version.el'." >&2 exit 1 fi # Make sure the subdirectory is available. tempparent="make-dist.tmp.$$" if [ -d ${tempparent} ]; then echo "${progname}: staging directory \`${tempparent}' already exists. Perhaps a previous invocation of \`${progname}' failed to clean up after itself. Check that directories whose names are of the form \`make-dist.tmp.NNNNN' don't contain any important information, remove them, and try again." >&2 exit 1 fi echo "Creating staging directory: \`${tempparent}'" mkdir ${tempparent} emacsname="emacs-${version}${new_extension}" tempdir="${tempparent}/${emacsname}" # This trap ensures that the staging directory will be cleaned up even # when the script is interrupted in mid-career. if [ "${clean_up}" = yes ]; then trap "echo 'Interrupted...cleaning up the staging directory.'; rm -rf ${tempparent}; exit 1" 1 2 15 fi echo "Creating top directory: \`${tempdir}'" mkdir ${tempdir} # We copy in the top-level files before creating the subdirectories in # hopes that this will make the top-level files appear first in the # tar file; this means that people can start reading the INSTALL and # README while the rest of the tar file is still unpacking. Whoopee. echo "Making links to top-level files." ln GETTING.GNU.SOFTWARE INSTALL PROBLEMS README move-if-change ${tempdir} ln ChangeLog Makefile.in build-install.in configure make-dist ${tempdir} # Copy these files; on the GNU machines, at least, they are symbolic # links to files on another file system, so we can't make a hard link # to it. Eech. cp config.sub ${tempdir} echo "Creating subdirectories." for subdir in lisp lisp/term local-lisp external-lisp \ src src/m src/s lib-src oldXMenu \ etc lock arch-lib cpp info man shortnames vms; do mkdir ${tempdir}/${subdir} done echo "Making links to \`lisp'." # Don't distribute =*.el files, site-init.el, site-load.el, or default.el. (cd lisp ln [a-zA-Z]*.el ../${tempdir}/lisp ln [a-zA-Z]*.elc ../${tempdir}/lisp # simula.el doesn't keep abbreviations in simula.defns any more. # ln [a-zA-Z]*.defns ../${tempdir}/lisp ln ChangeLog README ../${tempdir}/lisp cd ../${tempdir}/lisp rm -f site-init site-init.el site-init.elc rm -f site-load site-load.el site-load.elc rm -f default default.el default.elc) echo "Making links to \`lisp/term'." # Don't distribute =*.el files. (cd lisp/term ln [a-zA-Z]*.el ../../${tempdir}/lisp/term ln [a-zA-Z]*.elc ../../${tempdir}/lisp/term ln README ../../${tempdir}/lisp/term) echo "Making links to \`external-lisp'." # Don't distribute =*.el files. (cd external-lisp ln [a-zA-Z]*.el ../${tempdir}/external-lisp ln [a-zA-Z]*.elc ../${tempdir}/external-lisp ln ChangeLog README ../${tempdir}/external-lisp) echo "Making links to \`src'." # Don't distribute =*.[ch] files, or the configured versions of # config.h.in, paths.h.in, or Makefile.in. (cd src ln [a-zA-Z]*.c ../${tempdir}/src ln [a-zA-Z]*.h ../${tempdir}/src ln [a-zA-Z]*.s ../${tempdir}/src ln README Makefile.in ymakefile ChangeLog config.h.in paths.h.in \ ../${tempdir}/src ln .gdbinit .dbxinit ../${tempdir}/src ln *.com *.opt vms-pp.trans vmsbuild ../${tempdir}/src cd ../${tempdir}/src rm -f config.h paths.h Makefile if [ -z "${newer}" ]; then etags *.h *.c ../lisp/*.el fi) echo "Making links to \`src/m'." (cd src/m ln README *.h ../../${tempdir}/src/m) echo "Making links to \`src/s'." (cd src/s ln README *.h ../../${tempdir}/src/s) echo "Making links to \`lib-src'." (cd lib-src ln [a-zA-Z]*.[chy] [a-zA-Z]*.lex [a-zA-Z]*.com ../${tempdir}/lib-src ln ChangeLog Makefile.in README testfile vcdiff rcs2log ../${tempdir}/lib-src ln emacs.csh ../${tempdir}/lib-src cd ../${tempdir}/lib-src rm -f getdate.c getdate.tab.c y.tab.c y.tab.h) echo "Making links to \`oldXMenu'." (cd oldXMenu ln *.c *.h ../${tempdir}/oldXMenu ln README Makefile Imakefile ChangeLog ../${tempdir}/oldXMenu) echo "Making links to \`etc'." # Don't distribute DOC files, backups, autosaves, or tex litter. (cd etc ln [0-9a-zA-Z]* ../${tempdir}/etc cd ../${tempdir}/etc # Avoid an error when expanding the wildcards later. for dummy in DOC-dummy dummy~ \#dummy\# dummy.dvi dummy.log; do ln MACHINES ${dummy} done rm -f DOC* *~ \#*\# *.dvi *.log core) # For now, we comment these out, since I'm not changing them any. #!! echo "Making links to \`cpp'." #!! (cd cpp #!! ln cccp.c cexp.y Makefile README ../${tempdir}/cpp) #!! #!! echo "Making links to \`info'." #!! # Don't distribute backups or autosaves. #!! (cd info #!! ln [a-zA-Z]* ../${tempdir}/info #!! cd ../${tempdir}/info #!! # Avoid an error when expanding the wildcards later. #!! ln emacs dummy~ ; ln emacs \#dummy\# #!! rm -f *~ \#*\# core) #!! #!! echo "Making links to \`man'." #!! (cd man #!! ln *.tex *.texinfo *.texi *.aux *.cps *.fns *.kys *.vrs ../${tempdir}/man #!! ln *.c ../${tempdir}/man #!! ln ChangeLog Makefile README split-man ../${tempdir}/man) echo "Making links to \`shortnames'." (cd shortnames ln *.c ../${tempdir}/shortnames ln Makefile reserved special ../${tempdir}/shortnames) echo "Making links to \`vms'." (cd vms ln [0-9a-zA-Z]* ../${tempdir}/vms cd ../${tempdir}/vms rm -f *~) echo "Making sure copying notices are all symlinks to \`etc/COPYING'." rm -f ${tempdir}/etc/COPYING cp etc/COPYING ${tempdir}/etc/COPYING for subdir in lisp external-lisp src lib-src info shortnames; do if [ -f ${tempdir}/${subdir}/COPYING ]; then rm ${tempdir}/${subdir}/COPYING fi ln -s ../etc/COPYING ${tempdir}/${subdir} done if [ "${newer}" ]; then echo "Removing files older than $newer." # We remove .elc files unconditionally, on the theory that anyone picking # up an incremental distribution already has a running Emacs to byte-compile # them with. find ${tempparent} \( -name '*.elc' -o ! -newer ${newer} \) -exec rm -f {} \; fi if [ "${make_tar}" = yes ]; then echo "Creating tar file." (cd ${tempparent}; tar cvf - ${emacsname}) | compress > ${emacsname}.tar.Z fi if [ "${clean_up}" = yes ]; then echo "Cleaning up the staging directory." rm -rf ${tempparent} fi # make-dist ends here