Merge branch 'upstream' into stable
[gnulib.git] / build-aux / gendocs.sh
1 #!/bin/sh -e
2 # gendocs.sh -- generate a GNU manual in many formats.  This script is
3 #   mentioned in maintain.texi.  See the help message below for usage details.
4
5 scriptversion=2010-11-27.07
6
7 # Copyright 2003-2010 Free Software Foundation, Inc.
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 #
22 # Original author: Mohit Agarwal.
23 # Send bug reports and any other correspondence to bug-texinfo@gnu.org.
24 #
25 # The latest version of this script, and the companion template, is
26 # available from Texinfo CVS:
27 # http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs.sh
28 # http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template
29 #
30 # An up-to-date copy is also maintained in Gnulib (gnu.org/software/gnulib).
31
32 prog=`basename "$0"`
33 srcdir=`pwd`
34
35 scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh"
36 templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template"
37
38 : ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="}
39 : ${MAKEINFO="makeinfo"}
40 : ${TEXI2DVI="texi2dvi -t @finalout"}
41 : ${DVIPS="dvips"}
42 : ${DOCBOOK2HTML="docbook2html"}
43 : ${DOCBOOK2PDF="docbook2pdf"}
44 : ${DOCBOOK2PS="docbook2ps"}
45 : ${DOCBOOK2TXT="docbook2txt"}
46 : ${GENDOCS_TEMPLATE_DIR="."}
47 : ${TEXI2HTML="texi2html"}
48 unset CDPATH
49 unset use_texi2html
50
51 version="gendocs.sh $scriptversion
52
53 Copyright 2010 Free Software Foundation, Inc.
54 There is NO warranty.  You may redistribute this software
55 under the terms of the GNU General Public License.
56 For more information about these matters, see the files named COPYING."
57
58 usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
59
60 Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source.
61 See the GNU Maintainers document for a more extensive discussion:
62   http://www.gnu.org/prep/maintain_toc.html
63
64 Options:
65   -s SRCFILE  read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi}
66   -o OUTDIR   write files into OUTDIR, instead of manual/.
67   --email ADR use ADR as contact in generated web pages.
68   --docbook   convert to DocBook too (xml, txt, html, pdf and ps).
69   --html ARG  pass indicated ARG to makeinfo or texi2html for HTML targets.
70   --texi2html use texi2html to generate HTML targets.
71   --help      display this help and exit successfully.
72   --version   display version information and exit successfully.
73
74 Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\"
75
76 Typical sequence:
77   cd PACKAGESOURCE/doc
78   wget \"$scripturl\"
79   wget \"$templateurl\"
80   $prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\"
81
82 Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR
83 to override).  Move all the new files into your web CVS tree, as
84 explained in the Web Pages node of maintain.texi.
85
86 Please use the --email ADDRESS option to specify your bug-reporting
87 address in the generated HTML pages.
88
89 MANUAL-TITLE is included as part of the HTML <title> of the overall
90 manual/index.html file.  It should include the name of the package being
91 documented.  manual/index.html is created by substitution from the file
92 $GENDOCS_TEMPLATE_DIR/gendocs_template.  (Feel free to modify the
93 generic template for your own purposes.)
94
95 If you have several manuals, you'll need to run this script several
96 times with different MANUAL values, specifying a different output
97 directory with -o each time.  Then write (by hand) an overall index.html
98 with links to them all.
99
100 If a manual's Texinfo sources are spread across several directories,
101 first copy or symlink all Texinfo sources into a single directory.
102 (Part of the script's work is to make a tar.gz of the sources.)
103
104 You can set the environment variables MAKEINFO, TEXI2DVI, TEXI2HTML, and
105 DVIPS to control the programs that get executed, and
106 GENDOCS_TEMPLATE_DIR to control where the gendocs_template file is
107 looked for.  With --docbook, the environment variables DOCBOOK2HTML,
108 DOCBOOK2PDF, DOCBOOK2PS, and DOCBOOK2TXT are also respected.
109
110 By default, makeinfo and texi2dvi are run in the default (English)
111 locale, since that's the language of most Texinfo manuals.  If you
112 happen to have a non-English manual and non-English web site, see the
113 SETLANG setting in the source.
114
115 Email bug reports or enhancement requests to bug-texinfo@gnu.org.
116 "
117
118 calcsize()
119 {
120   size=`ls -ksl $1 | awk '{print $1}'`
121   echo $size
122 }
123
124 MANUAL_TITLE=
125 PACKAGE=
126 EMAIL=webmasters@gnu.org  # please override with --email
127 htmlarg=
128 outdir=manual
129 srcfile=
130
131 while test $# -gt 0; do
132   case $1 in
133     --email) shift; EMAIL=$1;;
134     --help) echo "$usage"; exit 0;;
135     --version) echo "$version"; exit 0;;
136     -s) shift; srcfile=$1;;
137     -o) shift; outdir=$1;;
138     --docbook) docbook=yes;;
139     --html) shift; htmlarg=$1;;
140     --texi2html) use_texi2html=1;;
141     -*)
142       echo "$0: Unknown option \`$1'." >&2
143       echo "$0: Try \`--help' for more information." >&2
144       exit 1;;
145     *)
146       if test -z "$PACKAGE"; then
147         PACKAGE=$1
148       elif test -z "$MANUAL_TITLE"; then
149         MANUAL_TITLE=$1
150       else
151         echo "$0: extra non-option argument \`$1'." >&2
152         exit 1
153       fi;;
154   esac
155   shift
156 done
157
158 # For most of the following, the base name is just $PACKAGE
159 base=$PACKAGE
160
161 if test -n "$srcfile"; then
162   # but here, we use the basename of $srcfile
163   base=`basename "$srcfile"`
164   case $base in
165     *.txi|*.texi|*.texinfo) base=`echo "$base"|sed 's/\.[texinfo]*$//'`;;
166   esac
167   PACKAGE=$base
168 elif test -s "$srcdir/$PACKAGE.texinfo"; then
169   srcfile=$srcdir/$PACKAGE.texinfo
170 elif test -s "$srcdir/$PACKAGE.texi"; then
171   srcfile=$srcdir/$PACKAGE.texi
172 elif test -s "$srcdir/$PACKAGE.txi"; then
173   srcfile=$srcdir/$PACKAGE.txi
174 else
175   echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
176   exit 1
177 fi
178
179 if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
180   echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
181   echo "$0: it is available from $templateurl." >&2
182   exit 1
183 fi
184
185 case $outdir in
186   /*) abs_outdir=$outdir;;
187   *)  abs_outdir=$srcdir/$outdir;;
188 esac
189
190 echo Generating output formats for $srcfile
191
192 cmd="$SETLANG $MAKEINFO -o $PACKAGE.info \"$srcfile\""
193 echo "Generating info files... ($cmd)"
194 eval "$cmd"
195 mkdir -p "$outdir/"
196 tar czf "$outdir/$PACKAGE.info.tar.gz" $PACKAGE.info*
197 info_tgz_size=`calcsize "$outdir/$PACKAGE.info.tar.gz"`
198 # do not mv the info files, there's no point in having them available
199 # separately on the web.
200
201 cmd="$SETLANG ${TEXI2DVI} \"$srcfile\""
202 echo "Generating dvi ... ($cmd)"
203 eval "$cmd"
204
205 # now, before we compress dvi:
206 echo Generating postscript...
207 ${DVIPS} $PACKAGE -o
208 gzip -f -9 $PACKAGE.ps
209 ps_gz_size=`calcsize $PACKAGE.ps.gz`
210 mv $PACKAGE.ps.gz "$outdir/"
211
212 # compress/finish dvi:
213 gzip -f -9 $PACKAGE.dvi
214 dvi_gz_size=`calcsize $PACKAGE.dvi.gz`
215 mv $PACKAGE.dvi.gz "$outdir/"
216
217 cmd="$SETLANG ${TEXI2DVI} --pdf \"$srcfile\""
218 echo "Generating pdf ... ($cmd)"
219 eval "$cmd"
220 pdf_size=`calcsize $PACKAGE.pdf`
221 mv $PACKAGE.pdf "$outdir/"
222
223 cmd="$SETLANG $MAKEINFO -o $PACKAGE.txt --no-split --no-headers \"$srcfile\""
224 echo "Generating ASCII... ($cmd)"
225 eval "$cmd"
226 ascii_size=`calcsize $PACKAGE.txt`
227 gzip -f -9 -c $PACKAGE.txt >"$outdir/$PACKAGE.txt.gz"
228 ascii_gz_size=`calcsize "$outdir/$PACKAGE.txt.gz"`
229 mv $PACKAGE.txt "$outdir/"
230
231 html_split()
232 {
233   opt="--split=$1 $htmlarg --node-files"
234   cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $opt \"$srcfile\""
235   echo "Generating html by $1... ($cmd)"
236   eval "$cmd"
237   split_html_dir=$PACKAGE.html
238   (
239     cd ${split_html_dir} || exit 1
240     ln -sf ${PACKAGE}.html index.html
241     tar -czf "$abs_outdir/${PACKAGE}.html_$1.tar.gz" -- *.html
242   )
243   eval html_$1_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"`
244   rm -f "$outdir"/html_$1/*.html
245   mkdir -p "$outdir/html_$1/"
246   mv ${split_html_dir}/*.html "$outdir/html_$1/"
247   rmdir ${split_html_dir}
248 }
249
250 if test -z "$use_texi2html"; then
251   opt="--no-split --html -o $PACKAGE.html $htmlarg"
252   cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
253   echo "Generating monolithic html... ($cmd)"
254   rm -rf $PACKAGE.html  # in case a directory is left over
255   eval "$cmd"
256   html_mono_size=`calcsize $PACKAGE.html`
257   gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz"
258   html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"`
259   mv $PACKAGE.html "$outdir/"
260
261   cmd="$SETLANG $MAKEINFO --html -o $PACKAGE.html $htmlarg \"$srcfile\""
262   echo "Generating html by node... ($cmd)"
263   eval "$cmd"
264   split_html_dir=$PACKAGE.html
265   (
266    cd ${split_html_dir} || exit 1
267    tar -czf "$abs_outdir/${PACKAGE}.html_node.tar.gz" -- *.html
268   )
269   html_node_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node.tar.gz"`
270   rm -f "$outdir"/html_node/*.html
271   mkdir -p "$outdir/html_node/"
272   mv ${split_html_dir}/*.html "$outdir/html_node/"
273   rmdir ${split_html_dir}
274 else
275   cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $htmlarg \"$srcfile\""
276   echo "Generating monolithic html... ($cmd)"
277   rm -rf $PACKAGE.html  # in case a directory is left over
278   eval "$cmd"
279   html_mono_size=`calcsize $PACKAGE.html`
280   gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz"
281   html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"`
282   mv $PACKAGE.html "$outdir/"
283
284   html_split node
285   html_split chapter
286   html_split section
287 fi
288
289 echo Making .tar.gz for sources...
290 d=`dirname $srcfile`
291 (
292   cd "$d"
293   srcfiles=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null` || true
294   tar cvzfh "$abs_outdir/$PACKAGE.texi.tar.gz" $srcfiles
295 )
296 texi_tgz_size=`calcsize "$outdir/$PACKAGE.texi.tar.gz"`
297
298 if test -n "$docbook"; then
299   cmd="$SETLANG $MAKEINFO -o - --docbook \"$srcfile\" > ${srcdir}/$PACKAGE-db.xml"
300   echo "Generating docbook XML... ($cmd)"
301   eval "$cmd"
302   docbook_xml_size=`calcsize $PACKAGE-db.xml`
303   gzip -f -9 -c $PACKAGE-db.xml >"$outdir/$PACKAGE-db.xml.gz"
304   docbook_xml_gz_size=`calcsize "$outdir/$PACKAGE-db.xml.gz"`
305   mv $PACKAGE-db.xml "$outdir/"
306
307   cmd="${DOCBOOK2HTML} -o $split_html_db_dir \"${outdir}/$PACKAGE-db.xml\""
308   echo "Generating docbook HTML... ($cmd)"
309   eval "$cmd"
310   split_html_db_dir=html_node_db
311   (
312     cd ${split_html_db_dir} || exit 1
313     tar -czf "$abs_outdir/${PACKAGE}.html_node_db.tar.gz" -- *.html
314   )
315   html_node_db_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node_db.tar.gz"`
316   rm -f "$outdir"/html_node_db/*.html
317   mkdir -p "$outdir/html_node_db"
318   mv ${split_html_db_dir}/*.html "$outdir/html_node_db/"
319   rmdir ${split_html_db_dir}
320
321   cmd="${DOCBOOK2TXT} \"${outdir}/$PACKAGE-db.xml\""
322   echo "Generating docbook ASCII... ($cmd)"
323   eval "$cmd"
324   docbook_ascii_size=`calcsize $PACKAGE-db.txt`
325   mv $PACKAGE-db.txt "$outdir/"
326
327   cmd="${DOCBOOK2PS} \"${outdir}/$PACKAGE-db.xml\""
328   echo "Generating docbook PS... ($cmd)"
329   eval "$cmd"
330   gzip -f -9 -c $PACKAGE-db.ps >"$outdir/$PACKAGE-db.ps.gz"
331   docbook_ps_gz_size=`calcsize "$outdir/$PACKAGE-db.ps.gz"`
332   mv $PACKAGE-db.ps "$outdir/"
333
334   cmd="${DOCBOOK2PDF} \"${outdir}/$PACKAGE-db.xml\""
335   echo "Generating docbook PDF... ($cmd)"
336   eval "$cmd"
337   docbook_pdf_size=`calcsize $PACKAGE-db.pdf`
338   mv $PACKAGE-db.pdf "$outdir/"
339 fi
340
341 echo "Writing index file..."
342 if test -z "$use_texi2html"; then
343    CONDS="/%%IF  *HTML_SECTION%%/,/%%ENDIF  *HTML_SECTION%%/d;\
344           /%%IF  *HTML_CHAPTER%%/,/%%ENDIF  *HTML_CHAPTER%%/d"
345 else
346    CONDS="/%%ENDIF.*%%/d;/%%IF  *HTML_SECTION%%/d;/%%IF  *HTML_CHAPTER%%/d"
347 fi
348 curdate=`$SETLANG date '+%B %d, %Y'`
349 sed \
350    -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
351    -e "s!%%EMAIL%%!$EMAIL!g" \
352    -e "s!%%PACKAGE%%!$PACKAGE!g" \
353    -e "s!%%DATE%%!$curdate!g" \
354    -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
355    -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
356    -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
357    -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \
358    -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \
359    -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
360    -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
361    -e "s!%%PDF_SIZE%%!$pdf_size!g" \
362    -e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \
363    -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
364    -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
365    -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
366    -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
367    -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
368    -e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \
369    -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
370    -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
371    -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
372    -e "s,%%SCRIPTURL%%,$scripturl,g" \
373    -e "s!%%SCRIPTNAME%%!$prog!g" \
374    -e "$CONDS" \
375 $GENDOCS_TEMPLATE_DIR/gendocs_template >"$outdir/index.html"
376
377 echo "Done, see $outdir/ subdirectory for new files."
378
379 # Local variables:
380 # eval: (add-hook 'write-file-hooks 'time-stamp)
381 # time-stamp-start: "scriptversion="
382 # time-stamp-format: "%:y-%02m-%02d.%02H"
383 # time-stamp-end: "$"
384 # End: