]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bc/manuals/build.md
Import new 2-clause BSD licenced implementation of the bc and dc commands
[FreeBSD/FreeBSD.git] / contrib / bc / manuals / build.md
1 # Build
2
3 This `bc` attempts to be as portable as possible. It can be built on any
4 POSIX-compliant system.
5
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`.
8
9 The general form of configuring, building, and installing this `bc` is as
10 follows:
11
12 ```
13 [ENVIRONMENT_VARIABLE=<value>...] ./configure.sh [build_options...]
14 make
15 make install
16 ```
17
18 To get all of the options, including any useful environment variables, use
19 either 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
27 long, it does not support handling both at the same time. Use only one type.
28
29 To learn the available `make` targets run the following command after running
30 the `configure.sh` script:
31
32 ```
33 make help
34 ```
35
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.
39
40 <a name="cross-compiling"/>
41
42 ## Cross Compiling
43
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
48 approach is:
49
50 ```
51 HOSTCC="/path/to/native/compiler" ./configure.sh
52 make
53 make install
54 ```
55
56 `HOST_CC` will work in exactly the same way.
57
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).
62
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
65 details.
66
67 If an emulator is necessary to run the bootstrap binaries, it can be set with
68 the environment variable `GEN_EMU`.
69
70 <a name="build-environment-variables"/>
71
72 ## Build Environment Variables
73
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.
80
81 More detail on what those environment variables do can be found in the following
82 sections.
83
84 ### `CC`
85
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.**
89
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.
93
94 Defaults to `c99`.
95
96 ### `HOSTCC` or `HOST_CC`
97
98 C compiler for the host system, used only in [cross compiling][6]. Must be
99 compatible with POSIX `c99` behavior and options.
100
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.
104
105 Defaults to `$CC`.
106
107 ### `CFLAGS`
108
109 Command-line flags that will be passed verbatim to `CC`.
110
111 Defaults to empty.
112
113 ### `HOSTCFLAGS` or `HOST_CFLAGS`
114
115 Command-line flags that will be passed verbatim to `HOSTCC` or `HOST_CC`.
116
117 Defaults to `$CFLAGS`.
118
119 ### `CPPFLAGS`
120
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.
123
124 Defaults to empty.
125
126 ### `LDFLAGS`
127
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.
130
131 Defaults to empty.
132
133 ### `LDLIBS`
134
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]).
138
139 Defaults to empty.
140
141 ### `PREFIX`
142
143 The prefix to install to.
144
145 Can be overridden by passing the `--prefix` option to `configure.sh`.
146
147 Defaults to `/usr/local`.
148
149 ### `DESTDIR`
150
151 Path to prepend onto `PREFIX`. This is mostly for distro and package
152 maintainers.
153
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.
156
157 Defaults to empty.
158
159 ### `BINDIR`
160
161 The directory to install binaries in.
162
163 Can be overridden by passing the `--bindir` option to `configure.sh`.
164
165 Defaults to `$PREFIX/bin`.
166
167 ### `DATAROOTDIR`
168
169 The root directory to install data files in.
170
171 Can be overridden by passing the `--datarootdir` option to `configure.sh`.
172
173 Defaults to `$PREFIX/share`.
174
175 ### `DATADIR`
176
177 The directory to install data files in.
178
179 Can be overridden by passing the `--datadir` option to `configure.sh`.
180
181 Defaults to `$DATAROOTDIR`.
182
183 ### `MANDIR`
184
185 The directory to install manpages in.
186
187 Can be overridden by passing the `--mandir` option to `configure.sh`.
188
189 Defaults to `$DATADIR/man`
190
191 ### `MAN1DIR`
192
193 The directory to install Section 1 manpages in. Because both `bc` and `dc` are
194 Section 1 commands, this is the only relevant section directory.
195
196 Can be overridden by passing the `--man1dir` option to `configure.sh`.
197
198 Defaults to `$MANDIR/man1`.
199
200 ### `LOCALEDIR`
201
202 The directory to install locales in.
203
204 Can be overridden by passing the `--localedir` option to `configure.sh`.
205
206 Defaults to `$DATAROOTDIR/locale`.
207
208 ### `EXECSUFFIX`
209
210 The suffix to append onto the executable names *when installing*. This is for
211 packagers and distro maintainers who want this `bc` as an option, but do not
212 want to replace the default `bc`.
213
214 Defaults to empty.
215
216 ### `EXECPREFIX`
217
218 The prefix to append onto the executable names *when building and installing*.
219 This is for packagers and distro maintainers who want this `bc` as an option,
220 but do not want to replace the default `bc`.
221
222 Defaults to empty.
223
224 ### `LONG_BIT`
225
226 The number of bits in a C `long` type. This is mostly for the embedded space.
227
228 This `bc` uses `long`s internally for overflow checking. In C99, a `long` is
229 required to be 32 bits. For this reason, on 8-bit and 16-bit microcontrollers,
230 the generated code to do math with `long` types may be inefficient.
231
232 For most normal desktop systems, setting this is unnecessary, except that 32-bit
233 platforms with 64-bit longs may want to set it to `32`.
234
235 Defaults to the default value of `LONG_BIT` for the target platform. For
236 compliance with the `bc` spec, the minimum allowed value is `32`.
237
238 It is an error if the specified value is greater than the default value of
239 `LONG_BIT` for the target platform.
240
241 ### `GEN_HOST`
242
243 Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to produce the C
244 files that contain the help texts as well as the math libraries. By default,
245 `gen/strgen.c` is used, compiled by `$HOSTCC` and run on the host machine. Using
246 `gen/strgen.sh` removes the need to compile and run an executable on the host
247 machine since `gen/strgen.sh` is a POSIX shell script. However, `gen/lib2.bc` is
248 perilously close to 4095 characters, the max supported length of a string
249 literal in C99 (and it could be added to in the future), and `gen/strgen.sh`
250 generates a string literal instead of an array, as `gen/strgen.c` does. For most
251 production-ready compilers, this limit probably is not enforced, but it could
252 be. Both options are still available for this reason.
253
254 If you are sure your compiler does not have the limit and do not want to compile
255 and run a binary on the host machine, set this variable to "0". Any other value,
256 or a non-existent value, will cause the build system to compile and run
257 `gen/strgen.c`.
258
259 Default is "".
260
261 ### `GEN_EMU`
262
263 The emulator to run bootstrap binaries under. This is only if the binaries
264 produced by `HOSTCC` (or `HOST_CC`) need to be run under an emulator to work.
265
266 Defaults to empty.
267
268 <a name="build-options"/>
269
270 ## Build Options
271
272 This `bc` comes with several build options, all of which are enabled by default.
273
274 All options can be used with each other, with a few exceptions that will be
275 noted below.
276
277 **NOTE**: All long options with mandatory argumenst accept either one of the
278 following forms:
279
280 ```
281 --option arg
282 --option=arg
283 ```
284
285 ### `bc` Only
286
287 To build `bc` only (no `dc`), use any one of the following commands for the
288 configure step:
289
290 ```
291 ./configure.sh -b
292 ./configure.sh --bc-only
293 ./configure.sh -D
294 ./configure.sh --disable-dc
295 ```
296
297 Those commands are all equivalent.
298
299 ***Warning***: It is an error to use those options if `bc` has also been
300 disabled (see below).
301
302 ### `dc` Only
303
304 To build `dc` only (no `bc`), use either one of the following commands for the
305 configure step:
306
307 ```
308 ./configure.sh -d
309 ./configure.sh --dc-only
310 ./configure.sh -B
311 ./configure.sh --disable-bc
312 ```
313
314 Those commands are all equivalent.
315
316 ***Warning***: It is an error to use those options if `dc` has also been
317 disabled (see above).
318
319 <a name="build-history"/>
320
321 ### History
322
323 To disable signal handling, pass either the `-H` flag or the `--disable-history`
324 option to `configure.sh`, as follows:
325
326 ```
327 ./configure.sh -H
328 ./configure.sh --disable-history
329 ```
330
331 Both commands are equivalent.
332
333 History is automatically disabled when building for Windows or on another
334 platform that does not support the terminal handling that is required.
335
336 ***WARNING***: Of all of the code in the `bc`, this is the only code that is not
337 completely portable. If the `bc` does not work on your platform, your first step
338 should be to retry with history disabled.
339
340 ### NLS (Locale Support)
341
342 To disable locale support (use only English), pass either the `-N` flag or the
343 `--disable-nls` option to `configure.sh`, as follows:
344
345 ```
346 ./configure.sh -N
347 ./configure.sh --disable-nls
348 ```
349
350 Both commands are equivalent.
351
352 NLS (locale support) is automatically disabled when building for Windows or on
353 another platform that does not support the POSIX locale API or utilities.
354
355 ### Prompt
356
357 By default, `bc` and `dc` print a prompt when in interactive mode. They both
358 have the command-line option `-P`/`--no-prompt`, which turns that off, but it
359 can be disabled permanently in the build by passing the `-P` flag or the
360 `--disable-prompt` option to `configure.sh`, as follows:
361
362 ```
363 ./configure.sh -P
364 ./configure.sh --disable-prompt
365 ```
366
367 Both commands are equivalent.
368
369 ### Long Options
370
371 By default, `bc` and `dc` support long options like `--mathlib` and
372 `--interactive`. However, support for these options requires `getopt_long()`
373 which is not in the POSIX standard. For those platforms that do *not* have
374 `getopt_long()` it will be disabled automatically, or if you wish to disable
375 them regardless, you can pass the `-L` flag or the `--disable-long-options`
376 option to `configure.sh`, as follows:
377
378 ```
379 ./configure.sh -L
380 ./configure.sh --disable-long-options
381 ```
382
383 Both commands are equivalent.
384
385 ### Extra Math
386
387 This `bc` has 7 extra operators:
388
389 * `$` (truncation to integer)
390 * `@` (set precision)
391 * `@=` (set precision and assign)
392 * `<<` (shift number left, shifts radix right)
393 * `<<=` (shift number left and assign)
394 * `>>` (shift number right, shifts radix left)
395 * `>>=` (shift number right and assign)
396
397 There is no assignment version of `$` because it is a unary operator.
398
399 The assignment versions of the above operators are not available in `dc`, but
400 the others are, as the operators `$`, `@`, `H`, and `h`, respectively.
401
402 In addition, this `bc` has the option of outputting in scientific notation or
403 engineering notation. It can also take input in scientific or engineering
404 notation. On top of that, it has a pseudo-random number generator. (See the
405 [full manual](./bc.md) for more details.)
406
407 Extra operators, scientific notation, engineering notation, and the
408 pseudo-random number generator can be disabled by passing either the `-E` flag
409 or the `--disable-extra-math` option to `configure.sh`, as follows:
410
411 ```
412 ./configure.sh -E
413 ./configure.sh --disable-extra-math
414 ```
415
416 Both commands are equivalent.
417
418 This `bc` also has a larger library that is only enabled if extra operators and
419 the pseudo-random number generator are. More information about the functions can
420 be found in the [Extended Library](./bc.md#extended-library) section of the
421 [full manual](./bc.md).
422
423 ### Manpages
424
425 To disable installing manpages, pass either the `-M` flag or the
426 `--disable-man-pages` option to `configure.sh` as follows:
427
428 ```
429 ./configure.sh -M
430 ./configure.sh --disable-man-pages
431 ```
432
433 Both commands are equivalent.
434
435 ### Karatsuba Length
436
437 The Karatsuba length is the point at which `bc` and `dc` switch from Karatsuba
438 multiplication to brute force, `O(n^2)` multiplication. It can be set by passing
439 the `-k` flag or the `--karatsuba-len` option to `configure.sh` as follows:
440
441 ```
442 ./configure.sh -k64
443 ./configure.sh --karatsuba-len 64
444 ```
445
446 Both commands are equivalent.
447
448 Default is `64`.
449
450 ***WARNING***: The Karatsuba Length must be a **integer** greater than or equal
451 to `16` (to prevent stack overflow). If it is not, `configure.sh` will give an
452 error.
453
454 ### Install Options
455
456 The relevant `autotools`-style install options are supported in `configure.sh`:
457
458 * `--prefix`
459 * `--bindir`
460 * `--datarootdir`
461 * `--datadir`
462 * `--mandir`
463 * `--man1dir`
464 * `--localedir`
465
466 An example is:
467
468 ```
469 ./configure.sh --prefix=/usr --localedir /usr/share/nls
470 make
471 make install
472 ```
473
474 They correspond to the environment variables `$PREFIX`, `$BINDIR`,
475 `$DATAROOTDIR`, `$DATADIR`, `$MANDIR`, `$MAN1DIR`, and `$LOCALEDIR`,
476 respectively.
477
478 ***WARNING***: If the option is given, the value of the corresponding
479 environment variable is overridden.
480
481 ***WARNING***: If any long command-line options are used, the long form of all
482 other command-line options must be used. Mixing long and short options is not
483 supported.
484
485 ## Optimization
486
487 The `configure.sh` script will accept an optimization level to pass to the
488 compiler. Because `bc` is orders of magnitude faster with optimization, I
489 ***highly*** recommend package and distro maintainers pass the highest
490 optimization level available in `CC` to `configure.sh` with the `-O` flag or
491 `--opt` option, as follows:
492
493 ```
494 ./configure.sh -O3
495 ./configure.sh --opt 3
496 ```
497
498 Both commands are equivalent.
499
500 The build and install can then be run as normal:
501
502 ```
503 make
504 make install
505 ```
506
507 As usual, `configure.sh` will also accept additional `CFLAGS` on the command
508 line, so for SSE4 architectures, the following can add a bit more speed:
509
510 ```
511 CFLAGS="-march=native -msse4" ./configure.sh -O3
512 make
513 make install
514 ```
515
516 Building with link-time optimization (`-flto` in clang) can further increase the
517 performance. I ***highly*** recommend doing so.
518
519 I do **NOT*** recommend building with `-march=native`; doing so reduces this
520 `bc`'s performance.
521
522 Manual stripping is not necessary; non-debug builds are automatically stripped
523 in the link stage.
524
525 ## Debug Builds
526
527 Debug builds (which also disable optimization if no optimization level is given
528 and if no extra `CFLAGS` are given) can be enabled with either the `-g` flag or
529 the `--debug` option, as follows:
530
531 ```
532 ./configure.sh -g
533 ./configure.sh --debug
534 ```
535
536 Both commands are equivalent.
537
538 The build and install can then be run as normal:
539
540 ```
541 make
542 make install
543 ```
544
545 ## Stripping Binaries
546
547 By default, when `bc` and `dc` are not built in debug mode, the binaries are
548 stripped. Stripping can be disabled with either the `-T` or the
549 `--disable-strip` option, as follows:
550
551 ```
552 ./configure.sh -T
553 ./configure.sh --disable-strip
554 ```
555
556 Both commands are equivalent.
557
558 The build and install can then be run as normal:
559
560 ```
561 make
562 make install
563 ```
564
565 ## Binary Size
566
567 When built with both calculators, all available features, and `-Os` using
568 `clang` and `musl`, the executable is 140.4 kb (140,386 bytes) on `x86_64`. That
569 isn't much for what is contained in the binary, but if necessary, it can be
570 reduced.
571
572 The single largest user of space is the `bc` calculator. If just `dc` is needed,
573 the size can be reduced to 107.6 kb (107,584 bytes).
574
575 The next largest user of space is history support. If that is not needed, size
576 can be reduced (for a build with both calculators) to 119.9 kb (119,866 bytes).
577
578 There are several reasons that history is a bigger user of space than `dc`
579 itself:
580
581 * `dc`'s lexer and parser are *tiny* compared to `bc`'s because `dc` code is
582   almost already in the form that it is executed in, while `bc` has to not only
583   adjust the form to be executable, it has to parse functions, loops, `if`
584   statements, and other extra features.
585 * `dc` does not have much extra code in the interpreter.
586 * History has a lot of const data for supporting `UTF-8` terminals.
587 * History pulls in a bunch of more code from the `libc`.
588
589 The next biggest user is extra math support. Without it, the size is reduced to
590 124.0 kb (123,986 bytes) with history and 107.6 kb (107,560 bytes) without
591 history.
592
593 The reasons why extra math support is bigger than `dc`, besides the fact that
594 `dc` is small already, are:
595
596 * Extra math supports adds an extra math library that takes several kilobytes of
597   constant data space.
598 * Extra math support includes support for a pseudo-random number generator,
599   including the code to convert a series of pseudo-random numbers into a number
600   of arbitrary size.
601 * Extra math support adds several operators.
602
603 The next biggest user is `dc`, so if just `bc` is needed, the size can be
604 reduced to 128.1 kb (128,096 bytes) with history and extra math support, 107.6
605 kb (107,576 bytes) without history and with extra math support, and 95.3 kb
606 (95,272 bytes) without history and without extra math support.
607
608 *Note*: all of these binary sizes were compiled using `musl` `1.2.0` as the
609 `libc`, making a fully static executable, with `clang` `9.0.1` (well,
610 `musl-clang` using `clang` `9.0.1`) as the compiler and using `-Os`
611 optimizations. These builds were done on an `x86_64` machine running Gentoo
612 Linux.
613
614 ## Testing
615
616 The default test suite can be run with the following command:
617
618 ```
619 make test
620 ```
621
622 To test `bc` only, run the following command:
623
624 ```
625 make test_bc
626 ```
627
628 To test `dc` only, run the following command:
629
630 ```
631 make test_dc
632 ```
633
634 This `bc`, if built, assumes a working, GNU-compatible `bc`, installed on the
635 system and in the `PATH`, to generate some tests, unless the `-G` flag or
636 `--disable-generated-tests` option is given to `configure.sh`, as follows:
637
638 ```
639 ./configure.sh -G
640 ./configure.sh --disable-generated-tests
641 ```
642
643 After running `configure.sh`, build and run tests as follows:
644
645 ```
646 make
647 make test
648 ```
649
650 This `dc` also assumes a working, GNU-compatible `dc`, installed on the system
651 and in the `PATH`, to generate some tests, unless one of the above options is
652 given to `configure.sh`.
653
654 To generate test coverage, pass the `-c` flag or the `--coverage` option to
655 `configure.sh` as follows:
656
657 ```
658 ./configure.sh -c
659 ./configure.sh --coverage
660 ```
661
662 Both commands are equivalent.
663
664 ***WARNING***: Both `bc` and `dc` must be built for test coverage. Otherwise,
665 `configure.sh` will give an error.
666
667 [1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
668 [2]: https://www.gnu.org/software/bc/
669 [3]: https://www.musl-libc.org/
670 [4]: #build-environment-variables
671 [5]: #build-options
672 [6]: #cross-compiling