; * lisp/ldefs-boot.el: Update.
[emacs.git] / admin / make-manuals
blob4e65d3d8753281d27abf9a34a05bf622310aaff0
1 #!/bin/bash
2 ### make-manuals - create the Emacs manuals to upload to the gnu.org website
4 ## Copyright 2018-2019 Free Software Foundation, Inc.
6 ## Author: Glenn Morris <rgm@gnu.org>
8 ## This file is part of GNU Emacs.
10 ## GNU Emacs is free software: you can redistribute it and/or modify
11 ## it under the terms of the GNU General Public License as published by
12 ## the Free Software Foundation, either version 3 of the License, or
13 ## (at your option) any later version.
15 ## GNU Emacs is distributed in the hope that it will be useful,
16 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ## GNU General Public License for more details.
20 ## You should have received a copy of the GNU General Public License
21 ## along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
23 ### Commentary:
25 ## This is a helper script to create the Emacs manuals as used on the
26 ## gnu.org website. After this, use upload-manuals to upload them.
28 ## Usage:
29 ## Call from the top-level directory of an Emacs source tree.
30 ## This should normally be a release.
31 ## The info files should exist.
33 ### Code:
35 die () # write error to stderr and exit
37 [ $# -gt 0 ] && echo "$PN: $@" >&2
38 exit 1
41 PN=${0##*/} # basename of script
43 usage ()
45 cat 1>&2 <<EOF
46 Usage: ${PN} [-c] [-e emacs]
47 Create the Emacs manuals for the gnu.org website.
48 Call this script from the top-level of the Emacs source tree that
49 contains the manuals you want to use (normally a release).
50 The admin/ directory is required.
51 Options:
52 -c: do not delete any pre-existing $outdir/ directory
53 -e: Emacs executable to use (default $emacs)
54 EOF
55 exit 1
59 ## Defaults.
60 continue=
61 emacs=emacs
63 ## Parameters.
64 outdir=manual
65 gzip="gzip --best --no-name"
66 tar="tar --numeric-owner --owner=0 --group=0 --mode=go+u,go-w"
67 ## Requires GNU tar >= 1.28 so that the tarballs are more reproducible.
68 ## (Personally I think this is way OOT. I'm not even sure if anyone
69 ## uses these tarfiles, let alone cares whether they are reproducible.)
70 tar --help | grep -- '--sort.*name' >& /dev/null && tar="$tar --sort=name"
72 while getopts ":hce:" option ; do
73 case $option in
74 (h) usage ;;
76 (c) continue=t ;;
78 (e) emacs=$OPTARG ;;
80 (\?) die "Bad option -$OPTARG" ;;
82 (:) die "Option -$OPTARG requires an argument" ;;
84 (*) die "getopts error" ;;
85 esac
86 done
87 shift $(( --OPTIND ))
88 OPTIND=1
90 [ $# -eq 0 ] || usage
93 [ -e admin/admin.el ] || die "admin/admin.el not found"
96 tempfile=/tmp/$PN.$$
97 trap "rm -f $tempfile 2> /dev/null" EXIT
100 [ "$continue" ] || rm -rf $outdir
102 if [ -e $outdir ]; then
103 ## Speed up repeat invocation.
104 echo "Re-using existing $outdir/ directory"
106 else
108 ## This creates the manuals in a manual/ directory.
109 ## Note makeinfo >= 5 is much slower than makeinfo 4.
110 echo "Making manuals (slow)..."
111 $emacs --batch -Q -l admin/admin.el -f make-manuals \
112 >| $tempfile 2>&1 || {
113 cat $tempfile 1>&2
115 die "error running make-manuals"
119 find $outdir -name '*~' -exec rm {} +
122 echo "Adding compressed html files..."
123 for f in emacs elisp; do
124 $tar -C $outdir/html_node -cf - $f | $gzip \
125 > $outdir/$f.html_node.tar.gz || die "error for $f"
126 done
129 echo "Making manual tarfiles..."
130 $emacs --batch -Q -l admin/admin.el -f make-manuals-dist \
131 >| $tempfile || {
133 cat $tempfile 1>&2
135 die "error running make-manuals-dist"
138 o=$outdir/texi
139 mkdir -p $o
141 for f in $outdir/*.tar; do
142 of=${f##*/}
143 of=${of#emacs-}
144 of=${of%%-[0-9]*}.texi.tar
145 of=${of/lispintro/eintr}
146 of=${of/lispref/elisp}
147 of=${of/manual/emacs}
148 of=$o/$of
149 mv $f $of
150 $gzip $of || die "error compressing $f"
151 done
154 echo "Making refcards..."
155 make -C etc/refcards dist >| $tempfile 2>&1 || {
156 cat $tempfile 1>&2
157 die "failed make dist"
160 ## This may hang if eg german.sty is missing.
161 make -k -C etc/refcards pdf >| $tempfile 2>&1 || {
162 cat $tempfile 1>&2
163 echo "Warning: ignored failure(s) from make pdf"
166 ## Newer Texlive only provide mex (used by pl refcards) for pdf, AFAICS.
167 make -k -C etc/refcards ps >| $tempfile 2>&1 || {
168 cat $tempfile 1>&2
169 echo "Warning: ignored failure(s) from make ps"
172 ## Note that in the website, refcards/ is not a subdirectory of manual/.
173 refdir=$outdir/refcards
175 mkdir -p $refdir
177 mv etc/refcards/emacs-refcards.tar $refdir
178 $gzip $refdir/emacs-refcards.tar
180 for fmt in pdf ps; do
182 o=$refdir/$fmt
184 mkdir -p $o
186 [ $fmt = pdf ] && {
187 cp etc/refcards/*.$fmt $o
188 rm $o/gnus-logo.pdf
189 continue
192 for f in etc/refcards/*.$fmt; do
193 $gzip < $f > $o/${f##*/}.gz
194 done
195 done
197 make -C etc/refcards extraclean > /dev/null
200 echo "Adding compressed info files..."
202 o=$outdir/info
203 mkdir -p $o
205 for f in eintr.info elisp.info emacs.info; do
207 $gzip < info/$f > $o/$f.gz || die "error for $f"
208 done
211 echo "Finished OK, you might want to run upload-manuals now"
214 exit 0