Commit | Line | Data |
---|---|---|
f7dbcf3c | 1 | #!/bin/sh |
76fb0a58 JB |
2 | |
3 | #### make-dist: create an Emacs distribution tar file from the current | |
1d650ff1 | 4 | #### source tree. This basically creates a duplicate directory |
76fb0a58 JB |
5 | #### structure, and then hard links into it only those files that should |
6 | #### be distributed. This means that if you add a file with an odd name, | |
7 | #### you should make sure that this script will include it. | |
f7dbcf3c JB |
8 | |
9 | progname="$0" | |
10 | ||
76fb0a58 JB |
11 | ### Exit if a command fails. |
12 | ### set -e | |
f7dbcf3c | 13 | |
76fb0a58 JB |
14 | ### Print out each line we read, for debugging's sake. |
15 | ### set -v | |
f7dbcf3c | 16 | |
4746118a JB |
17 | clean_up=yes |
18 | make_tar=yes | |
1260d6ba | 19 | newer="" |
f7dbcf3c JB |
20 | |
21 | while [ $# -gt 0 ]; do | |
22 | case "$1" in | |
76fb0a58 JB |
23 | ## This option tells make-dist not to delete the staging directory |
24 | ## after it's done making the tar file. | |
1260d6ba | 25 | "--no-clean-up" ) |
4746118a JB |
26 | clean_up=no |
27 | ;; | |
76fb0a58 JB |
28 | ## This option tells make-dist not to make a tar file. Since it's |
29 | ## rather pointless to build the whole staging directory and then | |
30 | ## nuke it, using this option also selects '--no-clean-up'. | |
4746118a JB |
31 | "--no-tar" ) |
32 | make_tar=no | |
33 | clean_up=no | |
f7dbcf3c | 34 | ;; |
76fb0a58 | 35 | ## This option tells make-dist to make the distribution normally, then |
7b9cd64c ER |
36 | ## remove all files older than the given timestamp file. This is useful |
37 | ## for creating incremental or patch distributions. | |
1260d6ba | 38 | "--newer") |
ef15f270 JB |
39 | newer="$2" |
40 | new_extension=".new" | |
1260d6ba ER |
41 | shift |
42 | ;; | |
922ac4c5 JB |
43 | ## This option tells make-dist to use `compress' instead of gzip. |
44 | ## Normally, make-dist uses gzip whenever it is present. | |
45 | "--compress") | |
46 | default_gzip="compress" | |
47 | ;; | |
f7dbcf3c JB |
48 | * ) |
49 | echo "${progname}: Unrecognized argument: $1" >&2 | |
50 | exit 1 | |
51 | ;; | |
52 | esac | |
53 | shift | |
54 | done | |
55 | ||
76fb0a58 | 56 | ### Make sure we're running in the right place. |
f7dbcf3c | 57 | if [ ! -d src -o ! -f src/lisp.h -o ! -d lisp -o ! -f lisp/version.el ]; then |
1260d6ba ER |
58 | echo "${progname}: Can't find \`src/lisp.h' and \`lisp/version.el'." >&2 |
59 | echo "${progname} must be run in the top directory of the Emacs" >&2 | |
0d122844 | 60 | echo "distribution tree. cd to that directory and try again." >&2 |
f7dbcf3c JB |
61 | exit 1 |
62 | fi | |
63 | ||
76fb0a58 | 64 | ### Find out which version of Emacs this is. |
0e0186f1 | 65 | shortversion=`grep 'defconst[ ]*emacs-version' lisp/version.el \ |
47d105b0 | 66 | | sed -e 's/^.*"\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/'` |
0e0186f1 RS |
67 | version=`grep 'defconst[ ]*emacs-version' lisp/version.el \ |
68 | | sed -e 's/^[^"]*"\([^"]*\)".*$/\1/'` | |
f7dbcf3c | 69 | if [ ! "${version}" ]; then |
0e0186f1 | 70 | echo "${progname}: can't find current Emacs version in \`./lisp/version.el'." >&2 |
f7dbcf3c JB |
71 | exit 1 |
72 | fi | |
73 | ||
47d105b0 RS |
74 | echo $version and $shortversion |
75 | ||
0e0186f1 | 76 | if grep -s "GNU Emacs version ${shortversion}" ./man/emacs.texi > /dev/null; then |
f753e9aa JB |
77 | true |
78 | else | |
79 | echo "You must update the version number in \`./man/emacs.texi'" | |
7b7a9d23 | 80 | sleep 5 |
f753e9aa JB |
81 | fi |
82 | ||
bb160193 RS |
83 | ### Make sure we don't already have a directory emacs-${version}. |
84 | ||
85 | emacsname="emacs-${version}${new_extension}" | |
86 | ||
87 | if [ -d ${emacsname} ] | |
88 | then | |
89 | echo Directory "${emacsname}" already exists >&2 | |
90 | exit 1 | |
91 | fi | |
92 | ||
76fb0a58 | 93 | ### Make sure the subdirectory is available. |
1260d6ba | 94 | tempparent="make-dist.tmp.$$" |
f7dbcf3c | 95 | if [ -d ${tempparent} ]; then |
1260d6ba ER |
96 | echo "${progname}: staging directory \`${tempparent}' already exists. |
97 | Perhaps a previous invocation of \`${progname}' failed to clean up after | |
98 | itself. Check that directories whose names are of the form | |
99 | \`make-dist.tmp.NNNNN' don't contain any important information, remove | |
100 | them, and try again." >&2 | |
f7dbcf3c JB |
101 | exit 1 |
102 | fi | |
103 | ||
9f7602fd JB |
104 | ### Check for .elc files with no corresponding .el file. |
105 | ls -1 lisp/*.el | sed 's/\.el$/.elc/' > /tmp/el | |
106 | ls -1 lisp/*.elc > /tmp/elc | |
254e10d8 JB |
107 | bogosities="`comm -13 /tmp/el /tmp/elc`" |
108 | if [ "${bogosities}" != "" ]; then | |
109 | echo "The following .elc files have no corresponding .el files:" | |
110 | echo "${bogosities}" | |
111 | fi | |
8f731fcc | 112 | rm -f /tmp/el /tmp/elc |
9f7602fd | 113 | |
b4e84d5d JB |
114 | ### Make sure configure is newer than configure.in. |
115 | if [ "x`ls -t configure configure.in | head -1`" != "xconfigure" ]; then | |
863f1210 | 116 | echo "\`./configure.in' seems to be newer than \`./configure.'" >&2 |
b4e84d5d JB |
117 | echo "Attempting to run autoconf." >&2 |
118 | autoconf | |
119 | fi | |
120 | ||
2ed56345 | 121 | ### Update getdate.c. |
0e0186f1 | 122 | (cd lib-src; make -f Makefile getdate.c YACC="bison -y") |
2ed56345 | 123 | |
980ab937 RS |
124 | echo "Updating Info files." |
125 | ||
126 | (cd man; make info) | |
127 | ||
0588a761 RS |
128 | echo "Updating finder-inf.el." |
129 | ||
130 | ### update finder-inf.el. | |
131 | (cd src; emacs -batch -l finder -f finder-compile-keywords) | |
132 | ||
1260d6ba | 133 | echo "Creating staging directory: \`${tempparent}'" |
bb160193 | 134 | |
f7dbcf3c | 135 | mkdir ${tempparent} |
f7dbcf3c JB |
136 | tempdir="${tempparent}/${emacsname}" |
137 | ||
76fb0a58 JB |
138 | ### This trap ensures that the staging directory will be cleaned up even |
139 | ### when the script is interrupted in mid-career. | |
00c00348 ER |
140 | if [ "${clean_up}" = yes ]; then |
141 | trap "echo 'Interrupted...cleaning up the staging directory.'; rm -rf ${tempparent}; exit 1" 1 2 15 | |
142 | fi | |
143 | ||
1260d6ba | 144 | echo "Creating top directory: \`${tempdir}'" |
f7dbcf3c JB |
145 | mkdir ${tempdir} |
146 | ||
76fb0a58 JB |
147 | ### We copy in the top-level files before creating the subdirectories in |
148 | ### hopes that this will make the top-level files appear first in the | |
149 | ### tar file; this means that people can start reading the INSTALL and | |
150 | ### README while the rest of the tar file is still unpacking. Whoopee. | |
1260d6ba | 151 | echo "Making links to top-level files." |
525336b7 | 152 | ln GETTING.GNU.SOFTWARE INSTALL PROBLEMS README BUGS move-if-change ${tempdir} |
ac4eff2d | 153 | ln ChangeLog Makefile.in configure configure.in ${tempdir} |
6f8b09f3 | 154 | ln config.bat make-dist update-subdirs vpath.sed ${tempdir} |
bb160193 | 155 | ### Copy these files; they're cross-filesystem symlinks. |
76fb0a58 | 156 | cp config.sub ${tempdir} |
2ed56345 | 157 | cp config.guess ${tempdir} |
bb160193 | 158 | cp install.sh ${tempdir} |
f7dbcf3c | 159 | |
f753e9aa JB |
160 | echo "Updating version number in README." |
161 | (cd ${tempdir} | |
162 | awk \ | |
163 | '$1 " " $2 " " $3 " " $4 " " $5 == "This directory tree holds version" { $6 = version; print $0 } | |
164 | $1 " " $2 " " $3 " " $4 " " $5 != "This directory tree holds version"' \ | |
165 | version=${version} README > tmp.README | |
166 | mv tmp.README README) | |
167 | ||
168 | ||
f7dbcf3c | 169 | echo "Creating subdirectories." |
e793672b JB |
170 | # I think we're not going to distribute anything in external-lisp, so |
171 | # I've removed it from this list. | |
82a82d48 | 172 | for subdir in lisp lisp/term site-lisp \ |
c660c0a7 | 173 | src src/m src/s src/bitmaps lib-src oldXMenu lwlib \ |
391b3748 | 174 | nt nt/inc nt/inc/sys nt/src \ |
52d7b2e5 | 175 | etc lock cpp info man msdos shortnames vms; do |
f7dbcf3c JB |
176 | mkdir ${tempdir}/${subdir} |
177 | done | |
178 | ||
1260d6ba | 179 | echo "Making links to \`lisp'." |
7b9cd64c | 180 | ### Don't distribute TAGS, =*.el files, site-init.el, site-load.el, or default.el. |
f7dbcf3c JB |
181 | (cd lisp |
182 | ln [a-zA-Z]*.el ../${tempdir}/lisp | |
183 | ln [a-zA-Z]*.elc ../${tempdir}/lisp | |
8d2197ac | 184 | ln [a-zA-Z]*.dat ../${tempdir}/lisp |
76fb0a58 JB |
185 | ## simula.el doesn't keep abbreviations in simula.defns any more. |
186 | ## ln [a-zA-Z]*.defns ../${tempdir}/lisp | |
391b3748 | 187 | ln ChangeLog Makefile makefile.nt ChangeLog.? README dired.todo ../${tempdir}/lisp |
f7dbcf3c | 188 | cd ../${tempdir}/lisp |
7b9cd64c | 189 | rm -f TAGS =* |
f7dbcf3c | 190 | rm -f site-init site-init.el site-init.elc |
ef15f270 JB |
191 | rm -f site-load site-load.el site-load.elc |
192 | rm -f default default.el default.elc) | |
f7dbcf3c | 193 | |
56c31c87 RS |
194 | #echo "Making links to \`lisp/calc-2.02'." |
195 | #### Don't distribute =*.el files, TAGS or backups. | |
196 | #(cd lisp/calc-2.02 | |
197 | # ln [a-zA-Z]*.el ../../${tempdir}/lisp/calc-2.02 | |
198 | # ln [a-zA-Z]*.elc ../../${tempdir}/lisp/calc-2.02 | |
199 | # ln calc.info* calc.texinfo calc-refcard.* ../../${tempdir}/lisp/calc-2.02 | |
200 | # ln INSTALL Makefile README README.prev ../../${tempdir}/lisp/calc-2.02 | |
201 | # cd ../../${tempdir}/lisp/calc-2.02 | |
202 | # rm -f *~ TAGS) | |
fda4e8f6 | 203 | |
1260d6ba | 204 | echo "Making links to \`lisp/term'." |
7b9cd64c | 205 | ### Don't distribute =*.el files or TAGS. |
f7dbcf3c JB |
206 | (cd lisp/term |
207 | ln [a-zA-Z]*.el ../../${tempdir}/lisp/term | |
208 | ln [a-zA-Z]*.elc ../../${tempdir}/lisp/term | |
3e1fc5a7 | 209 | ln README ../../${tempdir}/lisp/term |
7b9cd64c | 210 | rm -f =* TAGS) |
f7dbcf3c | 211 | |
e793672b | 212 | ### echo "Making links to \`external-lisp'." |
7b9cd64c | 213 | ### ### Don't distribute =*.el files or TAGS. |
e793672b JB |
214 | ### (cd external-lisp |
215 | ### ln [a-zA-Z]*.el ../${tempdir}/external-lisp | |
216 | ### ln [a-zA-Z]*.elc ../${tempdir}/external-lisp | |
7b9cd64c ER |
217 | ### ln ChangeLog README ../${tempdir}/external-lisp |
218 | ### rm -f =* TAGS) | |
1260d6ba ER |
219 | |
220 | echo "Making links to \`src'." | |
76fb0a58 | 221 | ### Don't distribute =*.[ch] files, or the configured versions of |
9284d3a4 | 222 | ### config.h.in, paths.h.in, or Makefile.in.in, or TAGS. |
f7dbcf3c | 223 | (cd src |
76fb0a58 | 224 | echo " (If we can't link gmalloc.c, that's okay.)" |
f7dbcf3c | 225 | ln [a-zA-Z]*.c ../${tempdir}/src |
76fb0a58 | 226 | ## Might be a symlink to a file on another filesystem. |
39d6eb8e | 227 | test -f ../${tempdir}/src/gmalloc.c || cp gmalloc.c ../${tempdir}/src |
f7dbcf3c JB |
228 | ln [a-zA-Z]*.h ../${tempdir}/src |
229 | ln [a-zA-Z]*.s ../${tempdir}/src | |
8cce1257 | 230 | ln README Makefile.in.in ChangeLog ChangeLog.? config.h.in paths.h.in \ |
f7dbcf3c | 231 | ../${tempdir}/src |
990ee059 | 232 | ln .gdbinit .dbxinit ../${tempdir}/src |
6f95b621 | 233 | ln *.opt vms-pp.trans ../${tempdir}/src |
f7dbcf3c | 234 | cd ../${tempdir}/src |
ef15f270 | 235 | rm -f config.h paths.h Makefile |
7b9cd64c | 236 | rm -f =* TAGS) |
f7dbcf3c | 237 | |
690eca32 JB |
238 | echo "Making links to \`src/bitmaps'." |
239 | (cd src/bitmaps | |
240 | ln README *.xbm ../../${tempdir}/src/bitmaps) | |
241 | ||
1260d6ba | 242 | echo "Making links to \`src/m'." |
f7dbcf3c | 243 | (cd src/m |
facbb78e RS |
244 | # We call files for miscellaneous input (to linker etc) .inp. |
245 | ln README [a-zA-Z0-9]*.h *.inp ../../${tempdir}/src/m) | |
f7dbcf3c | 246 | |
1260d6ba | 247 | echo "Making links to \`src/s'." |
f7dbcf3c | 248 | (cd src/s |
facbb78e | 249 | ln README [a-zA-Z0-9]*.h *.inp ../../${tempdir}/src/s) |
f7dbcf3c | 250 | |
1260d6ba | 251 | echo "Making links to \`lib-src'." |
f7dbcf3c | 252 | (cd lib-src |
fa377791 | 253 | ln [a-zA-Z]*.[chy] [a-zA-Z]*.lex ../${tempdir}/lib-src |
0e0186f1 | 254 | ln ChangeLog Makefile.in.in README testfile vcdiff ../${tempdir}/lib-src |
391b3748 | 255 | ln emacs.csh rcs2log rcs-checkin makefile.nt ../${tempdir}/lib-src |
1260d6ba | 256 | cd ../${tempdir}/lib-src |
690a797c | 257 | rm -f getdate.tab.c y.tab.c y.tab.h |
7b9cd64c | 258 | rm -f =* TAGS) |
f7dbcf3c | 259 | |
391b3748 RS |
260 | echo "Making links to \`nt'." |
261 | (cd nt | |
262 | ln [a-z]*.cmd makefile.* todo ChangeLog install readme ../${tempdir}/nt) | |
263 | ||
264 | echo "Making links to \`nt/inc'." | |
265 | (cd nt/inc | |
266 | ln [a-z]*.h ../${tempdir}/nt/inc) | |
267 | ||
268 | echo "Making links to \`nt/inc/sys'." | |
269 | (cd nt/inc/sys | |
270 | ln [a-z]*.h ../${tempdir}/nt/inc/sys) | |
271 | ||
272 | echo "Making links to \`nt/src'." | |
273 | (cd nt/src | |
274 | ln [a-z]*.h ../${tempdir}/nt/src) | |
275 | ||
52d7b2e5 RS |
276 | echo "Making links to \`msdos'." |
277 | (cd msdos | |
278 | ln ChangeLog emacs.ico emacs.pif ../${tempdir}/msdos | |
6f8b09f3 | 279 | ln mainmake sed*.inp ../${tempdir}/msdos |
52d7b2e5 RS |
280 | cd ../${tempdir}/msdos |
281 | rm -f =*) | |
282 | ||
1260d6ba | 283 | echo "Making links to \`oldXMenu'." |
f7dbcf3c | 284 | (cd oldXMenu |
8bdbf9ed | 285 | ln *.c *.h *.in ../${tempdir}/oldXMenu |
df1ec566 | 286 | ln README Imakefile ChangeLog ../${tempdir}/oldXMenu |
f395c83a | 287 | ln compile.com descrip.mms ../${tempdir}/oldXMenu) |
f7dbcf3c | 288 | |
c660c0a7 RS |
289 | echo "Making links to \`lwlib'." |
290 | (cd lwlib | |
291 | ln *.c *.h *.in ../${tempdir}/lwlib | |
292 | ln README Imakefile ChangeLog ../${tempdir}/lwlib) | |
293 | ||
1260d6ba | 294 | echo "Making links to \`etc'." |
f395c83a JB |
295 | ### Don't distribute = files, TAGS, DOC files, backups, autosaves, or |
296 | ### tex litter. | |
f7dbcf3c | 297 | (cd etc |
f395c83a | 298 | ln `ls -d * | grep -v 'RCS' | grep -v 'Old'` ../${tempdir}/etc |
f7dbcf3c | 299 | cd ../${tempdir}/etc |
f395c83a JB |
300 | rm -f DOC* *~ \#*\# *.dvi *.log *,v =* core |
301 | rm -f TAGS) | |
f7dbcf3c | 302 | |
fda4e8f6 JB |
303 | echo "Making links to \`cpp'." |
304 | (cd cpp | |
305 | ln cccp.c cexp.y Makefile README ../${tempdir}/cpp) | |
306 | ||
66afa119 RS |
307 | echo "Making links to \`info'." |
308 | # Don't distribute backups or autosaves. | |
309 | (cd info | |
310 | ln [a-zA-Z]* ../${tempdir}/info | |
311 | cd ../${tempdir}/info | |
312 | # Avoid an error when expanding the wildcards later. | |
313 | ln emacs dummy~ ; ln emacs \#dummy\# | |
314 | rm -f *~ \#*\# core) | |
fda4e8f6 JB |
315 | |
316 | echo "Making links to \`man'." | |
317 | (cd man | |
298c8970 | 318 | ln *.texi *.aux *.cps *.fns *.kys *.vrs ../${tempdir}/man |
5e808bc0 JB |
319 | test -f README && ln README ../${tempdir}/man |
320 | test -f Makefile && ln Makefile ../${tempdir}/man | |
56c31c87 | 321 | ln ChangeLog split-man ../${tempdir}/man |
91a480c1 | 322 | cp texinfo.tex texindex.c getopt.c ../${tempdir}/man |
4f8cc93a | 323 | cd ../${tempdir}/man |
56c31c87 RS |
324 | rm -f \#*\# =* *~ core emacs-index* *.Z *.z xmail |
325 | rm -f emacs.?? termcap.?? gdb.?? *.log *.toc *.dvi *.oaux) | |
f7dbcf3c | 326 | |
1260d6ba | 327 | echo "Making links to \`shortnames'." |
f7dbcf3c JB |
328 | (cd shortnames |
329 | ln *.c ../${tempdir}/shortnames | |
330 | ln Makefile reserved special ../${tempdir}/shortnames) | |
331 | ||
40eef465 JB |
332 | echo "Making links to \`vms'." |
333 | (cd vms | |
334 | ln [0-9a-zA-Z]* ../${tempdir}/vms | |
335 | cd ../${tempdir}/vms | |
336 | rm -f *~) | |
337 | ||
c87b230f JB |
338 | ### It would be nice if they could all be symlinks to etc's copy, but |
339 | ### you're not supposed to have any symlinks in distribution tar files. | |
340 | echo "Making sure copying notices are all copies of \`etc/COPYING'." | |
1260d6ba ER |
341 | rm -f ${tempdir}/etc/COPYING |
342 | cp etc/COPYING ${tempdir}/etc/COPYING | |
52d7b2e5 | 343 | for subdir in lisp src lib-src info shortnames msdos; do |
f7dbcf3c JB |
344 | if [ -f ${tempdir}/${subdir}/COPYING ]; then |
345 | rm ${tempdir}/${subdir}/COPYING | |
346 | fi | |
96858c42 | 347 | cp etc/COPYING ${tempdir}/${subdir} |
f7dbcf3c JB |
348 | done |
349 | ||
5b8def65 JB |
350 | #### Make sure that there aren't any hard links between files in the |
351 | #### distribution; people with afs can't deal with that. Okay, | |
352 | #### actually we just re-copy anything with a link count greater | |
353 | #### than two. | |
354 | echo "Breaking intra-tree links." | |
e94817d7 | 355 | find ${tempdir} ! -type d -links +2 \ |
2752c6f9 | 356 | -exec cp -p {} $$ \; -exec rm -f {} \; -exec mv $$ {} \; |
5b8def65 | 357 | |
1260d6ba ER |
358 | if [ "${newer}" ]; then |
359 | echo "Removing files older than $newer." | |
76fb0a58 JB |
360 | ## We remove .elc files unconditionally, on the theory that anyone picking |
361 | ## up an incremental distribution already has a running Emacs to byte-compile | |
362 | ## them with. | |
1260d6ba ER |
363 | find ${tempparent} \( -name '*.elc' -o ! -newer ${newer} \) -exec rm -f {} \; |
364 | fi | |
365 | ||
4746118a | 366 | if [ "${make_tar}" = yes ]; then |
922ac4c5 JB |
367 | if [ "${default_gzip}" = "" ]; then |
368 | echo "Looking for gzip." | |
369 | temppath=`echo $PATH | sed 's/^:/.:/ | |
370 | s/::/:.:/g | |
371 | s/:$/:./ | |
372 | s/:/ /g'` | |
373 | default_gzip=`( | |
374 | for dir in ${temppath}; do | |
375 | if [ -f ${dir}/gzip ]; then echo 'gzip --best'; exit 0; fi | |
376 | done | |
377 | echo compress | |
378 | )` | |
379 | fi | |
f395c83a JB |
380 | case "${default_gzip}" in |
381 | compress* ) gzip_extension=.Z ;; | |
0dc610dd | 382 | * ) gzip_extension=.gz ;; |
f395c83a | 383 | esac |
4746118a | 384 | echo "Creating tar file." |
f395c83a JB |
385 | (cd ${tempparent} ; tar cvf - ${emacsname} ) \ |
386 | | ${default_gzip} \ | |
387 | > ${emacsname}.tar${gzip_extension} | |
4746118a | 388 | fi |
f7dbcf3c | 389 | |
4746118a | 390 | if [ "${clean_up}" = yes ]; then |
f7dbcf3c | 391 | echo "Cleaning up the staging directory." |
f395c83a | 392 | rm -rf ${tempparent} |
bb160193 RS |
393 | else |
394 | (cd ${tempparent}; mv ${emacsname} ..) | |
395 | rm -rf ${tempparent} | |
f7dbcf3c | 396 | fi |
00c00348 | 397 | |
76fb0a58 | 398 | ### make-dist ends here |