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.
40 <a name="cross-compiling"/>
44 To cross-compile this `bc`, an appropriate compiler must be present and assigned
45 to the environment variable `HOSTCC` or `HOST_CC` (the two are equivalent,
46 though `HOSTCC` is prioritized). This is in order to bootstrap core file(s), if
47 the architectures are not compatible (i.e., unlike i686 on x86_64). Thus, the
51 HOSTCC="/path/to/native/compiler" ./configure.sh
56 `HOST_CC` will work in exactly the same way.
58 `HOSTCFLAGS` and `HOST_CFLAGS` can be used to set compiler flags for `HOSTCC`.
59 (The two are equivalent, as `HOSTCC` and `HOST_CC` are.) `HOSTCFLAGS` is
60 prioritized over `HOST_CFLAGS`. If neither are present, `HOSTCC` (or `HOST_CC`)
61 uses `CFLAGS` (see [Build Environment Variables][4] for more details).
63 It is expected that `CC` produces code for the target system and `HOSTCC`
64 produces code for the host system. See [Build Environment Variables][4] for more
67 If an emulator is necessary to run the bootstrap binaries, it can be set with
68 the environment variable `GEN_EMU`.
70 <a name="build-environment-variables"/>
72 ## Build Environment Variables
74 This `bc` supports `CC`, `HOSTCC`, `HOST_CC`, `CFLAGS`, `HOSTCFLAGS`,
75 `HOST_CFLAGS`, `CPPFLAGS`, `LDFLAGS`, `LDLIBS`, `PREFIX`, `DESTDIR`, `BINDIR`,
76 `DATAROOTDIR`, `DATADIR`, `MANDIR`, `MAN1DIR`, `LOCALEDIR` `EXECSUFFIX`,
77 `EXECPREFIX`, `LONG_BIT`, `GEN_HOST`, and `GEN_EMU` environment variables in
78 `configure.sh`. Any values of those variables given to `configure.sh` will be
79 put into the generated Makefile.
81 More detail on what those environment variables do can be found in the following
86 C compiler for the target system. `CC` must be compatible with POSIX `c99`
87 behavior and options. However, **I encourage users to use any C99 or C11
88 compatible compiler they wish.**
90 If there is a space in the basename of the compiler, the items after the first
91 space are assumed to be compiler flags, and in that case, the flags are
92 automatically moved into CFLAGS.
96 ### `HOSTCC` or `HOST_CC`
98 C compiler for the host system, used only in [cross compiling][6]. Must be
99 compatible with POSIX `c99` behavior and options.
101 If there is a space in the basename of the compiler, the items after the first
102 space are assumed to be compiler flags, and in that case, the flags are
103 automatically moved into HOSTCFLAGS.
109 Command-line flags that will be passed verbatim to `CC`.
113 ### `HOSTCFLAGS` or `HOST_CFLAGS`
115 Command-line flags that will be passed verbatim to `HOSTCC` or `HOST_CC`.
117 Defaults to `$CFLAGS`.
121 Command-line flags for the C preprocessor. These are also passed verbatim to
122 both compilers (`CC` and `HOSTCC`); they are supported just for legacy reasons.
128 Command-line flags for the linker. These are also passed verbatim to both
129 compilers (`CC` and `HOSTCC`); they are supported just for legacy reasons.
135 Libraries to link to. These are also passed verbatim to both compilers (`CC` and
136 `HOSTCC`); they are supported just for legacy reasons and for cross compiling
137 with different C standard libraries (like [musl][3]).
143 The prefix to install to.
145 Can be overridden by passing the `--prefix` option to `configure.sh`.
147 Defaults to `/usr/local`.
151 Path to prepend onto `PREFIX`. This is mostly for distro and package
154 This can be passed either to `configure.sh` or `make install`. If it is passed
155 to both, the one given to `configure.sh` takes precedence.
161 The directory to install binaries in.
163 Can be overridden by passing the `--bindir` option to `configure.sh`.
165 Defaults to `$PREFIX/bin`.
169 The directory to install header files in.
171 Can be overridden by passing the `--includedir` option to `configure.sh`.
173 Defaults to `$PREFIX/include`.
177 The directory to install libraries in.
179 Can be overridden by passing the `--libdir` option to `configure.sh`.
181 Defaults to `$PREFIX/lib`.
185 The root directory to install data files in.
187 Can be overridden by passing the `--datarootdir` option to `configure.sh`.
189 Defaults to `$PREFIX/share`.
193 The directory to install data files in.
195 Can be overridden by passing the `--datadir` option to `configure.sh`.
197 Defaults to `$DATAROOTDIR`.
201 The directory to install manpages in.
203 Can be overridden by passing the `--mandir` option to `configure.sh`.
205 Defaults to `$DATADIR/man`
209 The directory to install Section 1 manpages in. Because both `bc` and `dc` are
210 Section 1 commands, this is the only relevant section directory.
212 Can be overridden by passing the `--man1dir` option to `configure.sh`.
214 Defaults to `$MANDIR/man1`.
218 The directory to install locales in.
220 Can be overridden by passing the `--localedir` option to `configure.sh`.
222 Defaults to `$DATAROOTDIR/locale`.
226 The suffix to append onto the executable names *when installing*. This is for
227 packagers and distro maintainers who want this `bc` as an option, but do not
228 want to replace the default `bc`.
234 The prefix to append onto the executable names *when building and installing*.
235 This is for packagers and distro maintainers who want this `bc` as an option,
236 but do not want to replace the default `bc`.
242 The number of bits in a C `long` type. This is mostly for the embedded space.
244 This `bc` uses `long`s internally for overflow checking. In C99, a `long` is
245 required to be 32 bits. For this reason, on 8-bit and 16-bit microcontrollers,
246 the generated code to do math with `long` types may be inefficient.
248 For most normal desktop systems, setting this is unnecessary, except that 32-bit
249 platforms with 64-bit longs may want to set it to `32`.
251 Defaults to the default value of `LONG_BIT` for the target platform. For
252 compliance with the `bc` spec, the minimum allowed value is `32`.
254 It is an error if the specified value is greater than the default value of
255 `LONG_BIT` for the target platform.
259 Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to produce the C
260 files that contain the help texts as well as the math libraries. By default,
261 `gen/strgen.c` is used, compiled by `$HOSTCC` and run on the host machine. Using
262 `gen/strgen.sh` removes the need to compile and run an executable on the host
263 machine since `gen/strgen.sh` is a POSIX shell script. However, `gen/lib2.bc` is
264 perilously close to 4095 characters, the max supported length of a string
265 literal in C99 (and it could be added to in the future), and `gen/strgen.sh`
266 generates a string literal instead of an array, as `gen/strgen.c` does. For most
267 production-ready compilers, this limit probably is not enforced, but it could
268 be. Both options are still available for this reason.
270 If you are sure your compiler does not have the limit and do not want to compile
271 and run a binary on the host machine, set this variable to "0". Any other value,
272 or a non-existent value, will cause the build system to compile and run
279 The emulator to run bootstrap binaries under. This is only if the binaries
280 produced by `HOSTCC` (or `HOST_CC`) need to be run under an emulator to work.
284 <a name="build-options"/>
288 This `bc` comes with several build options, all of which are enabled by default.
290 All options can be used with each other, with a few exceptions that will be
293 **NOTE**: All long options with mandatory argumenst accept either one of the
303 To build the math library, use the following commands for the configure step:
307 ./configure.sh --library
310 Both commands are equivalent.
312 When the library is built, history, prompt, and locales are disabled, and the
313 functionality for `bc` and `dc` are both enabled, though the executables are
314 *not* built. This is because the library's options clash with the executables.
316 To build an optimized version of the library, users can pass optimization
317 options to `configure.sh` or include them in `CFLAGS`.
319 The library API can be found in `manuals/bcl.3.md` or `man bcl` once the library
322 The library is built as `bin/libbcl.a`.
326 To build `bc` only (no `dc`), use any one of the following commands for the
331 ./configure.sh --bc-only
333 ./configure.sh --disable-dc
336 Those commands are all equivalent.
338 ***Warning***: It is an error to use those options if `bc` has also been
339 disabled (see below).
343 To build `dc` only (no `bc`), use either one of the following commands for the
348 ./configure.sh --dc-only
350 ./configure.sh --disable-bc
353 Those commands are all equivalent.
355 ***Warning***: It is an error to use those options if `dc` has also been
356 disabled (see above).
358 <a name="build-history"/>
362 To disable signal handling, pass either the `-H` flag or the `--disable-history`
363 option to `configure.sh`, as follows:
367 ./configure.sh --disable-history
370 Both commands are equivalent.
372 History is automatically disabled when building for Windows or on another
373 platform that does not support the terminal handling that is required.
375 ***WARNING***: Of all of the code in the `bc`, this is the only code that is not
376 completely portable. If the `bc` does not work on your platform, your first step
377 should be to retry with history disabled.
379 ### NLS (Locale Support)
381 To disable locale support (use only English), pass either the `-N` flag or the
382 `--disable-nls` option to `configure.sh`, as follows:
386 ./configure.sh --disable-nls
389 Both commands are equivalent.
391 NLS (locale support) is automatically disabled when building for Windows or on
392 another platform that does not support the POSIX locale API or utilities.
396 By default, `bc` and `dc` print a prompt when in interactive mode. They both
397 have the command-line option `-P`/`--no-prompt`, which turns that off, but it
398 can be disabled permanently in the build by passing the `-P` flag or the
399 `--disable-prompt` option to `configure.sh`, as follows:
403 ./configure.sh --disable-prompt
406 Both commands are equivalent.
410 By default, `bc` and `dc` do not install all locales, but only the enabled
411 locales. If `DESTDIR` exists and is not empty, then they will install all of
412 the locales that exist on the system. The `-l` flag or `--install-all-locales`
413 option skips all of that and just installs all of the locales that `bc` and `dc`
414 have, regardless. To enable that behavior, you can pass the `-l` flag or the
415 `--install-all-locales` option to `configure.sh`, as follows:
419 ./configure.sh --install-all-locales
422 Both commands are equivalent.
426 This `bc` has 7 extra operators:
428 * `$` (truncation to integer)
429 * `@` (set precision)
430 * `@=` (set precision and assign)
431 * `<<` (shift number left, shifts radix right)
432 * `<<=` (shift number left and assign)
433 * `>>` (shift number right, shifts radix left)
434 * `>>=` (shift number right and assign)
436 There is no assignment version of `$` because it is a unary operator.
438 The assignment versions of the above operators are not available in `dc`, but
439 the others are, as the operators `$`, `@`, `H`, and `h`, respectively.
441 In addition, this `bc` has the option of outputting in scientific notation or
442 engineering notation. It can also take input in scientific or engineering
443 notation. On top of that, it has a pseudo-random number generator. (See the
444 full manual for more details.)
446 Extra operators, scientific notation, engineering notation, and the
447 pseudo-random number generator can be disabled by passing either the `-E` flag
448 or the `--disable-extra-math` option to `configure.sh`, as follows:
452 ./configure.sh --disable-extra-math
455 Both commands are equivalent.
457 This `bc` also has a larger library that is only enabled if extra operators and
458 the pseudo-random number generator are. More information about the functions can
459 be found in the Extended Library section of the full manual.
463 To disable installing manpages, pass either the `-M` flag or the
464 `--disable-man-pages` option to `configure.sh` as follows:
468 ./configure.sh --disable-man-pages
471 Both commands are equivalent.
475 The Karatsuba length is the point at which `bc` and `dc` switch from Karatsuba
476 multiplication to brute force, `O(n^2)` multiplication. It can be set by passing
477 the `-k` flag or the `--karatsuba-len` option to `configure.sh` as follows:
481 ./configure.sh --karatsuba-len 64
484 Both commands are equivalent.
488 ***WARNING***: The Karatsuba Length must be a **integer** greater than or equal
489 to `16` (to prevent stack overflow). If it is not, `configure.sh` will give an
494 The relevant `autotools`-style install options are supported in `configure.sh`:
507 ./configure.sh --prefix=/usr --localedir /usr/share/nls
512 They correspond to the environment variables `$PREFIX`, `$BINDIR`,
513 `$DATAROOTDIR`, `$DATADIR`, `$MANDIR`, `$MAN1DIR`, and `$LOCALEDIR`,
516 ***WARNING***: If the option is given, the value of the corresponding
517 environment variable is overridden.
519 ***WARNING***: If any long command-line options are used, the long form of all
520 other command-line options must be used. Mixing long and short options is not
525 The `configure.sh` script will accept an optimization level to pass to the
526 compiler. Because `bc` is orders of magnitude faster with optimization, I
527 ***highly*** recommend package and distro maintainers pass the highest
528 optimization level available in `CC` to `configure.sh` with the `-O` flag or
529 `--opt` option, as follows:
533 ./configure.sh --opt 3
536 Both commands are equivalent.
538 The build and install can then be run as normal:
545 As usual, `configure.sh` will also accept additional `CFLAGS` on the command
546 line, so for SSE4 architectures, the following can add a bit more speed:
549 CFLAGS="-march=native -msse4" ./configure.sh -O3
554 Building with link-time optimization (`-flto` in clang) can further increase the
555 performance. I ***highly*** recommend doing so.
557 I do **NOT*** recommend building with `-march=native`; doing so reduces this
560 Manual stripping is not necessary; non-debug builds are automatically stripped
565 Debug builds (which also disable optimization if no optimization level is given
566 and if no extra `CFLAGS` are given) can be enabled with either the `-g` flag or
567 the `--debug` option, as follows:
571 ./configure.sh --debug
574 Both commands are equivalent.
576 The build and install can then be run as normal:
583 ## Stripping Binaries
585 By default, when `bc` and `dc` are not built in debug mode, the binaries are
586 stripped. Stripping can be disabled with either the `-T` or the
587 `--disable-strip` option, as follows:
591 ./configure.sh --disable-strip
594 Both commands are equivalent.
596 The build and install can then be run as normal:
605 When built with both calculators, all available features, and `-Os` using
606 `clang` and `musl`, the executable is 140.4 kb (140,386 bytes) on `x86_64`. That
607 isn't much for what is contained in the binary, but if necessary, it can be
610 The single largest user of space is the `bc` calculator. If just `dc` is needed,
611 the size can be reduced to 107.6 kb (107,584 bytes).
613 The next largest user of space is history support. If that is not needed, size
614 can be reduced (for a build with both calculators) to 119.9 kb (119,866 bytes).
616 There are several reasons that history is a bigger user of space than `dc`
619 * `dc`'s lexer and parser are *tiny* compared to `bc`'s because `dc` code is
620 almost already in the form that it is executed in, while `bc` has to not only
621 adjust the form to be executable, it has to parse functions, loops, `if`
622 statements, and other extra features.
623 * `dc` does not have much extra code in the interpreter.
624 * History has a lot of const data for supporting `UTF-8` terminals.
625 * History pulls in a bunch of more code from the `libc`.
627 The next biggest user is extra math support. Without it, the size is reduced to
628 124.0 kb (123,986 bytes) with history and 107.6 kb (107,560 bytes) without
631 The reasons why extra math support is bigger than `dc`, besides the fact that
632 `dc` is small already, are:
634 * Extra math supports adds an extra math library that takes several kilobytes of
636 * Extra math support includes support for a pseudo-random number generator,
637 including the code to convert a series of pseudo-random numbers into a number
639 * Extra math support adds several operators.
641 The next biggest user is `dc`, so if just `bc` is needed, the size can be
642 reduced to 128.1 kb (128,096 bytes) with history and extra math support, 107.6
643 kb (107,576 bytes) without history and with extra math support, and 95.3 kb
644 (95,272 bytes) without history and without extra math support.
646 *Note*: all of these binary sizes were compiled using `musl` `1.2.0` as the
647 `libc`, making a fully static executable, with `clang` `9.0.1` (well,
648 `musl-clang` using `clang` `9.0.1`) as the compiler and using `-Os`
649 optimizations. These builds were done on an `x86_64` machine running Gentoo
654 The default test suite can be run with the following command:
660 To test `bc` only, run the following command:
666 To test `dc` only, run the following command:
672 This `bc`, if built, assumes a working, GNU-compatible `bc`, installed on the
673 system and in the `PATH`, to generate some tests, unless the `-G` flag or
674 `--disable-generated-tests` option is given to `configure.sh`, as follows:
678 ./configure.sh --disable-generated-tests
681 After running `configure.sh`, build and run tests as follows:
688 This `dc` also assumes a working, GNU-compatible `dc`, installed on the system
689 and in the `PATH`, to generate some tests, unless one of the above options is
690 given to `configure.sh`.
692 To generate test coverage, pass the `-c` flag or the `--coverage` option to
693 `configure.sh` as follows:
697 ./configure.sh --coverage
700 Both commands are equivalent.
702 ***WARNING***: Both `bc` and `dc` must be built for test coverage. Otherwise,
703 `configure.sh` will give an error.
705 [1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
706 [2]: https://www.gnu.org/software/bc/
707 [3]: https://www.musl-libc.org/
708 [4]: #build-environment-variables
710 [6]: #cross-compiling