xref: /freebsd/contrib/bc/configure.sh (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
1#! /bin/sh
2#
3# SPDX-License-Identifier: BSD-2-Clause
4#
5# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions are met:
9#
10# * Redistributions of source code must retain the above copyright notice, this
11#   list of conditions and the following disclaimer.
12#
13# * Redistributions in binary form must reproduce the above copyright notice,
14#   this list of conditions and the following disclaimer in the documentation
15#   and/or other materials provided with the distribution.
16#
17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27# POSSIBILITY OF SUCH DAMAGE.
28#
29
30script="$0"
31scriptdir=$(dirname "$script")
32script=$(basename "$script")
33
34builddir=$(pwd)
35
36. "$scriptdir/scripts/functions.sh"
37
38# Simply prints the help message and quits based on the argument.
39# @param msg  The help message to print.
40usage() {
41
42	if [ $# -gt 0 ]; then
43
44		_usage_val=1
45
46		printf "%s\n\n" "$1"
47
48	else
49		_usage_val=0
50	fi
51
52	printf 'usage:\n'
53	printf '    %s -h\n' "$script"
54	printf '    %s --help\n' "$script"
55	printf '    %s [-a|-bD|-dB|-c] [-CEfgGHlmMNtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script"
56	printf '       [-s SETTING] [-S SETTING]\n'
57	printf '    %s \\\n' "$script"
58	printf '       [--library|--bc-only --disable-dc|--dc-only --disable-bc|--coverage]  \\\n'
59	printf '       [--force --debug --disable-extra-math --disable-generated-tests]      \\\n'
60	printf '       [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n'
61	printf '       [--install-all-locales] [--opt=OPT_LEVEL]                             \\\n'
62	printf '       [--karatsuba-len=KARATSUBA_LEN]                                       \\\n'
63	printf '       [--set-default-on=SETTING] [--set-default-off=SETTING]                \\\n'
64	printf '       [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR]       \\\n'
65	printf '       [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR]             \\\n'
66	printf '\n'
67	printf '    -a, --library\n'
68	printf '        Build the libbcl instead of the programs. This is meant to be used with\n'
69	printf '        Other software like programming languages that want to make use of the\n'
70	printf '        parsing and math capabilities. This option will install headers using\n'
71	printf '        `make install`.\n'
72	printf '    -b, --bc-only\n'
73	printf '        Build bc only. It is an error if "-d", "--dc-only", "-B", or\n'
74	printf '        "--disable-bc" are specified too.\n'
75	printf '    -B, --disable-bc\n'
76	printf '        Disable bc. It is an error if "-b", "--bc-only", "-D", or "--disable-dc"\n'
77	printf '        are specified too.\n'
78	printf '    -c, --coverage\n'
79	printf '        Generate test coverage code. Requires gcov and gcovr.\n'
80	printf '        It is an error if either "-b" ("-D") or "-d" ("-B") is specified.\n'
81	printf '        Requires a compiler that use gcc-compatible coverage options\n'
82	printf '    -C, --disable-clean\n'
83	printf '        Disable the clean that configure.sh does before configure.\n'
84	printf '    -d, --dc-only\n'
85	printf '        Build dc only. It is an error if "-b", "--bc-only", "-D", or\n'
86	printf '        "--disable-dc" are specified too.\n'
87	printf '    -D, --disable-dc\n'
88	printf '        Disable dc. It is an error if "-d", "--dc-only", "-B", or "--disable-bc"\n'
89	printf '        are specified too.\n'
90	printf '    -E, --disable-extra-math\n'
91	printf '        Disable extra math. This includes: "$" operator (truncate to integer),\n'
92	printf '        "@" operator (set number of decimal places), and r(x, p) (rounding\n'
93	printf '        function). Additionally, this option disables the extra printing\n'
94	printf '        functions in the math library.\n'
95	printf '    -f, --force\n'
96	printf '        Force use of all enabled options, even if they do not work. This\n'
97	printf '        option is to allow the maintainer a way to test that certain options\n'
98	printf '        are not failing invisibly. (Development only.)\n'
99	printf '    -g, --debug\n'
100	printf '        Build in debug mode. Adds the "-g" flag, and if there are no\n'
101	printf '        other CFLAGS, and "-O" was not given, this also adds the "-O0"\n'
102	printf '        flag. If this flag is *not* given, "-DNDEBUG" is added to CPPFLAGS\n'
103	printf '        and a strip flag is added to the link stage.\n'
104	printf '    -G, --disable-generated-tests\n'
105	printf '        Disable generating tests. This is for platforms that do not have a\n'
106	printf '        GNU bc-compatible bc to generate tests.\n'
107	printf '    -h, --help\n'
108	printf '        Print this help message and exit.\n'
109	printf '    -H, --disable-history\n'
110	printf '        Disable history.\n'
111	printf '    -k KARATSUBA_LEN, --karatsuba-len KARATSUBA_LEN\n'
112	printf '        Set the karatsuba length to KARATSUBA_LEN (default is 64).\n'
113	printf '        It is an error if KARATSUBA_LEN is not a number or is less than 16.\n'
114	printf '    -l, --install-all-locales\n'
115	printf '        Installs all locales, regardless of how many are on the system. This\n'
116	printf '        option is useful for package maintainers who want to make sure that\n'
117	printf '        a package contains all of the locales that end users might need.\n'
118	printf '    -m, --enable-memcheck\n'
119	printf '        Enable memcheck mode, to ensure no memory leaks. For development only.\n'
120	printf '    -M, --disable-man-pages\n'
121	printf '        Disable installing manpages.\n'
122	printf '    -N, --disable-nls\n'
123	printf '        Disable POSIX locale (NLS) support.\n'
124	printf '    -O OPT_LEVEL, --opt OPT_LEVEL\n'
125	printf '        Set the optimization level. This can also be included in the CFLAGS,\n'
126	printf '        but it is provided, so maintainers can build optimized debug builds.\n'
127	printf '        This is passed through to the compiler, so it must be supported.\n'
128	printf '    -s SETTING, --set-default-on SETTING\n'
129	printf '        Set the default named by SETTING to on. See below for possible values\n'
130	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
131	printf '        setting, the last one is used.\n'
132	printf '    -S SETTING, --set-default-off SETTING\n'
133	printf '        Set the default named by SETTING to off. See below for possible values\n'
134	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
135	printf '        setting, the last one is used.\n'
136	printf '    -t, --enable-test-timing\n'
137	printf '        Enable the timing of tests. This is for development only.\n'
138	printf '    -T, --disable-strip\n'
139	printf '        Disable stripping symbols from the compiled binary or binaries.\n'
140	printf '        Stripping symbols only happens when debug mode is off.\n'
141	printf '    -v, --enable-valgrind\n'
142	printf '        Enable a build appropriate for valgrind. For development only.\n'
143	printf '    -z, --enable-fuzz-mode\n'
144	printf '        Enable fuzzing mode. THIS IS FOR DEVELOPMENT ONLY.\n'
145	printf '    --prefix PREFIX\n'
146	printf '        The prefix to install to. Overrides "$PREFIX" if it exists.\n'
147	printf '        If PREFIX is "/usr", install path will be "/usr/bin".\n'
148	printf '        Default is "/usr/local".\n'
149	printf '    --bindir BINDIR\n'
150	printf '        The directory to install binaries in. Overrides "$BINDIR" if it exists.\n'
151	printf '        Default is "$PREFIX/bin".\n'
152	printf '    --includedir INCLUDEDIR\n'
153	printf '        The directory to install headers in. Overrides "$INCLUDEDIR" if it\n'
154	printf '        exists. Default is "$PREFIX/include".\n'
155	printf '    --libdir LIBDIR\n'
156	printf '        The directory to install libraries in. Overrides "$LIBDIR" if it exists.\n'
157	printf '        Default is "$PREFIX/lib".\n'
158	printf '    --datarootdir DATAROOTDIR\n'
159	printf '        The root location for data files. Overrides "$DATAROOTDIR" if it exists.\n'
160	printf '        Default is "$PREFIX/share".\n'
161	printf '    --datadir DATADIR\n'
162	printf '        The location for data files. Overrides "$DATADIR" if it exists.\n'
163	printf '        Default is "$DATAROOTDIR".\n'
164	printf '    --mandir MANDIR\n'
165	printf '        The location to install manpages to. Overrides "$MANDIR" if it exists.\n'
166	printf '        Default is "$DATADIR/man".\n'
167	printf '    --man1dir MAN1DIR\n'
168	printf '        The location to install Section 1 manpages to. Overrides "$MAN1DIR" if\n'
169	printf '        it exists. Default is "$MANDIR/man1".\n'
170	printf '    --man3dir MAN3DIR\n'
171	printf '        The location to install Section 3 manpages to. Overrides "$MAN3DIR" if\n'
172	printf '        it exists. Default is "$MANDIR/man3".\n'
173	printf '\n'
174	printf 'In addition, the following environment variables are used:\n'
175	printf '\n'
176	printf '    CC           C compiler. Must be compatible with POSIX c99. If there is a\n'
177	printf '                 space in the basename of the compiler, the items after the\n'
178	printf '                 first space are assumed to be compiler flags, and in that case,\n'
179	printf '                 the flags are automatically moved into CFLAGS. Default is\n'
180	printf '                 "c99".\n'
181	printf '    HOSTCC       Host C compiler. Must be compatible with POSIX c99. If there is\n'
182	printf '                 a space in the basename of the compiler, the items after the\n'
183	printf '                 first space are assumed to be compiler flags, and in the case,\n'
184	printf '                 the flags are automatically moved into HOSTCFLAGS. Default is\n'
185	printf '                 "$CC".\n'
186	printf '    HOST_CC      Same as HOSTCC. If HOSTCC also exists, it is used.\n'
187	printf '    CFLAGS       C compiler flags.\n'
188	printf '    HOSTCFLAGS   CFLAGS for HOSTCC. Default is "$CFLAGS".\n'
189	printf '    HOST_CFLAGS  Same as HOST_CFLAGS. If HOST_CFLAGS also exists, it is used.\n'
190	printf '    CPPFLAGS     C preprocessor flags. Default is "".\n'
191	printf '    LDFLAGS      Linker flags. Default is "".\n'
192	printf '    PREFIX       The prefix to install to. Default is "/usr/local".\n'
193	printf '                 If PREFIX is "/usr", install path will be "/usr/bin".\n'
194	printf '    BINDIR       The directory to install binaries in. Default is "$PREFIX/bin".\n'
195	printf '    INCLUDEDIR   The directory to install header files in. Default is\n'
196	printf '                 "$PREFIX/include".\n'
197	printf '    LIBDIR       The directory to install libraries in. Default is\n'
198	printf '                 "$PREFIX/lib".\n'
199	printf '    DATAROOTDIR  The root location for data files. Default is "$PREFIX/share".\n'
200	printf '    DATADIR      The location for data files. Default is "$DATAROOTDIR".\n'
201	printf '    MANDIR       The location to install manpages to. Default is "$DATADIR/man".\n'
202	printf '    MAN1DIR      The location to install Section 1 manpages to. Default is\n'
203	printf '                 "$MANDIR/man1".\n'
204	printf '    MAN3DIR      The location to install Section 3 manpages to. Default is\n'
205	printf '                 "$MANDIR/man3".\n'
206	printf '    NLSPATH      The location to install locale catalogs to. Must be an absolute\n'
207	printf '                 path (or contain one). This is treated the same as the POSIX\n'
208	printf '                 definition of $NLSPATH (see POSIX environment variables for\n'
209	printf '                 more information). Default is "/usr/share/locale/%%L/%%N".\n'
210	printf '    PC_PATH      The location to install pkg-config files to. Must be an\n'
211	printf '                 path or contain one. Default is the first path given by the\n'
212	printf '                 output of `pkg-config --variable=pc_path pkg-config`.\n'
213	printf '    EXECSUFFIX   The suffix to append to the executable names, used to not\n'
214	printf '                 interfere with other installed bc executables. Default is "".\n'
215	printf '    EXECPREFIX   The prefix to append to the executable names, used to not\n'
216	printf '                 interfere with other installed bc executables. Default is "".\n'
217	printf '    DESTDIR      For package creation. Default is "". If it is empty when\n'
218	printf '                 `%s` is run, it can also be passed to `make install`\n' "$script"
219	printf '                 later as an environment variable. If both are specified,\n'
220	printf '                 the one given to `%s` takes precedence.\n' "$script"
221	printf '    LONG_BIT     The number of bits in a C `long` type. This is mostly for the\n'
222	printf '                 embedded space since this `bc` uses `long`s internally for\n'
223	printf '                 overflow checking. In C99, a `long` is required to be 32 bits.\n'
224	printf '                 For most normal desktop systems, setting this is unnecessary,\n'
225	printf '                 except that 32-bit platforms with 64-bit longs may want to set\n'
226	printf '                 it to `32`. Default is the default of `LONG_BIT` for the target\n'
227	printf '                 platform. Minimum allowed is `32`. It is a build time error if\n'
228	printf '                 the specified value of `LONG_BIT` is greater than the default\n'
229	printf '                 value of `LONG_BIT` for the target platform.\n'
230	printf '    GEN_HOST     Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to\n'
231	printf '                 produce the C files that contain the help texts as well as the\n'
232	printf '                 math libraries. By default, `gen/strgen.c` is used, compiled by\n'
233	printf '                 "$HOSTCC" and run on the host machine. Using `gen/strgen.sh`\n'
234	printf '                 removes the need to compile and run an executable on the host\n'
235	printf '                 machine since `gen/strgen.sh` is a POSIX shell script. However,\n'
236	printf '                 `gen/lib2.bc` is perilously close to 4095 characters, the max\n'
237	printf '                 supported length of a string literal in C99 (and it could be\n'
238	printf '                 added to in the future), and `gen/strgen.sh` generates a string\n'
239	printf '                 literal instead of an array, as `gen/strgen.c` does. For most\n'
240	printf '                 production-ready compilers, this limit probably is not\n'
241	printf '                 enforced, but it could be. Both options are still available for\n'
242	printf '                 this reason. If you are sure your compiler does not have the\n'
243	printf '                 limit and do not want to compile and run a binary on the host\n'
244	printf '                 machine, set this variable to "0". Any other value, or a\n'
245	printf '                 non-existent value, will cause the build system to compile and\n'
246	printf '                 run `gen/strgen.c`. Default is "".\n'
247	printf '    GEN_EMU      Emulator to run string generator code under (leave empty if not\n'
248	printf '                 necessary). This is not necessary when using `gen/strgen.sh`.\n'
249	printf '                 Default is "".\n'
250	printf '\n'
251	printf 'WARNING: even though `configure.sh` supports both option types, short and\n'
252	printf 'long, it does not support handling both at the same time. Use only one type.\n'
253	printf '\n'
254	printf 'Settings\n'
255	printf '========\n'
256	printf '\n'
257	printf 'bc and dc have some settings that, while they cannot be removed by build time\n'
258	printf 'options, can have their defaults changed at build time by packagers. Users are\n'
259	printf 'also able to change each setting with environment variables.\n'
260	printf '\n'
261	printf 'The following is a table of settings, along with their default values and the\n'
262	printf 'environment variables users can use to change them. (For the defaults, non-zero\n'
263	printf 'means on, and zero means off.)\n'
264	printf '\n'
265	printf '| Setting         | Description          | Default      | Env Variable         |\n'
266	printf '| =============== | ==================== | ============ | ==================== |\n'
267	printf '| bc.banner       | Whether to display   |            0 | BC_BANNER            |\n'
268	printf '|                 | the bc version       |              |                      |\n'
269	printf '|                 | banner when in       |              |                      |\n'
270	printf '|                 | interactive mode.    |              |                      |\n'
271	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
272	printf '| bc.sigint_reset | Whether SIGINT will  |            1 | BC_SIGINT_RESET      |\n'
273	printf '|                 | reset bc, instead of |              |                      |\n'
274	printf '|                 | exiting, when in     |              |                      |\n'
275	printf '|                 | interactive mode.    |              |                      |\n'
276	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
277	printf '| dc.sigint_reset | Whether SIGINT will  |            1 | DC_SIGINT_RESET      |\n'
278	printf '|                 | reset dc, instead of |              |                      |\n'
279	printf '|                 | exiting, when in     |              |                      |\n'
280	printf '|                 | interactive mode.    |              |                      |\n'
281	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
282	printf '| bc.tty_mode     | Whether TTY mode for |            1 | BC_TTY_MODE          |\n'
283	printf '|                 | bc should be on when |              |                      |\n'
284	printf '|                 | available.           |              |                      |\n'
285	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
286	printf '| dc.tty_mode     | Whether TTY mode for |            0 | BC_TTY_MODE          |\n'
287	printf '|                 | dc should be on when |              |                      |\n'
288	printf '|                 | available.           |              |                      |\n'
289	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
290	printf '| bc.prompt       | Whether the prompt   | $BC_TTY_MODE | BC_PROMPT            |\n'
291	printf '|                 | for bc should be on  |              |                      |\n'
292	printf '|                 | in tty mode.         |              |                      |\n'
293	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
294	printf '| dc.prompt       | Whether the prompt   | $DC_TTY_MODE | DC_PROMPT            |\n'
295	printf '|                 | for dc should be on  |              |                      |\n'
296	printf '|                 | in tty mode.         |              |                      |\n'
297	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
298	printf '| bc.expr_exit    | Whether to exit bc   |            1 | BC_EXPR_EXIT         |\n'
299	printf '|                 | if an expression or  |              |                      |\n'
300	printf '|                 | expression file is   |              |                      |\n'
301	printf '|                 | given with the -e or |              |                      |\n'
302	printf '|                 | -f options.          |              |                      |\n'
303	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
304	printf '| dc.expr_exit    | Whether to exit dc   |            1 | DC_EXPR_EXIT         |\n'
305	printf '|                 | if an expression or  |              |                      |\n'
306	printf '|                 | expression file is   |              |                      |\n'
307	printf '|                 | given with the -e or |              |                      |\n'
308	printf '|                 | -f options.          |              |                      |\n'
309	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
310	printf '\n'
311	printf 'These settings are not meant to be changed on a whim. They are meant to ensure\n'
312	printf 'that this bc and dc will conform to the expectations of the user on each\n'
313	printf 'platform.\n'
314
315	exit "$_usage_val"
316}
317
318# Replaces a file extension in a filename. This is used mostly to turn filenames
319# like `src/num.c` into `src/num.o`. In other words, it helps to link targets to
320# the files they depend on.
321#
322# @param file  The filename.
323# @param ext1  The extension to replace.
324# @param ext2  The new extension.
325replace_ext() {
326
327	if [ "$#" -ne 3 ]; then
328		err_exit "Invalid number of args to $0"
329	fi
330
331	_replace_ext_file="$1"
332	_replace_ext_ext1="$2"
333	_replace_ext_ext2="$3"
334
335	_replace_ext_result="${_replace_ext_file%.$_replace_ext_ext1}.$_replace_ext_ext2"
336
337	printf '%s\n' "$_replace_ext_result"
338}
339
340# Replaces a file extension in every filename given in a list. The list is just
341# a space-separated list of words, so filenames are expected to *not* have
342# spaces in them. See the documentation for `replace_ext()`.
343#
344# @param files  The list of space-separated filenames to replace extensions for.
345# @param ext1   The extension to replace.
346# @param ext2   The new extension.
347replace_exts() {
348
349	if [ "$#" -ne 3 ]; then
350		err_exit "Invalid number of args to $0"
351	fi
352
353	_replace_exts_files="$1"
354	_replace_exts_ext1="$2"
355	_replace_exts_ext2="$3"
356
357	for _replace_exts_file in $_replace_exts_files; do
358		_replace_exts_new_name=$(replace_ext "$_replace_exts_file" "$_replace_exts_ext1" "$_replace_exts_ext2")
359		_replace_exts_result="$_replace_exts_result $_replace_exts_new_name"
360	done
361
362	printf '%s\n' "$_replace_exts_result"
363}
364
365# Finds a placeholder in @a str and replaces it. This is the workhorse of
366# configure.sh. It's what replaces placeholders in Makefile.in with the data
367# needed for the chosen build. Below, you will see a lot of calls to this
368# function.
369#
370# Note that needle can never contain an exclamation point. For more information,
371# see substring_replace() in scripts/functions.sh.
372#
373# @param str          The string to find and replace placeholders in.
374# @param needle       The placeholder name.
375# @param replacement  The string to use to replace the placeholder.
376replace() {
377
378	if [ "$#" -ne 3 ]; then
379		err_exit "Invalid number of args to $0"
380	fi
381
382	_replace_str="$1"
383	_replace_needle="$2"
384	_replace_replacement="$3"
385
386	substring_replace "$_replace_str" "%%$_replace_needle%%" "$_replace_replacement"
387}
388
389# This function finds all the source files that need to be built. If there is
390# only one argument and it is empty, then all source files are built. Otherwise,
391# the arguments are all assumed to be source files that should *not* be built.
392find_src_files() {
393
394	_find_src_files_args=""
395
396	if [ "$#" -ge 1 ] && [ "$1" != "" ]; then
397
398		while [ "$#" -ge 1 ]; do
399			_find_src_files_a="${1## }"
400			shift
401			_find_src_files_args=$(printf '%s\n%s/src/%s\n' "$_find_src_files_args" "$scriptdir" "${_find_src_files_a}")
402		done
403
404	fi
405
406	_find_src_files_files=$(find "$scriptdir/src/" -depth -name "*.c" -print)
407
408	_find_src_files_result=""
409
410	for _find_src_files_f in $_find_src_files_files; do
411
412		# If this is true, the file is part of args, and therefore, unneeded.
413		if [ "${_find_src_files_args##*$_find_src_files_f}" != "${_find_src_files_args}" ]; then
414			continue
415		fi
416
417		_find_src_files_result=$(printf '%s\n%s\n' "$_find_src_files_result" "$_find_src_files_f")
418
419	done
420
421	printf '%s\n' "$_find_src_files_result"
422}
423
424# This function generates a list of files to go into the Makefile. It generates
425# the list of object files, as well as the list of test coverage files.
426#
427# @param contents  The contents of the Makefile template to put the list of
428#                  files into.
429gen_file_list() {
430
431	if [ "$#" -lt 1 ]; then
432		err_exit "Invalid number of args to $0"
433	fi
434
435	_gen_file_list_contents="$1"
436	shift
437
438	if [ "$#" -ge 1 ]; then
439		_gen_file_list_unneeded="$@"
440	else
441		_gen_file_list_unneeded=""
442	fi
443
444	_gen_file_list_needle_src="SRC"
445	_gen_file_list_needle_obj="OBJ"
446	_gen_file_list_needle_gcda="GCDA"
447	_gen_file_list_needle_gcno="GCNO"
448
449	_gen_file_list_replacement=$(find_src_files $_gen_file_list_unneeded | tr '\n' ' ')
450	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
451		"$_gen_file_list_needle_src" "$_gen_file_list_replacement")
452
453	_gen_file_list_cbases=""
454
455	for _gen_file_list_f in $_gen_file_list_replacement; do
456		_gen_file_list_b=$(basename "$_gen_file_list_f")
457		_gen_file_list_cbases="$_gen_file_list_cbases src/$_gen_file_list_b"
458	done
459
460	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_cbases" "c" "o")
461	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
462		"$_gen_file_list_needle_obj" "$_gen_file_list_replacement")
463
464	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "o" "gcda")
465	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
466		"$_gen_file_list_needle_gcda" "$_gen_file_list_replacement")
467
468	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "gcda" "gcno")
469	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
470		"$_gen_file_list_needle_gcno" "$_gen_file_list_replacement")
471
472	printf '%s\n' "$_gen_file_list_contents"
473}
474
475# Generates the proper test targets for each test to have its own target. This
476# allows `make test` to run in parallel.
477#
478# @param name        Which calculator to generate tests for.
479# @param extra_math  An integer that, if non-zero, activates extra math tests.
480# @param time_tests  An integer that, if non-zero, tells the test suite to time
481#                    the execution of each test.
482gen_std_tests() {
483
484	_gen_std_tests_name="$1"
485	shift
486
487	_gen_std_tests_extra_math="$1"
488	shift
489
490	_gen_std_tests_time_tests="$1"
491	shift
492
493	_gen_std_tests_extra_required=$(cat "$scriptdir/tests/extra_required.txt")
494
495	for _gen_std_tests_t in $(cat "$scriptdir/tests/$_gen_std_tests_name/all.txt"); do
496
497		if [ "$_gen_std_tests_extra_math" -eq 0 ]; then
498
499			if [ -z "${_gen_std_tests_extra_required##*$_gen_std_tests_t*}" ]; then
500				printf 'test_%s_%s:\n\t@printf "Skipping %s %s\\n"\n\n' \
501					"$_gen_std_tests_name" "$_gen_std_tests_t" "$_gen_std_tests_name" \
502					"$_gen_std_tests_t" >> "Makefile"
503				continue
504			fi
505
506		fi
507
508		printf 'test_%s_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/test.sh %s %s %s %s %s\n\n' \
509			"$_gen_std_tests_name" "$_gen_std_tests_t" "$builddir" "$_gen_std_tests_name" \
510			"$_gen_std_tests_t" "$generate_tests" "$time_tests" \
511			"$*" >> "Makefile"
512
513	done
514}
515
516# Generates a list of test targets that will be used as prerequisites for other
517# targets.
518#
519# @param name  The name of the calculator to generate test targets for.
520gen_std_test_targets() {
521
522	_gen_std_test_targets_name="$1"
523	shift
524
525	_gen_std_test_targets_tests=$(cat "$scriptdir/tests/${_gen_std_test_targets_name}/all.txt")
526
527	for _gen_std_test_targets_t in $_gen_std_test_targets_tests; do
528		printf ' test_%s_%s' "$_gen_std_test_targets_name" "$_gen_std_test_targets_t"
529	done
530
531	printf '\n'
532}
533
534# Generates the proper test targets for each error test to have its own target.
535# This allows `make test_bc_errors` and `make test_dc_errors` to run in
536# parallel.
537#
538# @param name  Which calculator to generate tests for.
539gen_err_tests() {
540
541	_gen_err_tests_name="$1"
542	shift
543
544	_gen_err_tests_fs=$(ls "$scriptdir/tests/$_gen_err_tests_name/errors/")
545
546	for _gen_err_tests_t in $_gen_err_tests_fs; do
547
548		printf 'test_%s_error_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/error.sh %s %s %s\n\n' \
549			"$_gen_err_tests_name" "$_gen_err_tests_t" "$builddir" "$_gen_err_tests_name" \
550			"$_gen_err_tests_t" "$*" >> "Makefile"
551
552	done
553
554}
555
556# Generates a list of error test targets that will be used as prerequisites for
557# other targets.
558#
559# @param name  The name of the calculator to generate test targets for.
560gen_err_test_targets() {
561
562	_gen_err_test_targets_name="$1"
563	shift
564
565	_gen_err_test_targets_tests=$(ls "$scriptdir/tests/$_gen_err_test_targets_name/errors/")
566
567	for _gen_err_test_targets_t in $_gen_err_test_targets_tests; do
568		printf ' test_%s_error_%s' "$_gen_err_test_targets_name" "$_gen_err_test_targets_t"
569	done
570
571	printf '\n'
572}
573
574# Generates the proper script test targets for each script test to have its own
575# target. This allows `make test` to run in parallel.
576#
577# @param name        Which calculator to generate tests for.
578# @param extra_math  An integer that, if non-zero, activates extra math tests.
579# @param generate    An integer that, if non-zero, activates generated tests.
580# @param time_tests  An integer that, if non-zero, tells the test suite to time
581#                    the execution of each test.
582gen_script_tests() {
583
584	_gen_script_tests_name="$1"
585	shift
586
587	_gen_script_tests_extra_math="$1"
588	shift
589
590	_gen_script_tests_generate="$1"
591	shift
592
593	_gen_script_tests_time="$1"
594	shift
595
596	_gen_script_tests_tests=$(cat "$scriptdir/tests/$_gen_script_tests_name/scripts/all.txt")
597
598	for _gen_script_tests_f in $_gen_script_tests_tests; do
599
600		_gen_script_tests_b=$(basename "$_gen_script_tests_f" ".${_gen_script_tests_name}")
601
602		printf 'test_%s_script_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/script.sh %s %s %s 1 %s %s %s\n\n' \
603			"$_gen_script_tests_name" "$_gen_script_tests_b" "$builddir" "$_gen_script_tests_name" \
604			"$_gen_script_tests_f" "$_gen_script_tests_extra_math" "$_gen_script_tests_generate" \
605			"$_gen_script_tests_time" "$*" >> "Makefile"
606	done
607}
608
609set_default() {
610
611	_set_default_on="$1"
612	shift
613
614	_set_default_name="$1"
615	shift
616
617	# The reason that the variables that are being set do not have the same
618	# non-collision avoidance that the other variables do is that we *do* want
619	# the settings of these variables to leak out of the function. They adjust
620	# the settings outside of the function.
621	case "$_set_default_name" in
622
623		bc.banner) bc_default_banner="$_set_default_on" ;;
624		bc.sigint_reset) bc_default_sigint_reset="$_set_default_on" ;;
625		dc.sigint_reset) dc_default_sigint_reset="$_set_default_on" ;;
626		bc.tty_mode) bc_default_tty_mode="$_set_default_on" ;;
627		dc.tty_mode) dc_default_tty_mode="$_set_default_on" ;;
628		bc.prompt) bc_default_prompt="$_set_default_on" ;;
629		dc.prompt) dc_default_prompt="$_set_default_on" ;;
630		bc.expr_exit) bc_default_expr_exit="$_set_default_on";;
631		dc.expr_exit) dc_default_expr_exit="$_set_default_on";;
632		?) usage "Invalid setting: $_set_default_name" ;;
633
634	esac
635}
636
637# Generates a list of script test targets that will be used as prerequisites for
638# other targets.
639#
640# @param name  The name of the calculator to generate script test targets for.
641gen_script_test_targets() {
642
643	_gen_script_test_targets_name="$1"
644	shift
645
646	_gen_script_test_targets_tests=$(cat "$scriptdir/tests/$_gen_script_test_targets_name/scripts/all.txt")
647
648	for _gen_script_test_targets_f in $_gen_script_test_targets_tests; do
649		_gen_script_test_targets_b=$(basename "$_gen_script_test_targets_f" \
650			".$_gen_script_test_targets_name")
651		printf ' test_%s_script_%s' "$_gen_script_test_targets_name" \
652			"$_gen_script_test_targets_b"
653	done
654
655	printf '\n'
656}
657
658# This is a list of defaults, but it is also the list of possible options for
659# users to change.
660#
661# The development options are: force (force options even if they fail), valgrind
662# (build in a way suitable for valgrind testing), memcheck (same as valgrind),
663# and fuzzing (build in a way suitable for fuzzing).
664bc_only=0
665dc_only=0
666coverage=0
667karatsuba_len=32
668debug=0
669hist=1
670extra_math=1
671optimization=""
672generate_tests=1
673install_manpages=1
674nls=1
675force=0
676strip_bin=1
677all_locales=0
678library=0
679fuzz=0
680time_tests=0
681vg=0
682memcheck=0
683clean=1
684
685# The empty strings are because they depend on TTY mode. If they are directly
686# set, though, they will be integers. We test for empty strings later.
687bc_default_banner=0
688bc_default_sigint_reset=1
689dc_default_sigint_reset=1
690bc_default_tty_mode=1
691dc_default_tty_mode=0
692bc_default_prompt=""
693dc_default_prompt=""
694bc_default_expr_exit=1
695dc_default_expr_exit=1
696
697# getopts is a POSIX utility, but it cannot handle long options. Thus, the
698# handling of long options is done by hand, and that's the reason that short and
699# long options cannot be mixed.
700while getopts "abBcdDEfgGhHk:lMmNO:S:s:tTvz-" opt; do
701
702	case "$opt" in
703		a) library=1 ;;
704		b) bc_only=1 ;;
705		B) dc_only=1 ;;
706		c) coverage=1 ;;
707		C) clean=0 ;;
708		d) dc_only=1 ;;
709		D) bc_only=1 ;;
710		E) extra_math=0 ;;
711		f) force=1 ;;
712		g) debug=1 ;;
713		G) generate_tests=0 ;;
714		h) usage ;;
715		H) hist=0 ;;
716		k) karatsuba_len="$OPTARG" ;;
717		l) all_locales=1 ;;
718		m) memcheck=1 ;;
719		M) install_manpages=0 ;;
720		N) nls=0 ;;
721		O) optimization="$OPTARG" ;;
722		S) set_default 0 "$OPTARG" ;;
723		s) set_default 1 "$OPTARG" ;;
724		t) time_tests=1 ;;
725		T) strip_bin=0 ;;
726		v) vg=1 ;;
727		z) fuzz=1 ;;
728		-)
729			arg="$1"
730			arg="${arg#--}"
731			LONG_OPTARG="${arg#*=}"
732			case $arg in
733				help) usage ;;
734				library) library=1 ;;
735				bc-only) bc_only=1 ;;
736				dc-only) dc_only=1 ;;
737				coverage) coverage=1 ;;
738				debug) debug=1 ;;
739				force) force=1 ;;
740				prefix=?*) PREFIX="$LONG_OPTARG" ;;
741				prefix)
742					if [ "$#" -lt 2 ]; then
743						usage "No argument given for '--$arg' option"
744					fi
745					PREFIX="$2"
746					shift ;;
747				bindir=?*) BINDIR="$LONG_OPTARG" ;;
748				bindir)
749					if [ "$#" -lt 2 ]; then
750						usage "No argument given for '--$arg' option"
751					fi
752					BINDIR="$2"
753					shift ;;
754				includedir=?*) INCLUDEDIR="$LONG_OPTARG" ;;
755				includedir)
756					if [ "$#" -lt 2 ]; then
757						usage "No argument given for '--$arg' option"
758					fi
759					INCLUDEDIR="$2"
760					shift ;;
761				libdir=?*) LIBDIR="$LONG_OPTARG" ;;
762				libdir)
763					if [ "$#" -lt 2 ]; then
764						usage "No argument given for '--$arg' option"
765					fi
766					LIBDIR="$2"
767					shift ;;
768				datarootdir=?*) DATAROOTDIR="$LONG_OPTARG" ;;
769				datarootdir)
770					if [ "$#" -lt 2 ]; then
771						usage "No argument given for '--$arg' option"
772					fi
773					DATAROOTDIR="$2"
774					shift ;;
775				datadir=?*) DATADIR="$LONG_OPTARG" ;;
776				datadir)
777					if [ "$#" -lt 2 ]; then
778						usage "No argument given for '--$arg' option"
779					fi
780					DATADIR="$2"
781					shift ;;
782				mandir=?*) MANDIR="$LONG_OPTARG" ;;
783				mandir)
784					if [ "$#" -lt 2 ]; then
785						usage "No argument given for '--$arg' option"
786					fi
787					MANDIR="$2"
788					shift ;;
789				man1dir=?*) MAN1DIR="$LONG_OPTARG" ;;
790				man1dir)
791					if [ "$#" -lt 2 ]; then
792						usage "No argument given for '--$arg' option"
793					fi
794					MAN1DIR="$2"
795					shift ;;
796				man3dir=?*) MAN3DIR="$LONG_OPTARG" ;;
797				man3dir)
798					if [ "$#" -lt 2 ]; then
799						usage "No argument given for '--$arg' option"
800					fi
801					MAN3DIR="$2"
802					shift ;;
803				localedir=?*) LOCALEDIR="$LONG_OPTARG" ;;
804				localedir)
805					if [ "$#" -lt 2 ]; then
806						usage "No argument given for '--$arg' option"
807					fi
808					LOCALEDIR="$2"
809					shift ;;
810				karatsuba-len=?*) karatsuba_len="$LONG_OPTARG" ;;
811				karatsuba-len)
812					if [ "$#" -lt 2 ]; then
813						usage "No argument given for '--$arg' option"
814					fi
815					karatsuba_len="$1"
816					shift ;;
817				opt=?*) optimization="$LONG_OPTARG" ;;
818				opt)
819					if [ "$#" -lt 2 ]; then
820						usage "No argument given for '--$arg' option"
821					fi
822					optimization="$1"
823					shift ;;
824				set-default-on=?*) set_default 1 "$LONG_OPTARG" ;;
825				set-default-on)
826					if [ "$#" -lt 2 ]; then
827						usage "No argument given for '--$arg' option"
828					fi
829					set_default 1 "$1"
830					shift ;;
831				set-default-off=?*) set_default 0 "$LONG_OPTARG" ;;
832				set-default-off)
833					if [ "$#" -lt 2 ]; then
834						usage "No argument given for '--$arg' option"
835					fi
836					set_default 0 "$1"
837					shift ;;
838				disable-bc) dc_only=1 ;;
839				disable-dc) bc_only=1 ;;
840				disable-clean) clean=0 ;;
841				disable-extra-math) extra_math=0 ;;
842				disable-generated-tests) generate_tests=0 ;;
843				disable-history) hist=0 ;;
844				disable-man-pages) install_manpages=0 ;;
845				disable-nls) nls=0 ;;
846				disable-strip) strip_bin=0 ;;
847				enable-test-timing) time_tests=1 ;;
848				enable-valgrind) vg=1 ;;
849				enable-fuzz-mode) fuzz=1 ;;
850				enable-memcheck) memcheck=1 ;;
851				install-all-locales) all_locales=1 ;;
852				help* | bc-only* | dc-only* | coverage* | debug*)
853					usage "No arg allowed for --$arg option" ;;
854				disable-bc* | disable-dc* | disable-clean*)
855					usage "No arg allowed for --$arg option" ;;
856				disable-extra-math*)
857					usage "No arg allowed for --$arg option" ;;
858				disable-generated-tests* | disable-history*)
859					usage "No arg allowed for --$arg option" ;;
860				disable-man-pages* | disable-nls* | disable-strip*)
861					usage "No arg allowed for --$arg option" ;;
862				enable-fuzz-mode* | enable-test-timing* | enable-valgrind*)
863					usage "No arg allowed for --$arg option" ;;
864				enable-memcheck* | install-all-locales*)
865					usage "No arg allowed for --$arg option" ;;
866				'') break ;; # "--" terminates argument processing
867				* ) usage "Invalid option $LONG_OPTARG" ;;
868			esac
869			shift
870			OPTIND=1 ;;
871		?) usage "Invalid option: $opt" ;;
872	esac
873
874done
875
876# Sometimes, developers don't want configure.sh to do a config clean. But
877# sometimes they do.
878if [ "$clean" -ne 0 ]; then
879	if [ -f ./Makefile ]; then
880		make clean_config > /dev/null
881	fi
882fi
883
884# It is an error to say that bc only should be built and likewise for dc.
885if [ "$bc_only" -eq 1 ] && [ "$dc_only" -eq 1 ]; then
886	usage "Can only specify one of -b(-D) or -d(-B)"
887fi
888
889# The library is mutually exclusive to the calculators, so it's an error to
890# give an option for either of them.
891if [ "$library" -ne 0 ]; then
892	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
893		usage "Must not specify -b(-D) or -d(-B) when building the library"
894	fi
895fi
896
897# KARATSUBA_LEN must be an integer and must be 16 or greater.
898case $karatsuba_len in
899	(*[!0-9]*|'') usage "KARATSUBA_LEN is not a number" ;;
900	(*) ;;
901esac
902
903if [ "$karatsuba_len" -lt 16 ]; then
904	usage "KARATSUBA_LEN is less than 16"
905fi
906
907set -e
908
909if [ -z "${LONG_BIT+set}" ]; then
910	LONG_BIT_DEFINE=""
911elif [ "$LONG_BIT" -lt 32 ]; then
912	usage "LONG_BIT is less than 32"
913else
914	LONG_BIT_DEFINE="-DBC_LONG_BIT=\$(BC_LONG_BIT)"
915fi
916
917if [ -z "$CC" ]; then
918	CC="c99"
919else
920
921	# I had users complain that, if they gave CFLAGS as part of CC, which
922	# autotools allows in its braindead way, the build would fail with an error.
923	# I don't like adjusting for autotools, but oh well. These lines puts the
924	# stuff after the first space into CFLAGS.
925	ccbase=$(basename "$CC")
926	suffix=" *"
927	prefix="* "
928
929	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
930		ccflags="${ccbase#$prefix}"
931		cc="${ccbase%%$suffix}"
932		ccdir=$(dirname "$CC")
933		if [ "$ccdir" = "." ] && [ "${CC#.}" = "$CC" ]; then
934			ccdir=""
935		else
936			ccdir="$ccdir/"
937		fi
938		CC="${ccdir}${cc}"
939		CFLAGS="$CFLAGS $ccflags"
940	fi
941fi
942
943if [ -z "$HOSTCC" ] && [ -z "$HOST_CC" ]; then
944	HOSTCC="$CC"
945elif [ -z "$HOSTCC" ]; then
946	HOSTCC="$HOST_CC"
947fi
948
949if [ "$HOSTCC" != "$CC" ]; then
950
951	# Like above, this splits HOSTCC and HOSTCFLAGS.
952	ccbase=$(basename "$HOSTCC")
953	suffix=" *"
954	prefix="* "
955
956	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
957		ccflags="${ccbase#$prefix}"
958		cc="${ccbase%%$suffix}"
959		ccdir=$(dirname "$HOSTCC")
960		if [ "$ccdir" = "." ] && [ "${HOSTCC#.}" = "$HOSTCC" ]; then
961			ccdir=""
962		else
963			ccdir="$ccdir/"
964		fi
965		HOSTCC="${ccdir}${cc}"
966		HOSTCFLAGS="$HOSTCFLAGS $ccflags"
967	fi
968fi
969
970if [ -z "${HOSTCFLAGS+set}" ] && [ -z "${HOST_CFLAGS+set}" ]; then
971	HOSTCFLAGS="$CFLAGS"
972elif [ -z "${HOSTCFLAGS+set}" ]; then
973	HOSTCFLAGS="$HOST_CFLAGS"
974fi
975
976# Store these for the cross compilation detection later.
977OLDCFLAGS="$CFLAGS"
978OLDHOSTCFLAGS="$HOSTCFLAGS"
979
980link="@printf 'No link necessary\\\\n'"
981main_exec="BC"
982executable="BC_EXEC"
983
984tests="test_bc timeconst test_dc"
985
986bc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
987bc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
988dc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
989dc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
990
991timeconst="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/bc/timeconst.sh \$(TESTSDIR)/bc/scripts/timeconst.bc \$(BC_EXEC)"
992
993# In order to have cleanup at exit, we need to be in
994# debug mode, so don't run valgrind without that.
995if [ "$vg" -ne 0 ]; then
996	debug=1
997	bc_test_exec='valgrind $(VALGRIND_ARGS) $(BC_EXEC)'
998	dc_test_exec='valgrind $(VALGRIND_ARGS) $(DC_EXEC)'
999else
1000	bc_test_exec='$(BC_EXEC)'
1001	dc_test_exec='$(DC_EXEC)'
1002fi
1003
1004test_bc_history_prereqs="test_bc_history_all"
1005test_dc_history_prereqs="test_dc_history_all"
1006
1007karatsuba="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
1008karatsuba_test="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
1009
1010bc_lib="\$(GEN_DIR)/lib.o"
1011bc_help="\$(GEN_DIR)/bc_help.o"
1012dc_help="\$(GEN_DIR)/dc_help.o"
1013
1014default_target_prereqs="\$(BIN) \$(OBJS)"
1015default_target_cmd="\$(CC) \$(CFLAGS) \$(OBJS) \$(LDFLAGS) -o \$(EXEC)"
1016default_target="\$(DC_EXEC)"
1017
1018second_target_prereqs=""
1019second_target_cmd="$default_target_cmd"
1020second_target="\$(BC_EXEC)"
1021
1022# This if/else if chain is for setting the defaults that change based on whether
1023# the library is being built, bc only, dc only, or both calculators.
1024if [ "$library" -ne 0 ]; then
1025
1026	extra_math=1
1027	nls=0
1028	hist=0
1029	bc=1
1030	dc=1
1031
1032	default_target_prereqs="\$(BIN) \$(OBJ)"
1033	default_target_cmd="ar -r -cu \$(LIBBC) \$(OBJ)"
1034	default_target="\$(LIBBC)"
1035	tests="test_library"
1036	test_bc_history_prereqs=" test_bc_history_skip"
1037	test_dc_history_prereqs=" test_dc_history_skip"
1038
1039	install_prereqs=" install_library"
1040	uninstall_prereqs=" uninstall_library"
1041	install_man_prereqs=" install_bcl_manpage"
1042	uninstall_man_prereqs=" uninstall_bcl_manpage"
1043
1044elif [ "$bc_only" -eq 1 ]; then
1045
1046	bc=1
1047	dc=0
1048
1049	dc_help=""
1050
1051	executables="bc"
1052
1053	dc_test="@printf 'No dc tests to run\\\\n'"
1054	dc_test_np="@printf 'No dc tests to run\\\\n'"
1055	test_dc_history_prereqs=" test_dc_history_skip"
1056
1057	install_prereqs=" install_execs"
1058	install_man_prereqs=" install_bc_manpage"
1059	uninstall_prereqs=" uninstall_bc"
1060	uninstall_man_prereqs=" uninstall_bc_manpage"
1061
1062	default_target="\$(BC_EXEC)"
1063	second_target="\$(DC_EXEC)"
1064	tests="test_bc timeconst"
1065
1066elif [ "$dc_only" -eq 1 ]; then
1067
1068	bc=0
1069	dc=1
1070
1071	bc_lib=""
1072	bc_help=""
1073
1074	executables="dc"
1075
1076	main_exec="DC"
1077	executable="DC_EXEC"
1078
1079	bc_test="@printf 'No bc tests to run\\\\n'"
1080	bc_test_np="@printf 'No bc tests to run\\\\n'"
1081	test_bc_history_prereqs=" test_bc_history_skip"
1082
1083	timeconst="@printf 'timeconst cannot be run because bc is not built\\\\n'"
1084
1085	install_prereqs=" install_execs"
1086	install_man_prereqs=" install_dc_manpage"
1087	uninstall_prereqs=" uninstall_dc"
1088	uninstall_man_prereqs=" uninstall_dc_manpage"
1089
1090	tests="test_dc"
1091
1092else
1093
1094	bc=1
1095	dc=1
1096
1097	executables="bc and dc"
1098
1099	karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)"
1100	karatsuba_test="@\$(KARATSUBA) 1 100 \$(BC_EXEC)"
1101
1102	if [ "$library" -eq 0 ]; then
1103		install_prereqs=" install_execs"
1104		install_man_prereqs=" install_bc_manpage install_dc_manpage"
1105		uninstall_prereqs=" uninstall_bc uninstall_dc"
1106		uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage"
1107	else
1108		install_prereqs=" install_library install_bcl_header"
1109		install_man_prereqs=" install_bcl_manpage"
1110		uninstall_prereqs=" uninstall_library uninstall_bcl_header"
1111		uninstall_man_prereqs=" uninstall_bcl_manpage"
1112		tests="test_library"
1113	fi
1114
1115	second_target_prereqs="$default_target_prereqs"
1116	default_target_prereqs="$second_target"
1117	default_target_cmd="\$(LINK) \$(BIN) \$(EXEC_PREFIX)\$(DC)"
1118
1119fi
1120
1121# We need specific stuff for fuzzing.
1122if [ "$fuzz" -ne 0 ]; then
1123	debug=1
1124	hist=0
1125	nls=0
1126	optimization="3"
1127fi
1128
1129# This sets some necessary things for debug mode.
1130if [ "$debug" -eq 1 ]; then
1131
1132	if [ -z "$CFLAGS" ] && [ -z "$optimization" ]; then
1133		CFLAGS="-O0"
1134	fi
1135
1136	CFLAGS="-g $CFLAGS"
1137
1138else
1139
1140	CPPFLAGS="-DNDEBUG $CPPFLAGS"
1141
1142	if [ "$strip_bin" -ne 0 ]; then
1143		LDFLAGS="-s $LDFLAGS"
1144	fi
1145fi
1146
1147# Set optimization CFLAGS.
1148if [ -n "$optimization" ]; then
1149	CFLAGS="-O$optimization $CFLAGS"
1150fi
1151
1152# Set test coverage defaults.
1153if [ "$coverage" -eq 1 ]; then
1154
1155	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
1156		usage "Can only specify -c without -b or -d"
1157	fi
1158
1159	CFLAGS="-fprofile-arcs -ftest-coverage -g -O0 $CFLAGS"
1160	CPPFLAGS="-DNDEBUG $CPPFLAGS"
1161
1162	COVERAGE_OUTPUT="@gcov -pabcdf \$(GCDA) \$(BC_GCDA) \$(DC_GCDA) \$(HISTORY_GCDA) \$(RAND_GCDA)"
1163	COVERAGE_OUTPUT="$COVERAGE_OUTPUT;\$(RM) -f \$(GEN)*.gc*"
1164	COVERAGE_OUTPUT="$COVERAGE_OUTPUT;gcovr --exclude-unreachable-branches --exclude-throw-branches --html-details --output index.html"
1165	COVERAGE_PREREQS=" test coverage_output"
1166
1167else
1168	COVERAGE_OUTPUT="@printf 'Coverage not generated\\\\n'"
1169	COVERAGE_PREREQS=""
1170fi
1171
1172
1173# Set some defaults.
1174if [ -z "${DESTDIR+set}" ]; then
1175	destdir=""
1176else
1177	destdir="DESTDIR = $DESTDIR"
1178fi
1179
1180if [ -z "${PREFIX+set}" ]; then
1181	PREFIX="/usr/local"
1182fi
1183
1184if [ -z "${BINDIR+set}" ]; then
1185	BINDIR="$PREFIX/bin"
1186fi
1187
1188if [ -z "${INCLUDEDIR+set}" ]; then
1189	INCLUDEDIR="$PREFIX/include"
1190fi
1191
1192if [ -z "${LIBDIR+set}" ]; then
1193	LIBDIR="$PREFIX/lib"
1194fi
1195
1196if [ -z "${PC_PATH+set}" ]; then
1197
1198	set +e
1199
1200	command -v pkg-config > /dev/null
1201	err=$?
1202
1203	set -e
1204
1205	if [ "$err" -eq 0 ]; then
1206		PC_PATH=$(pkg-config --variable=pc_path pkg-config)
1207		PC_PATH="${PC_PATH%%:*}"
1208	else
1209		PC_PATH=""
1210	fi
1211
1212fi
1213
1214# Set a default for the DATAROOTDIR. This is done if either manpages will be
1215# installed, or locales are enabled because that's probably where NLS_PATH
1216# points.
1217if [ "$install_manpages" -ne 0 ] || [ "$nls" -ne 0 ]; then
1218	if [ -z "${DATAROOTDIR+set}" ]; then
1219		DATAROOTDIR="$PREFIX/share"
1220	fi
1221fi
1222
1223# Set defaults for manpage environment variables.
1224if [ "$install_manpages" -ne 0 ]; then
1225
1226	if [ -z "${DATADIR+set}" ]; then
1227		DATADIR="$DATAROOTDIR"
1228	fi
1229
1230	if [ -z "${MANDIR+set}" ]; then
1231		MANDIR="$DATADIR/man"
1232	fi
1233
1234	if [ -z "${MAN1DIR+set}" ]; then
1235		MAN1DIR="$MANDIR/man1"
1236	fi
1237
1238	if [ -z "${MAN3DIR+set}" ]; then
1239		MAN3DIR="$MANDIR/man3"
1240	fi
1241
1242else
1243	install_man_prereqs=""
1244	uninstall_man_prereqs=""
1245fi
1246
1247# Here is where we test NLS (the locale system). This is done by trying to
1248# compile src/vm.c, which has the relevant code. If it fails, then it is
1249# disabled.
1250if [ "$nls" -ne 0 ]; then
1251
1252	set +e
1253
1254	printf 'Testing NLS...\n'
1255
1256	flags="-DBC_ENABLE_NLS=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
1257	flags="$flags -DBC_ENABLE_HISTORY=$hist -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
1258	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/"
1259	flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
1260
1261	"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/vm.c" -o "./vm.o" > /dev/null 2>&1
1262
1263	err="$?"
1264
1265	rm -rf "./vm.o"
1266
1267	# If this errors, it is probably because of building on Windows,
1268	# and NLS is not supported on Windows, so disable it.
1269	if [ "$err" -ne 0 ]; then
1270		printf 'NLS does not work.\n'
1271		if [ $force -eq 0 ]; then
1272			printf 'Disabling NLS...\n\n'
1273			nls=0
1274		else
1275			printf 'Forcing NLS...\n\n'
1276		fi
1277	else
1278		printf 'NLS works.\n\n'
1279
1280		printf 'Testing gencat...\n'
1281		gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" > /dev/null 2>&1
1282
1283		err="$?"
1284
1285		rm -rf "./en_US.cat"
1286
1287		if [ "$err" -ne 0 ]; then
1288			printf 'gencat does not work.\n'
1289			if [ $force -eq 0 ]; then
1290				printf 'Disabling NLS...\n\n'
1291				nls=0
1292			else
1293				printf 'Forcing NLS...\n\n'
1294			fi
1295		else
1296
1297			printf 'gencat works.\n\n'
1298
1299			# It turns out that POSIX locales are really terrible, and running
1300			# gencat on one machine is not guaranteed to make those cat files
1301			# portable to another machine, so we had better warn the user here.
1302			if [ "$HOSTCC" != "$CC" ] || [ "$OLDHOSTCFLAGS" != "$OLDCFLAGS" ]; then
1303				printf 'Cross-compile detected.\n\n'
1304				printf 'WARNING: Catalog files generated with gencat may not be portable\n'
1305				printf '         across different architectures.\n\n'
1306			fi
1307
1308			if [ -z "$NLSPATH" ]; then
1309				NLSPATH="/usr/share/locale/%L/%N"
1310			fi
1311
1312			install_locales_prereqs=" install_locales"
1313			uninstall_locales_prereqs=" uninstall_locales"
1314
1315		fi
1316
1317	fi
1318
1319	set -e
1320
1321else
1322	install_locales_prereqs=""
1323	uninstall_locales_prereqs=""
1324	all_locales=0
1325fi
1326
1327if [ "$nls" -ne 0 ] && [ "$all_locales" -ne 0 ]; then
1328	install_locales="\$(LOCALE_INSTALL) -l \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
1329else
1330	install_locales="\$(LOCALE_INSTALL) \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
1331fi
1332
1333# Like the above tested locale support, this tests history.
1334if [ "$hist" -eq 1 ]; then
1335
1336	set +e
1337
1338	printf 'Testing history...\n'
1339
1340	flags="-DBC_ENABLE_HISTORY=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
1341	flags="$flags -DBC_ENABLE_NLS=$nls -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
1342	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/"
1343	flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
1344
1345	"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/history.c" -o "./history.o" > /dev/null 2>&1
1346
1347	err="$?"
1348
1349	rm -rf "./history.o"
1350
1351	# If this errors, it is probably because of building on Windows,
1352	# and history is not supported on Windows, so disable it.
1353	if [ "$err" -ne 0 ]; then
1354		printf 'History does not work.\n'
1355		if [ $force -eq 0 ]; then
1356			printf 'Disabling history...\n\n'
1357			hist=0
1358		else
1359			printf 'Forcing history...\n\n'
1360		fi
1361	else
1362		printf 'History works.\n\n'
1363	fi
1364
1365	set -e
1366
1367fi
1368
1369# We have to disable the history tests if it is disabled or valgrind is on.
1370if [ "$hist" -eq 0 ] || [ "$vg" -ne 0 ]; then
1371	test_bc_history_prereqs=" test_bc_history_skip"
1372	test_dc_history_prereqs=" test_dc_history_skip"
1373	history_tests="@printf 'Skipping history tests...\\\\n'"
1374else
1375	history_tests="@printf '\$(TEST_STARS)\\\\n\\\\nRunning history tests...\\\\n\\\\n' \&\& \$(TESTSDIR)/history.sh bc -a \&\& \$(TESTSDIR)/history.sh dc -a \&\& printf '\\\\nAll history tests passed.\\\\n\\\\n\$(TEST_STARS)\\\\n'"
1376fi
1377
1378# Test OpenBSD. This is not in an if statement because regardless of whatever
1379# the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE.
1380# No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC
1381# and Clang complain that that is only allowed for system headers. Sigh....So we
1382# have to check at configure time and set it on the compiler command-line. And
1383# we have to set it because we also set _POSIX_C_SOURCE, which OpenBSD headers
1384# detect, and when they detect it, they turn off _BSD_SOURCE unless it is
1385# specifically requested.
1386set +e
1387printf 'Testing for OpenBSD...\n'
1388
1389flags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0"
1390"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/include/status.h" > /dev/null 2>&1
1391
1392err="$?"
1393
1394if [ "$err" -ne 0 ]; then
1395	printf 'On OpenBSD. Using _BSD_SOURCE.\n\n'
1396	bsd="-D_BSD_SOURCE"
1397else
1398	printf 'Not on OpenBSD.\n\n'
1399	bsd=""
1400fi
1401
1402if [ "$library" -eq 1 ]; then
1403	bc_lib=""
1404fi
1405
1406if [ "$extra_math" -eq 1 ] && [ "$bc" -ne 0 ] && [ "$library" -eq 0 ]; then
1407	BC_LIB2_O="\$(GEN_DIR)/lib2.o"
1408else
1409	BC_LIB2_O=""
1410fi
1411
1412# These lines set the appropriate targets based on whether `gen/strgen.c` or
1413# `gen/strgen.sh` is used.
1414GEN="strgen"
1415GEN_EXEC_TARGET="\$(HOSTCC) \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)"
1416CLEAN_PREREQS=" clean_gen clean_coverage"
1417
1418if [ -z "${GEN_HOST+set}" ]; then
1419	GEN_HOST=1
1420else
1421	if [ "$GEN_HOST" -eq 0 ]; then
1422		GEN="strgen.sh"
1423		GEN_EXEC_TARGET="@printf 'Do not need to build gen/strgen.c\\\\n'"
1424		CLEAN_PREREQS=" clean_coverage"
1425	fi
1426fi
1427
1428manpage_args=""
1429unneeded=""
1430headers="\$(HEADERS)"
1431
1432# This series of if statements figure out what source files are *not* needed.
1433if [ "$extra_math" -eq 0 ]; then
1434	manpage_args="E"
1435	unneeded="$unneeded rand.c"
1436else
1437	headers="$headers \$(EXTRA_MATH_HEADERS)"
1438fi
1439
1440# All of these next if statements set the build type and mark certain source
1441# files as unneeded so that they won't have targets generated for them.
1442
1443if [ "$hist" -eq 0 ]; then
1444	manpage_args="${manpage_args}H"
1445	unneeded="$unneeded history.c"
1446else
1447	headers="$headers \$(HISTORY_HEADERS)"
1448fi
1449
1450if [ "$nls" -eq 0 ]; then
1451	manpage_args="${manpage_args}N"
1452fi
1453
1454if [ "$bc" -eq 0 ]; then
1455	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
1456else
1457	headers="$headers \$(BC_HEADERS)"
1458fi
1459
1460if [ "$dc" -eq 0 ]; then
1461	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
1462else
1463	headers="$headers \$(DC_HEADERS)"
1464fi
1465
1466# This convoluted mess does pull the version out. If you change the format of
1467# include/version.h, you may have to change this line.
1468version=$(cat "$scriptdir/include/version.h" | grep "VERSION " - | awk '{ print $3 }' -)
1469
1470if [ "$library" -ne 0 ]; then
1471
1472	unneeded="$unneeded args.c opt.c read.c file.c main.c"
1473	unneeded="$unneeded lang.c lex.c parse.c program.c"
1474	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
1475	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
1476	headers="$headers \$(LIBRARY_HEADERS)"
1477
1478	if [ "$PC_PATH" != "" ]; then
1479
1480		contents=$(cat "$scriptdir/bcl.pc.in")
1481
1482		contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
1483		contents=$(replace "$contents" "LIBDIR" "$LIBDIR")
1484		contents=$(replace "$contents" "VERSION" "$version")
1485
1486		printf '%s\n' "$contents" > "./bcl.pc"
1487
1488		pkg_config_install="\$(SAFE_INSTALL) \$(PC_INSTALL_ARGS) \"\$(BCL_PC)\" \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
1489		pkg_config_uninstall="\$(RM) -f \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
1490
1491	else
1492
1493		pkg_config_install=""
1494		pkg_config_uninstall=""
1495
1496	fi
1497
1498else
1499
1500	unneeded="$unneeded library.c"
1501
1502	PC_PATH=""
1503	pkg_config_install=""
1504	pkg_config_uninstall=""
1505
1506fi
1507
1508# library.c is not needed under normal circumstances.
1509if [ "$unneeded" = "" ]; then
1510	unneeded="library.c"
1511fi
1512
1513# This sets the appropriate manpage for a full build.
1514if [ "$manpage_args" = "" ]; then
1515	manpage_args="A"
1516fi
1517
1518if [ "$vg" -ne 0 ]; then
1519	memcheck=1
1520fi
1521
1522if [ "$bc_default_prompt" = "" ]; then
1523	bc_default_prompt="$bc_default_tty_mode"
1524fi
1525
1526if [ "$dc_default_prompt" = "" ]; then
1527	dc_default_prompt="$dc_default_tty_mode"
1528fi
1529
1530# Generate the test targets and prerequisites.
1531bc_tests=$(gen_std_test_targets bc)
1532bc_script_tests=$(gen_script_test_targets bc)
1533bc_err_tests=$(gen_err_test_targets bc)
1534dc_tests=$(gen_std_test_targets dc)
1535dc_script_tests=$(gen_script_test_targets dc)
1536dc_err_tests=$(gen_err_test_targets dc)
1537
1538# Print out the values; this is for debugging.
1539printf 'Version: %s\n' "$version"
1540
1541if [ "$bc" -ne 0 ]; then
1542	printf 'Building bc\n'
1543else
1544	printf 'Not building bc\n'
1545fi
1546if [ "$dc" -ne 0 ]; then
1547	printf 'Building dc\n'
1548else
1549	printf 'Not building dc\n'
1550fi
1551printf '\n'
1552printf 'BC_ENABLE_LIBRARY=%s\n\n' "$library"
1553printf 'BC_ENABLE_HISTORY=%s\n' "$hist"
1554printf 'BC_ENABLE_EXTRA_MATH=%s\n' "$extra_math"
1555printf 'BC_ENABLE_NLS=%s\n' "$nls"
1556printf 'BC_ENABLE_AFL=%s\n' "$fuzz"
1557printf '\n'
1558printf 'BC_NUM_KARATSUBA_LEN=%s\n' "$karatsuba_len"
1559printf '\n'
1560printf 'CC=%s\n' "$CC"
1561printf 'CFLAGS=%s\n' "$CFLAGS"
1562printf 'HOSTCC=%s\n' "$HOSTCC"
1563printf 'HOSTCFLAGS=%s\n' "$HOSTCFLAGS"
1564printf 'CPPFLAGS=%s\n' "$CPPFLAGS"
1565printf 'LDFLAGS=%s\n' "$LDFLAGS"
1566printf 'PREFIX=%s\n' "$PREFIX"
1567printf 'BINDIR=%s\n' "$BINDIR"
1568printf 'INCLUDEDIR=%s\n' "$INCLUDEDIR"
1569printf 'LIBDIR=%s\n' "$LIBDIR"
1570printf 'DATAROOTDIR=%s\n' "$DATAROOTDIR"
1571printf 'DATADIR=%s\n' "$DATADIR"
1572printf 'MANDIR=%s\n' "$MANDIR"
1573printf 'MAN1DIR=%s\n' "$MAN1DIR"
1574printf 'MAN3DIR=%s\n' "$MAN3DIR"
1575printf 'NLSPATH=%s\n' "$NLSPATH"
1576printf 'PC_PATH=%s\n' "$PC_PATH"
1577printf 'EXECSUFFIX=%s\n' "$EXECSUFFIX"
1578printf 'EXECPREFIX=%s\n' "$EXECPREFIX"
1579printf 'DESTDIR=%s\n' "$DESTDIR"
1580printf 'LONG_BIT=%s\n' "$LONG_BIT"
1581printf 'GEN_HOST=%s\n' "$GEN_HOST"
1582printf 'GEN_EMU=%s\n' "$GEN_EMU"
1583printf '\n'
1584printf 'Setting Defaults\n'
1585printf '================\n'
1586printf 'bc.banner=%s\n' "$bc_default_banner"
1587printf 'bc.sigint_reset=%s\n' "$bc_default_sigint_reset"
1588printf 'dc.sigint_reset=%s\n' "$dc_default_sigint_reset"
1589printf 'bc.tty_mode=%s\n' "$bc_default_tty_mode"
1590printf 'dc.tty_mode=%s\n' "$dc_default_tty_mode"
1591printf 'bc.prompt=%s\n' "$bc_default_prompt"
1592printf 'dc.prompt=%s\n' "$dc_default_prompt"
1593printf 'bc.expr_exit=%s\n' "$bc_default_expr_exit"
1594printf 'dc.expr_exit=%s\n' "$dc_default_expr_exit"
1595
1596# This is where the real work begins. This is the point at which the Makefile.in
1597# template is edited and output to the Makefile.
1598
1599contents=$(cat "$scriptdir/Makefile.in")
1600
1601needle="WARNING"
1602replacement='*** WARNING: Autogenerated from Makefile.in. DO NOT MODIFY ***'
1603
1604contents=$(replace "$contents" "$needle" "$replacement")
1605
1606# The contents are edited to have the list of files to build.
1607contents=$(gen_file_list "$contents" $unneeded)
1608
1609SRC_TARGETS=""
1610
1611# This line and loop generates the individual targets for source files. I used
1612# to just use an implicit target, but that was found to be inadequate when I
1613# added the library.
1614src_files=$(find_src_files $unneeded)
1615
1616for f in $src_files; do
1617	o=$(replace_ext "$f" "c" "o")
1618	o=$(basename "$o")
1619	SRC_TARGETS=$(printf '%s\n\nsrc/%s: src %s %s\n\t$(CC) $(CFLAGS) -o src/%s -c %s\n' \
1620		"$SRC_TARGETS" "$o" "$headers" "$f" "$o" "$f")
1621done
1622
1623# Replace all the placeholders.
1624contents=$(replace "$contents" "ROOTDIR" "$scriptdir")
1625contents=$(replace "$contents" "BUILDDIR" "$builddir")
1626
1627contents=$(replace "$contents" "HEADERS" "$headers")
1628
1629contents=$(replace "$contents" "BC_ENABLED" "$bc")
1630contents=$(replace "$contents" "DC_ENABLED" "$dc")
1631
1632contents=$(replace "$contents" "BC_ALL_TESTS" "$bc_test")
1633contents=$(replace "$contents" "BC_ALL_TESTS_NP" "$bc_test_np")
1634contents=$(replace "$contents" "BC_TESTS" "$bc_tests")
1635contents=$(replace "$contents" "BC_SCRIPT_TESTS" "$bc_script_tests")
1636contents=$(replace "$contents" "BC_ERROR_TESTS" "$bc_err_tests")
1637contents=$(replace "$contents" "BC_TEST_EXEC" "$bc_test_exec")
1638contents=$(replace "$contents" "TIMECONST_ALL_TESTS" "$timeconst")
1639
1640contents=$(replace "$contents" "DC_ALL_TESTS" "$dc_test")
1641contents=$(replace "$contents" "DC_ALL_TESTS_NP" "$dc_test_np")
1642contents=$(replace "$contents" "DC_TESTS" "$dc_tests")
1643contents=$(replace "$contents" "DC_SCRIPT_TESTS" "$dc_script_tests")
1644contents=$(replace "$contents" "DC_ERROR_TESTS" "$dc_err_tests")
1645contents=$(replace "$contents" "DC_TEST_EXEC" "$dc_test_exec")
1646
1647contents=$(replace "$contents" "BUILD_TYPE" "$manpage_args")
1648
1649contents=$(replace "$contents" "LIBRARY" "$library")
1650contents=$(replace "$contents" "HISTORY" "$hist")
1651contents=$(replace "$contents" "EXTRA_MATH" "$extra_math")
1652contents=$(replace "$contents" "NLS" "$nls")
1653contents=$(replace "$contents" "FUZZ" "$fuzz")
1654contents=$(replace "$contents" "MEMCHECK" "$memcheck")
1655
1656contents=$(replace "$contents" "BC_LIB_O" "$bc_lib")
1657contents=$(replace "$contents" "BC_HELP_O" "$bc_help")
1658contents=$(replace "$contents" "DC_HELP_O" "$dc_help")
1659contents=$(replace "$contents" "BC_LIB2_O" "$BC_LIB2_O")
1660contents=$(replace "$contents" "KARATSUBA_LEN" "$karatsuba_len")
1661
1662contents=$(replace "$contents" "NLSPATH" "$NLSPATH")
1663contents=$(replace "$contents" "DESTDIR" "$destdir")
1664contents=$(replace "$contents" "EXECSUFFIX" "$EXECSUFFIX")
1665contents=$(replace "$contents" "EXECPREFIX" "$EXECPREFIX")
1666contents=$(replace "$contents" "BINDIR" "$BINDIR")
1667contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
1668contents=$(replace "$contents" "LIBDIR" "$LIBDIR")
1669contents=$(replace "$contents" "MAN1DIR" "$MAN1DIR")
1670contents=$(replace "$contents" "MAN3DIR" "$MAN3DIR")
1671contents=$(replace "$contents" "CFLAGS" "$CFLAGS")
1672contents=$(replace "$contents" "HOSTCFLAGS" "$HOSTCFLAGS")
1673contents=$(replace "$contents" "CPPFLAGS" "$CPPFLAGS")
1674contents=$(replace "$contents" "LDFLAGS" "$LDFLAGS")
1675contents=$(replace "$contents" "CC" "$CC")
1676contents=$(replace "$contents" "HOSTCC" "$HOSTCC")
1677contents=$(replace "$contents" "COVERAGE_OUTPUT" "$COVERAGE_OUTPUT")
1678contents=$(replace "$contents" "COVERAGE_PREREQS" "$COVERAGE_PREREQS")
1679contents=$(replace "$contents" "INSTALL_PREREQS" "$install_prereqs")
1680contents=$(replace "$contents" "INSTALL_MAN_PREREQS" "$install_man_prereqs")
1681contents=$(replace "$contents" "INSTALL_LOCALES" "$install_locales")
1682contents=$(replace "$contents" "INSTALL_LOCALES_PREREQS" "$install_locales_prereqs")
1683contents=$(replace "$contents" "UNINSTALL_MAN_PREREQS" "$uninstall_man_prereqs")
1684contents=$(replace "$contents" "UNINSTALL_PREREQS" "$uninstall_prereqs")
1685contents=$(replace "$contents" "UNINSTALL_LOCALES_PREREQS" "$uninstall_locales_prereqs")
1686
1687contents=$(replace "$contents" "PC_PATH" "$PC_PATH")
1688contents=$(replace "$contents" "PKG_CONFIG_INSTALL" "$pkg_config_install")
1689contents=$(replace "$contents" "PKG_CONFIG_UNINSTALL" "$pkg_config_uninstall")
1690
1691contents=$(replace "$contents" "DEFAULT_TARGET" "$default_target")
1692contents=$(replace "$contents" "DEFAULT_TARGET_PREREQS" "$default_target_prereqs")
1693contents=$(replace "$contents" "DEFAULT_TARGET_CMD" "$default_target_cmd")
1694contents=$(replace "$contents" "SECOND_TARGET" "$second_target")
1695contents=$(replace "$contents" "SECOND_TARGET_PREREQS" "$second_target_prereqs")
1696contents=$(replace "$contents" "SECOND_TARGET_CMD" "$second_target_cmd")
1697
1698contents=$(replace "$contents" "ALL_PREREQ" "$ALL_PREREQ")
1699contents=$(replace "$contents" "BC_EXEC_PREREQ" "$bc_exec_prereq")
1700contents=$(replace "$contents" "BC_EXEC_CMD" "$bc_exec_cmd")
1701contents=$(replace "$contents" "DC_EXEC_PREREQ" "$dc_exec_prereq")
1702contents=$(replace "$contents" "DC_EXEC_CMD" "$dc_exec_cmd")
1703
1704contents=$(replace "$contents" "EXECUTABLES" "$executables")
1705contents=$(replace "$contents" "MAIN_EXEC" "$main_exec")
1706contents=$(replace "$contents" "EXEC" "$executable")
1707contents=$(replace "$contents" "TESTS" "$tests")
1708
1709contents=$(replace "$contents" "BC_HISTORY_TEST_PREREQS" "$test_bc_history_prereqs")
1710contents=$(replace "$contents" "DC_HISTORY_TEST_PREREQS" "$test_dc_history_prereqs")
1711contents=$(replace "$contents" "HISTORY_TESTS" "$history_tests")
1712
1713contents=$(replace "$contents" "VG_BC_TEST" "$vg_bc_test")
1714contents=$(replace "$contents" "VG_DC_TEST" "$vg_dc_test")
1715
1716contents=$(replace "$contents" "TIMECONST" "$timeconst")
1717
1718contents=$(replace "$contents" "KARATSUBA" "$karatsuba")
1719contents=$(replace "$contents" "KARATSUBA_TEST" "$karatsuba_test")
1720
1721contents=$(replace "$contents" "LONG_BIT" "$LONG_BIT")
1722contents=$(replace "$contents" "LONG_BIT_DEFINE" "$LONG_BIT_DEFINE")
1723
1724contents=$(replace "$contents" "GEN" "$GEN")
1725contents=$(replace "$contents" "GEN_EXEC_TARGET" "$GEN_EXEC_TARGET")
1726contents=$(replace "$contents" "CLEAN_PREREQS" "$CLEAN_PREREQS")
1727contents=$(replace "$contents" "GEN_EMU" "$GEN_EMU")
1728
1729contents=$(replace "$contents" "BSD" "$bsd")
1730
1731contents=$(replace "$contents" "BC_DEFAULT_BANNER" "$bc_default_banner")
1732contents=$(replace "$contents" "BC_DEFAULT_SIGINT_RESET" "$bc_default_sigint_reset")
1733contents=$(replace "$contents" "DC_DEFAULT_SIGINT_RESET" "$dc_default_sigint_reset")
1734contents=$(replace "$contents" "BC_DEFAULT_TTY_MODE" "$bc_default_tty_mode")
1735contents=$(replace "$contents" "DC_DEFAULT_TTY_MODE" "$dc_default_tty_mode")
1736contents=$(replace "$contents" "BC_DEFAULT_PROMPT" "$bc_default_prompt")
1737contents=$(replace "$contents" "DC_DEFAULT_PROMPT" "$dc_default_prompt")
1738contents=$(replace "$contents" "BC_DEFAULT_EXPR_EXIT" "$bc_default_expr_exit")
1739contents=$(replace "$contents" "DC_DEFAULT_EXPR_EXIT" "$dc_default_expr_exit")
1740
1741# Do the first print to the Makefile.
1742printf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "Makefile"
1743
1744# Generate the individual test targets.
1745if [ "$bc" -ne 0 ]; then
1746	gen_std_tests bc "$extra_math" "$time_tests" $bc_test_exec
1747	gen_script_tests bc "$extra_math" "$generate_tests" "$time_tests" $bc_test_exec
1748	gen_err_tests bc $bc_test_exec
1749fi
1750
1751if [ "$dc" -ne 0 ]; then
1752	gen_std_tests dc "$extra_math" "$time_tests" $dc_test_exec
1753	gen_script_tests dc "$extra_math" "$generate_tests" "$time_tests" $dc_test_exec
1754	gen_err_tests dc $dc_test_exec
1755fi
1756
1757# Copy the correct manuals to the expected places.
1758mkdir -p manuals
1759cp -f "$scriptdir/manuals/bc/$manpage_args.1.md" manuals/bc.1.md
1760cp -f "$scriptdir/manuals/bc/$manpage_args.1" manuals/bc.1
1761cp -f "$scriptdir/manuals/dc/$manpage_args.1.md" manuals/dc.1.md
1762cp -f "$scriptdir/manuals/dc/$manpage_args.1" manuals/dc.1
1763
1764make clean > /dev/null
1765