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.
5 scriptversion
=2012-10-27.11
7 # Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
8 # Free Software Foundation, Inc.
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.
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.
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/>.
23 # Original author: Mohit Agarwal.
24 # Send bug reports and any other correspondence to bug-texinfo@gnu.org.
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
31 # An up-to-date copy is also maintained in Gnulib (gnu.org/software/gnulib).
34 # - image importation was only implemented for HTML generated by
35 # makeinfo. But it should be simple enough to adjust.
36 # - images are not imported in the source tarball. All the needed
37 # formats (PDF, PNG, etc.) should be included.
42 scripturl
="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh"
43 templateurl
="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template"
45 : ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="}
46 : ${MAKEINFO="makeinfo"}
47 : ${TEXI2DVI="texi2dvi -t @finalout"}
48 : ${DOCBOOK2HTML="docbook2html"}
49 : ${DOCBOOK2PDF="docbook2pdf"}
50 : ${DOCBOOK2TXT="docbook2txt"}
51 : ${GENDOCS_TEMPLATE_DIR="."}
53 : ${TEXI2HTML="texi2html"}
57 version
="gendocs.sh $scriptversion
59 Copyright 2012 Free Software Foundation, Inc.
60 There is NO warranty. You may redistribute this software
61 under the terms of the GNU General Public License.
62 For more information about these matters, see the files named COPYING."
64 usage
="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
66 Generate output in various formats from PACKAGE.texinfo (or .texi or
67 .txi) source. See the GNU Maintainers document for a more extensive
69 http://www.gnu.org/prep/maintain_toc.html
72 -s SRCFILE read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi}
73 -o OUTDIR write files into OUTDIR, instead of manual/.
74 -I DIR append DIR to the Texinfo search path.
75 --email ADR use ADR as contact in generated web pages.
76 --docbook convert through DocBook too (xml, txt, html, pdf).
77 --html ARG pass indicated ARG to makeinfo or texi2html for HTML targets.
78 --info ARG pass indicated ARG to makeinfo for Info, instead of --no-split.
79 --texi2html use texi2html to generate HTML targets.
80 --help display this help and exit successfully.
81 --version display version information and exit successfully.
83 Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\"
89 $prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\"
91 Output will be in a new subdirectory \"manual\" (by default;
92 use -o OUTDIR to override). Move all the new files into your web CVS
93 tree, as explained in the Web Pages node of maintain.texi.
95 Please do use the --email ADDRESS option to specify your bug-reporting
96 address in the generated HTML pages.
98 MANUAL-TITLE is included as part of the HTML <title> of the overall
99 manual/index.html file. It should include the name of the package being
100 documented. manual/index.html is created by substitution from the file
101 $GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the
102 generic template for your own purposes.)
104 If you have several manuals, you'll need to run this script several
105 times with different MANUAL values, specifying a different output
106 directory with -o each time. Then write (by hand) an overall index.html
107 with links to them all.
109 If a manual's Texinfo sources are spread across several directories,
110 first copy or symlink all Texinfo sources into a single directory.
111 (Part of the script's work is to make a tar.gz of the sources.)
113 As implied above, by default monolithic Info files are generated.
114 If you want split Info, or other Info options, use --info to override.
116 You can set the environment variables MAKEINFO, TEXI2DVI, TEXI2HTML,
117 and PERL to control the programs that get executed, and
118 GENDOCS_TEMPLATE_DIR to control where the gendocs_template file is
119 looked for. With --docbook, the environment variables DOCBOOK2HTML,
120 DOCBOOK2PDF, and DOCBOOK2TXT are also respected.
122 By default, makeinfo and texi2dvi are run in the default (English)
123 locale, since that's the language of most Texinfo manuals. If you
124 happen to have a non-English manual and non-English web site, see the
125 SETLANG setting in the source.
127 Email bug reports or enhancement requests to bug-texinfo@gnu.org.
132 EMAIL
=webmasters@gnu.org
# please override with --email
133 commonarg
= # Options passed to all the tools (-I dir).
134 dirs= # -I's directories.
140 while test $# -gt 0; do
142 --email) shift; EMAIL
=$1;;
143 --help) echo "$usage"; exit 0;;
144 --version) echo "$version"; exit 0;;
145 -s) shift; srcfile
=$1;;
146 -o) shift; outdir
=$1;;
147 -I) shift; commonarg
="$commonarg -I '$1'"; dirs="$dirs $1";;
148 --docbook) docbook
=yes;;
149 --html) shift; htmlarg
=$1;;
150 --info) shift; infoarg
=$1;;
151 --texi2html) use_texi2html
=1;;
153 echo "$0: Unknown option \`$1'." >&2
154 echo "$0: Try \`--help' for more information." >&2
157 if test -z "$PACKAGE"; then
159 elif test -z "$MANUAL_TITLE"; then
162 echo "$0: extra non-option argument \`$1'." >&2
169 # For most of the following, the base name is just $PACKAGE
172 if test -n "$srcfile"; then
173 # but here, we use the basename of $srcfile
174 base
=`basename "$srcfile"`
176 *.txi|
*.texi|
*.texinfo
) base
=`echo "$base"|sed 's/\.[texinfo]*$//'`;;
179 elif test -s "$srcdir/$PACKAGE.texinfo"; then
180 srcfile
=$srcdir/$PACKAGE.texinfo
181 elif test -s "$srcdir/$PACKAGE.texi"; then
182 srcfile
=$srcdir/$PACKAGE.texi
183 elif test -s "$srcdir/$PACKAGE.txi"; then
184 srcfile
=$srcdir/$PACKAGE.txi
186 echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
190 if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template
; then
191 echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
192 echo "$0: it is available from $templateurl." >&2
196 # Function to return size of $1 in something resembling kilobytes.
199 size
=`ls -ksl $1 | awk '{print $1}'`
203 # copy_images OUTDIR HTML-FILE...
204 # -------------------------------
205 # Copy all the images needed by the HTML-FILEs into OUTDIR. Look
206 # for them in the -I directories.
219 /<img src="(.*?)"/g && ++$need{$1};
222 #print "$me: @{[keys %need]}\n"; # for debugging, show images found.
223 FILE: for my $f (keys %need) {
227 my $dest = dirname ("$odir/$f");
230 -d $dest || mkpath ($dest)
231 || die "$me: cannot mkdir $dest: $!\n";
234 copy ("$d/$f", $dest)
235 || die "$me: cannot copy $d/$f to $dest: $!\n";
239 die "$me: $ARGV: cannot find image $f\n";
246 /*) abs_outdir
=$outdir;;
247 *) abs_outdir
=$srcdir/$outdir;;
250 echo "Generating output formats for $srcfile"
252 cmd
="$SETLANG $MAKEINFO -o $PACKAGE.info $commonarg $infoarg \"$srcfile\""
253 echo "Generating info file(s)... ($cmd)"
256 tar czf
"$outdir/$PACKAGE.info.tar.gz" $PACKAGE.info
*
257 info_tgz_size
=`calcsize "$outdir/$PACKAGE.info.tar.gz"`
258 # do not mv the info files, there's no point in having them available
259 # separately on the web.
261 cmd
="$SETLANG $TEXI2DVI $commonarg \"$srcfile\""
262 echo "Generating dvi ... ($cmd)"
265 # compress/finish dvi:
266 gzip -f -9 $PACKAGE.dvi
267 dvi_gz_size
=`calcsize $PACKAGE.dvi.gz`
268 mv $PACKAGE.dvi.gz
"$outdir/"
270 cmd
="$SETLANG $TEXI2DVI --pdf $commonarg \"$srcfile\""
271 echo "Generating pdf ... ($cmd)"
273 pdf_size
=`calcsize $PACKAGE.pdf`
274 mv $PACKAGE.pdf
"$outdir/"
276 opt
="-o $PACKAGE.txt --no-split --no-headers $commonarg"
277 cmd
="$SETLANG $MAKEINFO $opt \"$srcfile\""
278 echo "Generating ASCII... ($cmd)"
280 ascii_size
=`calcsize $PACKAGE.txt`
281 gzip -f -9 -c $PACKAGE.txt
>"$outdir/$PACKAGE.txt.gz"
282 ascii_gz_size
=`calcsize "$outdir/$PACKAGE.txt.gz"`
283 mv $PACKAGE.txt
"$outdir/"
287 opt
="--split=$1 $commonarg $htmlarg --node-files"
288 cmd
="$SETLANG $TEXI2HTML --output $PACKAGE.html $opt \"$srcfile\""
289 echo "Generating html by $1... ($cmd)"
291 split_html_dir
=$PACKAGE.html
293 cd ${split_html_dir} ||
exit 1
294 ln -sf ${PACKAGE}.html index.html
295 tar -czf "$abs_outdir/${PACKAGE}.html_$1.tar.gz" -- *.html
297 eval html_
$1_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"`
298 rm -f "$outdir"/html_
$1/*.html
299 mkdir
-p "$outdir/html_$1/"
300 mv ${split_html_dir}/*.html
"$outdir/html_$1/"
301 rmdir ${split_html_dir}
304 if test -z "$use_texi2html"; then
305 opt
="--no-split --html -o $PACKAGE.html $commonarg $htmlarg"
306 cmd
="$SETLANG $MAKEINFO $opt \"$srcfile\""
307 echo "Generating monolithic html... ($cmd)"
308 rm -rf $PACKAGE.html
# in case a directory is left over
310 html_mono_size
=`calcsize $PACKAGE.html`
311 gzip -f -9 -c $PACKAGE.html
>"$outdir/$PACKAGE.html.gz"
312 html_mono_gz_size
=`calcsize "$outdir/$PACKAGE.html.gz"`
313 copy_images
"$outdir/" $PACKAGE.html
314 mv $PACKAGE.html
"$outdir/"
316 opt
="--html -o $PACKAGE.html $commonarg $htmlarg"
317 cmd
="$SETLANG $MAKEINFO $opt \"$srcfile\""
318 echo "Generating html by node... ($cmd)"
320 split_html_dir
=$PACKAGE.html
321 copy_images
$split_html_dir/ $split_html_dir/*.html
323 cd $split_html_dir ||
exit 1
324 tar -czf "$abs_outdir/$PACKAGE.html_node.tar.gz" -- *
326 html_node_tgz_size
=`calcsize "$outdir/$PACKAGE.html_node.tar.gz"`
327 rm -rf "$outdir/html_node/"
328 mv $split_html_dir "$outdir/html_node/"
330 opt
="--output $PACKAGE.html $commonarg $htmlarg"
331 cmd
="$SETLANG $TEXI2HTML $opt \"$srcfile\""
332 echo "Generating monolithic html... ($cmd)"
333 rm -rf $PACKAGE.html
# in case a directory is left over
335 html_mono_size
=`calcsize $PACKAGE.html`
336 gzip -f -9 -c $PACKAGE.html
>"$outdir/$PACKAGE.html.gz"
337 html_mono_gz_size
=`calcsize "$outdir/$PACKAGE.html.gz"`
338 mv $PACKAGE.html
"$outdir/"
345 echo Making .
tar.gz
for sources...
349 srcfiles
=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null` || true
350 tar cvzfh
"$abs_outdir/$PACKAGE.texi.tar.gz" $srcfiles
352 texi_tgz_size
=`calcsize "$outdir/$PACKAGE.texi.tar.gz"`
354 if test -n "$docbook"; then
355 opt
="-o - --docbook $commonarg"
356 cmd
="$SETLANG $MAKEINFO $opt \"$srcfile\" >${srcdir}/$PACKAGE-db.xml"
357 echo "Generating docbook XML... ($cmd)"
359 docbook_xml_size
=`calcsize $PACKAGE-db.xml`
360 gzip -f -9 -c $PACKAGE-db.xml
>"$outdir/$PACKAGE-db.xml.gz"
361 docbook_xml_gz_size
=`calcsize "$outdir/$PACKAGE-db.xml.gz"`
362 mv $PACKAGE-db.xml
"$outdir/"
364 split_html_db_dir
=html_node_db
365 opt
="$commonarg -o $split_html_db_dir"
366 cmd
="$DOCBOOK2HTML $opt \"${outdir}/$PACKAGE-db.xml\""
367 echo "Generating docbook HTML... ($cmd)"
370 cd ${split_html_db_dir} ||
exit 1
371 tar -czf "$abs_outdir/${PACKAGE}.html_node_db.tar.gz" -- *.html
373 html_node_db_tgz_size
=`calcsize "$outdir/${PACKAGE}.html_node_db.tar.gz"`
374 rm -f "$outdir"/html_node_db
/*.html
375 mkdir
-p "$outdir/html_node_db"
376 mv ${split_html_db_dir}/*.html
"$outdir/html_node_db/"
377 rmdir ${split_html_db_dir}
379 cmd
="$DOCBOOK2TXT \"${outdir}/$PACKAGE-db.xml\""
380 echo "Generating docbook ASCII... ($cmd)"
382 docbook_ascii_size
=`calcsize $PACKAGE-db.txt`
383 mv $PACKAGE-db.txt
"$outdir/"
385 cmd
="$DOCBOOK2PDF \"${outdir}/$PACKAGE-db.xml\""
386 echo "Generating docbook PDF... ($cmd)"
388 docbook_pdf_size
=`calcsize $PACKAGE-db.pdf`
389 mv $PACKAGE-db.pdf
"$outdir/"
392 echo "Writing index file..."
393 if test -z "$use_texi2html"; then
394 CONDS
="/%%IF *HTML_SECTION%%/,/%%ENDIF *HTML_SECTION%%/d;\
395 /%%IF *HTML_CHAPTER%%/,/%%ENDIF *HTML_CHAPTER%%/d"
397 CONDS
="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d"
400 curdate
=`$SETLANG date '+%B %d, %Y'`
402 -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
403 -e "s!%%EMAIL%%!$EMAIL!g" \
404 -e "s!%%PACKAGE%%!$PACKAGE!g" \
405 -e "s!%%DATE%%!$curdate!g" \
406 -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
407 -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
408 -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
409 -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \
410 -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \
411 -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
412 -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
413 -e "s!%%PDF_SIZE%%!$pdf_size!g" \
414 -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
415 -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
416 -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
417 -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
418 -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
419 -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
420 -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
421 -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
422 -e "s,%%SCRIPTURL%%,$scripturl,g" \
423 -e "s!%%SCRIPTNAME%%!$prog!g" \
425 $GENDOCS_TEMPLATE_DIR/gendocs_template
>"$outdir/index.html"
427 echo "Done, see $outdir/ subdirectory for new files."
430 # eval: (add-hook 'write-file-hooks 'time-stamp)
431 # time-stamp-start: "scriptversion="
432 # time-stamp-format: "%:y-%02m-%02d.%02H"
433 # time-stamp-end: "$"