1[/ 2 Copyright 2015-2020 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-2020 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/] generates a =CMakeLists.txt= file for /module/. 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