1# Build 2 3This `bc` attempts to be as portable as possible. It can be built on any 4POSIX-compliant system. 5 6To accomplish that, a POSIX-compatible, custom `configure.sh` script is used to 7select build options, compiler, and compiler flags and generate a `Makefile`. 8 9The general form of configuring, building, and installing this `bc` is as 10follows: 11 12``` 13[ENVIRONMENT_VARIABLE=<value>...] ./configure.sh [build_options...] 14make 15make install 16``` 17 18To get all of the options, including any useful environment variables, use 19either one of the following commands: 20 21``` 22./configure.sh -h 23./configure.sh --help 24``` 25 26***WARNING***: even though `configure.sh` supports both option types, short and 27long, it does not support handling both at the same time. Use only one type. 28 29To learn the available `make` targets run the following command after running 30the `configure.sh` script: 31 32``` 33make help 34``` 35 36See [Build Environment Variables][4] for a more detailed description of all 37accepted environment variables and [Build Options][5] for more detail about all 38accepted build options. 39 40## Windows 41 42For releases, Windows builds of `bc`, `dc`, and `bcl` are available for download 43from <https://git.yzena.com/gavin/bc> and GitHub. 44 45However, if you wish to build it yourself, this `bc` can be built using Visual 46Studio or MSBuild. 47 48Unfortunately, only one build configuration (besides Debug or Release) is 49supported: extra math enabled, history and NLS (locale support) disabled, with 50both calculators built. The default [settings][11] are `BC_BANNER=1`, 51`{BC,DC}_SIGINT_RESET=0`, `{BC,DC}_TTY_MODE=1`, `{BC,DC}_PROMPT=1`. 52 53The library can also be built on Windows. 54 55### Visual Studio 56 57In Visual Studio, open up the solution file (`bc.sln` for `bc`, or `bcl.sln` for 58the library), select the desired configuration, and build. 59 60### MSBuild 61 62To build with MSBuild, first, *be sure that you are using the MSBuild that comes 63with Visual Studio*. 64 65To build `bc`, run the following from the root directory: 66 67``` 68msbuild -property:Configuration=<config> vs/bc.sln 69``` 70 71where `<config>` is either one of `Debug` or `Release`. 72 73To build the library, run the following from the root directory: 74 75``` 76msbuild -property:Configuration=<config> vs/bcl.sln 77``` 78 79where `<config>` is either one of `Debug`, `ReleaseMD`, or `ReleaseMT`. 80 81## POSIX-Compatible Systems 82 83Building `bc`, `dc`, and `bcl` (the library) is more complex than on Windows 84because many build options are supported. 85 86### Cross Compiling 87 88To cross-compile this `bc`, an appropriate compiler must be present and assigned 89to the environment variable `HOSTCC` or `HOST_CC` (the two are equivalent, 90though `HOSTCC` is prioritized). This is in order to bootstrap core file(s), if 91the architectures are not compatible (i.e., unlike i686 on x86_64). Thus, the 92approach is: 93 94``` 95HOSTCC="/path/to/native/compiler" ./configure.sh 96make 97make install 98``` 99 100`HOST_CC` will work in exactly the same way. 101 102`HOSTCFLAGS` and `HOST_CFLAGS` can be used to set compiler flags for `HOSTCC`. 103(The two are equivalent, as `HOSTCC` and `HOST_CC` are.) `HOSTCFLAGS` is 104prioritized over `HOST_CFLAGS`. If neither are present, `HOSTCC` (or `HOST_CC`) 105uses `CFLAGS` (see [Build Environment Variables][4] for more details). 106 107It is expected that `CC` produces code for the target system and `HOSTCC` 108produces code for the host system. See [Build Environment Variables][4] for more 109details. 110 111If an emulator is necessary to run the bootstrap binaries, it can be set with 112the environment variable `GEN_EMU`. 113 114### Build Environment Variables 115 116This `bc` supports `CC`, `HOSTCC`, `HOST_CC`, `CFLAGS`, `HOSTCFLAGS`, 117`HOST_CFLAGS`, `CPPFLAGS`, `LDFLAGS`, `LDLIBS`, `PREFIX`, `DESTDIR`, `BINDIR`, 118`DATAROOTDIR`, `DATADIR`, `MANDIR`, `MAN1DIR`, `LOCALEDIR` `EXECSUFFIX`, 119`EXECPREFIX`, `LONG_BIT`, `GEN_HOST`, and `GEN_EMU` environment variables in 120`configure.sh`. Any values of those variables given to `configure.sh` will be 121put into the generated Makefile. 122 123More detail on what those environment variables do can be found in the following 124sections. 125 126#### `CC` 127 128C compiler for the target system. `CC` must be compatible with POSIX `c99` 129behavior and options. However, **I encourage users to use any C99 or C11 130compatible compiler they wish.** 131 132If there is a space in the basename of the compiler, the items after the first 133space are assumed to be compiler flags, and in that case, the flags are 134automatically moved into CFLAGS. 135 136Defaults to `c99`. 137 138#### `HOSTCC` or `HOST_CC` 139 140C compiler for the host system, used only in [cross compiling][6]. Must be 141compatible with POSIX `c99` behavior and options. 142 143If there is a space in the basename of the compiler, the items after the first 144space are assumed to be compiler flags, and in that case, the flags are 145automatically moved into HOSTCFLAGS. 146 147Defaults to `$CC`. 148 149#### `CFLAGS` 150 151Command-line flags that will be passed verbatim to `CC`. 152 153Defaults to empty. 154 155#### `HOSTCFLAGS` or `HOST_CFLAGS` 156 157Command-line flags that will be passed verbatim to `HOSTCC` or `HOST_CC`. 158 159Defaults to `$CFLAGS`. 160 161#### `CPPFLAGS` 162 163Command-line flags for the C preprocessor. These are also passed verbatim to 164both compilers (`CC` and `HOSTCC`); they are supported just for legacy reasons. 165 166Defaults to empty. 167 168#### `LDFLAGS` 169 170Command-line flags for the linker. These are also passed verbatim to both 171compilers (`CC` and `HOSTCC`); they are supported just for legacy reasons. 172 173Defaults to empty. 174 175#### `LDLIBS` 176 177Libraries to link to. These are also passed verbatim to both compilers (`CC` and 178`HOSTCC`); they are supported just for legacy reasons and for cross compiling 179with different C standard libraries (like [musl][3]). 180 181Defaults to empty. 182 183#### `PREFIX` 184 185The prefix to install to. 186 187Can be overridden by passing the `--prefix` option to `configure.sh`. 188 189Defaults to `/usr/local`. 190 191#### `DESTDIR` 192 193Path to prepend onto `PREFIX`. This is mostly for distro and package 194maintainers. 195 196This can be passed either to `configure.sh` or `make install`. If it is passed 197to both, the one given to `configure.sh` takes precedence. 198 199Defaults to empty. 200 201#### `BINDIR` 202 203The directory to install binaries in. 204 205Can be overridden by passing the `--bindir` option to `configure.sh`. 206 207Defaults to `$PREFIX/bin`. 208 209#### `INCLUDEDIR` 210 211The directory to install header files in. 212 213Can be overridden by passing the `--includedir` option to `configure.sh`. 214 215Defaults to `$PREFIX/include`. 216 217#### `LIBDIR` 218 219The directory to install libraries in. 220 221Can be overridden by passing the `--libdir` option to `configure.sh`. 222 223Defaults to `$PREFIX/lib`. 224 225#### `DATAROOTDIR` 226 227The root directory to install data files in. 228 229Can be overridden by passing the `--datarootdir` option to `configure.sh`. 230 231Defaults to `$PREFIX/share`. 232 233#### `DATADIR` 234 235The directory to install data files in. 236 237Can be overridden by passing the `--datadir` option to `configure.sh`. 238 239Defaults to `$DATAROOTDIR`. 240 241#### `MANDIR` 242 243The directory to install manpages in. 244 245Can be overridden by passing the `--mandir` option to `configure.sh`. 246 247Defaults to `$DATADIR/man` 248 249#### `MAN1DIR` 250 251The directory to install Section 1 manpages in. Because both `bc` and `dc` are 252Section 1 commands, this is the only relevant section directory. 253 254Can be overridden by passing the `--man1dir` option to `configure.sh`. 255 256Defaults to `$MANDIR/man1`. 257 258#### `LOCALEDIR` 259 260The directory to install locales in. 261 262Can be overridden by passing the `--localedir` option to `configure.sh`. 263 264Defaults to `$DATAROOTDIR/locale`. 265 266#### `EXECSUFFIX` 267 268The suffix to append onto the executable names *when installing*. This is for 269packagers and distro maintainers who want this `bc` as an option, but do not 270want to replace the default `bc`. 271 272Defaults to empty. 273 274#### `EXECPREFIX` 275 276The prefix to append onto the executable names *when building and installing*. 277This is for packagers and distro maintainers who want this `bc` as an option, 278but do not want to replace the default `bc`. 279 280Defaults to empty. 281 282#### `LONG_BIT` 283 284The number of bits in a C `long` type. This is mostly for the embedded space. 285 286This `bc` uses `long`s internally for overflow checking. In C99, a `long` is 287required to be 32 bits. For this reason, on 8-bit and 16-bit microcontrollers, 288the generated code to do math with `long` types may be inefficient. 289 290For most normal desktop systems, setting this is unnecessary, except that 32-bit 291platforms with 64-bit longs may want to set it to `32`. 292 293Defaults to the default value of `LONG_BIT` for the target platform. For 294compliance with the `bc` spec, the minimum allowed value is `32`. 295 296It is an error if the specified value is greater than the default value of 297`LONG_BIT` for the target platform. 298 299#### `GEN_HOST` 300 301Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to produce the C 302files that contain the help texts as well as the math libraries. By default, 303`gen/strgen.c` is used, compiled by `$HOSTCC` and run on the host machine. Using 304`gen/strgen.sh` removes the need to compile and run an executable on the host 305machine since `gen/strgen.sh` is a POSIX shell script. However, `gen/lib2.bc` is 306perilously close to 4095 characters, the max supported length of a string 307literal in C99 (and it could be added to in the future), and `gen/strgen.sh` 308generates a string literal instead of an array, as `gen/strgen.c` does. For most 309production-ready compilers, this limit probably is not enforced, but it could 310be. Both options are still available for this reason. 311 312If you are sure your compiler does not have the limit and do not want to compile 313and run a binary on the host machine, set this variable to "0". Any other value, 314or a non-existent value, will cause the build system to compile and run 315`gen/strgen.c`. 316 317Default is "". 318 319#### `GEN_EMU` 320 321The emulator to run bootstrap binaries under. This is only if the binaries 322produced by `HOSTCC` (or `HOST_CC`) need to be run under an emulator to work. 323 324Defaults to empty. 325 326### Build Options 327 328This `bc` comes with several build options, all of which are enabled by default. 329 330All options can be used with each other, with a few exceptions that will be 331noted below. 332 333**NOTE**: All long options with mandatory argumenst accept either one of the 334following forms: 335 336``` 337--option arg 338--option=arg 339``` 340 341#### Library 342 343To build the math library, use the following commands for the configure step: 344 345``` 346./configure.sh -a 347./configure.sh --library 348``` 349 350Both commands are equivalent. 351 352When the library is built, history and locales are disabled, and the 353functionality for `bc` and `dc` are both enabled, though the executables are 354*not* built. This is because the library's options clash with the executables. 355 356To build an optimized version of the library, users can pass optimization 357options to `configure.sh` or include them in `CFLAGS`. 358 359The library API can be found in `manuals/bcl.3.md` or `man bcl` once the library 360is installed. 361 362The library is built as `bin/libbcl.a`. 363 364#### `bc` Only 365 366To build `bc` only (no `dc`), use any one of the following commands for the 367configure step: 368 369``` 370./configure.sh -b 371./configure.sh --bc-only 372./configure.sh -D 373./configure.sh --disable-dc 374``` 375 376Those commands are all equivalent. 377 378***Warning***: It is an error to use those options if `bc` has also been 379disabled (see below). 380 381#### `dc` Only 382 383To build `dc` only (no `bc`), use either one of the following commands for the 384configure step: 385 386``` 387./configure.sh -d 388./configure.sh --dc-only 389./configure.sh -B 390./configure.sh --disable-bc 391``` 392 393Those commands are all equivalent. 394 395***Warning***: It is an error to use those options if `dc` has also been 396disabled (see above). 397 398#### History 399 400To disable hisory, pass either the `-H` flag or the `--disable-history` option 401to `configure.sh`, as follows: 402 403``` 404./configure.sh -H 405./configure.sh --disable-history 406``` 407 408Both commands are equivalent. 409 410History is automatically disabled when building for Windows or on another 411platform that does not support the terminal handling that is required. 412 413***WARNING***: Of all of the code in the `bc`, this is the only code that is not 414completely portable. If the `bc` does not work on your platform, your first step 415should be to retry with history disabled. 416 417This option affects the [build type][7]. 418 419#### NLS (Locale Support) 420 421To disable locale support (use only English), pass either the `-N` flag or the 422`--disable-nls` option to `configure.sh`, as follows: 423 424``` 425./configure.sh -N 426./configure.sh --disable-nls 427``` 428 429Both commands are equivalent. 430 431NLS (locale support) is automatically disabled when building for Windows or on 432another platform that does not support the POSIX locale API or utilities. 433 434This option affects the [build type][7]. 435 436#### Extra Math 437 438This `bc` has 7 extra operators: 439 440* `$` (truncation to integer) 441* `@` (set precision) 442* `@=` (set precision and assign) 443* `<<` (shift number left, shifts radix right) 444* `<<=` (shift number left and assign) 445* `>>` (shift number right, shifts radix left) 446* `>>=` (shift number right and assign) 447 448There is no assignment version of `$` because it is a unary operator. 449 450The assignment versions of the above operators are not available in `dc`, but 451the others are, as the operators `$`, `@`, `H`, and `h`, respectively. 452 453In addition, this `bc` has the option of outputting in scientific notation or 454engineering notation. It can also take input in scientific or engineering 455notation. On top of that, it has a pseudo-random number generator. (See the 456full manual for more details.) 457 458Extra operators, scientific notation, engineering notation, and the 459pseudo-random number generator can be disabled by passing either the `-E` flag 460or the `--disable-extra-math` option to `configure.sh`, as follows: 461 462``` 463./configure.sh -E 464./configure.sh --disable-extra-math 465``` 466 467Both commands are equivalent. 468 469This `bc` also has a larger library that is only enabled if extra operators and 470the pseudo-random number generator are. More information about the functions can 471be found in the Extended Library section of the full manual. 472 473This option affects the [build type][7]. 474 475#### Karatsuba Length 476 477The Karatsuba length is the point at which `bc` and `dc` switch from Karatsuba 478multiplication to brute force, `O(n^2)` multiplication. It can be set by passing 479the `-k` flag or the `--karatsuba-len` option to `configure.sh` as follows: 480 481``` 482./configure.sh -k32 483./configure.sh --karatsuba-len 32 484``` 485 486Both commands are equivalent. 487 488Default is `32`. 489 490***WARNING***: The Karatsuba Length must be a **integer** greater than or equal 491to `16` (to prevent stack overflow). If it is not, `configure.sh` will give an 492error. 493 494#### Settings 495 496This `bc` and `dc` have a few settings to override default behavior. 497 498The defaults for these settings can be set by package maintainers, and the 499settings themselves can be overriden by users. 500 501To set a default to **on**, use the `-s` or `--set-default-on` option to 502`configure.sh`, with the name of the setting, as follows: 503 504``` 505./configure.sh -s bc.banner 506./configure.sh --set-default-on=bc.banner 507``` 508 509Both commands are equivalent. 510 511To set a default to **off**, use the `-S` or `--set-default-off` option to 512`configure.sh`, with the name of the setting, as follows: 513 514``` 515./configure.sh -S bc.banner 516./configure.sh --set-default-off=bc.banner 517``` 518 519Both commands are equivalent. 520 521Users can override the default settings set by packagers with environment 522variables. If the environment variable has an integer, then the setting is 523turned **on** for a non-zero integer, and **off** for zero. 524 525The table of the available settings, along with their defaults and the 526environment variables to override them, is below: 527 528``` 529| Setting | Description | Default | Env Variable | 530| =============== | ==================== | ============ | ==================== | 531| bc.banner | Whether to display | 0 | BC_BANNER | 532| | the bc version | | | 533| | banner when in | | | 534| | interactive mode. | | | 535| --------------- | -------------------- | ------------ | -------------------- | 536| bc.sigint_reset | Whether SIGINT will | 1 | BC_SIGINT_RESET | 537| | reset bc, instead of | | | 538| | exiting, when in | | | 539| | interactive mode. | | | 540| --------------- | -------------------- | ------------ | -------------------- | 541| dc.sigint_reset | Whether SIGINT will | 1 | DC_SIGINT_RESET | 542| | reset dc, instead of | | | 543| | exiting, when in | | | 544| | interactive mode. | | | 545| --------------- | -------------------- | ------------ | -------------------- | 546| bc.tty_mode | Whether TTY mode for | 1 | BC_TTY_MODE | 547| | bc should be on when | | | 548| | available. | | | 549| --------------- | -------------------- | ------------ | -------------------- | 550| dc.tty_mode | Whether TTY mode for | 0 | BC_TTY_MODE | 551| | dc should be on when | | | 552| | available. | | | 553| --------------- | -------------------- | ------------ | -------------------- | 554| bc.prompt | Whether the prompt | $BC_TTY_MODE | BC_PROMPT | 555| | for bc should be on | | | 556| | in tty mode. | | | 557| --------------- | -------------------- | ------------ | -------------------- | 558| dc.prompt | Whether the prompt | $DC_TTY_MODE | DC_PROMPT | 559| | for dc should be on | | | 560| | in tty mode. | | | 561| --------------- | -------------------- | ------------ | -------------------- | 562``` 563 564These settings are not meant to be changed on a whim. They are meant to ensure 565that this bc and dc will conform to the expectations of the user on each 566platform. 567 568#### Install Options 569 570The relevant `autotools`-style install options are supported in `configure.sh`: 571 572* `--prefix` 573* `--bindir` 574* `--datarootdir` 575* `--datadir` 576* `--mandir` 577* `--man1dir` 578* `--localedir` 579 580An example is: 581 582``` 583./configure.sh --prefix=/usr --localedir /usr/share/nls 584make 585make install 586``` 587 588They correspond to the environment variables `$PREFIX`, `$BINDIR`, 589`$DATAROOTDIR`, `$DATADIR`, `$MANDIR`, `$MAN1DIR`, and `$LOCALEDIR`, 590respectively. 591 592***WARNING***: If the option is given, the value of the corresponding 593environment variable is overridden. 594 595***WARNING***: If any long command-line options are used, the long form of all 596other command-line options must be used. Mixing long and short options is not 597supported. 598 599##### Manpages 600 601To disable installing manpages, pass either the `-M` flag or the 602`--disable-man-pages` option to `configure.sh` as follows: 603 604``` 605./configure.sh -M 606./configure.sh --disable-man-pages 607``` 608 609Both commands are equivalent. 610 611##### Locales 612 613By default, `bc` and `dc` do not install all locales, but only the enabled 614locales. If `DESTDIR` exists and is not empty, then they will install all of 615the locales that exist on the system. The `-l` flag or `--install-all-locales` 616option skips all of that and just installs all of the locales that `bc` and `dc` 617have, regardless. To enable that behavior, you can pass the `-l` flag or the 618`--install-all-locales` option to `configure.sh`, as follows: 619 620``` 621./configure.sh -l 622./configure.sh --install-all-locales 623``` 624 625Both commands are equivalent. 626 627### Optimization 628 629The `configure.sh` script will accept an optimization level to pass to the 630compiler. Because `bc` is orders of magnitude faster with optimization, I 631***highly*** recommend package and distro maintainers pass the highest 632optimization level available in `CC` to `configure.sh` with the `-O` flag or 633`--opt` option, as follows: 634 635``` 636./configure.sh -O3 637./configure.sh --opt 3 638``` 639 640Both commands are equivalent. 641 642The build and install can then be run as normal: 643 644``` 645make 646make install 647``` 648 649As usual, `configure.sh` will also accept additional `CFLAGS` on the command 650line, so for SSE4 architectures, the following can add a bit more speed: 651 652``` 653CFLAGS="-march=native -msse4" ./configure.sh -O3 654make 655make install 656``` 657 658Building with link-time optimization (`-flto` in clang) can further increase the 659performance. I ***highly*** recommend doing so. 660 661I do ***NOT*** recommend building with `-march=native`; doing so reduces this 662`bc`'s performance. 663 664Manual stripping is not necessary; non-debug builds are automatically stripped 665in the link stage. 666 667### Debug Builds 668 669Debug builds (which also disable optimization if no optimization level is given 670and if no extra `CFLAGS` are given) can be enabled with either the `-g` flag or 671the `--debug` option, as follows: 672 673``` 674./configure.sh -g 675./configure.sh --debug 676``` 677 678Both commands are equivalent. 679 680The build and install can then be run as normal: 681 682``` 683make 684make install 685``` 686 687### Stripping Binaries 688 689By default, when `bc` and `dc` are not built in debug mode, the binaries are 690stripped. Stripping can be disabled with either the `-T` or the 691`--disable-strip` option, as follows: 692 693``` 694./configure.sh -T 695./configure.sh --disable-strip 696``` 697 698Both commands are equivalent. 699 700The build and install can then be run as normal: 701 702``` 703make 704make install 705``` 706 707### Build Type 708 709`bc` and `dc` have 8 build types, affected by the [History][8], [NLS (Locale 710Support)][9], and [Extra Math][10] build options. 711 712The build types are as follows: 713 714* `A`: Nothing disabled. 715* `E`: Extra math disabled. 716* `H`: History disabled. 717* `N`: NLS disabled. 718* `EH`: Extra math and History disabled. 719* `EN`: Extra math and NLS disabled. 720* `HN`: History and NLS disabled. 721* `EHN`: Extra math, History, and NLS all disabled. 722 723These build types correspond to the generated manuals in `manuals/bc` and 724`manuals/dc`. 725 726### Binary Size 727 728When built with both calculators, all available features, and `-Os` using 729`clang` and `musl`, the executable is 140.4 kb (140,386 bytes) on `x86_64`. That 730isn't much for what is contained in the binary, but if necessary, it can be 731reduced. 732 733The single largest user of space is the `bc` calculator. If just `dc` is needed, 734the size can be reduced to 107.6 kb (107,584 bytes). 735 736The next largest user of space is history support. If that is not needed, size 737can be reduced (for a build with both calculators) to 119.9 kb (119,866 bytes). 738 739There are several reasons that history is a bigger user of space than `dc` 740itself: 741 742* `dc`'s lexer and parser are *tiny* compared to `bc`'s because `dc` code is 743 almost already in the form that it is executed in, while `bc` has to not only 744 adjust the form to be executable, it has to parse functions, loops, `if` 745 statements, and other extra features. 746* `dc` does not have much extra code in the interpreter. 747* History has a lot of const data for supporting `UTF-8` terminals. 748* History pulls in a bunch of more code from the `libc`. 749 750The next biggest user is extra math support. Without it, the size is reduced to 751124.0 kb (123,986 bytes) with history and 107.6 kb (107,560 bytes) without 752history. 753 754The reasons why extra math support is bigger than `dc`, besides the fact that 755`dc` is small already, are: 756 757* Extra math supports adds an extra math library that takes several kilobytes of 758 constant data space. 759* Extra math support includes support for a pseudo-random number generator, 760 including the code to convert a series of pseudo-random numbers into a number 761 of arbitrary size. 762* Extra math support adds several operators. 763 764The next biggest user is `dc`, so if just `bc` is needed, the size can be 765reduced to 128.1 kb (128,096 bytes) with history and extra math support, 107.6 766kb (107,576 bytes) without history and with extra math support, and 95.3 kb 767(95,272 bytes) without history and without extra math support. 768 769*Note*: all of these binary sizes were compiled using `musl` `1.2.0` as the 770`libc`, making a fully static executable, with `clang` `9.0.1` (well, 771`musl-clang` using `clang` `9.0.1`) as the compiler and using `-Os` 772optimizations. These builds were done on an `x86_64` machine running Gentoo 773Linux. 774 775### Testing 776 777The default test suite can be run with the following command: 778 779``` 780make test 781``` 782 783To test `bc` only, run the following command: 784 785``` 786make test_bc 787``` 788 789To test `dc` only, run the following command: 790 791``` 792make test_dc 793``` 794 795This `bc`, if built, assumes a working, GNU-compatible `bc`, installed on the 796system and in the `PATH`, to generate some tests, unless the `-G` flag or 797`--disable-generated-tests` option is given to `configure.sh`, as follows: 798 799``` 800./configure.sh -G 801./configure.sh --disable-generated-tests 802``` 803 804After running `configure.sh`, build and run tests as follows: 805 806``` 807make 808make test 809``` 810 811This `dc` also assumes a working, GNU-compatible `dc`, installed on the system 812and in the `PATH`, to generate some tests, unless one of the above options is 813given to `configure.sh`. 814 815To generate test coverage, pass the `-c` flag or the `--coverage` option to 816`configure.sh` as follows: 817 818``` 819./configure.sh -c 820./configure.sh --coverage 821``` 822 823Both commands are equivalent. 824 825***WARNING***: Both `bc` and `dc` must be built for test coverage. Otherwise, 826`configure.sh` will give an error. 827 828[1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html 829[2]: https://www.gnu.org/software/bc/ 830[3]: https://www.musl-libc.org/ 831[4]: #build-environment-variables 832[5]: #build-options 833[6]: #cross-compiling 834[7]: #build-type 835[8]: #history 836[9]: #nls-locale-support 837[10]: #extra-math 838[11]: #settings 839