#!/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 ${tempdir} ln make-dist ${tempdir} ### Copy config.sub; it's a cross-filesystem symlink. 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 echo " (If we can't link gmalloc.c, that's okay.)" ln [a-zA-Z]*.c ../${tempdir}/src ## Might be a symlink to a file on another filesystem. cp gmalloc.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 *.opt vms-pp.trans ../${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 [a-zA-Z0-9]*.h ../../${tempdir}/src/m) echo "Making links to \`src/s'." (cd src/s ln README [a-zA-Z0-9]*.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