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