aboutsummaryrefslogtreecommitdiff
path: root/contrib/bc/manuals/build.md
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bc/manuals/build.md')
-rw-r--r--contrib/bc/manuals/build.md694
1 files changed, 694 insertions, 0 deletions
diff --git a/contrib/bc/manuals/build.md b/contrib/bc/manuals/build.md
new file mode 100644
index 000000000000..47fbabdfad7f
--- /dev/null
+++ b/contrib/bc/manuals/build.md
@@ -0,0 +1,694 @@
+# Build
+
+This `bc` attempts to be as portable as possible. It can be built on any
+POSIX-compliant system.
+
+To accomplish that, a POSIX-compatible, custom `configure.sh` script is used to
+select build options, compiler, and compiler flags and generate a `Makefile`.
+
+The general form of configuring, building, and installing this `bc` is as
+follows:
+
+```
+[ENVIRONMENT_VARIABLE=<value>...] ./configure.sh [build_options...]
+make
+make install
+```
+
+To get all of the options, including any useful environment variables, use
+either one of the following commands:
+
+```
+./configure.sh -h
+./configure.sh --help
+```
+
+***WARNING***: even though `configure.sh` supports both option types, short and
+long, it does not support handling both at the same time. Use only one type.
+
+To learn the available `make` targets run the following command after running
+the `configure.sh` script:
+
+```
+make help
+```
+
+See [Build Environment Variables][4] for a more detailed description of all
+accepted environment variables and [Build Options][5] for more detail about all
+accepted build options.
+
+<a name="cross-compiling"/>
+
+## Cross Compiling
+
+To cross-compile this `bc`, an appropriate compiler must be present and assigned
+to the environment variable `HOSTCC` or `HOST_CC` (the two are equivalent,
+though `HOSTCC` is prioritized). This is in order to bootstrap core file(s), if
+the architectures are not compatible (i.e., unlike i686 on x86_64). Thus, the
+approach is:
+
+```
+HOSTCC="/path/to/native/compiler" ./configure.sh
+make
+make install
+```
+
+`HOST_CC` will work in exactly the same way.
+
+`HOSTCFLAGS` and `HOST_CFLAGS` can be used to set compiler flags for `HOSTCC`.
+(The two are equivalent, as `HOSTCC` and `HOST_CC` are.) `HOSTCFLAGS` is
+prioritized over `HOST_CFLAGS`. If neither are present, `HOSTCC` (or `HOST_CC`)
+uses `CFLAGS` (see [Build Environment Variables][4] for more details).
+
+It is expected that `CC` produces code for the target system and `HOSTCC`
+produces code for the host system. See [Build Environment Variables][4] for more
+details.
+
+If an emulator is necessary to run the bootstrap binaries, it can be set with
+the environment variable `GEN_EMU`.
+
+<a name="build-environment-variables"/>
+
+## Build Environment Variables
+
+This `bc` supports `CC`, `HOSTCC`, `HOST_CC`, `CFLAGS`, `HOSTCFLAGS`,
+`HOST_CFLAGS`, `CPPFLAGS`, `LDFLAGS`, `LDLIBS`, `PREFIX`, `DESTDIR`, `BINDIR`,
+`DATAROOTDIR`, `DATADIR`, `MANDIR`, `MAN1DIR`, `LOCALEDIR` `EXECSUFFIX`,
+`EXECPREFIX`, `LONG_BIT`, `GEN_HOST`, and `GEN_EMU` environment variables in
+`configure.sh`. Any values of those variables given to `configure.sh` will be
+put into the generated Makefile.
+
+More detail on what those environment variables do can be found in the following
+sections.
+
+### `CC`
+
+C compiler for the target system. `CC` must be compatible with POSIX `c99`
+behavior and options. However, **I encourage users to use any C99 or C11
+compatible compiler they wish.**
+
+If there is a space in the basename of the compiler, the items after the first
+space are assumed to be compiler flags, and in that case, the flags are
+automatically moved into CFLAGS.
+
+Defaults to `c99`.
+
+### `HOSTCC` or `HOST_CC`
+
+C compiler for the host system, used only in [cross compiling][6]. Must be
+compatible with POSIX `c99` behavior and options.
+
+If there is a space in the basename of the compiler, the items after the first
+space are assumed to be compiler flags, and in that case, the flags are
+automatically moved into HOSTCFLAGS.
+
+Defaults to `$CC`.
+
+### `CFLAGS`
+
+Command-line flags that will be passed verbatim to `CC`.
+
+Defaults to empty.
+
+### `HOSTCFLAGS` or `HOST_CFLAGS`
+
+Command-line flags that will be passed verbatim to `HOSTCC` or `HOST_CC`.
+
+Defaults to `$CFLAGS`.
+
+### `CPPFLAGS`
+
+Command-line flags for the C preprocessor. These are also passed verbatim to
+both compilers (`CC` and `HOSTCC`); they are supported just for legacy reasons.
+
+Defaults to empty.
+
+### `LDFLAGS`
+
+Command-line flags for the linker. These are also passed verbatim to both
+compilers (`CC` and `HOSTCC`); they are supported just for legacy reasons.
+
+Defaults to empty.
+
+### `LDLIBS`
+
+Libraries to link to. These are also passed verbatim to both compilers (`CC` and
+`HOSTCC`); they are supported just for legacy reasons and for cross compiling
+with different C standard libraries (like [musl][3]).
+
+Defaults to empty.
+
+### `PREFIX`
+
+The prefix to install to.
+
+Can be overridden by passing the `--prefix` option to `configure.sh`.
+
+Defaults to `/usr/local`.
+
+### `DESTDIR`
+
+Path to prepend onto `PREFIX`. This is mostly for distro and package
+maintainers.
+
+This can be passed either to `configure.sh` or `make install`. If it is passed
+to both, the one given to `configure.sh` takes precedence.
+
+Defaults to empty.
+
+### `BINDIR`
+
+The directory to install binaries in.
+
+Can be overridden by passing the `--bindir` option to `configure.sh`.
+
+Defaults to `$PREFIX/bin`.
+
+### `DATAROOTDIR`
+
+The root directory to install data files in.
+
+Can be overridden by passing the `--datarootdir` option to `configure.sh`.
+
+Defaults to `$PREFIX/share`.
+
+### `DATADIR`
+
+The directory to install data files in.
+
+Can be overridden by passing the `--datadir` option to `configure.sh`.
+
+Defaults to `$DATAROOTDIR`.
+
+### `MANDIR`
+
+The directory to install manpages in.
+
+Can be overridden by passing the `--mandir` option to `configure.sh`.
+
+Defaults to `$DATADIR/man`
+
+### `MAN1DIR`
+
+The directory to install Section 1 manpages in. Because both `bc` and `dc` are
+Section 1 commands, this is the only relevant section directory.
+
+Can be overridden by passing the `--man1dir` option to `configure.sh`.
+
+Defaults to `$MANDIR/man1`.
+
+### `LOCALEDIR`
+
+The directory to install locales in.
+
+Can be overridden by passing the `--localedir` option to `configure.sh`.
+
+Defaults to `$DATAROOTDIR/locale`.
+
+### `EXECSUFFIX`
+
+The suffix to append onto the executable names *when installing*. This is for
+packagers and distro maintainers who want this `bc` as an option, but do not
+want to replace the default `bc`.
+
+Defaults to empty.
+
+### `EXECPREFIX`
+
+The prefix to append onto the executable names *when building and installing*.
+This is for packagers and distro maintainers who want this `bc` as an option,
+but do not want to replace the default `bc`.
+
+Defaults to empty.
+
+### `LONG_BIT`
+
+The number of bits in a C `long` type. This is mostly for the embedded space.
+
+This `bc` uses `long`s internally for overflow checking. In C99, a `long` is
+required to be 32 bits. For this reason, on 8-bit and 16-bit microcontrollers,
+the generated code to do math with `long` types may be inefficient.
+
+For most normal desktop systems, setting this is unnecessary, except that 32-bit
+platforms with 64-bit longs may want to set it to `32`.
+
+Defaults to the default value of `LONG_BIT` for the target platform. For
+compliance with the `bc` spec, the minimum allowed value is `32`.
+
+It is an error if the specified value is greater than the default value of
+`LONG_BIT` for the target platform.
+
+### `GEN_HOST`
+
+Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to produce the C
+files that contain the help texts as well as the math libraries. By default,
+`gen/strgen.c` is used, compiled by `$HOSTCC` and run on the host machine. Using
+`gen/strgen.sh` removes the need to compile and run an executable on the host
+machine since `gen/strgen.sh` is a POSIX shell script. However, `gen/lib2.bc` is
+perilously close to 4095 characters, the max supported length of a string
+literal in C99 (and it could be added to in the future), and `gen/strgen.sh`
+generates a string literal instead of an array, as `gen/strgen.c` does. For most
+production-ready compilers, this limit probably is not enforced, but it could
+be. Both options are still available for this reason.
+
+If you are sure your compiler does not have the limit and do not want to compile
+and run a binary on the host machine, set this variable to "0". Any other value,
+or a non-existent value, will cause the build system to compile and run
+`gen/strgen.c`.
+
+Default is "".
+
+### `GEN_EMU`
+
+The emulator to run bootstrap binaries under. This is only if the binaries
+produced by `HOSTCC` (or `HOST_CC`) need to be run under an emulator to work.
+
+Defaults to empty.
+
+<a name="build-options"/>
+
+## Build Options
+
+This `bc` comes with several build options, all of which are enabled by default.
+
+All options can be used with each other, with a few exceptions that will be
+noted below.
+
+**NOTE**: All long options with mandatory argumenst accept either one of the
+following forms:
+
+```
+--option arg
+--option=arg
+```
+
+### Library
+
+To build the math library, use the following commands for the configure step:
+
+```
+./configure.sh -a
+./configure.sh --library
+```
+
+Both commands are equivalent.
+
+When the library is built, history, prompt, and locales are disabled, and the
+functionality for `bc` and `dc` are both enabled, though the executables are
+*not* built. This is because the library's options clash with the executables.
+
+To build an optimized version of the library, users can pass optimization
+options to `configure.sh` or include them in `CFLAGS`.
+
+The library API can be found in `manuals/bcl.3.md` or `man bcl` once the library
+is installed.
+
+The library is built as `bin/libbcl.a`.
+
+### `bc` Only
+
+To build `bc` only (no `dc`), use any one of the following commands for the
+configure step:
+
+```
+./configure.sh -b
+./configure.sh --bc-only
+./configure.sh -D
+./configure.sh --disable-dc
+```
+
+Those commands are all equivalent.
+
+***Warning***: It is an error to use those options if `bc` has also been
+disabled (see below).
+
+### `dc` Only
+
+To build `dc` only (no `bc`), use either one of the following commands for the
+configure step:
+
+```
+./configure.sh -d
+./configure.sh --dc-only
+./configure.sh -B
+./configure.sh --disable-bc
+```
+
+Those commands are all equivalent.
+
+***Warning***: It is an error to use those options if `dc` has also been
+disabled (see above).
+
+<a name="build-history"/>
+
+### History
+
+To disable signal handling, pass either the `-H` flag or the `--disable-history`
+option to `configure.sh`, as follows:
+
+```
+./configure.sh -H
+./configure.sh --disable-history
+```
+
+Both commands are equivalent.
+
+History is automatically disabled when building for Windows or on another
+platform that does not support the terminal handling that is required.
+
+***WARNING***: Of all of the code in the `bc`, this is the only code that is not
+completely portable. If the `bc` does not work on your platform, your first step
+should be to retry with history disabled.
+
+### NLS (Locale Support)
+
+To disable locale support (use only English), pass either the `-N` flag or the
+`--disable-nls` option to `configure.sh`, as follows:
+
+```
+./configure.sh -N
+./configure.sh --disable-nls
+```
+
+Both commands are equivalent.
+
+NLS (locale support) is automatically disabled when building for Windows or on
+another platform that does not support the POSIX locale API or utilities.
+
+### Prompt
+
+By default, `bc` and `dc` print a prompt when in interactive mode. They both
+have the command-line option `-P`/`--no-prompt`, which turns that off, but it
+can be disabled permanently in the build by passing the `-P` flag or the
+`--disable-prompt` option to `configure.sh`, as follows:
+
+```
+./configure.sh -P
+./configure.sh --disable-prompt
+```
+
+Both commands are equivalent.
+
+### Locales
+
+By default, `bc` and `dc` do not install all locales, but only the enabled
+locales. If `DESTDIR` exists and is not empty, then they will install all of
+the locales that exist on the system. The `-l` flag or `--install-all-locales`
+option skips all of that and just installs all of the locales that `bc` and `dc`
+have, regardless. To enable that behavior, you can pass the `-l` flag or the
+`--install-all-locales` option to `configure.sh`, as follows:
+
+```
+./configure.sh -l
+./configure.sh --install-all-locales
+```
+
+Both commands are equivalent.
+
+### Extra Math
+
+This `bc` has 7 extra operators:
+
+* `$` (truncation to integer)
+* `@` (set precision)
+* `@=` (set precision and assign)
+* `<<` (shift number left, shifts radix right)
+* `<<=` (shift number left and assign)
+* `>>` (shift number right, shifts radix left)
+* `>>=` (shift number right and assign)
+
+There is no assignment version of `$` because it is a unary operator.
+
+The assignment versions of the above operators are not available in `dc`, but
+the others are, as the operators `$`, `@`, `H`, and `h`, respectively.
+
+In addition, this `bc` has the option of outputting in scientific notation or
+engineering notation. It can also take input in scientific or engineering
+notation. On top of that, it has a pseudo-random number generator. (See the
+full manual for more details.)
+
+Extra operators, scientific notation, engineering notation, and the
+pseudo-random number generator can be disabled by passing either the `-E` flag
+or the `--disable-extra-math` option to `configure.sh`, as follows:
+
+```
+./configure.sh -E
+./configure.sh --disable-extra-math
+```
+
+Both commands are equivalent.
+
+This `bc` also has a larger library that is only enabled if extra operators and
+the pseudo-random number generator are. More information about the functions can
+be found in the Extended Library section of the full manual.
+
+### Manpages
+
+To disable installing manpages, pass either the `-M` flag or the
+`--disable-man-pages` option to `configure.sh` as follows:
+
+```
+./configure.sh -M
+./configure.sh --disable-man-pages
+```
+
+Both commands are equivalent.
+
+### Karatsuba Length
+
+The Karatsuba length is the point at which `bc` and `dc` switch from Karatsuba
+multiplication to brute force, `O(n^2)` multiplication. It can be set by passing
+the `-k` flag or the `--karatsuba-len` option to `configure.sh` as follows:
+
+```
+./configure.sh -k64
+./configure.sh --karatsuba-len 64
+```
+
+Both commands are equivalent.
+
+Default is `64`.
+
+***WARNING***: The Karatsuba Length must be a **integer** greater than or equal
+to `16` (to prevent stack overflow). If it is not, `configure.sh` will give an
+error.
+
+### Install Options
+
+The relevant `autotools`-style install options are supported in `configure.sh`:
+
+* `--prefix`
+* `--bindir`
+* `--datarootdir`
+* `--datadir`
+* `--mandir`
+* `--man1dir`
+* `--localedir`
+
+An example is:
+
+```
+./configure.sh --prefix=/usr --localedir /usr/share/nls
+make
+make install
+```
+
+They correspond to the environment variables `$PREFIX`, `$BINDIR`,
+`$DATAROOTDIR`, `$DATADIR`, `$MANDIR`, `$MAN1DIR`, and `$LOCALEDIR`,
+respectively.
+
+***WARNING***: If the option is given, the value of the corresponding
+environment variable is overridden.
+
+***WARNING***: If any long command-line options are used, the long form of all
+other command-line options must be used. Mixing long and short options is not
+supported.
+
+## Optimization
+
+The `configure.sh` script will accept an optimization level to pass to the
+compiler. Because `bc` is orders of magnitude faster with optimization, I
+***highly*** recommend package and distro maintainers pass the highest
+optimization level available in `CC` to `configure.sh` with the `-O` flag or
+`--opt` option, as follows:
+
+```
+./configure.sh -O3
+./configure.sh --opt 3
+```
+
+Both commands are equivalent.
+
+The build and install can then be run as normal:
+
+```
+make
+make install
+```
+
+As usual, `configure.sh` will also accept additional `CFLAGS` on the command
+line, so for SSE4 architectures, the following can add a bit more speed:
+
+```
+CFLAGS="-march=native -msse4" ./configure.sh -O3
+make
+make install
+```
+
+Building with link-time optimization (`-flto` in clang) can further increase the
+performance. I ***highly*** recommend doing so.
+
+I do **NOT*** recommend building with `-march=native`; doing so reduces this
+`bc`'s performance.
+
+Manual stripping is not necessary; non-debug builds are automatically stripped
+in the link stage.
+
+## Debug Builds
+
+Debug builds (which also disable optimization if no optimization level is given
+and if no extra `CFLAGS` are given) can be enabled with either the `-g` flag or
+the `--debug` option, as follows:
+
+```
+./configure.sh -g
+./configure.sh --debug
+```
+
+Both commands are equivalent.
+
+The build and install can then be run as normal:
+
+```
+make
+make install
+```
+
+## Stripping Binaries
+
+By default, when `bc` and `dc` are not built in debug mode, the binaries are
+stripped. Stripping can be disabled with either the `-T` or the
+`--disable-strip` option, as follows:
+
+```
+./configure.sh -T
+./configure.sh --disable-strip
+```
+
+Both commands are equivalent.
+
+The build and install can then be run as normal:
+
+```
+make
+make install
+```
+
+## Binary Size
+
+When built with both calculators, all available features, and `-Os` using
+`clang` and `musl`, the executable is 140.4 kb (140,386 bytes) on `x86_64`. That
+isn't much for what is contained in the binary, but if necessary, it can be
+reduced.
+
+The single largest user of space is the `bc` calculator. If just `dc` is needed,
+the size can be reduced to 107.6 kb (107,584 bytes).
+
+The next largest user of space is history support. If that is not needed, size
+can be reduced (for a build with both calculators) to 119.9 kb (119,866 bytes).
+
+There are several reasons that history is a bigger user of space than `dc`
+itself:
+
+* `dc`'s lexer and parser are *tiny* compared to `bc`'s because `dc` code is
+ almost already in the form that it is executed in, while `bc` has to not only
+ adjust the form to be executable, it has to parse functions, loops, `if`
+ statements, and other extra features.
+* `dc` does not have much extra code in the interpreter.
+* History has a lot of const data for supporting `UTF-8` terminals.
+* History pulls in a bunch of more code from the `libc`.
+
+The next biggest user is extra math support. Without it, the size is reduced to
+124.0 kb (123,986 bytes) with history and 107.6 kb (107,560 bytes) without
+history.
+
+The reasons why extra math support is bigger than `dc`, besides the fact that
+`dc` is small already, are:
+
+* Extra math supports adds an extra math library that takes several kilobytes of
+ constant data space.
+* Extra math support includes support for a pseudo-random number generator,
+ including the code to convert a series of pseudo-random numbers into a number
+ of arbitrary size.
+* Extra math support adds several operators.
+
+The next biggest user is `dc`, so if just `bc` is needed, the size can be
+reduced to 128.1 kb (128,096 bytes) with history and extra math support, 107.6
+kb (107,576 bytes) without history and with extra math support, and 95.3 kb
+(95,272 bytes) without history and without extra math support.
+
+*Note*: all of these binary sizes were compiled using `musl` `1.2.0` as the
+`libc`, making a fully static executable, with `clang` `9.0.1` (well,
+`musl-clang` using `clang` `9.0.1`) as the compiler and using `-Os`
+optimizations. These builds were done on an `x86_64` machine running Gentoo
+Linux.
+
+## Testing
+
+The default test suite can be run with the following command:
+
+```
+make test
+```
+
+To test `bc` only, run the following command:
+
+```
+make test_bc
+```
+
+To test `dc` only, run the following command:
+
+```
+make test_dc
+```
+
+This `bc`, if built, assumes a working, GNU-compatible `bc`, installed on the
+system and in the `PATH`, to generate some tests, unless the `-G` flag or
+`--disable-generated-tests` option is given to `configure.sh`, as follows:
+
+```
+./configure.sh -G
+./configure.sh --disable-generated-tests
+```
+
+After running `configure.sh`, build and run tests as follows:
+
+```
+make
+make test
+```
+
+This `dc` also assumes a working, GNU-compatible `dc`, installed on the system
+and in the `PATH`, to generate some tests, unless one of the above options is
+given to `configure.sh`.
+
+To generate test coverage, pass the `-c` flag or the `--coverage` option to
+`configure.sh` as follows:
+
+```
+./configure.sh -c
+./configure.sh --coverage
+```
+
+Both commands are equivalent.
+
+***WARNING***: Both `bc` and `dc` must be built for test coverage. Otherwise,
+`configure.sh` will give an error.
+
+[1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
+[2]: https://www.gnu.org/software/bc/
+[3]: https://www.musl-libc.org/
+[4]: #build-environment-variables
+[5]: #build-options
+[6]: #cross-compiling