3 This `bc` attempts to be as portable as possible. It can be built on any
4 POSIX-compliant system.
6 To accomplish that, a POSIX-compatible, custom `configure.sh` script is used to
7 select build options, compiler, and compiler flags and generate a `Makefile`.
9 The general form of configuring, building, and installing this `bc` is as
13 [ENVIRONMENT_VARIABLE=<value>...] ./configure.sh [build_options...]
18 To get all of the options, including any useful environment variables, use
19 either one of the following commands:
26 ***WARNING***: even though `configure.sh` supports both option types, short and
27 long, it does not support handling both at the same time. Use only one type.
29 To learn the available `make` targets run the following command after running
30 the `configure.sh` script:
36 See [Build Environment Variables][4] for a more detailed description of all
37 accepted environment variables and [Build Options][5] for more detail about all
38 accepted build options.
42 For releases, Windows builds of `bc`, `dc`, and `bcl` are available for download
43 from <https://git.yzena.com/gavin/bc> and GitHub.
45 However, if you wish to build it yourself, this `bc` can be built using Visual
48 Unfortunately, only one build configuration (besides Debug or Release) is
49 supported: extra math enabled, history and NLS (locale support) disabled, with
50 both 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`.
53 The library can also be built on Windows.
57 In Visual Studio, open up the solution file (`bc.sln` for `bc`, or `bcl.sln` for
58 the library), select the desired configuration, and build.
62 To build with MSBuild, first, *be sure that you are using the MSBuild that comes
65 To build `bc`, run the following from the root directory:
68 msbuild -property:Configuration=<config> vs/bc.sln
71 where `<config>` is either one of `Debug` or `Release`.
73 To build the library, run the following from the root directory:
76 msbuild -property:Configuration=<config> vs/bcl.sln
79 where `<config>` is either one of `Debug`, `ReleaseMD`, or `ReleaseMT`.
81 ## POSIX-Compatible Systems
83 Building `bc`, `dc`, and `bcl` (the library) is more complex than on Windows
84 because many build options are supported.
88 To cross-compile this `bc`, an appropriate compiler must be present and assigned
89 to the environment variable `HOSTCC` or `HOST_CC` (the two are equivalent,
90 though `HOSTCC` is prioritized). This is in order to bootstrap core file(s), if
91 the architectures are not compatible (i.e., unlike i686 on x86_64). Thus, the
95 HOSTCC="/path/to/native/compiler" ./configure.sh
100 `HOST_CC` will work in exactly the same way.
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
104 prioritized over `HOST_CFLAGS`. If neither are present, `HOSTCC` (or `HOST_CC`)
105 uses `CFLAGS` (see [Build Environment Variables][4] for more details).
107 It is expected that `CC` produces code for the target system and `HOSTCC`
108 produces code for the host system. See [Build Environment Variables][4] for more
111 If an emulator is necessary to run the bootstrap binaries, it can be set with
112 the environment variable `GEN_EMU`.
114 ### Build Environment Variables
116 This `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
121 put into the generated Makefile.
123 More detail on what those environment variables do can be found in the following
128 C compiler for the target system. `CC` must be compatible with POSIX `c99`
129 behavior and options. However, **I encourage users to use any C99 or C11
130 compatible compiler they wish.**
132 If there is a space in the basename of the compiler, the items after the first
133 space are assumed to be compiler flags, and in that case, the flags are
134 automatically moved into CFLAGS.
138 #### `HOSTCC` or `HOST_CC`
140 C compiler for the host system, used only in [cross compiling][6]. Must be
141 compatible with POSIX `c99` behavior and options.
143 If there is a space in the basename of the compiler, the items after the first
144 space are assumed to be compiler flags, and in that case, the flags are
145 automatically moved into HOSTCFLAGS.
151 Command-line flags that will be passed verbatim to `CC`.
155 #### `HOSTCFLAGS` or `HOST_CFLAGS`
157 Command-line flags that will be passed verbatim to `HOSTCC` or `HOST_CC`.
159 Defaults to `$CFLAGS`.
163 Command-line flags for the C preprocessor. These are also passed verbatim to
164 both compilers (`CC` and `HOSTCC`); they are supported just for legacy reasons.
170 Command-line flags for the linker. These are also passed verbatim to both
171 compilers (`CC` and `HOSTCC`); they are supported just for legacy reasons.
177 Libraries 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
179 with different C standard libraries (like [musl][3]).
185 The prefix to install to.
187 Can be overridden by passing the `--prefix` option to `configure.sh`.
189 Defaults to `/usr/local`.
193 Path to prepend onto `PREFIX`. This is mostly for distro and package
196 This can be passed either to `configure.sh` or `make install`. If it is passed
197 to both, the one given to `configure.sh` takes precedence.
203 The directory to install binaries in.
205 Can be overridden by passing the `--bindir` option to `configure.sh`.
207 Defaults to `$PREFIX/bin`.
211 The directory to install header files in.
213 Can be overridden by passing the `--includedir` option to `configure.sh`.
215 Defaults to `$PREFIX/include`.
219 The directory to install libraries in.
221 Can be overridden by passing the `--libdir` option to `configure.sh`.
223 Defaults to `$PREFIX/lib`.
227 The root directory to install data files in.
229 Can be overridden by passing the `--datarootdir` option to `configure.sh`.
231 Defaults to `$PREFIX/share`.
235 The directory to install data files in.
237 Can be overridden by passing the `--datadir` option to `configure.sh`.
239 Defaults to `$DATAROOTDIR`.
243 The directory to install manpages in.
245 Can be overridden by passing the `--mandir` option to `configure.sh`.
247 Defaults to `$DATADIR/man`
251 The directory to install Section 1 manpages in. Because both `bc` and `dc` are
252 Section 1 commands, this is the only relevant section directory.
254 Can be overridden by passing the `--man1dir` option to `configure.sh`.
256 Defaults to `$MANDIR/man1`.
260 The directory to install locales in.
262 Can be overridden by passing the `--localedir` option to `configure.sh`.
264 Defaults to `$DATAROOTDIR/locale`.
268 The suffix to append onto the executable names *when installing*. This is for
269 packagers and distro maintainers who want this `bc` as an option, but do not
270 want to replace the default `bc`.
276 The prefix to append onto the executable names *when building and installing*.
277 This is for packagers and distro maintainers who want this `bc` as an option,
278 but do not want to replace the default `bc`.
284 The number of bits in a C `long` type. This is mostly for the embedded space.
286 This `bc` uses `long`s internally for overflow checking. In C99, a `long` is
287 required to be 32 bits. For this reason, on 8-bit and 16-bit microcontrollers,
288 the generated code to do math with `long` types may be inefficient.
290 For most normal desktop systems, setting this is unnecessary, except that 32-bit
291 platforms with 64-bit longs may want to set it to `32`.
293 Defaults to the default value of `LONG_BIT` for the target platform. For
294 compliance with the `bc` spec, the minimum allowed value is `32`.
296 It is an error if the specified value is greater than the default value of
297 `LONG_BIT` for the target platform.
301 Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to produce the C
302 files 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
305 machine since `gen/strgen.sh` is a POSIX shell script. However, `gen/lib2.bc` is
306 perilously close to 4095 characters, the max supported length of a string
307 literal in C99 (and it could be added to in the future), and `gen/strgen.sh`
308 generates a string literal instead of an array, as `gen/strgen.c` does. For most
309 production-ready compilers, this limit probably is not enforced, but it could
310 be. Both options are still available for this reason.
312 If you are sure your compiler does not have the limit and do not want to compile
313 and run a binary on the host machine, set this variable to "0". Any other value,
314 or a non-existent value, will cause the build system to compile and run
321 The emulator to run bootstrap binaries under. This is only if the binaries
322 produced by `HOSTCC` (or `HOST_CC`) need to be run under an emulator to work.
328 This `bc` comes with several build options, all of which are enabled by default.
330 All options can be used with each other, with a few exceptions that will be
333 **NOTE**: All long options with mandatory argumenst accept either one of the
343 To build the math library, use the following commands for the configure step:
347 ./configure.sh --library
350 Both commands are equivalent.
352 When the library is built, history and locales are disabled, and the
353 functionality 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.
356 To build an optimized version of the library, users can pass optimization
357 options to `configure.sh` or include them in `CFLAGS`.
359 The library API can be found in `manuals/bcl.3.md` or `man bcl` once the library
362 The library is built as `bin/libbcl.a`.
366 To build `bc` only (no `dc`), use any one of the following commands for the
371 ./configure.sh --bc-only
373 ./configure.sh --disable-dc
376 Those commands are all equivalent.
378 ***Warning***: It is an error to use those options if `bc` has also been
379 disabled (see below).
383 To build `dc` only (no `bc`), use either one of the following commands for the
388 ./configure.sh --dc-only
390 ./configure.sh --disable-bc
393 Those commands are all equivalent.
395 ***Warning***: It is an error to use those options if `dc` has also been
396 disabled (see above).
400 To disable hisory, pass either the `-H` flag or the `--disable-history` option
401 to `configure.sh`, as follows:
405 ./configure.sh --disable-history
408 Both commands are equivalent.
410 History is automatically disabled when building for Windows or on another
411 platform that does not support the terminal handling that is required.
413 ***WARNING***: Of all of the code in the `bc`, this is the only code that is not
414 completely portable. If the `bc` does not work on your platform, your first step
415 should be to retry with history disabled.
417 This option affects the [build type][7].
419 #### NLS (Locale Support)
421 To disable locale support (use only English), pass either the `-N` flag or the
422 `--disable-nls` option to `configure.sh`, as follows:
426 ./configure.sh --disable-nls
429 Both commands are equivalent.
431 NLS (locale support) is automatically disabled when building for Windows or on
432 another platform that does not support the POSIX locale API or utilities.
434 This option affects the [build type][7].
438 This `bc` has 7 extra operators:
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)
448 There is no assignment version of `$` because it is a unary operator.
450 The assignment versions of the above operators are not available in `dc`, but
451 the others are, as the operators `$`, `@`, `H`, and `h`, respectively.
453 In addition, this `bc` has the option of outputting in scientific notation or
454 engineering notation. It can also take input in scientific or engineering
455 notation. On top of that, it has a pseudo-random number generator. (See the
456 full manual for more details.)
458 Extra operators, scientific notation, engineering notation, and the
459 pseudo-random number generator can be disabled by passing either the `-E` flag
460 or the `--disable-extra-math` option to `configure.sh`, as follows:
464 ./configure.sh --disable-extra-math
467 Both commands are equivalent.
469 This `bc` also has a larger library that is only enabled if extra operators and
470 the pseudo-random number generator are. More information about the functions can
471 be found in the Extended Library section of the full manual.
473 This option affects the [build type][7].
475 #### Karatsuba Length
477 The Karatsuba length is the point at which `bc` and `dc` switch from Karatsuba
478 multiplication to brute force, `O(n^2)` multiplication. It can be set by passing
479 the `-k` flag or the `--karatsuba-len` option to `configure.sh` as follows:
483 ./configure.sh --karatsuba-len 32
486 Both commands are equivalent.
490 ***WARNING***: The Karatsuba Length must be a **integer** greater than or equal
491 to `16` (to prevent stack overflow). If it is not, `configure.sh` will give an
496 This `bc` and `dc` have a few settings to override default behavior.
498 The defaults for these settings can be set by package maintainers, and the
499 settings themselves can be overriden by users.
501 To 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:
505 ./configure.sh -s bc.banner
506 ./configure.sh --set-default-on=bc.banner
509 Both commands are equivalent.
511 To 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:
515 ./configure.sh -S bc.banner
516 ./configure.sh --set-default-off=bc.banner
519 Both commands are equivalent.
521 Users can override the default settings set by packagers with environment
522 variables. If the environment variable has an integer, then the setting is
523 turned **on** for a non-zero integer, and **off** for zero.
525 The table of the available settings, along with their defaults and the
526 environment variables to override them, is below:
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 | | |
549 | --------------- | -------------------- | ------------ | -------------------- |
550 | dc.tty_mode | Whether TTY mode for | 0 | BC_TTY_MODE |
551 | | dc should be on when | | |
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 | --------------- | -------------------- | ------------ | -------------------- |
564 These settings are not meant to be changed on a whim. They are meant to ensure
565 that this bc and dc will conform to the expectations of the user on each
570 The relevant `autotools`-style install options are supported in `configure.sh`:
583 ./configure.sh --prefix=/usr --localedir /usr/share/nls
588 They correspond to the environment variables `$PREFIX`, `$BINDIR`,
589 `$DATAROOTDIR`, `$DATADIR`, `$MANDIR`, `$MAN1DIR`, and `$LOCALEDIR`,
592 ***WARNING***: If the option is given, the value of the corresponding
593 environment variable is overridden.
595 ***WARNING***: If any long command-line options are used, the long form of all
596 other command-line options must be used. Mixing long and short options is not
601 To disable installing manpages, pass either the `-M` flag or the
602 `--disable-man-pages` option to `configure.sh` as follows:
606 ./configure.sh --disable-man-pages
609 Both commands are equivalent.
613 By default, `bc` and `dc` do not install all locales, but only the enabled
614 locales. If `DESTDIR` exists and is not empty, then they will install all of
615 the locales that exist on the system. The `-l` flag or `--install-all-locales`
616 option skips all of that and just installs all of the locales that `bc` and `dc`
617 have, regardless. To enable that behavior, you can pass the `-l` flag or the
618 `--install-all-locales` option to `configure.sh`, as follows:
622 ./configure.sh --install-all-locales
625 Both commands are equivalent.
629 The `configure.sh` script will accept an optimization level to pass to the
630 compiler. Because `bc` is orders of magnitude faster with optimization, I
631 ***highly*** recommend package and distro maintainers pass the highest
632 optimization level available in `CC` to `configure.sh` with the `-O` flag or
633 `--opt` option, as follows:
637 ./configure.sh --opt 3
640 Both commands are equivalent.
642 The build and install can then be run as normal:
649 As usual, `configure.sh` will also accept additional `CFLAGS` on the command
650 line, so for SSE4 architectures, the following can add a bit more speed:
653 CFLAGS="-march=native -msse4" ./configure.sh -O3
658 Building with link-time optimization (`-flto` in clang) can further increase the
659 performance. I ***highly*** recommend doing so.
661 I do ***NOT*** recommend building with `-march=native`; doing so reduces this
664 Manual stripping is not necessary; non-debug builds are automatically stripped
669 Debug builds (which also disable optimization if no optimization level is given
670 and if no extra `CFLAGS` are given) can be enabled with either the `-g` flag or
671 the `--debug` option, as follows:
675 ./configure.sh --debug
678 Both commands are equivalent.
680 The build and install can then be run as normal:
687 ### Stripping Binaries
689 By default, when `bc` and `dc` are not built in debug mode, the binaries are
690 stripped. Stripping can be disabled with either the `-T` or the
691 `--disable-strip` option, as follows:
695 ./configure.sh --disable-strip
698 Both commands are equivalent.
700 The build and install can then be run as normal:
709 `bc` and `dc` have 8 build types, affected by the [History][8], [NLS (Locale
710 Support)][9], and [Extra Math][10] build options.
712 The build types are as follows:
714 * `A`: Nothing disabled.
715 * `E`: Extra math disabled.
716 * `H`: History 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.
723 These build types correspond to the generated manuals in `manuals/bc` and
728 When 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
730 isn't much for what is contained in the binary, but if necessary, it can be
733 The single largest user of space is the `bc` calculator. If just `dc` is needed,
734 the size can be reduced to 107.6 kb (107,584 bytes).
736 The next largest user of space is history support. If that is not needed, size
737 can be reduced (for a build with both calculators) to 119.9 kb (119,866 bytes).
739 There are several reasons that history is a bigger user of space than `dc`
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`.
750 The next biggest user is extra math support. Without it, the size is reduced to
751 124.0 kb (123,986 bytes) with history and 107.6 kb (107,560 bytes) without
754 The reasons why extra math support is bigger than `dc`, besides the fact that
755 `dc` is small already, are:
757 * Extra math supports adds an extra math library that takes several kilobytes of
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
762 * Extra math support adds several operators.
764 The next biggest user is `dc`, so if just `bc` is needed, the size can be
765 reduced to 128.1 kb (128,096 bytes) with history and extra math support, 107.6
766 kb (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.
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`
772 optimizations. These builds were done on an `x86_64` machine running Gentoo
777 The default test suite can be run with the following command:
783 To test `bc` only, run the following command:
789 To test `dc` only, run the following command:
795 This `bc`, if built, assumes a working, GNU-compatible `bc`, installed on the
796 system 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:
801 ./configure.sh --disable-generated-tests
804 After running `configure.sh`, build and run tests as follows:
811 This `dc` also assumes a working, GNU-compatible `dc`, installed on the system
812 and in the `PATH`, to generate some tests, unless one of the above options is
813 given to `configure.sh`.
815 To generate test coverage, pass the `-c` flag or the `--coverage` option to
816 `configure.sh` as follows:
820 ./configure.sh --coverage
823 Both commands are equivalent.
825 ***WARNING***: Both `bc` and `dc` must be built for test coverage. Otherwise,
826 `configure.sh` will give an error.
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
833 [6]: #cross-compiling
836 [9]: #nls-locale-support