| <section xmlns="http://docbook.org/ns/docbook" version="5.0" | |
| xml:id="appendix.porting.doc" xreflabel="Documentation Hacking"> | |
| <?dbhtml filename="documentation_hacking.html"?> | |
| <info><title>Writing and Generating Documentation</title> | |
| <keywordset> | |
| <keyword>ISO C++</keyword> | |
| <keyword>documentation</keyword> | |
| <keyword>style</keyword> | |
| <keyword>docbook</keyword> | |
| <keyword>doxygen</keyword> | |
| </keywordset> | |
| </info> | |
| <section xml:id="doc.intro"> | |
| <info> | |
| <title>Introduction</title> | |
| </info> | |
| <para> | |
| Documentation for the GNU C++ Library is created from three | |
| independent sources: a manual, a FAQ, and an API reference. | |
| </para> | |
| <para> | |
| The sub-directory <filename class="directory">doc</filename> | |
| within the main source directory contains | |
| <filename>Makefile.am</filename> and | |
| <filename>Makefile.in</filename>, which provide rules for | |
| generating documentation, described in excruciating detail | |
| below. The <filename class="directory">doc</filename> | |
| sub-directory also contains three directories: <filename | |
| class="directory">doxygen</filename>, which contains scripts and | |
| fragments for <command>doxygen</command>, <filename | |
| class="directory">html</filename>, which contains an html | |
| version of the manual, and <filename | |
| class="directory">xml</filename>, which contains an xml version | |
| of the manual. | |
| </para> | |
| <para> | |
| Diverging from established documentation conventions in the rest | |
| of the GCC project, libstdc++ does not use Texinfo as a markup | |
| language. Instead, Docbook is used to create the manual and the | |
| FAQ, and Doxygen is used to construct the API | |
| reference. Although divergent, this conforms to the GNU Project | |
| recommendations as long as the output is of sufficient quality, | |
| as per | |
| <link xmlns:xlink="http://www.w3.org/1999/xlink" | |
| xlink:href="http://www.gnu.org/prep/standards/standards.html#Documentation"> | |
| GNU Manuals</link>. | |
| </para> | |
| </section> | |
| <section xml:id="doc.generation"> | |
| <info> | |
| <title>Generating Documentation</title> | |
| </info> | |
| <para> | |
| Certain Makefile rules are required by the GNU Coding | |
| Standards. These standard rules generate HTML, PDF, XML, or man | |
| files. For each of the generative rules, there is an additional | |
| install rule that is used to install any generated documentation | |
| files into the prescribed installation directory. Files are | |
| installed into <filename class="directory">share/doc</filename> | |
| or <filename class="directory">share/man</filename> directories. | |
| </para> | |
| <para> | |
| The standard Makefile rules are conditionally supported, based | |
| on the results of examining the host environment for | |
| prerequisites at configuration time. If requirements are not | |
| found, the rule is aliased to a dummy rule that does nothing, | |
| and produces no documentation. If the requirements are found, | |
| the rule forwards to a private rule that produces the requested | |
| documentation. | |
| </para> | |
| <para> | |
| For more details on what prerequisites were found and where, | |
| please consult the file <filename>config.log</filename> in the | |
| libstdc++ build directory. Compare this log to what is expected | |
| for the relevant Makefile conditionals: | |
| <literal>BUILD_INFO</literal>, <literal>BUILD_XML</literal>, | |
| <literal>BUILD_HTML</literal>, <literal>BUILD_MAN</literal>, | |
| <literal>BUILD_PDF</literal>, and <literal>BUILD_EPUB</literal>. | |
| </para> | |
| <para> | |
| Supported Makefile rules: | |
| </para> | |
| <variablelist> | |
| <varlistentry> | |
| <term> | |
| <emphasis>make html</emphasis> | |
| </term> | |
| <term> | |
| <emphasis>make install-html</emphasis> | |
| </term> | |
| <listitem> | |
| <para> | |
| Generates multi-page HTML documentation, and installs it | |
| in the following directories: | |
| </para> | |
| <para> | |
| <filename>doc/libstdc++/libstdc++-api.html</filename> | |
| </para> | |
| <para> | |
| <filename>doc/libstdc++/libstdc++-manual.html</filename> | |
| </para> | |
| </listitem> | |
| </varlistentry> | |
| <varlistentry> | |
| <term> | |
| <emphasis>make pdf</emphasis> | |
| </term> | |
| <term> | |
| <emphasis>make install-pdf</emphasis> | |
| </term> | |
| <listitem> | |
| <para> | |
| Generates indexed PDF documentation, and installs it as | |
| the following files: | |
| </para> | |
| <para> | |
| <filename>doc/libstdc++/libstdc++-api.pdf</filename> | |
| </para> | |
| <para> | |
| <filename>doc/libstdc++/libstdc++-manual.pdf</filename> | |
| </para> | |
| </listitem> | |
| </varlistentry> | |
| <varlistentry> | |
| <term> | |
| <emphasis>make man</emphasis> | |
| </term> | |
| <term> | |
| <emphasis>make install-man</emphasis> | |
| </term> | |
| <listitem> | |
| <para> | |
| Generates man pages, and installs it in the following directory: | |
| </para> | |
| <para> | |
| <filename class="directory">man/man3/</filename> | |
| </para> | |
| <para> | |
| The generated man pages are namespace-qualified, so to look at | |
| the man page for <classname>vector</classname>, one would use | |
| <command>man std::vector</command>. | |
| </para> | |
| </listitem> | |
| </varlistentry> | |
| <varlistentry> | |
| <term> | |
| <emphasis>make epub</emphasis> | |
| </term> | |
| <term> | |
| <emphasis>make install-epub</emphasis> | |
| </term> | |
| <listitem> | |
| <para> | |
| Generates documentation in the ebook/portable electronic | |
| reader format called Epub, and installs it as the | |
| following file. | |
| </para> | |
| <para> | |
| <filename>doc/libstdc++/libstdc++-manual.epub</filename> | |
| </para> | |
| </listitem> | |
| </varlistentry> | |
| <varlistentry> | |
| <term> | |
| <emphasis>make xml</emphasis> | |
| </term> | |
| <term> | |
| <emphasis>make install-xml</emphasis> | |
| </term> | |
| <listitem> | |
| <para> | |
| Generates single-file XML documentation, and installs it | |
| as the following files: | |
| </para> | |
| <para> | |
| <filename>doc/libstdc++/libstdc++-api-single.xml</filename> | |
| </para> | |
| <para> | |
| <filename>doc/libstdc++/libstdc++-manual-single.xml</filename> | |
| </para> | |
| </listitem> | |
| </varlistentry> | |
| </variablelist> | |
| <para> | |
| Makefile rules for several other formats are explicitly not | |
| supported, and are always aliased to dummy rules. These | |
| unsupported formats are: <emphasis>info</emphasis>, | |
| <emphasis>ps</emphasis>, and <emphasis>dvi</emphasis>. | |
| </para> | |
| </section> | |
| <section xml:id="doc.doxygen"><info><title>Doxygen</title></info> | |
| <section xml:id="doxygen.prereq"><info><title>Prerequisites</title></info> | |
| <table frame="all" xml:id="table.doxygen_prereq"> | |
| <title>Doxygen Prerequisites</title> | |
| <tgroup cols="3" align="center" colsep="1" rowsep="1"> | |
| <colspec colname="c1"/> | |
| <colspec colname="c2"/> | |
| <colspec colname="c3"/> | |
| <thead> | |
| <row> | |
| <entry>Tool</entry> | |
| <entry>Version</entry> | |
| <entry>Required By</entry> | |
| </row> | |
| </thead> | |
| <tbody> | |
| <row> | |
| <entry>coreutils</entry> | |
| <entry>8.5</entry> | |
| <entry>all</entry> | |
| </row> | |
| <row> | |
| <entry>bash</entry> | |
| <entry>4.1</entry> | |
| <entry>all</entry> | |
| </row> | |
| <row> | |
| <entry>doxygen</entry> | |
| <entry>1.9.1</entry> | |
| <entry>all</entry> | |
| </row> | |
| <row> | |
| <entry>graphviz</entry> | |
| <entry>2.26</entry> | |
| <entry>graphical hierarchies</entry> | |
| </row> | |
| <row> | |
| <entry>pdflatex</entry> | |
| <entry>2007-59</entry> | |
| <entry>pdf output</entry> | |
| </row> | |
| </tbody> | |
| </tgroup> | |
| </table> | |
| <para> | |
| Prerequisite tools are Bash 2.0 or later, | |
| <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.doxygen.nl">Doxygen</link> | |
| 1.9.1 or later (for best results use at least 1.9.6), and | |
| the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.gnu.org/software/coreutils/">GNU | |
| coreutils</link>. (GNU versions of find, xargs, and possibly | |
| sed and grep are used, just because the GNU versions make | |
| things very easy.) | |
| </para> | |
| <para> | |
| To generate the pretty pictures and hierarchy | |
| graphs, the | |
| <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.graphviz.org">Graphviz</link> package | |
| will need to be installed. For PDF | |
| output, <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://tug.org/applications/pdftex/"> | |
| pdflatex</link> is required as well as a number of TeX packages | |
| such as <package>texlive-xtab</package> and | |
| <package>texlive-tocloft</package>. | |
| </para> | |
| <para> | |
| Be warned the PDF file generated via doxygen is extremely | |
| large. At last count, the PDF file is over three thousand | |
| pages. Generating this document taxes the underlying TeX | |
| formatting system, and will require the expansion of TeX's memory | |
| capacity. Specifically, the <literal>pool_size</literal> | |
| variable in the configuration file <filename>texmf.cnf</filename> may | |
| need to be increased by a minimum factor of two. Alternatively, using | |
| <userinput>LATEX_CMD=lualatex</userinput> might allow the docs to be | |
| build without running out of memory. | |
| </para> | |
| </section> | |
| <section xml:id="doxygen.rules"><info><title>Generating the Doxygen Files</title></info> | |
| <para> | |
| The following Makefile rules run Doxygen to generate HTML | |
| docs, XML docs, XML docs as a single file, PDF docs, and the | |
| man pages. These rules are not conditional! If the required | |
| tools are not found, or are the wrong versions, the rule may | |
| end in an error. | |
| </para> | |
| <para> | |
| <screen><userinput>make doc-html-doxygen</userinput></screen> | |
| </para> | |
| <para> | |
| <screen><userinput>make doc-xml-doxygen</userinput></screen> | |
| </para> | |
| <para> | |
| <screen><userinput>make doc-xml-single-doxygen</userinput></screen> | |
| </para> | |
| <para> | |
| <screen><userinput>make doc-pdf-doxygen</userinput></screen> | |
| </para> | |
| <para> | |
| <screen><userinput>make doc-man-doxygen</userinput></screen> | |
| </para> | |
| <para> | |
| Generated files are output into separate sub directories of | |
| <filename class="directory">doc/doxygen/</filename> in the | |
| build directory, based on the output format. For instance, the | |
| HTML docs will be in <filename class="directory">doc/doxygen/html</filename>. | |
| </para> | |
| <para> | |
| Careful observers will see that the Makefile rules simply call | |
| a script from the source tree, <filename>run_doxygen</filename>, which | |
| does the actual work of running Doxygen and then (most | |
| importantly) massaging the output files. If for some reason | |
| you prefer to not go through the Makefile, you can call this | |
| script directly. (Start by passing <literal>--help</literal>.) | |
| </para> | |
| <para> | |
| If you wish to tweak the Doxygen settings, do so by editing | |
| <filename>doc/doxygen/user.cfg.in</filename>. Notes to fellow | |
| library hackers are written in triple-# comments. | |
| </para> | |
| </section> | |
| <section xml:id="doxygen.debug"> | |
| <info><title>Debugging Generation</title></info> | |
| <para> | |
| Sometimes, mis-configuration of the pre-requisite tools can | |
| lead to errors when attempting to build the | |
| documentation. Here are some of the obvious errors, and ways | |
| to fix some common issues that may appear quite cryptic. | |
| </para> | |
| <para> | |
| First, if using a rule like <code>make pdf</code>, try to | |
| narrow down the scope of the error to either docbook | |
| (<code>make doc-pdf-docbook</code>) or doxygen (<code>make | |
| doc-pdf-doxygen</code>). | |
| </para> | |
| <para> | |
| Working on the doxygen path only, closely examine the | |
| contents of the following build directory: <filename | |
| class="directory">build/target/libstdc++-v3/doc/doxygen/latex</filename>. | |
| Pay attention to three files enclosed within, annotated as follows. | |
| </para> | |
| <itemizedlist> | |
| <listitem> | |
| <para> | |
| <emphasis>refman.tex</emphasis> | |
| </para> | |
| <para> | |
| The actual latex file, or partial latex file. This is generated | |
| via <command>doxygen</command>, and is the LaTeX version of the | |
| Doxygen XML file <filename>libstdc++-api.xml</filename>. Go to a specific | |
| line, and look at the generated LaTeX, and try to deduce what | |
| markup in <filename>libstdc++-api.xml</filename> is causing it. | |
| </para> | |
| </listitem> | |
| <listitem> | |
| <para> | |
| <emphasis>refman.log</emphasis> | |
| </para> | |
| <para> | |
| A log created by <command>latex</command> as it processes the | |
| <filename>refman.tex</filename> file. If generating the PDF fails | |
| look at the end of this file for errors such as: | |
| <screen> | |
| ! LaTeX Error: File `xtab.sty' not found. | |
| </screen> | |
| This indicates a required TeX package is missing. For the example | |
| above the <package>texlive-xtab</package> package needs to be | |
| installed. | |
| </para> | |
| </listitem> | |
| <listitem> | |
| <para> | |
| <emphasis>refman.out</emphasis> | |
| </para> | |
| <para> | |
| A log of the compilation of the converted LaTeX form to PDF. This | |
| is a linear list, from the beginning of the | |
| <filename>refman.tex</filename> file: the last entry of this file | |
| should be the end of the LaTeX file. If it is truncated, then you | |
| know that the last entry is the last part of the generated LaTeX | |
| source file that is valid. Often this file contains an error with | |
| a specific line number of <filename>refman.tex</filename> that is | |
| incorrect, or will have clues at the end of the file with the dump | |
| of the memory usage of LaTeX. | |
| </para> | |
| </listitem> | |
| </itemizedlist> | |
| <para> | |
| If the error at hand is not obvious after examination, a | |
| fall-back strategy is to start commenting out the doxygen | |
| input sources, which can be found in | |
| <filename>doc/doxygen/user.cfg.in</filename>, look for the | |
| <literal>INPUT</literal> tag. Start by commenting out whole | |
| directories of header files, until the offending header is | |
| identified. Then, read the latex log files to try and find | |
| surround text, and look for that in the offending header. | |
| </para> | |
| </section> | |
| <section xml:id="doxygen.markup"><info><title>Markup</title></info> | |
| <para> | |
| In general, libstdc++ files should be formatted according to | |
| the rules found in the | |
| <link linkend="contrib.coding_style">Coding Standard</link>. Before | |
| any doxygen-specific formatting tweaks are made, please try to | |
| make sure that the initial formatting is sound. | |
| </para> | |
| <para> | |
| Adding Doxygen markup to a file (informally called | |
| <quote>doxygenating</quote>) is very simple. See the | |
| <link xmlns:xlink="http://www.w3.org/1999/xlink" | |
| xlink:href="https://www.doxygen.nl/download.html#latestman">Doxygen | |
| manual</link> for details. | |
| We try to use a very-recent version of Doxygen. | |
| </para> | |
| <para> | |
| For classes, use | |
| <classname>deque</classname>/<classname>vector</classname>/<classname>list</classname> | |
| and <classname>std::pair</classname> as examples. For | |
| functions, see their member functions, and the free functions | |
| in <filename class="headerfile">stl_algobase.h</filename>. Member | |
| functions of other container-like types should read similarly to | |
| these member functions. | |
| </para> | |
| <para> | |
| Some commentary to accompany | |
| the first list in the <link xmlns:xlink="http://www.w3.org/1999/xlink" | |
| xlink:href="https://www.doxygen.nl/manual/docblocks.html">Special | |
| Documentation Blocks</link> section of the Doxygen manual: | |
| </para> | |
| <orderedlist inheritnum="ignore" continuation="restarts"> | |
| <listitem> | |
| <para>For longer comments, use the Javadoc style...</para> | |
| </listitem> | |
| <listitem> | |
| <para> | |
| ...not the Qt style. The intermediate *'s are preferred. | |
| </para> | |
| </listitem> | |
| <listitem> | |
| <para> | |
| Use the triple-slash style only for one-line comments (the | |
| <quote>brief</quote> mode). | |
| </para> | |
| </listitem> | |
| <listitem> | |
| <para> | |
| This is disgusting. Don't do this. | |
| </para> | |
| </listitem> | |
| </orderedlist> | |
| <para> | |
| Some specific guidelines: | |
| </para> | |
| <para> | |
| Use the @-style of commands, not the !-style. Please be | |
| careful about whitespace in your markup comments. Most of the | |
| time it doesn't matter; doxygen absorbs most whitespace, and | |
| both HTML and *roff are agnostic about whitespace. However, | |
| in <pre> blocks and @code/@endcode sections, spacing can | |
| have <quote>interesting</quote> effects. | |
| </para> | |
| <para> | |
| Use either kind of grouping, as | |
| appropriate. <filename>doxygroups.cc</filename> exists for this | |
| purpose. See <filename class="headerfile">stl_iterator.h</filename> | |
| for a good example of the <quote>other</quote> kind of grouping. | |
| </para> | |
| <para> | |
| Markdown can be used for formatting text. Doxygen is configured to | |
| support this, and it is a good compromise between readable comments | |
| in the C++ source and nice formatting in the generated HTML. | |
| Please format the names of function parameters in either code font | |
| or italics. Use underscores or @e for emphasis when necessary. | |
| Use backticks or @c to refer to other standard names. | |
| (Examples of all these abound in the present code.) | |
| </para> | |
| <para> | |
| Complicated math functions should use the multi-line format. | |
| An example from <filename class="headerfile">random.h</filename>: | |
| </para> | |
| <para> | |
| <literallayout class="normal"> | |
| /** | |
| * @brief A model of a linear congruential random number generator. | |
| * | |
| * @f[ | |
| * x_{i+1}\leftarrow(ax_{i} + c) \bmod m | |
| * @f] | |
| */ | |
| </literallayout> | |
| </para> | |
| <para> | |
| One area of note is the markup required for | |
| <literal>@file</literal> markup in header files. Two details | |
| are important: for filenames that have the same name in | |
| multiple directories, include part of the installed path to | |
| disambiguate. For example: | |
| </para> | |
| <para> | |
| <literallayout class="normal"> | |
| /** @file debug/vector | |
| * This file is a GNU debug extension to the Standard C++ Library. | |
| */ | |
| </literallayout> | |
| </para> | |
| <para> | |
| The other relevant detail for header files is the use of a | |
| libstdc++-specific doxygen alias that helps distinguish | |
| between public header files (like <filename class="headerfile">random</filename>) | |
| from implementation or private header files (like | |
| <filename class="headerfile">bits/c++config.h</filename>.) This alias is spelled | |
| <literal>@headername</literal> and can take one or two | |
| arguments that detail the public header file or files that | |
| should be included to use the contents of the file. All header | |
| files that are not intended for direct inclusion must use | |
| <literal>headername</literal> in the <literal>file</literal> | |
| block. An example: | |
| </para> | |
| <para> | |
| <literallayout class="normal"> | |
| /** @file bits/basic_string.h | |
| * This is an internal header file, included by other library headers. | |
| * Do not attempt to use it directly. @headername{string} | |
| */ | |
| </literallayout> | |
| </para> | |
| <para> | |
| Be careful about using certain, special characters when | |
| writing Doxygen comments. Single and double quotes, and | |
| separators in filenames are two common trouble spots. When in | |
| doubt, consult the following table. | |
| </para> | |
| <table frame="all" xml:id="table.doxygen_cmp"> | |
| <title>HTML to Doxygen Markup Comparison</title> | |
| <tgroup cols="2" align="left" colsep="1" rowsep="1"> | |
| <colspec colname="c1"/> | |
| <colspec colname="c2"/> | |
| <thead> | |
| <row> | |
| <entry>HTML</entry> | |
| <entry>Doxygen</entry> | |
| <entry>Markdown</entry> | |
| </row> | |
| </thead> | |
| <tbody> | |
| <row> | |
| <entry>\</entry> | |
| <entry>\\</entry> | |
| <entry>\\</entry> | |
| </row> | |
| <row> | |
| <entry>"</entry> | |
| <entry>\"</entry> | |
| <entry>\"</entry> | |
| </row> | |
| <row> | |
| <entry>'</entry> | |
| <entry>\'</entry> | |
| <entry>\'</entry> | |
| </row> | |
| <row> | |
| <entry><i></entry> | |
| <entry>@a word</entry> | |
| <entry>_word_ or *word*</entry> | |
| </row> | |
| <row> | |
| <entry><b></entry> | |
| <entry>@b word</entry> | |
| <entry>**word** or __word__</entry> | |
| </row> | |
| <row> | |
| <entry><code></entry> | |
| <entry>@c word</entry> | |
| <entry>`word`</entry> | |
| </row> | |
| <row> | |
| <entry><em></entry> | |
| <entry>@a word</entry> | |
| <entry>_word_ or *word*</entry> | |
| </row> | |
| <row> | |
| <entry><em></entry> | |
| <entry><em>two words or more</em></entry> | |
| <entry>_two words or more_</entry> | |
| </row> | |
| </tbody> | |
| </tgroup> | |
| </table> | |
| </section> | |
| </section> | |
| <section xml:id="doc.docbook"><info><title>Docbook</title></info> | |
| <section xml:id="docbook.prereq"><info><title>Prerequisites</title></info> | |
| <table frame="all" xml:id="table.docbook_prereq"> | |
| <title>Docbook Prerequisites</title> | |
| <tgroup cols="3" align="center" colsep="1" rowsep="1"> | |
| <colspec colname="c1"/> | |
| <colspec colname="c2"/> | |
| <colspec colname="c3"/> | |
| <thead> | |
| <row> | |
| <entry>Tool</entry> | |
| <entry>Version</entry> | |
| <entry>Required By</entry> | |
| </row> | |
| </thead> | |
| <tbody> | |
| <row> | |
| <entry>docbook5-style-xsl</entry> | |
| <entry>1.76.1</entry> | |
| <entry>all</entry> | |
| </row> | |
| <row> | |
| <entry>xsltproc</entry> | |
| <entry>1.1.26</entry> | |
| <entry>all</entry> | |
| </row> | |
| <row> | |
| <entry>xmllint</entry> | |
| <entry>2.7.7</entry> | |
| <entry>validation</entry> | |
| </row> | |
| <row> | |
| <entry>dblatex</entry> | |
| <entry>0.3</entry> | |
| <entry>pdf output</entry> | |
| </row> | |
| <row> | |
| <entry>pdflatex</entry> | |
| <entry>2007-59</entry> | |
| <entry>pdf output</entry> | |
| </row> | |
| <row> | |
| <entry>docbook2X</entry> | |
| <entry>0.8.8</entry> | |
| <entry>info output</entry> | |
| </row> | |
| <row> | |
| <entry>epub3 stylesheets</entry> | |
| <entry>b3</entry> | |
| <entry>epub output</entry> | |
| </row> | |
| </tbody> | |
| </tgroup> | |
| </table> | |
| <para> | |
| An XML editor is recommended for editing the DocBook sources. Many | |
| exist: some notable options | |
| include <command>emacs</command>, <application>Kate</application>, | |
| or <application>Conglomerate</application>. | |
| </para> | |
| <para> | |
| Some editors support special <quote>XML Validation</quote> | |
| modes that can validate the file as it is | |
| produced. Recommended is the <command>nXML Mode</command> | |
| for <command>emacs</command>. | |
| </para> | |
| <para> | |
| Besides an editor, additional DocBook files and XML tools are | |
| also required. | |
| </para> | |
| <para> | |
| Access to the DocBook 5.0 stylesheets and schema is required. The | |
| stylesheets are usually packaged by vendor, in something | |
| like <filename>docbook5-style-xsl</filename>. To exactly match | |
| generated output, please use a version of the stylesheets | |
| equivalent | |
| to <filename>docbook5-style-xsl-1.75.2-3</filename>. The | |
| installation directory for this package corresponds to | |
| the <literal>XSL_STYLE_DIR</literal> | |
| in <filename>doc/Makefile.am</filename> and defaults | |
| to <filename class="directory">/usr/share/sgml/docbook/xsl-ns-stylesheets</filename>. | |
| </para> | |
| <para> | |
| For processing XML, an XSLT processor and some style | |
| sheets are necessary. Defaults are <command>xsltproc</command> | |
| provided by <filename>libxslt</filename>. | |
| </para> | |
| <para> | |
| For validating the XML document, you'll need | |
| something like <command>xmllint</command> and access to the | |
| relevant DocBook schema. These are provided | |
| by a vendor package like <filename>libxml2</filename> and <filename>docbook5-schemas-5.0-4</filename> | |
| </para> | |
| <para> | |
| For PDF output, something that transforms valid Docbook XML to PDF is | |
| required. Possible solutions include <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://dblatex.sourceforge.net">dblatex</link>, | |
| <command>xmlto</command>, or <command>prince</command>. Of | |
| these, <command>dblatex</command> is the default. | |
| Please consult the <email>libstdc++@gcc.gnu.org</email> list when | |
| preparing printed manuals for current best practice and | |
| suggestions. | |
| </para> | |
| <para> | |
| For Texinfo output, something that transforms valid Docbook | |
| XML to Texinfo is required. The default choice is <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://docbook2x.sourceforge.net/">docbook2X</link>. | |
| </para> | |
| <para> | |
| For epub output, the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://sourceforge.net/projects/docbook/files/epub3/">stylesheets</link> for EPUB3 are required. These stylesheets are still in development. To validate the created file, <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://github.com/w3c/epubcheck">epubcheck</link> is necessary. | |
| </para> | |
| </section> | |
| <section xml:id="docbook.rules"><info><title>Generating the DocBook Files</title></info> | |
| <para> | |
| The following Makefile rules generate (in order): an HTML | |
| version of all the DocBook documentation, a PDF version of the | |
| same, and a single XML document. These rules are not | |
| conditional! If the required tools are not found, or are the | |
| wrong versions, the rule may end in an error. | |
| </para> | |
| <para> | |
| <screen><userinput>make doc-html-docbook</userinput></screen> | |
| </para> | |
| <para> | |
| <screen><userinput>make doc-pdf-docbook</userinput></screen> | |
| </para> | |
| <para> | |
| <screen><userinput>make doc-xml-single-docbook</userinput></screen> | |
| </para> | |
| <para> | |
| Generated files are output into separate sub-directores of | |
| <filename class="directory">doc/docbook/</filename> in the | |
| build directory, based on the output format. For instance, the | |
| HTML docs will be in <filename | |
| class="directory">doc/docbook/html</filename>. | |
| </para> | |
| <para> | |
| The <userinput>doc-html-docbook-regenerate</userinput> target will | |
| generate the HTML files and copy them back to the libstdc++ source tree. | |
| This can be used to update the HTML files that are checked in to | |
| version control. | |
| </para> | |
| <para> | |
| If the Docbook stylesheets are installed in a custom location, | |
| one can use the variable <literal>XSL_STYLE_DIR</literal> to | |
| override the Makefile defaults. For example: | |
| </para> | |
| <screen> | |
| <userinput> | |
| make <literal>XSL_STYLE_DIR="/usr/share/xml/docbook/stylesheet/nwalsh"</literal> doc-html-docbook | |
| </userinput> | |
| </screen> | |
| </section> | |
| <section xml:id="docbook.debug"> | |
| <info><title>Debugging Generation</title></info> | |
| <para> | |
| Sometimes, mis-configuration of the pre-requisite tools can | |
| lead to errors when attempting to build the | |
| documentation. Here are some of the obvious errors, and ways | |
| to fix some common issues that may appear quite cryptic. | |
| </para> | |
| <para> | |
| First, if using a rule like <code>make pdf</code>, try to | |
| narrow down the scope of the error to either docbook | |
| (<code>make doc-pdf-docbook</code>) or doxygen (<code>make | |
| doc-pdf-doxygen</code>). | |
| </para> | |
| <para> | |
| Working on the docbook path only, closely examine the | |
| contents of the following build directory: | |
| <filename class="directory">build/target/libstdc++-v3/doc/docbook/latex</filename>. | |
| Pay attention to three files enclosed within, annotated as follows. | |
| </para> | |
| <itemizedlist> | |
| <listitem> | |
| <para> | |
| <emphasis>spine.tex</emphasis> | |
| </para> | |
| <para> | |
| The actual latex file, or partial latex file. This is generated | |
| via <command>dblatex</command>, and is the LaTeX version of the | |
| DocBook XML file <filename>spine.xml</filename>. Go to a specific | |
| line, and look at the generated LaTeX, and try to deduce what | |
| markup in <filename>spine.xml</filename> is causing it. | |
| </para> | |
| </listitem> | |
| <listitem> | |
| <para> | |
| <emphasis>spine.out</emphasis> | |
| </para> | |
| <para> | |
| A log of the conversion from the XML form to the LaTeX form. This | |
| is a linear list, from the beginning of the | |
| <filename>spine.xml</filename> file: the last entry of this file | |
| should be the end of the DocBook file. If it is truncated, then | |
| you know that the last entry is the last part of the XML source | |
| file that is valid. The error is after this point. | |
| </para> | |
| </listitem> | |
| <listitem> | |
| <para> | |
| <emphasis>spine.log</emphasis> | |
| </para> | |
| <para> | |
| A log of the compilation of the converted LaTeX form to pdf. This | |
| is a linear list, from the beginning of the | |
| <filename>spine.tex</filename> file: the last entry of this file | |
| should be the end of the LaTeX file. If it is truncated, then you | |
| know that the last entry is the last part of the generated LaTeX | |
| source file that is valid. Often this file contains an error with | |
| a specific line number of <filename>spine.tex</filename> that is | |
| incorrect. | |
| </para> | |
| </listitem> | |
| </itemizedlist> | |
| <para> | |
| If the error at hand is not obvious after examination, or if one | |
| encounters the inscruitable <quote>Incomplete | |
| \ifmmode</quote> error, a fall-back strategy is to start | |
| commenting out parts of the XML document (regardless of what | |
| this does to over-all document validity). Start by | |
| commenting out each of the largest parts of the | |
| <filename>spine.xml</filename> file, section by section, | |
| until the offending section is identified. | |
| </para> | |
| </section> | |
| <section xml:id="docbook.validation"><info><title>Editing and Validation</title></info> | |
| <para> | |
| After editing the xml sources, please make sure that the XML | |
| documentation and markup is still valid. This can be | |
| done easily, with the following validation rule: | |
| </para> | |
| <screen> | |
| <userinput>make doc-xml-validate-docbook</userinput> | |
| </screen> | |
| <para> | |
| This is equivalent to doing: | |
| </para> | |
| <screen> | |
| <userinput> | |
| xmllint --noout --valid <filename>xml/index.xml</filename> | |
| </userinput> | |
| </screen> | |
| <para> | |
| Please note that individual sections and chapters of the | |
| manual can be validated by substituting the file desired for | |
| <filename>xml/index.xml</filename> in the command | |
| above. Reducing scope in this manner can be helpful when | |
| validation on the entire manual fails. | |
| </para> | |
| <para> | |
| All Docbook xml sources should always validate. No excuses! | |
| </para> | |
| </section> | |
| <section xml:id="docbook.examples"><info><title>File Organization and Basics</title></info> | |
| <literallayout class="normal"> | |
| <emphasis>Which files are important</emphasis> | |
| All Docbook files are in the directory | |
| libstdc++-v3/doc/xml | |
| Inside this directory, the files of importance: | |
| spine.xml - index to documentation set | |
| manual/spine.xml - index to manual | |
| manual/*.xml - individual chapters and sections of the manual | |
| faq.xml - index to FAQ | |
| api.xml - index to source level / API | |
| All *.txml files are template xml files, i.e., otherwise empty files with | |
| the correct structure, suitable for filling in with new information. | |
| <emphasis>Canonical Writing Style</emphasis> | |
| class template | |
| function template | |
| member function template | |
| (via C++ Templates, Vandevoorde) | |
| class in namespace std: allocator, not std::allocator | |
| header file: iostream, not <iostream> | |
| <emphasis>General structure</emphasis> | |
| <set> | |
| <book> | |
| </book> | |
| <book> | |
| <chapter> | |
| </chapter> | |
| </book> | |
| <book> | |
| <part> | |
| <chapter> | |
| <section> | |
| </section> | |
| <sect1> | |
| </sect1> | |
| <sect1> | |
| <sect2> | |
| </sect2> | |
| </sect1> | |
| </chapter> | |
| <chapter> | |
| </chapter> | |
| </part> | |
| </book> | |
| </set> | |
| </literallayout> | |
| </section> | |
| <section xml:id="docbook.markup"><info><title>Markup By Example</title></info> | |
| <para> | |
| Complete details on Docbook markup can be found in the | |
| <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://tdg.docbook.org/tdg/5.0/ref-elements.html">DocBook Element Reference</link>. | |
| An incomplete reference for HTML to Docbook conversion is | |
| detailed in the table below. | |
| </para> | |
| <table frame="all" xml:id="table.docbook_cmp"> | |
| <title>HTML to Docbook XML Markup Comparison</title> | |
| <tgroup cols="2" align="left" colsep="1" rowsep="1"> | |
| <colspec colname="c1"/> | |
| <colspec colname="c2"/> | |
| <thead> | |
| <row> | |
| <entry>HTML</entry> | |
| <entry>Docbook</entry> | |
| </row> | |
| </thead> | |
| <tbody> | |
| <row> | |
| <entry><p></entry> | |
| <entry><para></entry> | |
| </row> | |
| <row> | |
| <entry><pre></entry> | |
| <entry><computeroutput>, <programlisting>, | |
| <literallayout></entry> | |
| </row> | |
| <row> | |
| <entry><ul></entry> | |
| <entry><itemizedlist></entry> | |
| </row> | |
| <row> | |
| <entry><ol></entry> | |
| <entry><orderedlist></entry> | |
| </row> | |
| <row> | |
| <entry><il></entry> | |
| <entry><listitem></entry> | |
| </row> | |
| <row> | |
| <entry><dl></entry> | |
| <entry><variablelist></entry> | |
| </row> | |
| <row> | |
| <entry><dt></entry> | |
| <entry><term></entry> | |
| </row> | |
| <row> | |
| <entry><dd></entry> | |
| <entry><listitem></entry> | |
| </row> | |
| <row> | |
| <entry><a href=""></entry> | |
| <entry><ulink url=""></entry> | |
| </row> | |
| <row> | |
| <entry><code></entry> | |
| <entry><literal>, <programlisting></entry> | |
| </row> | |
| <row> | |
| <entry><strong></entry> | |
| <entry><emphasis></entry> | |
| </row> | |
| <row> | |
| <entry><em></entry> | |
| <entry><emphasis></entry> | |
| </row> | |
| <row> | |
| <entry>"</entry> | |
| <entry><quote></entry> | |
| </row> | |
| </tbody> | |
| </tgroup> | |
| </table> | |
| <para> | |
| And examples of detailed markup for which there are no real HTML | |
| equivalents are listed in the table below. | |
| </para> | |
| <table frame="all" xml:id="table.docbook_elem"> | |
| <title>Docbook XML Element Use</title> | |
| <tgroup cols="2" align="left" colsep="1" rowsep="1"> | |
| <colspec colname="c1"/> | |
| <colspec colname="c2"/> | |
| <thead> | |
| <row> | |
| <entry>Element</entry> | |
| <entry>Use</entry> | |
| </row> | |
| </thead> | |
| <tbody> | |
| <row> | |
| <entry><structname></entry> | |
| <entry><structname>char_traits</structname></entry> | |
| </row> | |
| <row> | |
| <entry><classname></entry> | |
| <entry><classname>string</classname></entry> | |
| </row> | |
| <row> | |
| <entry><function></entry> | |
| <entry> | |
| <para><function>clear()</function></para> | |
| <para><function>fs.clear()</function></para> | |
| </entry> | |
| </row> | |
| <row> | |
| <entry><type></entry> | |
| <entry><type>long long</type></entry> | |
| </row> | |
| <row> | |
| <entry><varname></entry> | |
| <entry><varname>fs</varname></entry> | |
| </row> | |
| <row> | |
| <entry><literal></entry> | |
| <entry> | |
| <para><literal>-Weffc++</literal></para> | |
| <para><literal>rel_ops</literal></para> | |
| </entry> | |
| </row> | |
| <row> | |
| <entry><constant></entry> | |
| <entry> | |
| <para><constant>_GNU_SOURCE</constant></para> | |
| <para><constant>3.0</constant></para> | |
| </entry> | |
| </row> | |
| <row> | |
| <entry><command></entry> | |
| <entry><command>g++</command></entry> | |
| </row> | |
| <row> | |
| <entry><errortext></entry> | |
| <entry><errortext>In instantiation of</errortext></entry> | |
| </row> | |
| <row> | |
| <entry><filename></entry> | |
| <entry> | |
| <para><filename class="headerfile">ctype.h</filename></para> | |
| <para><filename class="directory">/home/gcc/build</filename></para> | |
| <para><filename class="libraryfile">libstdc++.so</filename></para> | |
| </entry> | |
| </row> | |
| </tbody> | |
| </tgroup> | |
| </table> | |
| </section> | |
| </section> | |
| </section> |