1[/
2  Copyright 2015-2017 Peter Dimov
3
4  Distributed under the Boost Software License, Version 1.0.
5
6  See accompanying file LICENSE_1_0.txt or copy at
7  http://boost.org/LICENSE_1_0.txt
8]
9
10[article Boostdep
11  [quickbook 1.6]
12  [id boostdep]
13  [copyright 2014-2017 Peter Dimov]
14  [license Distributed under the
15    [@http://boost.org/LICENSE_1_0.txt Boost Software License, Version 1.0].
16  ]
17]
18
19[template simplesect[title]
20[block '''<simplesect><title>'''[title]'''</title>''']]
21
22[template endsimplesect[]
23[block '''</simplesect>''']]
24
25[section Introduction]
26
27/Boostdep/ is a tool for generating Boost dependency reports. It scans
28the header or source files of the Boost libraries for `#include`
29directives, builds a dependency graph from this information and outputs
30its findings in plain text or HTML.
31
32[section Modular Boost]
33
34/Boostdep/ requires the so-called "modular Boost" directory structure.
35
36If you already have a [@https://svn.boost.org/trac/boost/wiki/ModularBoost
37modular Boost installation], you can skip this section. Otherwise, read on.
38
39Boost libraries reside in subdirectories under the =libs= directory. For
40example, the contents of the Boost.Filesystem library are in =libs/filesystem=.
41This includes the build scripts (in =libs/filesystem/build=), the source files
42(in =libs/filesystem/src=), the tests (in =libs/filesystem/test=), the documentation
43(in =libs/filesystem/doc=), and so on.
44
45In the past, when Boost used SVN as its version control system, the header files
46were an exception. The header files of all libraries resided in the =boost= subdirectory,
47and it wasn't possible to accurately determine which header belonged to which library.
48
49When Boost moved to Git for version control, header files were moved to their corresponding
50libraries, into an =include= subdirectory. The header files of Boost.Filesystem are now in
51=libs/filesystem/include=.
52
53For compatibility, =boost= is now a "virtual" directory, containing links to the headers.
54It's maintained automatically by Boost.Build. (The command =b2 headers= creates or recreates
55the contents of the =boost= directory.)
56
57This new structure allows /Boostdep/ to determine that, when faced with an
58`#include <boost/filesystem.hpp>` directive, that this header is part of Boost.Filesystem, and
59that therefore, the current library being scanned depends on Boost.Filesystem.
60
61Unfortunately, Boost releases do not have this structure. For backward compatibility, they
62have an old-style =boost= directory containing all header files, whereas the per-library =include=
63subdirectories are missing. Therefore, /Boostdep/ will not work with a downloaded Boost release.
64
65To use /Boostdep/, you will have to clone the Boost Git repository instead. To do that, execute the
66following command:
67
68[pre
69git clone https://github.com/boostorg/boost.git boost
70]
71
72This will download the Boost "superproject" (the master project, without any libraries) and place it
73into the subdirectory =boost= of the current directory. To override the directory name, pass it as a
74second argument instead of =boost=:
75
76[pre
77git clone https://github.com/boostorg/boost.git /mydir/
78]
79
80You can now =cd= into the newly created directory with
81
82[pre
83cd /mydir/
84]
85
86This directory is called the "Boost root". All of the commands below assume that it is the current directory.
87
88The above =git clone= commands download the default branch of the Boost Git repository, which is =master=.
89This is the current more-or-less stable version of Boost.
90
91To verify this, issue the command
92
93[pre
94git status
95]
96
97from the Boost root. This will output
98
99[pre
100# On branch master
101nothing to commit, working directory clean
102]
103
104To download a specific release instead, such as 1.58.0, issue the following command after =git clone=, from
105the Boost root:
106
107[pre
108git checkout boost-1.58.0
109]
110
111=git status= will now say
112
113[pre
114# HEAD detached at boost-1.58.0
115nothing to commit, working directory clean
116]
117
118Then, download all the libraries:
119
120[pre
121git submodule update --init
122]
123
124This step will take a while.
125
126If all goes well, you will now have the complete contents of Boost's latest =master= branch (if you didn't =checkout=
127a specific release by name) or the corresponding Boost release (if you did).
128
129You can switch between the =master= branch, the =develop= (unstable) branch, and a release, by issuing the following
130commands:
131
132[:For the =master= branch:]
133
134[pre
135git checkout master
136git pull
137git submodule update --init
138]
139
140[:(=git pull= updates your local copy of the =master= branch from the server, in case it has changed since your initial
141checkout.)]
142
143[:For the =develop= branch:]
144
145[pre
146git checkout develop
147git pull
148git submodule update --init
149]
150
151[:For the =boost-1.58.0= release:]
152
153[pre
154git checkout boost-1.58.0
155git submodule update --init
156]
157
158[:For the =boost-1.57.0= release:]
159
160[pre
161git checkout boost-1.57.0
162git submodule update --init
163]
164
165Note that, while the initial =git submodule update= is quite slow, as it needs to download all the libraries, the
166subsequent invocations are a lot faster.
167
168Also note that if a new Boost library (=libs/convert=, for example) is present in, say, =master=, and you have it checked out,
169when you later switch to =boost-1.58.0=, where this library doesn't exist, Git will not delete =libs/convert=. In this case,
170=git status= will output
171
172[pre
173# HEAD detached at boost-1.58.0
174# Untracked files:
175#   (use "git add <file>..." to include in what will be committed)
176#
177#       libs/convert/
178nothing added to commit but untracked files present (use "git add" to track)
179]
180
181and you will have to remove =libs/convert= by hand.
182
183Once you have the Boost contents which you want to analyze for dependencies, proceed with the next step, building /Boostdep/.
184
185[endsect]
186
187[section Building Boostdep]
188
189To build /Boostdep/, issue the following command from the Boost root:
190
191[pre
192b2 tools/boostdep/build
193]
194
195This will build /Boostdep/ from source using the default "toolset" (a Boost.Build term meaning "compiler") and if successful,
196place it into the =dist/bin= subdirectory. The command assumes that =b2= (the Boost.Build executable) is somewhere in your path.
197If you don't have =b2=, execute
198
199[pre
200.\bootstrap
201]
202
203under Windows or
204
205[pre
206./bootstrap.sh
207]
208
209under Unix-like systems, which should build =b2= and place it into the current directory. You can then use =./b2= instead of =b2=.
210
211[endsect]
212
213[section Running Boostdep]
214
215Once you have built /Boostdep/, execute it with the following command:
216
217[pre
218dist/bin/boostdep
219]
220
221or
222
223[pre
224dist\bin\boostdep
225]
226
227on Windows. The commands below are given as using =dist/bin/boostdep=; if you're using Windows, use =dist\bin\boostdep= instead.
228
229This will print out the following help message:
230
231[pre
232Usage:
233
234    boostdep --list-modules
235    boostdep --list-buildable
236    boostdep \[--track-sources\] \[--track-tests\] --list-dependencies
237    boostdep --list-exceptions
238    boostdep --list-missing-headers
239    boostdep --list-buildable-dependencies
240
241    boostdep \[options\] --module-overview
242    boostdep \[options\] --module-levels
243    boostdep \[options\] --module-weights
244
245    boostdep \[options\] \[--primary\] <module>
246    boostdep \[options\] --secondary <module>
247    boostdep \[options\] --reverse <module>
248    boostdep \[options\] --subset <module>
249    boostdep \[options\] \[--header\] <header>
250    boostdep --test <module>
251    boostdep --cmake <module>
252    boostdep --pkgconfig <module> <version> \[<var>=<value>\] \[<var>=<value>\]...
253    boostdep \[options\] --subset-for <directory>
254
255    \[options\]: \[--boost-root <path-to-boost>\]
256               \[--\[no-\]track-sources\] \[--\[no-\]track-tests\]
257               \[--html-title <title>\] \[--html-footer <footer>\]
258               \[--html-stylesheet <stylesheet>\] \[--html-prefix <prefix>\]
259               \[--html\]
260]
261
262[endsect]
263
264[endsect]
265
266[section Usage]
267
268[section Simple Queries]
269
270To list the dependencies of a specific library, use the command
271
272[pre
273dist/bin/boostdep /library/
274]
275
276For Boost.Filesystem, for example, type
277
278[pre
279dist/bin/boostdep filesystem
280]
281
282This will print out something similar to the following:
283
284[pre
285Primary dependencies for filesystem:
286
287assert:
288    <boost/assert.hpp>
289        from <boost/filesystem/operations.hpp>
290        from <boost/filesystem/path_traits.hpp>
291
292config:
293    <boost/config.hpp>
294        from <boost/filesystem/config.hpp>
295        from <boost/filesystem/convenience.hpp>
296        from <boost/filesystem/fstream.hpp>
297        from <boost/filesystem/operations.hpp>
298        from <boost/filesystem/path.hpp>
299        from <boost/filesystem/path_traits.hpp>
300    /.../
301
302functional:
303    <boost/functional/hash_fwd.hpp>
304        from <boost/filesystem/path.hpp>
305
306io:
307    <boost/io/detail/quoted_manip.hpp>
308        from <boost/filesystem/path.hpp>
309
310iterator:
311    <boost/iterator/iterator_facade.hpp>
312        from <boost/filesystem/path.hpp>
313    /.../
314]
315
316This lists the immediate dependencies of Boost.Filesystem. =assert:= is the library,
317=<boost/assert.hpp>= is the file that is being included, and =from <boost/filesystem/config.hpp>=
318shows where =<boost/assert.hpp>= is being included.
319
320/Boostdep/ names libraries (or modules) after their directory name. The =libs/filesystem=
321directory, for example, is the =filesystem= module. The =libs/numeric/conversion= directory
322is the =numeric~conversion= module, according to the /Boostdep/ naming convention.
323
324The reason forward slashes are replaced with tildes is that =numeric~conversion= is a valid
325file name, which makes generating HTML reports a bit easier.
326
327To see where a given header resides and who includes it, type
328
329[pre
330dist/bin/boostdep /header/
331]
332
333For =boost/filesystem.hpp=, for example, type
334
335[pre
336dist/bin/boostdep boost/filesystem.hpp
337]
338
339This will print something along the lines of
340
341[pre
342Inclusion report for <boost/filesystem.hpp> (in module filesystem):
343
344    from spirit:
345        <boost/spirit/home/x3/support/utility/testing.hpp>
346]
347
348What this tells you is that =boost/filesystem.hpp= is part of Boost.Filesystem and is only
349included once, from =<boost/spirit/home/x3/support/utility/testing.hpp>=. Other headers,
350such as =boost/shared_ptr.hpp=, are more widely used, as you can see if you try
351
352[pre
353dist/bin/boostdep boost/shared_ptr.hpp
354]
355
356To print the reverse dependencies of a library, use
357
358[pre
359dist/bin/boostdep --reverse /library/
360]
361
362For example,
363
364[pre
365dist/bin/boostdep --reverse filesystem
366]
367
368will list which libraries depend on Boost.Filesystem:
369
370[pre
371Reverse dependencies for filesystem:
372
373graph_parallel:
374    <boost/filesystem/operations.hpp>
375        from <boost/graph/distributed/adjlist/serialization.hpp>
376    <boost/filesystem/path.hpp>
377        from <boost/graph/distributed/adjlist/serialization.hpp>
378
379log:
380    <boost/filesystem/config.hpp>
381        from <boost/log/detail/config.hpp>
382    <boost/filesystem/path.hpp>
383        from <boost/log/sinks/event_log_backend.hpp>
384        from <boost/log/sinks/text_file_backend.hpp>
385        from <boost/log/sinks/text_multifile_backend.hpp>
386
387spirit:
388    <boost/filesystem.hpp>
389        from <boost/spirit/home/x3/support/utility/testing.hpp>
390    <boost/filesystem/fstream.hpp>
391        from <boost/spirit/home/x3/support/utility/testing.hpp>
392    <boost/filesystem/path.hpp>
393        from <boost/spirit/home/x3/support/utility/error_reporting.hpp>
394
395wave:
396    <boost/filesystem/operations.hpp>
397        from <boost/wave/util/cpp_include_paths.hpp>
398        from <boost/wave/util/cpp_iterator.hpp>
399        from <boost/wave/util/filesystem_compatibility.hpp>
400    <boost/filesystem/path.hpp>
401        from <boost/wave/cpp_context.hpp>
402        from <boost/wave/util/cpp_include_paths.hpp>
403        from <boost/wave/util/cpp_iterator.hpp>
404        from <boost/wave/util/cpp_macromap.hpp>
405        from <boost/wave/util/filesystem_compatibility.hpp>
406]
407
408[endsect]
409
410[section HTML reports]
411
412The primary purpose of /Boostdep/ is to generate HTML dependency reports. In
413the typical case, two types of reports are generated: overviews that contain
414information for all modules, and per-module ones that list information for a
415specific library.
416
417/Boostdep/ can generate three types of the first kind of report: module overview,
418module levels and module weights. To generate a module overview, use the command
419
420[pre
421dist/bin/boostdep --html --module-overview > module-overview.html
422]
423
424For a module level report, use
425
426[pre
427dist/bin/boostdep --html --module-levels > module-levels.html
428]
429
430For a module weight report, use
431
432[pre
433dist/bin/boostdep --html --module-weights > module-weights.html
434]
435
436In these reports, module names such as /module/ are HTML links to [^/module/.html].
437
438To make these links work as expected, you can generate HTML reports for each module
439as follows:
440
441[pre
442dist/bin/boostdep --html-title "Dependency Report for /module/" --html --primary /module/ --secondary /module/ --reverse /module/ > /module/.html
443]
444
445This step can be automated if you generate a module list first with
446
447[pre
448dist/bin/boostdep --list-modules > list-modules.txt
449]
450
451that will contain one module name per line, and then use a script to issue the previous
452command for each module name.
453
454For more information about the /Boostdep/ options and commands, see the [link boostdep.reference Reference] section.
455
456For an example of a report generation script, see the file =tools/boostdep/examples/report.bat=.
457This is a Windows batch file, but translating it to a Unix-style shell script should be
458straightforward.
459
460For convenience, the contents of =tools/boostdep/examples/report.bat= are given below:
461
462[pre
463SET BOOSTDEP=dist\bin\boostdep.exe
464
465FOR /f %%i IN ('git rev-parse HEAD') DO @SET REV=%%i
466
467FOR /f %%i IN ('git rev-parse --short HEAD') DO @SET SHREV=%%i
468
469FOR /f %%i IN ('git rev-parse --abbrev-ref HEAD') DO @SET BRANCH=%%i
470
471SET FOOTER=Generated on %DATE% %TIME% from revision %REV% on branch '%BRANCH%'
472
473SET OUTDIR=..\report-%BRANCH%-%SHREV%
474
475mkdir %OUTDIR%
476
477%BOOSTDEP% --list-modules > %OUTDIR%\list-modules.txt
478
479%BOOSTDEP% --html-footer "%FOOTER%" --html --module-overview > %OUTDIR%\module-overview.html
480%BOOSTDEP% --html-footer "%FOOTER%" --html --module-levels > %OUTDIR%\module-levels.html
481%BOOSTDEP% --html-footer "%FOOTER%" --html --module-weights > %OUTDIR%\module-weights.html
482
483FOR /f %%i IN (%OUTDIR%\list-modules.txt) DO %BOOSTDEP% --html-title "Dependency Report for %%i" --html-footer "%FOOTER%" --html --primary %%i --secondary %%i --reverse %%i > %OUTDIR%\%%i.html
484]
485
486[endsect]
487
488[endsect]
489
490[section Reference]
491
492[section --list-modules]
493=boostdep --list-modules= prints the module list. /Boostdep/ considers a
494subdirectory of =libs= a module if it contains an =include= subdirectory.
495
496This command is typically used from scripts which then use the list to execute
497a command for each module.
498[endsect]
499
500[section --list-buildable]
501=boostdep --list-buildable= prints a list of the modules that require building.
502/Boostdep/ considers a module to require building if it contains subdirectories
503named =build= and =src=.
504
505This command is typically used from scripts.
506
507[endsect]
508
509[section --list-dependencies]
510=boostdep --list-dependencies= prints a module list in which each line is of the
511form
512
513[pre
514module -> dependency1 dependency2 /.../
515]
516
517By default, only the =include= directory is scanned for `#include` directives. If
518the option =--track-sources= is given, the =src= directory is also scanned. If
519the option =--track-tests= is given, the =test= directory is also scanned.
520
521This command is typically used from scripts. The output is virtually identical to
522=--module-overview= in plain text, but slightly more machine-friendly.
523[endsect]
524
525[section --list-exceptions]
526=boostdep --list-exceptions= prints a list of the headers that are not contained into
527the include directory ot their corresponding module.
528
529[endsect]
530
531[section --list-missing-headers]
532=boostdep --list-missing-headers= prints a list of the headers that are included by
533another header, but are missing.
534
535[endsect]
536
537[section --list-buildable-dependencies]
538=boostdep --list-buildable-dependencies= prints a list of the dependencies of the buildable
539libraries, in the form
540
541[pre
542module = dependency1 dependency2 /.../ ;
543]
544
545This is valid Boost.Build syntax, so the output can be used as a Boost.Build module. All
546header-only libraries are considered one library named =headers=.
547
548[endsect]
549
550[section --module-overview]
551=boostdep --module-overview= generates a module overview, in plain text or HTML. The
552plain text output is of the form
553
554[pre
555Module Overview:
556
557accumulators -> array assert circular_buffer concept_check config core fusion iterator mpl numeric~conversion numeric~ublas parameter preprocessor range static_assert throw_exception tuple type_traits typeof
558algorithm -> array assert bind concept_check config core exception function iterator mpl range regex static_assert tuple type_traits unordered
559align -> assert config core static_assert throw_exception
560]
561
562whereas the HTML output is similar to
563
564[:
565*Module Overview*
566
567[*/accumulators/]
568
569\u21E2 array assert circular_buffer concept_check config core fusion iterator mpl numeric~conversion numeric~ublas parameter preprocessor range static_assert throw_exception tuple type_traits typeof
570]
571
572where /accumulators/ is a link to =accumulators.html=.
573
574As before, if =--track-sources= is given, the =src= subdirectory is scanned for `#include` directives.
575
576HTML output is enabled by the =--html= option. The =--html-title= and =--html-footer= options set the HTML =<title>=
577and the page footer and need to precede =--html=, like in the following example:
578
579[pre
580dist/bin/boostdep --html-title "Module Overview" --html-footer "Generated on 21.05.2015 20:53:11" --html --module-overview > module-overview.html
581]
582
583[endsect]
584
585[section --module-levels]
586
587=boostdep --module-levels= generates a report that groups modules by level. Levels are determined in such
588a way so that a module of level =N= never depends on modules of levels greater than =N=, and in the absence
589of cyclic dependencies, doesn't depend on other modules of level =N=. It takes the same options as
590=--module-overview=.
591
592[pre
593dist/bin/boostdep --html-title "Module Levels" --html-footer "Generated on 21.05.2015 20:53:11" --html --module-levels > module-levels.html
594]
595
596[endsect]
597
598[section --module-weights]
599
600=boostdep --module-weights= generates a report that lists modules by weight. A module weight is the total number of
601its dependencies. This includes the indirect dependencies.
602
603=--module-weights= takes the same options as =--module-overview=.
604
605[pre
606dist/bin/boostdep --html-title "Module Weights" --html-footer "Generated on 21.05.2015 20:53:11" --html --module-weights > module-weights.html
607]
608
609[endsect]
610
611[section --primary]
612
613[^boostdep --primary /module/] lists the primary (direct) dependencies of /module/. It takes the same options as =--module-overview=.
614
615[pre
616dist/bin/boostdep --html-title "Primary Dependencies of filesystem" --html-footer "Generated on 21.05.2015 20:53:11" --html --primary filesystem > filesystem-primary.html
617]
618
619[endsect]
620
621[section --secondary]
622
623[^boostdep --secondary /module/] lists the secondary (indirect) dependencies of /module/. It takes the same options as =--module-overview=.
624
625[pre
626dist/bin/boostdep --html-title "Secondary Dependencies of filesystem" --html-footer "Generated on 21.05.2015 20:53:11" --html --secondary filesystem > filesystem-secondary.html
627]
628
629You can combine =--primary= and =--secondary= in one invocation.
630
631[pre
632dist/bin/boostdep --html-title "Dependencies of filesystem" --html-footer "Generated on 21.05.2015 20:53:11" --html --primary filesystem --secondary filesystem > filesystem.html
633]
634
635[endsect]
636
637[section --reverse]
638
639[^boostdep --reverse /module/] lists the reverse dependencies of /module/, that is, it lists which modules depend on /module/. It takes the same options as =--module-overview=.
640
641[pre
642dist/bin/boostdep --html-title "Reverse Dependencies of filesystem" --html-footer "Generated on 21.05.2015 20:53:11" --html --reverse filesystem > filesystem-reverse.html
643]
644
645You can combine =--reverse= with =--primary= and =--secondary= for a complete module report.
646
647[pre
648dist/bin/boostdep --html-title "Dependency Report for filesystem" --html-footer "Generated on 21.05.2015 20:53:11" --html --primary filesystem --secondary filesystem --reverse filesystem > filesystem.html
649]
650
651[endsect]
652
653[section --subset]
654
655[^boostdep --subset /module/] lists the subset dependencies of /module/, that is, it lists which modules comprise the subset which /module/ requires in order to be usable.
656The dependencies are determined by tracing the =#include= directives starting from /module/'s headers.
657
658The difference between using the modules reported by =--subset= and those reported by the sum of =--primary= and =--secondary= is that the former only guarantees
659that /module/ will be usable, whereas the latter guarantees it for every module in the subset.
660
661=--subset= takes the same options as =--module-overview=.
662
663[pre
664dist/bin/boostdep --html-title "Subset Dependencies of filesystem" --html-footer "Generated on 21.05.2015 20:53:11" --html --subset filesystem > filesystem-subset.html
665]
666
667You can combine =--subset= with the other module report options.
668
669[endsect]
670
671[section --header]
672
673[^boostdep --header /header/] creates an inclusion report for /header/. It takes the same options as =--module-overview=.
674
675[pre
676dist/bin/boostdep --html-title "Inclusion Report for <boost/shared_ptr.hpp>" --html-footer "Generated on 21.05.2015 20:53:11" --html --header boost/shared_ptr.hpp > header-boost-shared_ptr.html
677]
678
679[endsect]
680
681[section --test]
682
683[^boostdep --test /module/] lists the test dependencies of /module/, that is, it lists which modules need to be present so that the tests of /module/ can be run.
684
685[pre
686dist/bin/boostdep --test filesystem
687]
688
689[endsect]
690
691[section --cmake]
692
693[^boostdep --cmake /module/] lists the dependencies of /module/ in a =cmake=-friendly form. This is typically used to generate a =dependencies.cmake= file.
694
695[endsect]
696
697[section --pkgconfig]
698
699[^boostdep --pkgconfig /module/ /version/ /var/=/value/...] outputs a =pkg-config= =.pc= file for /module/.
700
701[pre
702dist/bin/boostdep --pkgconfig system 1.65.0 prefix=/usr/local includedir=${prefix}/include libdir=${prefix}/lib
703]
704
705[endsect]
706
707[section --subset-for]
708
709[^boostdep --subset-for /directory/] scans /directory/ for `#include` directives and lists which Boost modules are reachable through these `#include`s.
710
711Its use is in determining what subset of Boost is needed by a user application or library.
712
713[pre
714dist/bin/boostdep --subset-for d:\my_app
715]
716
717[endsect]
718
719[section --boost-root]
720
721[^--boost-root /path-to-boost/] instructs /Boostdep/ to look for the Boost root directory at /path-to-boost/. If this option
722is not given, the current directory and its parents are searched for the presence of a file named =Jamroot=. If one is found,
723that directory is assumed to be the root. If not, the environment variable =BOOST_ROOT= is assumed to contain the path to the
724Boost root.
725
726[endsect]
727
728[section --track-sources]
729
730The =--track-sources= option instructs /Boostdep/ to scan the =src= library subdirectory for `#include` directives. By default,
731only the =include= subdirectory is scanned.
732
733[endsect]
734
735[section --track-tests]
736
737The =--track-tests= option instructs /Boostdep/ to scan the =test= library subdirectory for `#include` directives. By default,
738only the =include= subdirectory is scanned.
739
740[endsect]
741
742[section --html-title]
743
744[^--html-title /title/] sets the contents of the HTML =<title>= tag. It must precede =--html= to have an effect.
745
746[endsect]
747
748[section --html-footer]
749
750[^--html-footer /footer/] sets the HTML page footer text. It has no effect if =--html= is not given.
751
752[endsect]
753
754[section --html-stylesheet]
755
756[^--html-stylesheet /stylesheet/] sets the HTML stylesheet URL. It has no effect if =--html= is not given.
757
758[endsect]
759
760[section --html-prefix]
761
762[^--html-prefix /prefix/] sets the HTML prefix; the prefix is output immediately after the `<body>` tag. It has no effect if =--html= is not given.
763
764[endsect]
765
766[section --html]
767
768=--html= switches to HTML output mode (the default is plain text). It must precede the commands that generate output.
769
770[endsect]
771
772[endsect]
773