xref: /freebsd/contrib/bc/configure.sh (revision 00698711dee1d990d3db9c41bf58394e589eecfe)
13aa99676SStefan Eßer#! /bin/sh
23aa99676SStefan Eßer#
33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause
43aa99676SStefan Eßer#
510328f8bSStefan Eßer# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
63aa99676SStefan Eßer#
73aa99676SStefan Eßer# Redistribution and use in source and binary forms, with or without
83aa99676SStefan Eßer# modification, are permitted provided that the following conditions are met:
93aa99676SStefan Eßer#
103aa99676SStefan Eßer# * Redistributions of source code must retain the above copyright notice, this
113aa99676SStefan Eßer#   list of conditions and the following disclaimer.
123aa99676SStefan Eßer#
133aa99676SStefan Eßer# * Redistributions in binary form must reproduce the above copyright notice,
143aa99676SStefan Eßer#   this list of conditions and the following disclaimer in the documentation
153aa99676SStefan Eßer#   and/or other materials provided with the distribution.
163aa99676SStefan Eßer#
173aa99676SStefan Eßer# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
183aa99676SStefan Eßer# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
193aa99676SStefan Eßer# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
203aa99676SStefan Eßer# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
213aa99676SStefan Eßer# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
223aa99676SStefan Eßer# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
233aa99676SStefan Eßer# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
243aa99676SStefan Eßer# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
253aa99676SStefan Eßer# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
263aa99676SStefan Eßer# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
273aa99676SStefan Eßer# POSSIBILITY OF SUCH DAMAGE.
283aa99676SStefan Eßer#
293aa99676SStefan Eßer
303aa99676SStefan Eßerscript="$0"
313aa99676SStefan Eßerscriptdir=$(dirname "$script")
323aa99676SStefan Eßerscript=$(basename "$script")
333aa99676SStefan Eßer
3410041e99SStefan Eßerbuilddir=$(pwd)
353aa99676SStefan Eßer
3610041e99SStefan Eßer. "$scriptdir/scripts/functions.sh"
3710328f8bSStefan Eßer
3844d4804dSStefan Eßer# Simply prints the help message and quits based on the argument.
39*00698711SStefan Eßer# @param msg  The help message to print.
403aa99676SStefan Eßerusage() {
413aa99676SStefan Eßer
423aa99676SStefan Eßer	if [ $# -gt 0 ]; then
433aa99676SStefan Eßer
443aa99676SStefan Eßer		_usage_val=1
453aa99676SStefan Eßer
463aa99676SStefan Eßer		printf "%s\n\n" "$1"
473aa99676SStefan Eßer
483aa99676SStefan Eßer	else
493aa99676SStefan Eßer		_usage_val=0
503aa99676SStefan Eßer	fi
513aa99676SStefan Eßer
5250696a6eSStefan Eßer	printf 'usage:\n'
5350696a6eSStefan Eßer	printf '    %s -h\n' "$script"
543aa99676SStefan Eßer	printf '    %s --help\n' "$script"
5510041e99SStefan Eßer	printf '    %s [-a|-bD|-dB|-c] [-CEfgGHlmMNtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script"
5610041e99SStefan Eßer	printf '       [-s SETTING] [-S SETTING]\n'
573aa99676SStefan Eßer	printf '    %s \\\n' "$script"
5850696a6eSStefan Eßer	printf '       [--library|--bc-only --disable-dc|--dc-only --disable-bc|--coverage]  \\\n'
5950696a6eSStefan Eßer	printf '       [--force --debug --disable-extra-math --disable-generated-tests]      \\\n'
6044d4804dSStefan Eßer	printf '       [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n'
6144d4804dSStefan Eßer	printf '       [--install-all-locales] [--opt=OPT_LEVEL]                             \\\n'
6244d4804dSStefan Eßer	printf '       [--karatsuba-len=KARATSUBA_LEN]                                       \\\n'
6310041e99SStefan Eßer	printf '       [--set-default-on=SETTING] [--set-default-off=SETTING]                \\\n'
643aa99676SStefan Eßer	printf '       [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR]       \\\n'
653aa99676SStefan Eßer	printf '       [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR]             \\\n'
663aa99676SStefan Eßer	printf '\n'
6750696a6eSStefan Eßer	printf '    -a, --library\n'
6844d4804dSStefan Eßer	printf '        Build the libbcl instead of the programs. This is meant to be used with\n'
6950696a6eSStefan Eßer	printf '        Other software like programming languages that want to make use of the\n'
7050696a6eSStefan Eßer	printf '        parsing and math capabilities. This option will install headers using\n'
7150696a6eSStefan Eßer	printf '        `make install`.\n'
723aa99676SStefan Eßer	printf '    -b, --bc-only\n'
7350696a6eSStefan Eßer	printf '        Build bc only. It is an error if "-d", "--dc-only", "-B", or\n'
7450696a6eSStefan Eßer	printf '        "--disable-bc" are specified too.\n'
753aa99676SStefan Eßer	printf '    -B, --disable-bc\n'
763aa99676SStefan Eßer	printf '        Disable bc. It is an error if "-b", "--bc-only", "-D", or "--disable-dc"\n'
773aa99676SStefan Eßer	printf '        are specified too.\n'
783aa99676SStefan Eßer	printf '    -c, --coverage\n'
7944d4804dSStefan Eßer	printf '        Generate test coverage code. Requires gcov and gcovr.\n'
803aa99676SStefan Eßer	printf '        It is an error if either "-b" ("-D") or "-d" ("-B") is specified.\n'
813aa99676SStefan Eßer	printf '        Requires a compiler that use gcc-compatible coverage options\n'
8210328f8bSStefan Eßer	printf '    -C, --disable-clean\n'
8310328f8bSStefan Eßer	printf '        Disable the clean that configure.sh does before configure.\n'
843aa99676SStefan Eßer	printf '    -d, --dc-only\n'
8550696a6eSStefan Eßer	printf '        Build dc only. It is an error if "-b", "--bc-only", "-D", or\n'
8650696a6eSStefan Eßer	printf '        "--disable-dc" are specified too.\n'
873aa99676SStefan Eßer	printf '    -D, --disable-dc\n'
8850696a6eSStefan Eßer	printf '        Disable dc. It is an error if "-d", "--dc-only", "-B", or "--disable-bc"\n'
893aa99676SStefan Eßer	printf '        are specified too.\n'
903aa99676SStefan Eßer	printf '    -E, --disable-extra-math\n'
913aa99676SStefan Eßer	printf '        Disable extra math. This includes: "$" operator (truncate to integer),\n'
923aa99676SStefan Eßer	printf '        "@" operator (set number of decimal places), and r(x, p) (rounding\n'
933aa99676SStefan Eßer	printf '        function). Additionally, this option disables the extra printing\n'
943aa99676SStefan Eßer	printf '        functions in the math library.\n'
953aa99676SStefan Eßer	printf '    -f, --force\n'
963aa99676SStefan Eßer	printf '        Force use of all enabled options, even if they do not work. This\n'
973aa99676SStefan Eßer	printf '        option is to allow the maintainer a way to test that certain options\n'
98*00698711SStefan Eßer	printf '        are not failing invisibly. (Development only.)\n'
993aa99676SStefan Eßer	printf '    -g, --debug\n'
1003aa99676SStefan Eßer	printf '        Build in debug mode. Adds the "-g" flag, and if there are no\n'
1013aa99676SStefan Eßer	printf '        other CFLAGS, and "-O" was not given, this also adds the "-O0"\n'
1023aa99676SStefan Eßer	printf '        flag. If this flag is *not* given, "-DNDEBUG" is added to CPPFLAGS\n'
1033aa99676SStefan Eßer	printf '        and a strip flag is added to the link stage.\n'
1043aa99676SStefan Eßer	printf '    -G, --disable-generated-tests\n'
1053aa99676SStefan Eßer	printf '        Disable generating tests. This is for platforms that do not have a\n'
1063aa99676SStefan Eßer	printf '        GNU bc-compatible bc to generate tests.\n'
1073aa99676SStefan Eßer	printf '    -h, --help\n'
1083aa99676SStefan Eßer	printf '        Print this help message and exit.\n'
1093aa99676SStefan Eßer	printf '    -H, --disable-history\n'
1103aa99676SStefan Eßer	printf '        Disable history.\n'
1113aa99676SStefan Eßer	printf '    -k KARATSUBA_LEN, --karatsuba-len KARATSUBA_LEN\n'
1123aa99676SStefan Eßer	printf '        Set the karatsuba length to KARATSUBA_LEN (default is 64).\n'
1133aa99676SStefan Eßer	printf '        It is an error if KARATSUBA_LEN is not a number or is less than 16.\n'
114cf7becd2SStefan Eßer	printf '    -l, --install-all-locales\n'
115cf7becd2SStefan Eßer	printf '        Installs all locales, regardless of how many are on the system. This\n'
116cf7becd2SStefan Eßer	printf '        option is useful for package maintainers who want to make sure that\n'
117cf7becd2SStefan Eßer	printf '        a package contains all of the locales that end users might need.\n'
11810328f8bSStefan Eßer	printf '    -m, --enable-memcheck\n'
11910328f8bSStefan Eßer	printf '        Enable memcheck mode, to ensure no memory leaks. For development only.\n'
1203aa99676SStefan Eßer	printf '    -M, --disable-man-pages\n'
1213aa99676SStefan Eßer	printf '        Disable installing manpages.\n'
1223aa99676SStefan Eßer	printf '    -N, --disable-nls\n'
1233aa99676SStefan Eßer	printf '        Disable POSIX locale (NLS) support.\n'
1243aa99676SStefan Eßer	printf '    -O OPT_LEVEL, --opt OPT_LEVEL\n'
1253aa99676SStefan Eßer	printf '        Set the optimization level. This can also be included in the CFLAGS,\n'
1263aa99676SStefan Eßer	printf '        but it is provided, so maintainers can build optimized debug builds.\n'
1273aa99676SStefan Eßer	printf '        This is passed through to the compiler, so it must be supported.\n'
12844d4804dSStefan Eßer	printf '    -s SETTING, --set-default-on SETTING\n'
12944d4804dSStefan Eßer	printf '        Set the default named by SETTING to on. See below for possible values\n'
13044d4804dSStefan Eßer	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
13144d4804dSStefan Eßer	printf '        setting, the last one is used.\n'
13244d4804dSStefan Eßer	printf '    -S SETTING, --set-default-off SETTING\n'
13344d4804dSStefan Eßer	printf '        Set the default named by SETTING to off. See below for possible values\n'
13444d4804dSStefan Eßer	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
13544d4804dSStefan Eßer	printf '        setting, the last one is used.\n'
13610328f8bSStefan Eßer	printf '    -t, --enable-test-timing\n'
13710328f8bSStefan Eßer	printf '        Enable the timing of tests. This is for development only.\n'
1383aa99676SStefan Eßer	printf '    -T, --disable-strip\n'
1393aa99676SStefan Eßer	printf '        Disable stripping symbols from the compiled binary or binaries.\n'
1403aa99676SStefan Eßer	printf '        Stripping symbols only happens when debug mode is off.\n'
14110328f8bSStefan Eßer	printf '    -v, --enable-valgrind\n'
14210328f8bSStefan Eßer	printf '        Enable a build appropriate for valgrind. For development only.\n'
14310328f8bSStefan Eßer	printf '    -z, --enable-fuzz-mode\n'
14410328f8bSStefan Eßer	printf '        Enable fuzzing mode. THIS IS FOR DEVELOPMENT ONLY.\n'
1453aa99676SStefan Eßer	printf '    --prefix PREFIX\n'
1463aa99676SStefan Eßer	printf '        The prefix to install to. Overrides "$PREFIX" if it exists.\n'
1473aa99676SStefan Eßer	printf '        If PREFIX is "/usr", install path will be "/usr/bin".\n'
1483aa99676SStefan Eßer	printf '        Default is "/usr/local".\n'
1493aa99676SStefan Eßer	printf '    --bindir BINDIR\n'
15050696a6eSStefan Eßer	printf '        The directory to install binaries in. Overrides "$BINDIR" if it exists.\n'
1513aa99676SStefan Eßer	printf '        Default is "$PREFIX/bin".\n'
15250696a6eSStefan Eßer	printf '    --includedir INCLUDEDIR\n'
15350696a6eSStefan Eßer	printf '        The directory to install headers in. Overrides "$INCLUDEDIR" if it\n'
15450696a6eSStefan Eßer	printf '        exists. Default is "$PREFIX/include".\n'
15550696a6eSStefan Eßer	printf '    --libdir LIBDIR\n'
15650696a6eSStefan Eßer	printf '        The directory to install libraries in. Overrides "$LIBDIR" if it exists.\n'
15750696a6eSStefan Eßer	printf '        Default is "$PREFIX/lib".\n'
1583aa99676SStefan Eßer	printf '    --datarootdir DATAROOTDIR\n'
1593aa99676SStefan Eßer	printf '        The root location for data files. Overrides "$DATAROOTDIR" if it exists.\n'
1603aa99676SStefan Eßer	printf '        Default is "$PREFIX/share".\n'
1613aa99676SStefan Eßer	printf '    --datadir DATADIR\n'
1623aa99676SStefan Eßer	printf '        The location for data files. Overrides "$DATADIR" if it exists.\n'
1633aa99676SStefan Eßer	printf '        Default is "$DATAROOTDIR".\n'
1643aa99676SStefan Eßer	printf '    --mandir MANDIR\n'
1653aa99676SStefan Eßer	printf '        The location to install manpages to. Overrides "$MANDIR" if it exists.\n'
1663aa99676SStefan Eßer	printf '        Default is "$DATADIR/man".\n'
1673aa99676SStefan Eßer	printf '    --man1dir MAN1DIR\n'
1683aa99676SStefan Eßer	printf '        The location to install Section 1 manpages to. Overrides "$MAN1DIR" if\n'
1693aa99676SStefan Eßer	printf '        it exists. Default is "$MANDIR/man1".\n'
17050696a6eSStefan Eßer	printf '    --man3dir MAN3DIR\n'
17150696a6eSStefan Eßer	printf '        The location to install Section 3 manpages to. Overrides "$MAN3DIR" if\n'
17250696a6eSStefan Eßer	printf '        it exists. Default is "$MANDIR/man3".\n'
1733aa99676SStefan Eßer	printf '\n'
1743aa99676SStefan Eßer	printf 'In addition, the following environment variables are used:\n'
1753aa99676SStefan Eßer	printf '\n'
1763aa99676SStefan Eßer	printf '    CC           C compiler. Must be compatible with POSIX c99. If there is a\n'
1773aa99676SStefan Eßer	printf '                 space in the basename of the compiler, the items after the\n'
1783aa99676SStefan Eßer	printf '                 first space are assumed to be compiler flags, and in that case,\n'
1793aa99676SStefan Eßer	printf '                 the flags are automatically moved into CFLAGS. Default is\n'
1803aa99676SStefan Eßer	printf '                 "c99".\n'
1813aa99676SStefan Eßer	printf '    HOSTCC       Host C compiler. Must be compatible with POSIX c99. If there is\n'
1823aa99676SStefan Eßer	printf '                 a space in the basename of the compiler, the items after the\n'
1833aa99676SStefan Eßer	printf '                 first space are assumed to be compiler flags, and in the case,\n'
1843aa99676SStefan Eßer	printf '                 the flags are automatically moved into HOSTCFLAGS. Default is\n'
1853aa99676SStefan Eßer	printf '                 "$CC".\n'
1863aa99676SStefan Eßer	printf '    HOST_CC      Same as HOSTCC. If HOSTCC also exists, it is used.\n'
1873aa99676SStefan Eßer	printf '    CFLAGS       C compiler flags.\n'
1883aa99676SStefan Eßer	printf '    HOSTCFLAGS   CFLAGS for HOSTCC. Default is "$CFLAGS".\n'
1893aa99676SStefan Eßer	printf '    HOST_CFLAGS  Same as HOST_CFLAGS. If HOST_CFLAGS also exists, it is used.\n'
1903aa99676SStefan Eßer	printf '    CPPFLAGS     C preprocessor flags. Default is "".\n'
1913aa99676SStefan Eßer	printf '    LDFLAGS      Linker flags. Default is "".\n'
1923aa99676SStefan Eßer	printf '    PREFIX       The prefix to install to. Default is "/usr/local".\n'
1933aa99676SStefan Eßer	printf '                 If PREFIX is "/usr", install path will be "/usr/bin".\n'
19450696a6eSStefan Eßer	printf '    BINDIR       The directory to install binaries in. Default is "$PREFIX/bin".\n'
19550696a6eSStefan Eßer	printf '    INCLUDEDIR   The directory to install header files in. Default is\n'
19650696a6eSStefan Eßer	printf '                 "$PREFIX/include".\n'
19750696a6eSStefan Eßer	printf '    LIBDIR       The directory to install libraries in. Default is\n'
19850696a6eSStefan Eßer	printf '                 "$PREFIX/lib".\n'
1993aa99676SStefan Eßer	printf '    DATAROOTDIR  The root location for data files. Default is "$PREFIX/share".\n'
2003aa99676SStefan Eßer	printf '    DATADIR      The location for data files. Default is "$DATAROOTDIR".\n'
2013aa99676SStefan Eßer	printf '    MANDIR       The location to install manpages to. Default is "$DATADIR/man".\n'
2023aa99676SStefan Eßer	printf '    MAN1DIR      The location to install Section 1 manpages to. Default is\n'
2033aa99676SStefan Eßer	printf '                 "$MANDIR/man1".\n'
20450696a6eSStefan Eßer	printf '    MAN3DIR      The location to install Section 3 manpages to. Default is\n'
20550696a6eSStefan Eßer	printf '                 "$MANDIR/man3".\n'
2063aa99676SStefan Eßer	printf '    NLSPATH      The location to install locale catalogs to. Must be an absolute\n'
2073aa99676SStefan Eßer	printf '                 path (or contain one). This is treated the same as the POSIX\n'
2083aa99676SStefan Eßer	printf '                 definition of $NLSPATH (see POSIX environment variables for\n'
2093aa99676SStefan Eßer	printf '                 more information). Default is "/usr/share/locale/%%L/%%N".\n'
21010041e99SStefan Eßer	printf '    PC_PATH      The location to install pkg-config files to. Must be an\n'
21110041e99SStefan Eßer	printf '                 path or contain one. Default is the first path given by the\n'
21210041e99SStefan Eßer	printf '                 output of `pkg-config --variable=pc_path pkg-config`.\n'
2133aa99676SStefan Eßer	printf '    EXECSUFFIX   The suffix to append to the executable names, used to not\n'
2143aa99676SStefan Eßer	printf '                 interfere with other installed bc executables. Default is "".\n'
2153aa99676SStefan Eßer	printf '    EXECPREFIX   The prefix to append to the executable names, used to not\n'
2163aa99676SStefan Eßer	printf '                 interfere with other installed bc executables. Default is "".\n'
2173aa99676SStefan Eßer	printf '    DESTDIR      For package creation. Default is "". If it is empty when\n'
2183aa99676SStefan Eßer	printf '                 `%s` is run, it can also be passed to `make install`\n' "$script"
2193aa99676SStefan Eßer	printf '                 later as an environment variable. If both are specified,\n'
2203aa99676SStefan Eßer	printf '                 the one given to `%s` takes precedence.\n' "$script"
2213aa99676SStefan Eßer	printf '    LONG_BIT     The number of bits in a C `long` type. This is mostly for the\n'
2223aa99676SStefan Eßer	printf '                 embedded space since this `bc` uses `long`s internally for\n'
2233aa99676SStefan Eßer	printf '                 overflow checking. In C99, a `long` is required to be 32 bits.\n'
2243aa99676SStefan Eßer	printf '                 For most normal desktop systems, setting this is unnecessary,\n'
2253aa99676SStefan Eßer	printf '                 except that 32-bit platforms with 64-bit longs may want to set\n'
2263aa99676SStefan Eßer	printf '                 it to `32`. Default is the default of `LONG_BIT` for the target\n'
2273aa99676SStefan Eßer	printf '                 platform. Minimum allowed is `32`. It is a build time error if\n'
2283aa99676SStefan Eßer	printf '                 the specified value of `LONG_BIT` is greater than the default\n'
2293aa99676SStefan Eßer	printf '                 value of `LONG_BIT` for the target platform.\n'
2303aa99676SStefan Eßer	printf '    GEN_HOST     Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to\n'
2313aa99676SStefan Eßer	printf '                 produce the C files that contain the help texts as well as the\n'
2323aa99676SStefan Eßer	printf '                 math libraries. By default, `gen/strgen.c` is used, compiled by\n'
2333aa99676SStefan Eßer	printf '                 "$HOSTCC" and run on the host machine. Using `gen/strgen.sh`\n'
2343aa99676SStefan Eßer	printf '                 removes the need to compile and run an executable on the host\n'
2353aa99676SStefan Eßer	printf '                 machine since `gen/strgen.sh` is a POSIX shell script. However,\n'
2363aa99676SStefan Eßer	printf '                 `gen/lib2.bc` is perilously close to 4095 characters, the max\n'
2373aa99676SStefan Eßer	printf '                 supported length of a string literal in C99 (and it could be\n'
2383aa99676SStefan Eßer	printf '                 added to in the future), and `gen/strgen.sh` generates a string\n'
2393aa99676SStefan Eßer	printf '                 literal instead of an array, as `gen/strgen.c` does. For most\n'
2403aa99676SStefan Eßer	printf '                 production-ready compilers, this limit probably is not\n'
2413aa99676SStefan Eßer	printf '                 enforced, but it could be. Both options are still available for\n'
2423aa99676SStefan Eßer	printf '                 this reason. If you are sure your compiler does not have the\n'
2433aa99676SStefan Eßer	printf '                 limit and do not want to compile and run a binary on the host\n'
2443aa99676SStefan Eßer	printf '                 machine, set this variable to "0". Any other value, or a\n'
2453aa99676SStefan Eßer	printf '                 non-existent value, will cause the build system to compile and\n'
2463aa99676SStefan Eßer	printf '                 run `gen/strgen.c`. Default is "".\n'
2473aa99676SStefan Eßer	printf '    GEN_EMU      Emulator to run string generator code under (leave empty if not\n'
2483aa99676SStefan Eßer	printf '                 necessary). This is not necessary when using `gen/strgen.sh`.\n'
2493aa99676SStefan Eßer	printf '                 Default is "".\n'
2503aa99676SStefan Eßer	printf '\n'
2513aa99676SStefan Eßer	printf 'WARNING: even though `configure.sh` supports both option types, short and\n'
2523aa99676SStefan Eßer	printf 'long, it does not support handling both at the same time. Use only one type.\n'
25344d4804dSStefan Eßer	printf '\n'
25444d4804dSStefan Eßer	printf 'Settings\n'
25544d4804dSStefan Eßer	printf '========\n'
25644d4804dSStefan Eßer	printf '\n'
25744d4804dSStefan Eßer	printf 'bc and dc have some settings that, while they cannot be removed by build time\n'
25844d4804dSStefan Eßer	printf 'options, can have their defaults changed at build time by packagers. Users are\n'
25944d4804dSStefan Eßer	printf 'also able to change each setting with environment variables.\n'
26044d4804dSStefan Eßer	printf '\n'
26144d4804dSStefan Eßer	printf 'The following is a table of settings, along with their default values and the\n'
26244d4804dSStefan Eßer	printf 'environment variables users can use to change them. (For the defaults, non-zero\n'
26344d4804dSStefan Eßer	printf 'means on, and zero means off.)\n'
26444d4804dSStefan Eßer	printf '\n'
26544d4804dSStefan Eßer	printf '| Setting         | Description          | Default      | Env Variable         |\n'
26644d4804dSStefan Eßer	printf '| =============== | ==================== | ============ | ==================== |\n'
26744d4804dSStefan Eßer	printf '| bc.banner       | Whether to display   |            0 | BC_BANNER            |\n'
26844d4804dSStefan Eßer	printf '|                 | the bc version       |              |                      |\n'
26944d4804dSStefan Eßer	printf '|                 | banner when in       |              |                      |\n'
27044d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
27144d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
27244d4804dSStefan Eßer	printf '| bc.sigint_reset | Whether SIGINT will  |            1 | BC_SIGINT_RESET      |\n'
27344d4804dSStefan Eßer	printf '|                 | reset bc, instead of |              |                      |\n'
27444d4804dSStefan Eßer	printf '|                 | exiting, when in     |              |                      |\n'
27544d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
27644d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
27744d4804dSStefan Eßer	printf '| dc.sigint_reset | Whether SIGINT will  |            1 | DC_SIGINT_RESET      |\n'
27844d4804dSStefan Eßer	printf '|                 | reset dc, instead of |              |                      |\n'
27944d4804dSStefan Eßer	printf '|                 | exiting, when in     |              |                      |\n'
28044d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
28144d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
28244d4804dSStefan Eßer	printf '| bc.tty_mode     | Whether TTY mode for |            1 | BC_TTY_MODE          |\n'
28344d4804dSStefan Eßer	printf '|                 | bc should be on when |              |                      |\n'
28444d4804dSStefan Eßer	printf '|                 | available.           |              |                      |\n'
28544d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
28644d4804dSStefan Eßer	printf '| dc.tty_mode     | Whether TTY mode for |            0 | BC_TTY_MODE          |\n'
28744d4804dSStefan Eßer	printf '|                 | dc should be on when |              |                      |\n'
28844d4804dSStefan Eßer	printf '|                 | available.           |              |                      |\n'
28944d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
29044d4804dSStefan Eßer	printf '| bc.prompt       | Whether the prompt   | $BC_TTY_MODE | BC_PROMPT            |\n'
29144d4804dSStefan Eßer	printf '|                 | for bc should be on  |              |                      |\n'
29244d4804dSStefan Eßer	printf '|                 | in tty mode.         |              |                      |\n'
29344d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
29444d4804dSStefan Eßer	printf '| dc.prompt       | Whether the prompt   | $DC_TTY_MODE | DC_PROMPT            |\n'
29544d4804dSStefan Eßer	printf '|                 | for dc should be on  |              |                      |\n'
29644d4804dSStefan Eßer	printf '|                 | in tty mode.         |              |                      |\n'
29744d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
29810041e99SStefan Eßer	printf '| bc.expr_exit    | Whether to exit bc   |            1 | BC_EXPR_EXIT         |\n'
29910041e99SStefan Eßer	printf '|                 | if an expression or  |              |                      |\n'
30010041e99SStefan Eßer	printf '|                 | expression file is   |              |                      |\n'
30110041e99SStefan Eßer	printf '|                 | given with the -e or |              |                      |\n'
30210041e99SStefan Eßer	printf '|                 | -f options.          |              |                      |\n'
30310041e99SStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
30410041e99SStefan Eßer	printf '| dc.expr_exit    | Whether to exit dc   |            1 | DC_EXPR_EXIT         |\n'
30510041e99SStefan Eßer	printf '|                 | if an expression or  |              |                      |\n'
30610041e99SStefan Eßer	printf '|                 | expression file is   |              |                      |\n'
30710041e99SStefan Eßer	printf '|                 | given with the -e or |              |                      |\n'
30810041e99SStefan Eßer	printf '|                 | -f options.          |              |                      |\n'
30910041e99SStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
31044d4804dSStefan Eßer	printf '\n'
31144d4804dSStefan Eßer	printf 'These settings are not meant to be changed on a whim. They are meant to ensure\n'
31244d4804dSStefan Eßer	printf 'that this bc and dc will conform to the expectations of the user on each\n'
31344d4804dSStefan Eßer	printf 'platform.\n'
3143aa99676SStefan Eßer
3153aa99676SStefan Eßer	exit "$_usage_val"
3163aa99676SStefan Eßer}
3173aa99676SStefan Eßer
31844d4804dSStefan Eßer# Replaces a file extension in a filename. This is used mostly to turn filenames
31944d4804dSStefan Eßer# like `src/num.c` into `src/num.o`. In other words, it helps to link targets to
32044d4804dSStefan Eßer# the files they depend on.
32144d4804dSStefan Eßer#
32244d4804dSStefan Eßer# @param file  The filename.
32344d4804dSStefan Eßer# @param ext1  The extension to replace.
32444d4804dSStefan Eßer# @param ext2  The new extension.
3253aa99676SStefan Eßerreplace_ext() {
3263aa99676SStefan Eßer
3273aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3283aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3293aa99676SStefan Eßer	fi
3303aa99676SStefan Eßer
3313aa99676SStefan Eßer	_replace_ext_file="$1"
3323aa99676SStefan Eßer	_replace_ext_ext1="$2"
3333aa99676SStefan Eßer	_replace_ext_ext2="$3"
3343aa99676SStefan Eßer
3359a995fe1SStefan Eßer	_replace_ext_result="${_replace_ext_file%.$_replace_ext_ext1}.$_replace_ext_ext2"
3363aa99676SStefan Eßer
3373aa99676SStefan Eßer	printf '%s\n' "$_replace_ext_result"
3383aa99676SStefan Eßer}
3393aa99676SStefan Eßer
34044d4804dSStefan Eßer# Replaces a file extension in every filename given in a list. The list is just
34144d4804dSStefan Eßer# a space-separated list of words, so filenames are expected to *not* have
34244d4804dSStefan Eßer# spaces in them. See the documentation for `replace_ext()`.
34344d4804dSStefan Eßer#
34444d4804dSStefan Eßer# @param files  The list of space-separated filenames to replace extensions for.
34544d4804dSStefan Eßer# @param ext1   The extension to replace.
34644d4804dSStefan Eßer# @param ext2   The new extension.
3473aa99676SStefan Eßerreplace_exts() {
3483aa99676SStefan Eßer
3493aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3503aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3513aa99676SStefan Eßer	fi
3523aa99676SStefan Eßer
3533aa99676SStefan Eßer	_replace_exts_files="$1"
3543aa99676SStefan Eßer	_replace_exts_ext1="$2"
3553aa99676SStefan Eßer	_replace_exts_ext2="$3"
3563aa99676SStefan Eßer
3573aa99676SStefan Eßer	for _replace_exts_file in $_replace_exts_files; do
3583aa99676SStefan Eßer		_replace_exts_new_name=$(replace_ext "$_replace_exts_file" "$_replace_exts_ext1" "$_replace_exts_ext2")
3593aa99676SStefan Eßer		_replace_exts_result="$_replace_exts_result $_replace_exts_new_name"
3603aa99676SStefan Eßer	done
3613aa99676SStefan Eßer
3623aa99676SStefan Eßer	printf '%s\n' "$_replace_exts_result"
3633aa99676SStefan Eßer}
3643aa99676SStefan Eßer
36544d4804dSStefan Eßer# Finds a placeholder in @a str and replaces it. This is the workhorse of
36644d4804dSStefan Eßer# configure.sh. It's what replaces placeholders in Makefile.in with the data
36744d4804dSStefan Eßer# needed for the chosen build. Below, you will see a lot of calls to this
36844d4804dSStefan Eßer# function.
36944d4804dSStefan Eßer#
37044d4804dSStefan Eßer# Note that needle can never contain an exclamation point. For more information,
37144d4804dSStefan Eßer# see substring_replace() in scripts/functions.sh.
37244d4804dSStefan Eßer#
37344d4804dSStefan Eßer# @param str          The string to find and replace placeholders in.
37444d4804dSStefan Eßer# @param needle       The placeholder name.
37544d4804dSStefan Eßer# @param replacement  The string to use to replace the placeholder.
3763aa99676SStefan Eßerreplace() {
3773aa99676SStefan Eßer
3783aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3793aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3803aa99676SStefan Eßer	fi
3813aa99676SStefan Eßer
3823aa99676SStefan Eßer	_replace_str="$1"
3833aa99676SStefan Eßer	_replace_needle="$2"
3843aa99676SStefan Eßer	_replace_replacement="$3"
3853aa99676SStefan Eßer
3863aa99676SStefan Eßer	substring_replace "$_replace_str" "%%$_replace_needle%%" "$_replace_replacement"
3873aa99676SStefan Eßer}
3883aa99676SStefan Eßer
38944d4804dSStefan Eßer# This function finds all the source files that need to be built. If there is
39044d4804dSStefan Eßer# only one argument and it is empty, then all source files are built. Otherwise,
39144d4804dSStefan Eßer# the arguments are all assumed to be source files that should *not* be built.
39210328f8bSStefan Eßerfind_src_files() {
39310328f8bSStefan Eßer
39410041e99SStefan Eßer	_find_src_files_args=""
39510041e99SStefan Eßer
39610328f8bSStefan Eßer	if [ "$#" -ge 1 ] && [ "$1" != "" ]; then
39710328f8bSStefan Eßer
39810328f8bSStefan Eßer		while [ "$#" -ge 1 ]; do
39910328f8bSStefan Eßer			_find_src_files_a="${1## }"
40010328f8bSStefan Eßer			shift
40110041e99SStefan Eßer			_find_src_files_args=$(printf '%s\n%s/src/%s\n' "$_find_src_files_args" "$scriptdir" "${_find_src_files_a}")
40210328f8bSStefan Eßer		done
40310328f8bSStefan Eßer
40410328f8bSStefan Eßer	fi
40510328f8bSStefan Eßer
40610041e99SStefan Eßer	_find_src_files_files=$(find "$scriptdir/src/" -depth -name "*.c" -print)
40710041e99SStefan Eßer
40810041e99SStefan Eßer	_find_src_files_result=""
40910041e99SStefan Eßer
41010041e99SStefan Eßer	for _find_src_files_f in $_find_src_files_files; do
41110041e99SStefan Eßer
41210041e99SStefan Eßer		# If this is true, the file is part of args, and therefore, unneeded.
41310041e99SStefan Eßer		if [ "${_find_src_files_args##*$_find_src_files_f}" != "${_find_src_files_args}" ]; then
41410041e99SStefan Eßer			continue
41510041e99SStefan Eßer		fi
41610041e99SStefan Eßer
41710041e99SStefan Eßer		_find_src_files_result=$(printf '%s\n%s\n' "$_find_src_files_result" "$_find_src_files_f")
41810041e99SStefan Eßer
41910041e99SStefan Eßer	done
42010041e99SStefan Eßer
42110041e99SStefan Eßer	printf '%s\n' "$_find_src_files_result"
42210328f8bSStefan Eßer}
42310328f8bSStefan Eßer
42444d4804dSStefan Eßer# This function generates a list of files to go into the Makefile. It generates
42544d4804dSStefan Eßer# the list of object files, as well as the list of test coverage files.
42644d4804dSStefan Eßer#
42744d4804dSStefan Eßer# @param contents  The contents of the Makefile template to put the list of
42844d4804dSStefan Eßer#                  files into.
42950696a6eSStefan Eßergen_file_list() {
4303aa99676SStefan Eßer
43150696a6eSStefan Eßer	if [ "$#" -lt 1 ]; then
4323aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
4333aa99676SStefan Eßer	fi
4343aa99676SStefan Eßer
43550696a6eSStefan Eßer	_gen_file_list_contents="$1"
4363aa99676SStefan Eßer	shift
4373aa99676SStefan Eßer
43850696a6eSStefan Eßer	if [ "$#" -ge 1 ]; then
43910328f8bSStefan Eßer		_gen_file_list_unneeded="$@"
4403aa99676SStefan Eßer	else
44110328f8bSStefan Eßer		_gen_file_list_unneeded=""
4423aa99676SStefan Eßer	fi
4433aa99676SStefan Eßer
44450696a6eSStefan Eßer	_gen_file_list_needle_src="SRC"
44550696a6eSStefan Eßer	_gen_file_list_needle_obj="OBJ"
44650696a6eSStefan Eßer	_gen_file_list_needle_gcda="GCDA"
44750696a6eSStefan Eßer	_gen_file_list_needle_gcno="GCNO"
44850696a6eSStefan Eßer
44910328f8bSStefan Eßer	_gen_file_list_replacement=$(find_src_files $_gen_file_list_unneeded | tr '\n' ' ')
45050696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
45150696a6eSStefan Eßer		"$_gen_file_list_needle_src" "$_gen_file_list_replacement")
45250696a6eSStefan Eßer
45310041e99SStefan Eßer	_gen_file_list_cbases=""
45410041e99SStefan Eßer
45510041e99SStefan Eßer	for _gen_file_list_f in $_gen_file_list_replacement; do
45610041e99SStefan Eßer		_gen_file_list_b=$(basename "$_gen_file_list_f")
45710041e99SStefan Eßer		_gen_file_list_cbases="$_gen_file_list_cbases src/$_gen_file_list_b"
45810041e99SStefan Eßer	done
45910041e99SStefan Eßer
46010041e99SStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_cbases" "c" "o")
46150696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
46250696a6eSStefan Eßer		"$_gen_file_list_needle_obj" "$_gen_file_list_replacement")
46350696a6eSStefan Eßer
46450696a6eSStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "o" "gcda")
46550696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
46650696a6eSStefan Eßer		"$_gen_file_list_needle_gcda" "$_gen_file_list_replacement")
46750696a6eSStefan Eßer
46850696a6eSStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "gcda" "gcno")
46950696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
47050696a6eSStefan Eßer		"$_gen_file_list_needle_gcno" "$_gen_file_list_replacement")
47150696a6eSStefan Eßer
47250696a6eSStefan Eßer	printf '%s\n' "$_gen_file_list_contents"
4733aa99676SStefan Eßer}
4743aa99676SStefan Eßer
47544d4804dSStefan Eßer# Generates the proper test targets for each test to have its own target. This
47644d4804dSStefan Eßer# allows `make test` to run in parallel.
47744d4804dSStefan Eßer#
47844d4804dSStefan Eßer# @param name        Which calculator to generate tests for.
47944d4804dSStefan Eßer# @param extra_math  An integer that, if non-zero, activates extra math tests.
48044d4804dSStefan Eßer# @param time_tests  An integer that, if non-zero, tells the test suite to time
48144d4804dSStefan Eßer#                    the execution of each test.
482d43fa8efSStefan Eßergen_std_tests() {
48310328f8bSStefan Eßer
484d43fa8efSStefan Eßer	_gen_std_tests_name="$1"
48510328f8bSStefan Eßer	shift
48610328f8bSStefan Eßer
487d43fa8efSStefan Eßer	_gen_std_tests_extra_math="$1"
48810328f8bSStefan Eßer	shift
48910328f8bSStefan Eßer
490d43fa8efSStefan Eßer	_gen_std_tests_time_tests="$1"
49110328f8bSStefan Eßer	shift
49210328f8bSStefan Eßer
493d43fa8efSStefan Eßer	_gen_std_tests_extra_required=$(cat "$scriptdir/tests/extra_required.txt")
49410328f8bSStefan Eßer
495d43fa8efSStefan Eßer	for _gen_std_tests_t in $(cat "$scriptdir/tests/$_gen_std_tests_name/all.txt"); do
49610328f8bSStefan Eßer
497d43fa8efSStefan Eßer		if [ "$_gen_std_tests_extra_math" -eq 0 ]; then
49810328f8bSStefan Eßer
499d43fa8efSStefan Eßer			if [ -z "${_gen_std_tests_extra_required##*$_gen_std_tests_t*}" ]; then
50010328f8bSStefan Eßer				printf 'test_%s_%s:\n\t@printf "Skipping %s %s\\n"\n\n' \
501d43fa8efSStefan Eßer					"$_gen_std_tests_name" "$_gen_std_tests_t" "$_gen_std_tests_name" \
50210041e99SStefan Eßer					"$_gen_std_tests_t" >> "Makefile"
50310328f8bSStefan Eßer				continue
50410328f8bSStefan Eßer			fi
50510328f8bSStefan Eßer
50610328f8bSStefan Eßer		fi
50710328f8bSStefan Eßer
50810041e99SStefan Eßer		printf 'test_%s_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/test.sh %s %s %s %s %s\n\n' \
50910041e99SStefan Eßer			"$_gen_std_tests_name" "$_gen_std_tests_t" "$builddir" "$_gen_std_tests_name" \
510d43fa8efSStefan Eßer			"$_gen_std_tests_t" "$generate_tests" "$time_tests" \
51110041e99SStefan Eßer			"$*" >> "Makefile"
51210328f8bSStefan Eßer
51310328f8bSStefan Eßer	done
51410328f8bSStefan Eßer}
51510328f8bSStefan Eßer
51644d4804dSStefan Eßer# Generates a list of test targets that will be used as prerequisites for other
51744d4804dSStefan Eßer# targets.
51844d4804dSStefan Eßer#
51944d4804dSStefan Eßer# @param name  The name of the calculator to generate test targets for.
520d43fa8efSStefan Eßergen_std_test_targets() {
52110328f8bSStefan Eßer
522d43fa8efSStefan Eßer	_gen_std_test_targets_name="$1"
52310328f8bSStefan Eßer	shift
52410328f8bSStefan Eßer
525d43fa8efSStefan Eßer	_gen_std_test_targets_tests=$(cat "$scriptdir/tests/${_gen_std_test_targets_name}/all.txt")
52610328f8bSStefan Eßer
527d43fa8efSStefan Eßer	for _gen_std_test_targets_t in $_gen_std_test_targets_tests; do
528d43fa8efSStefan Eßer		printf ' test_%s_%s' "$_gen_std_test_targets_name" "$_gen_std_test_targets_t"
529d43fa8efSStefan Eßer	done
530d43fa8efSStefan Eßer
531d43fa8efSStefan Eßer	printf '\n'
532d43fa8efSStefan Eßer}
533d43fa8efSStefan Eßer
534d43fa8efSStefan Eßer# Generates the proper test targets for each error test to have its own target.
535d43fa8efSStefan Eßer# This allows `make test_bc_errors` and `make test_dc_errors` to run in
536d43fa8efSStefan Eßer# parallel.
537d43fa8efSStefan Eßer#
538d43fa8efSStefan Eßer# @param name  Which calculator to generate tests for.
539d43fa8efSStefan Eßergen_err_tests() {
540d43fa8efSStefan Eßer
541d43fa8efSStefan Eßer	_gen_err_tests_name="$1"
542d43fa8efSStefan Eßer	shift
543d43fa8efSStefan Eßer
544d43fa8efSStefan Eßer	_gen_err_tests_fs=$(ls "$scriptdir/tests/$_gen_err_tests_name/errors/")
545d43fa8efSStefan Eßer
546d43fa8efSStefan Eßer	for _gen_err_tests_t in $_gen_err_tests_fs; do
547d43fa8efSStefan Eßer
54810041e99SStefan Eßer		printf 'test_%s_error_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/error.sh %s %s %s\n\n' \
54910041e99SStefan Eßer			"$_gen_err_tests_name" "$_gen_err_tests_t" "$builddir" "$_gen_err_tests_name" \
55010041e99SStefan Eßer			"$_gen_err_tests_t" "$*" >> "Makefile"
551d43fa8efSStefan Eßer
552d43fa8efSStefan Eßer	done
553d43fa8efSStefan Eßer
554d43fa8efSStefan Eßer}
555d43fa8efSStefan Eßer
556d43fa8efSStefan Eßer# Generates a list of error test targets that will be used as prerequisites for
557d43fa8efSStefan Eßer# other targets.
558d43fa8efSStefan Eßer#
559d43fa8efSStefan Eßer# @param name  The name of the calculator to generate test targets for.
560d43fa8efSStefan Eßergen_err_test_targets() {
561d43fa8efSStefan Eßer
562d43fa8efSStefan Eßer	_gen_err_test_targets_name="$1"
563d43fa8efSStefan Eßer	shift
564d43fa8efSStefan Eßer
565d43fa8efSStefan Eßer	_gen_err_test_targets_tests=$(ls "$scriptdir/tests/$_gen_err_test_targets_name/errors/")
566d43fa8efSStefan Eßer
567d43fa8efSStefan Eßer	for _gen_err_test_targets_t in $_gen_err_test_targets_tests; do
568d43fa8efSStefan Eßer		printf ' test_%s_error_%s' "$_gen_err_test_targets_name" "$_gen_err_test_targets_t"
56910328f8bSStefan Eßer	done
57010328f8bSStefan Eßer
57110328f8bSStefan Eßer	printf '\n'
57210328f8bSStefan Eßer}
57310328f8bSStefan Eßer
57444d4804dSStefan Eßer# Generates the proper script test targets for each script test to have its own
57544d4804dSStefan Eßer# target. This allows `make test` to run in parallel.
57644d4804dSStefan Eßer#
57744d4804dSStefan Eßer# @param name        Which calculator to generate tests for.
57844d4804dSStefan Eßer# @param extra_math  An integer that, if non-zero, activates extra math tests.
57944d4804dSStefan Eßer# @param generate    An integer that, if non-zero, activates generated tests.
58044d4804dSStefan Eßer# @param time_tests  An integer that, if non-zero, tells the test suite to time
58144d4804dSStefan Eßer#                    the execution of each test.
58210328f8bSStefan Eßergen_script_tests() {
58310328f8bSStefan Eßer
58410328f8bSStefan Eßer	_gen_script_tests_name="$1"
58510328f8bSStefan Eßer	shift
58610328f8bSStefan Eßer
58710328f8bSStefan Eßer	_gen_script_tests_extra_math="$1"
58810328f8bSStefan Eßer	shift
58910328f8bSStefan Eßer
59010328f8bSStefan Eßer	_gen_script_tests_generate="$1"
59110328f8bSStefan Eßer	shift
59210328f8bSStefan Eßer
59310328f8bSStefan Eßer	_gen_script_tests_time="$1"
59410328f8bSStefan Eßer	shift
59510328f8bSStefan Eßer
59610328f8bSStefan Eßer	_gen_script_tests_tests=$(cat "$scriptdir/tests/$_gen_script_tests_name/scripts/all.txt")
59710328f8bSStefan Eßer
59810328f8bSStefan Eßer	for _gen_script_tests_f in $_gen_script_tests_tests; do
59910328f8bSStefan Eßer
60010328f8bSStefan Eßer		_gen_script_tests_b=$(basename "$_gen_script_tests_f" ".${_gen_script_tests_name}")
60110328f8bSStefan Eßer
60210041e99SStefan Eßer		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' \
60310041e99SStefan Eßer			"$_gen_script_tests_name" "$_gen_script_tests_b" "$builddir" "$_gen_script_tests_name" \
60410328f8bSStefan Eßer			"$_gen_script_tests_f" "$_gen_script_tests_extra_math" "$_gen_script_tests_generate" \
60510041e99SStefan Eßer			"$_gen_script_tests_time" "$*" >> "Makefile"
60610328f8bSStefan Eßer	done
60710328f8bSStefan Eßer}
60810328f8bSStefan Eßer
60944d4804dSStefan Eßerset_default() {
61044d4804dSStefan Eßer
61144d4804dSStefan Eßer	_set_default_on="$1"
61244d4804dSStefan Eßer	shift
61344d4804dSStefan Eßer
61444d4804dSStefan Eßer	_set_default_name="$1"
61544d4804dSStefan Eßer	shift
61644d4804dSStefan Eßer
61744d4804dSStefan Eßer	# The reason that the variables that are being set do not have the same
61844d4804dSStefan Eßer	# non-collision avoidance that the other variables do is that we *do* want
61944d4804dSStefan Eßer	# the settings of these variables to leak out of the function. They adjust
62044d4804dSStefan Eßer	# the settings outside of the function.
62144d4804dSStefan Eßer	case "$_set_default_name" in
62244d4804dSStefan Eßer
62344d4804dSStefan Eßer		bc.banner) bc_default_banner="$_set_default_on" ;;
62444d4804dSStefan Eßer		bc.sigint_reset) bc_default_sigint_reset="$_set_default_on" ;;
62544d4804dSStefan Eßer		dc.sigint_reset) dc_default_sigint_reset="$_set_default_on" ;;
62644d4804dSStefan Eßer		bc.tty_mode) bc_default_tty_mode="$_set_default_on" ;;
62744d4804dSStefan Eßer		dc.tty_mode) dc_default_tty_mode="$_set_default_on" ;;
62844d4804dSStefan Eßer		bc.prompt) bc_default_prompt="$_set_default_on" ;;
62944d4804dSStefan Eßer		dc.prompt) dc_default_prompt="$_set_default_on" ;;
63010041e99SStefan Eßer		bc.expr_exit) bc_default_expr_exit="$_set_default_on";;
63110041e99SStefan Eßer		dc.expr_exit) dc_default_expr_exit="$_set_default_on";;
63244d4804dSStefan Eßer		?) usage "Invalid setting: $_set_default_name" ;;
63344d4804dSStefan Eßer
63444d4804dSStefan Eßer	esac
63544d4804dSStefan Eßer}
63644d4804dSStefan Eßer
63744d4804dSStefan Eßer# Generates a list of script test targets that will be used as prerequisites for
63844d4804dSStefan Eßer# other targets.
63944d4804dSStefan Eßer#
64044d4804dSStefan Eßer# @param name  The name of the calculator to generate script test targets for.
64110328f8bSStefan Eßergen_script_test_targets() {
64210328f8bSStefan Eßer
64310328f8bSStefan Eßer	_gen_script_test_targets_name="$1"
64410328f8bSStefan Eßer	shift
64510328f8bSStefan Eßer
64610328f8bSStefan Eßer	_gen_script_test_targets_tests=$(cat "$scriptdir/tests/$_gen_script_test_targets_name/scripts/all.txt")
64710328f8bSStefan Eßer
64810328f8bSStefan Eßer	for _gen_script_test_targets_f in $_gen_script_test_targets_tests; do
64910328f8bSStefan Eßer		_gen_script_test_targets_b=$(basename "$_gen_script_test_targets_f" \
65010328f8bSStefan Eßer			".$_gen_script_test_targets_name")
65110328f8bSStefan Eßer		printf ' test_%s_script_%s' "$_gen_script_test_targets_name" \
65210328f8bSStefan Eßer			"$_gen_script_test_targets_b"
65310328f8bSStefan Eßer	done
65410328f8bSStefan Eßer
65510328f8bSStefan Eßer	printf '\n'
65610328f8bSStefan Eßer}
65710328f8bSStefan Eßer
65844d4804dSStefan Eßer# This is a list of defaults, but it is also the list of possible options for
65944d4804dSStefan Eßer# users to change.
66044d4804dSStefan Eßer#
66144d4804dSStefan Eßer# The development options are: force (force options even if they fail), valgrind
66244d4804dSStefan Eßer# (build in a way suitable for valgrind testing), memcheck (same as valgrind),
66344d4804dSStefan Eßer# and fuzzing (build in a way suitable for fuzzing).
6643aa99676SStefan Eßerbc_only=0
6653aa99676SStefan Eßerdc_only=0
6663aa99676SStefan Eßercoverage=0
6673aa99676SStefan Eßerkaratsuba_len=32
6683aa99676SStefan Eßerdebug=0
6693aa99676SStefan Eßerhist=1
6703aa99676SStefan Eßerextra_math=1
6713aa99676SStefan Eßeroptimization=""
6723aa99676SStefan Eßergenerate_tests=1
6733aa99676SStefan Eßerinstall_manpages=1
6743aa99676SStefan Eßernls=1
6753aa99676SStefan Eßerforce=0
6763aa99676SStefan Eßerstrip_bin=1
677cf7becd2SStefan Eßerall_locales=0
67850696a6eSStefan Eßerlibrary=0
67910328f8bSStefan Eßerfuzz=0
68010328f8bSStefan Eßertime_tests=0
68110328f8bSStefan Eßervg=0
68210328f8bSStefan Eßermemcheck=0
68310328f8bSStefan Eßerclean=1
6843aa99676SStefan Eßer
68544d4804dSStefan Eßer# The empty strings are because they depend on TTY mode. If they are directly
68644d4804dSStefan Eßer# set, though, they will be integers. We test for empty strings later.
68744d4804dSStefan Eßerbc_default_banner=0
68844d4804dSStefan Eßerbc_default_sigint_reset=1
68944d4804dSStefan Eßerdc_default_sigint_reset=1
69044d4804dSStefan Eßerbc_default_tty_mode=1
69144d4804dSStefan Eßerdc_default_tty_mode=0
69244d4804dSStefan Eßerbc_default_prompt=""
69344d4804dSStefan Eßerdc_default_prompt=""
69410041e99SStefan Eßerbc_default_expr_exit=1
69510041e99SStefan Eßerdc_default_expr_exit=1
69644d4804dSStefan Eßer
69744d4804dSStefan Eßer# getopts is a POSIX utility, but it cannot handle long options. Thus, the
69844d4804dSStefan Eßer# handling of long options is done by hand, and that's the reason that short and
69944d4804dSStefan Eßer# long options cannot be mixed.
70044d4804dSStefan Eßerwhile getopts "abBcdDEfgGhHk:lMmNO:S:s:tTvz-" opt; do
7013aa99676SStefan Eßer
7023aa99676SStefan Eßer	case "$opt" in
70350696a6eSStefan Eßer		a) library=1 ;;
7043aa99676SStefan Eßer		b) bc_only=1 ;;
7053aa99676SStefan Eßer		B) dc_only=1 ;;
7063aa99676SStefan Eßer		c) coverage=1 ;;
70710328f8bSStefan Eßer		C) clean=0 ;;
7083aa99676SStefan Eßer		d) dc_only=1 ;;
7093aa99676SStefan Eßer		D) bc_only=1 ;;
7103aa99676SStefan Eßer		E) extra_math=0 ;;
7113aa99676SStefan Eßer		f) force=1 ;;
7123aa99676SStefan Eßer		g) debug=1 ;;
7133aa99676SStefan Eßer		G) generate_tests=0 ;;
7143aa99676SStefan Eßer		h) usage ;;
7153aa99676SStefan Eßer		H) hist=0 ;;
7163aa99676SStefan Eßer		k) karatsuba_len="$OPTARG" ;;
717cf7becd2SStefan Eßer		l) all_locales=1 ;;
71810328f8bSStefan Eßer		m) memcheck=1 ;;
7193aa99676SStefan Eßer		M) install_manpages=0 ;;
7203aa99676SStefan Eßer		N) nls=0 ;;
7213aa99676SStefan Eßer		O) optimization="$OPTARG" ;;
72244d4804dSStefan Eßer		S) set_default 0 "$OPTARG" ;;
72344d4804dSStefan Eßer		s) set_default 1 "$OPTARG" ;;
72410328f8bSStefan Eßer		t) time_tests=1 ;;
7253aa99676SStefan Eßer		T) strip_bin=0 ;;
72610328f8bSStefan Eßer		v) vg=1 ;;
72710328f8bSStefan Eßer		z) fuzz=1 ;;
7283aa99676SStefan Eßer		-)
7293aa99676SStefan Eßer			arg="$1"
7303aa99676SStefan Eßer			arg="${arg#--}"
7313aa99676SStefan Eßer			LONG_OPTARG="${arg#*=}"
7323aa99676SStefan Eßer			case $arg in
7333aa99676SStefan Eßer				help) usage ;;
73450696a6eSStefan Eßer				library) library=1 ;;
7353aa99676SStefan Eßer				bc-only) bc_only=1 ;;
7363aa99676SStefan Eßer				dc-only) dc_only=1 ;;
7373aa99676SStefan Eßer				coverage) coverage=1 ;;
7383aa99676SStefan Eßer				debug) debug=1 ;;
7393aa99676SStefan Eßer				force) force=1 ;;
7403aa99676SStefan Eßer				prefix=?*) PREFIX="$LONG_OPTARG" ;;
7413aa99676SStefan Eßer				prefix)
7423aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7433aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7443aa99676SStefan Eßer					fi
7453aa99676SStefan Eßer					PREFIX="$2"
7463aa99676SStefan Eßer					shift ;;
7473aa99676SStefan Eßer				bindir=?*) BINDIR="$LONG_OPTARG" ;;
7483aa99676SStefan Eßer				bindir)
7493aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7503aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7513aa99676SStefan Eßer					fi
7523aa99676SStefan Eßer					BINDIR="$2"
7533aa99676SStefan Eßer					shift ;;
75450696a6eSStefan Eßer				includedir=?*) INCLUDEDIR="$LONG_OPTARG" ;;
75550696a6eSStefan Eßer				includedir)
75650696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
75750696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
75850696a6eSStefan Eßer					fi
75950696a6eSStefan Eßer					INCLUDEDIR="$2"
76050696a6eSStefan Eßer					shift ;;
76150696a6eSStefan Eßer				libdir=?*) LIBDIR="$LONG_OPTARG" ;;
76250696a6eSStefan Eßer				libdir)
76350696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
76450696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
76550696a6eSStefan Eßer					fi
76650696a6eSStefan Eßer					LIBDIR="$2"
76750696a6eSStefan Eßer					shift ;;
7683aa99676SStefan Eßer				datarootdir=?*) DATAROOTDIR="$LONG_OPTARG" ;;
7693aa99676SStefan Eßer				datarootdir)
7703aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7713aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7723aa99676SStefan Eßer					fi
7733aa99676SStefan Eßer					DATAROOTDIR="$2"
7743aa99676SStefan Eßer					shift ;;
7753aa99676SStefan Eßer				datadir=?*) DATADIR="$LONG_OPTARG" ;;
7763aa99676SStefan Eßer				datadir)
7773aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7783aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7793aa99676SStefan Eßer					fi
7803aa99676SStefan Eßer					DATADIR="$2"
7813aa99676SStefan Eßer					shift ;;
7823aa99676SStefan Eßer				mandir=?*) MANDIR="$LONG_OPTARG" ;;
7833aa99676SStefan Eßer				mandir)
7843aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7853aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7863aa99676SStefan Eßer					fi
7873aa99676SStefan Eßer					MANDIR="$2"
7883aa99676SStefan Eßer					shift ;;
7893aa99676SStefan Eßer				man1dir=?*) MAN1DIR="$LONG_OPTARG" ;;
7903aa99676SStefan Eßer				man1dir)
7913aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7923aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7933aa99676SStefan Eßer					fi
7943aa99676SStefan Eßer					MAN1DIR="$2"
7953aa99676SStefan Eßer					shift ;;
79650696a6eSStefan Eßer				man3dir=?*) MAN3DIR="$LONG_OPTARG" ;;
79750696a6eSStefan Eßer				man3dir)
79850696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
79950696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
80050696a6eSStefan Eßer					fi
80150696a6eSStefan Eßer					MAN3DIR="$2"
80250696a6eSStefan Eßer					shift ;;
8033aa99676SStefan Eßer				localedir=?*) LOCALEDIR="$LONG_OPTARG" ;;
8043aa99676SStefan Eßer				localedir)
8053aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8063aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8073aa99676SStefan Eßer					fi
8083aa99676SStefan Eßer					LOCALEDIR="$2"
8093aa99676SStefan Eßer					shift ;;
8103aa99676SStefan Eßer				karatsuba-len=?*) karatsuba_len="$LONG_OPTARG" ;;
8113aa99676SStefan Eßer				karatsuba-len)
8123aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8133aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8143aa99676SStefan Eßer					fi
8153aa99676SStefan Eßer					karatsuba_len="$1"
8163aa99676SStefan Eßer					shift ;;
8173aa99676SStefan Eßer				opt=?*) optimization="$LONG_OPTARG" ;;
8183aa99676SStefan Eßer				opt)
8193aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8203aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8213aa99676SStefan Eßer					fi
8223aa99676SStefan Eßer					optimization="$1"
8233aa99676SStefan Eßer					shift ;;
82444d4804dSStefan Eßer				set-default-on=?*) set_default 1 "$LONG_OPTARG" ;;
82544d4804dSStefan Eßer				set-default-on)
82644d4804dSStefan Eßer					if [ "$#" -lt 2 ]; then
82744d4804dSStefan Eßer						usage "No argument given for '--$arg' option"
82844d4804dSStefan Eßer					fi
82944d4804dSStefan Eßer					set_default 1 "$1"
83044d4804dSStefan Eßer					shift ;;
83144d4804dSStefan Eßer				set-default-off=?*) set_default 0 "$LONG_OPTARG" ;;
83244d4804dSStefan Eßer				set-default-off)
83344d4804dSStefan Eßer					if [ "$#" -lt 2 ]; then
83444d4804dSStefan Eßer						usage "No argument given for '--$arg' option"
83544d4804dSStefan Eßer					fi
83644d4804dSStefan Eßer					set_default 0 "$1"
83744d4804dSStefan Eßer					shift ;;
8383aa99676SStefan Eßer				disable-bc) dc_only=1 ;;
8393aa99676SStefan Eßer				disable-dc) bc_only=1 ;;
84010328f8bSStefan Eßer				disable-clean) clean=0 ;;
8413aa99676SStefan Eßer				disable-extra-math) extra_math=0 ;;
8423aa99676SStefan Eßer				disable-generated-tests) generate_tests=0 ;;
8433aa99676SStefan Eßer				disable-history) hist=0 ;;
8443aa99676SStefan Eßer				disable-man-pages) install_manpages=0 ;;
8453aa99676SStefan Eßer				disable-nls) nls=0 ;;
8463aa99676SStefan Eßer				disable-strip) strip_bin=0 ;;
84710328f8bSStefan Eßer				enable-test-timing) time_tests=1 ;;
84810328f8bSStefan Eßer				enable-valgrind) vg=1 ;;
84910328f8bSStefan Eßer				enable-fuzz-mode) fuzz=1 ;;
85010328f8bSStefan Eßer				enable-memcheck) memcheck=1 ;;
851cf7becd2SStefan Eßer				install-all-locales) all_locales=1 ;;
8523aa99676SStefan Eßer				help* | bc-only* | dc-only* | coverage* | debug*)
8533aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
85410328f8bSStefan Eßer				disable-bc* | disable-dc* | disable-clean*)
85510328f8bSStefan Eßer					usage "No arg allowed for --$arg option" ;;
85610328f8bSStefan Eßer				disable-extra-math*)
8573aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
8583aa99676SStefan Eßer				disable-generated-tests* | disable-history*)
8593aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
8603aa99676SStefan Eßer				disable-man-pages* | disable-nls* | disable-strip*)
8613aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
86210328f8bSStefan Eßer				enable-fuzz-mode* | enable-test-timing* | enable-valgrind*)
86310328f8bSStefan Eßer					usage "No arg allowed for --$arg option" ;;
86410328f8bSStefan Eßer				enable-memcheck* | install-all-locales*)
865cf7becd2SStefan Eßer					usage "No arg allowed for --$arg option" ;;
8663aa99676SStefan Eßer				'') break ;; # "--" terminates argument processing
8673aa99676SStefan Eßer				* ) usage "Invalid option $LONG_OPTARG" ;;
8683aa99676SStefan Eßer			esac
8693aa99676SStefan Eßer			shift
8703aa99676SStefan Eßer			OPTIND=1 ;;
87144d4804dSStefan Eßer		?) usage "Invalid option: $opt" ;;
8723aa99676SStefan Eßer	esac
8733aa99676SStefan Eßer
8743aa99676SStefan Eßerdone
8753aa99676SStefan Eßer
87644d4804dSStefan Eßer# Sometimes, developers don't want configure.sh to do a config clean. But
87744d4804dSStefan Eßer# sometimes they do.
87810328f8bSStefan Eßerif [ "$clean" -ne 0 ]; then
87910328f8bSStefan Eßer	if [ -f ./Makefile ]; then
88010328f8bSStefan Eßer		make clean_config > /dev/null
88110328f8bSStefan Eßer	fi
88210328f8bSStefan Eßerfi
88310328f8bSStefan Eßer
88444d4804dSStefan Eßer# It is an error to say that bc only should be built and likewise for dc.
8853aa99676SStefan Eßerif [ "$bc_only" -eq 1 ] && [ "$dc_only" -eq 1 ]; then
8863aa99676SStefan Eßer	usage "Can only specify one of -b(-D) or -d(-B)"
8873aa99676SStefan Eßerfi
8883aa99676SStefan Eßer
88944d4804dSStefan Eßer# The library is mutually exclusive to the calculators, so it's an error to
89044d4804dSStefan Eßer# give an option for either of them.
89150696a6eSStefan Eßerif [ "$library" -ne 0 ]; then
89250696a6eSStefan Eßer	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
89350696a6eSStefan Eßer		usage "Must not specify -b(-D) or -d(-B) when building the library"
89450696a6eSStefan Eßer	fi
89550696a6eSStefan Eßerfi
89650696a6eSStefan Eßer
89744d4804dSStefan Eßer# KARATSUBA_LEN must be an integer and must be 16 or greater.
8983aa99676SStefan Eßercase $karatsuba_len in
8993aa99676SStefan Eßer	(*[!0-9]*|'') usage "KARATSUBA_LEN is not a number" ;;
9003aa99676SStefan Eßer	(*) ;;
9013aa99676SStefan Eßeresac
9023aa99676SStefan Eßer
9033aa99676SStefan Eßerif [ "$karatsuba_len" -lt 16 ]; then
9043aa99676SStefan Eßer	usage "KARATSUBA_LEN is less than 16"
9053aa99676SStefan Eßerfi
9063aa99676SStefan Eßer
9073aa99676SStefan Eßerset -e
9083aa99676SStefan Eßer
9093aa99676SStefan Eßerif [ -z "${LONG_BIT+set}" ]; then
9103aa99676SStefan Eßer	LONG_BIT_DEFINE=""
9113aa99676SStefan Eßerelif [ "$LONG_BIT" -lt 32 ]; then
9123aa99676SStefan Eßer	usage "LONG_BIT is less than 32"
9133aa99676SStefan Eßerelse
9143aa99676SStefan Eßer	LONG_BIT_DEFINE="-DBC_LONG_BIT=\$(BC_LONG_BIT)"
9153aa99676SStefan Eßerfi
9163aa99676SStefan Eßer
9173aa99676SStefan Eßerif [ -z "$CC" ]; then
9183aa99676SStefan Eßer	CC="c99"
9193aa99676SStefan Eßerelse
92044d4804dSStefan Eßer
92144d4804dSStefan Eßer	# I had users complain that, if they gave CFLAGS as part of CC, which
92244d4804dSStefan Eßer	# autotools allows in its braindead way, the build would fail with an error.
92344d4804dSStefan Eßer	# I don't like adjusting for autotools, but oh well. These lines puts the
92444d4804dSStefan Eßer	# stuff after the first space into CFLAGS.
9253aa99676SStefan Eßer	ccbase=$(basename "$CC")
9263aa99676SStefan Eßer	suffix=" *"
9273aa99676SStefan Eßer	prefix="* "
9283aa99676SStefan Eßer
9293aa99676SStefan Eßer	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
9303aa99676SStefan Eßer		ccflags="${ccbase#$prefix}"
9313aa99676SStefan Eßer		cc="${ccbase%%$suffix}"
9323aa99676SStefan Eßer		ccdir=$(dirname "$CC")
9333aa99676SStefan Eßer		if [ "$ccdir" = "." ] && [ "${CC#.}" = "$CC" ]; then
9343aa99676SStefan Eßer			ccdir=""
9353aa99676SStefan Eßer		else
9363aa99676SStefan Eßer			ccdir="$ccdir/"
9373aa99676SStefan Eßer		fi
9383aa99676SStefan Eßer		CC="${ccdir}${cc}"
9393aa99676SStefan Eßer		CFLAGS="$CFLAGS $ccflags"
9403aa99676SStefan Eßer	fi
9413aa99676SStefan Eßerfi
9423aa99676SStefan Eßer
9433aa99676SStefan Eßerif [ -z "$HOSTCC" ] && [ -z "$HOST_CC" ]; then
9443aa99676SStefan Eßer	HOSTCC="$CC"
9453aa99676SStefan Eßerelif [ -z "$HOSTCC" ]; then
9463aa99676SStefan Eßer	HOSTCC="$HOST_CC"
9473aa99676SStefan Eßerfi
9483aa99676SStefan Eßer
9493aa99676SStefan Eßerif [ "$HOSTCC" != "$CC" ]; then
95044d4804dSStefan Eßer
95144d4804dSStefan Eßer	# Like above, this splits HOSTCC and HOSTCFLAGS.
9523aa99676SStefan Eßer	ccbase=$(basename "$HOSTCC")
9533aa99676SStefan Eßer	suffix=" *"
9543aa99676SStefan Eßer	prefix="* "
9553aa99676SStefan Eßer
9563aa99676SStefan Eßer	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
9573aa99676SStefan Eßer		ccflags="${ccbase#$prefix}"
9583aa99676SStefan Eßer		cc="${ccbase%%$suffix}"
9593aa99676SStefan Eßer		ccdir=$(dirname "$HOSTCC")
9603aa99676SStefan Eßer		if [ "$ccdir" = "." ] && [ "${HOSTCC#.}" = "$HOSTCC" ]; then
9613aa99676SStefan Eßer			ccdir=""
9623aa99676SStefan Eßer		else
9633aa99676SStefan Eßer			ccdir="$ccdir/"
9643aa99676SStefan Eßer		fi
9653aa99676SStefan Eßer		HOSTCC="${ccdir}${cc}"
9663aa99676SStefan Eßer		HOSTCFLAGS="$HOSTCFLAGS $ccflags"
9673aa99676SStefan Eßer	fi
9683aa99676SStefan Eßerfi
9693aa99676SStefan Eßer
9703aa99676SStefan Eßerif [ -z "${HOSTCFLAGS+set}" ] && [ -z "${HOST_CFLAGS+set}" ]; then
9713aa99676SStefan Eßer	HOSTCFLAGS="$CFLAGS"
9723aa99676SStefan Eßerelif [ -z "${HOSTCFLAGS+set}" ]; then
9733aa99676SStefan Eßer	HOSTCFLAGS="$HOST_CFLAGS"
9743aa99676SStefan Eßerfi
9753aa99676SStefan Eßer
97644d4804dSStefan Eßer# Store these for the cross compilation detection later.
97744d4804dSStefan EßerOLDCFLAGS="$CFLAGS"
97844d4804dSStefan EßerOLDHOSTCFLAGS="$HOSTCFLAGS"
97944d4804dSStefan Eßer
9803aa99676SStefan Eßerlink="@printf 'No link necessary\\\\n'"
9813aa99676SStefan Eßermain_exec="BC"
9823aa99676SStefan Eßerexecutable="BC_EXEC"
9833aa99676SStefan Eßer
984d43fa8efSStefan Eßertests="test_bc timeconst test_dc"
98550696a6eSStefan Eßer
98610041e99SStefan Eßerbc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
98710041e99SStefan Eßerbc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
98810041e99SStefan Eßerdc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
98910041e99SStefan Eßerdc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
9903aa99676SStefan Eßer
99110041e99SStefan Eßertimeconst="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/bc/timeconst.sh \$(TESTSDIR)/bc/scripts/timeconst.bc \$(BC_EXEC)"
9923aa99676SStefan Eßer
9933aa99676SStefan Eßer# In order to have cleanup at exit, we need to be in
9943aa99676SStefan Eßer# debug mode, so don't run valgrind without that.
99510328f8bSStefan Eßerif [ "$vg" -ne 0 ]; then
99610328f8bSStefan Eßer	debug=1
99710328f8bSStefan Eßer	bc_test_exec='valgrind $(VALGRIND_ARGS) $(BC_EXEC)'
99810328f8bSStefan Eßer	dc_test_exec='valgrind $(VALGRIND_ARGS) $(DC_EXEC)'
9993aa99676SStefan Eßerelse
100010328f8bSStefan Eßer	bc_test_exec='$(BC_EXEC)'
100110328f8bSStefan Eßer	dc_test_exec='$(DC_EXEC)'
10023aa99676SStefan Eßerfi
10033aa99676SStefan Eßer
100444d4804dSStefan Eßertest_bc_history_prereqs="test_bc_history_all"
100544d4804dSStefan Eßertest_dc_history_prereqs="test_dc_history_all"
100644d4804dSStefan Eßer
10073aa99676SStefan Eßerkaratsuba="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
10083aa99676SStefan Eßerkaratsuba_test="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
10093aa99676SStefan Eßer
10103aa99676SStefan Eßerbc_lib="\$(GEN_DIR)/lib.o"
10113aa99676SStefan Eßerbc_help="\$(GEN_DIR)/bc_help.o"
10123aa99676SStefan Eßerdc_help="\$(GEN_DIR)/dc_help.o"
10133aa99676SStefan Eßer
101410328f8bSStefan Eßerdefault_target_prereqs="\$(BIN) \$(OBJS)"
101510328f8bSStefan Eßerdefault_target_cmd="\$(CC) \$(CFLAGS) \$(OBJS) \$(LDFLAGS) -o \$(EXEC)"
101610328f8bSStefan Eßerdefault_target="\$(DC_EXEC)"
101710328f8bSStefan Eßer
101810328f8bSStefan Eßersecond_target_prereqs=""
101910328f8bSStefan Eßersecond_target_cmd="$default_target_cmd"
102010328f8bSStefan Eßersecond_target="\$(BC_EXEC)"
102110328f8bSStefan Eßer
102244d4804dSStefan Eßer# This if/else if chain is for setting the defaults that change based on whether
102344d4804dSStefan Eßer# the library is being built, bc only, dc only, or both calculators.
102410328f8bSStefan Eßerif [ "$library" -ne 0 ]; then
102510328f8bSStefan Eßer
102610328f8bSStefan Eßer	extra_math=1
102710328f8bSStefan Eßer	nls=0
102810328f8bSStefan Eßer	hist=0
102910328f8bSStefan Eßer	bc=1
103010328f8bSStefan Eßer	dc=1
103110328f8bSStefan Eßer
103210328f8bSStefan Eßer	default_target_prereqs="\$(BIN) \$(OBJ)"
103310328f8bSStefan Eßer	default_target_cmd="ar -r -cu \$(LIBBC) \$(OBJ)"
103410328f8bSStefan Eßer	default_target="\$(LIBBC)"
103510328f8bSStefan Eßer	tests="test_library"
103644d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
103744d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
103810328f8bSStefan Eßer
103910041e99SStefan Eßer	install_prereqs=" install_library"
104010041e99SStefan Eßer	uninstall_prereqs=" uninstall_library"
104110041e99SStefan Eßer	install_man_prereqs=" install_bcl_manpage"
104210041e99SStefan Eßer	uninstall_man_prereqs=" uninstall_bcl_manpage"
104310041e99SStefan Eßer
104410328f8bSStefan Eßerelif [ "$bc_only" -eq 1 ]; then
10453aa99676SStefan Eßer
10463aa99676SStefan Eßer	bc=1
10473aa99676SStefan Eßer	dc=0
10483aa99676SStefan Eßer
10493aa99676SStefan Eßer	dc_help=""
10503aa99676SStefan Eßer
10513aa99676SStefan Eßer	executables="bc"
10523aa99676SStefan Eßer
10533aa99676SStefan Eßer	dc_test="@printf 'No dc tests to run\\\\n'"
1054d43fa8efSStefan Eßer	dc_test_np="@printf 'No dc tests to run\\\\n'"
105544d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
10563aa99676SStefan Eßer
105750696a6eSStefan Eßer	install_prereqs=" install_execs"
105850696a6eSStefan Eßer	install_man_prereqs=" install_bc_manpage"
10593aa99676SStefan Eßer	uninstall_prereqs=" uninstall_bc"
10603aa99676SStefan Eßer	uninstall_man_prereqs=" uninstall_bc_manpage"
10613aa99676SStefan Eßer
106210328f8bSStefan Eßer	default_target="\$(BC_EXEC)"
106310328f8bSStefan Eßer	second_target="\$(DC_EXEC)"
1064d43fa8efSStefan Eßer	tests="test_bc timeconst"
106510328f8bSStefan Eßer
10663aa99676SStefan Eßerelif [ "$dc_only" -eq 1 ]; then
10673aa99676SStefan Eßer
10683aa99676SStefan Eßer	bc=0
10693aa99676SStefan Eßer	dc=1
10703aa99676SStefan Eßer
10713aa99676SStefan Eßer	bc_lib=""
10723aa99676SStefan Eßer	bc_help=""
10733aa99676SStefan Eßer
10743aa99676SStefan Eßer	executables="dc"
10753aa99676SStefan Eßer
10763aa99676SStefan Eßer	main_exec="DC"
10773aa99676SStefan Eßer	executable="DC_EXEC"
10783aa99676SStefan Eßer
10793aa99676SStefan Eßer	bc_test="@printf 'No bc tests to run\\\\n'"
1080d43fa8efSStefan Eßer	bc_test_np="@printf 'No bc tests to run\\\\n'"
108144d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
10823aa99676SStefan Eßer
10833aa99676SStefan Eßer	timeconst="@printf 'timeconst cannot be run because bc is not built\\\\n'"
10843aa99676SStefan Eßer
108550696a6eSStefan Eßer	install_prereqs=" install_execs"
108650696a6eSStefan Eßer	install_man_prereqs=" install_dc_manpage"
10873aa99676SStefan Eßer	uninstall_prereqs=" uninstall_dc"
10883aa99676SStefan Eßer	uninstall_man_prereqs=" uninstall_dc_manpage"
10893aa99676SStefan Eßer
1090d43fa8efSStefan Eßer	tests="test_dc"
109110328f8bSStefan Eßer
10923aa99676SStefan Eßerelse
10933aa99676SStefan Eßer
10943aa99676SStefan Eßer	bc=1
10953aa99676SStefan Eßer	dc=1
10963aa99676SStefan Eßer
10973aa99676SStefan Eßer	executables="bc and dc"
10983aa99676SStefan Eßer
10993aa99676SStefan Eßer	karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)"
11003aa99676SStefan Eßer	karatsuba_test="@\$(KARATSUBA) 1 100 \$(BC_EXEC)"
11013aa99676SStefan Eßer
110250696a6eSStefan Eßer	if [ "$library" -eq 0 ]; then
110350696a6eSStefan Eßer		install_prereqs=" install_execs"
110450696a6eSStefan Eßer		install_man_prereqs=" install_bc_manpage install_dc_manpage"
11053aa99676SStefan Eßer		uninstall_prereqs=" uninstall_bc uninstall_dc"
11063aa99676SStefan Eßer		uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage"
110750696a6eSStefan Eßer	else
110850696a6eSStefan Eßer		install_prereqs=" install_library install_bcl_header"
110950696a6eSStefan Eßer		install_man_prereqs=" install_bcl_manpage"
111050696a6eSStefan Eßer		uninstall_prereqs=" uninstall_library uninstall_bcl_header"
111150696a6eSStefan Eßer		uninstall_man_prereqs=" uninstall_bcl_manpage"
111250696a6eSStefan Eßer		tests="test_library"
111350696a6eSStefan Eßer	fi
11143aa99676SStefan Eßer
111510328f8bSStefan Eßer	second_target_prereqs="$default_target_prereqs"
111610328f8bSStefan Eßer	default_target_prereqs="$second_target"
111710328f8bSStefan Eßer	default_target_cmd="\$(LINK) \$(BIN) \$(EXEC_PREFIX)\$(DC)"
111810328f8bSStefan Eßer
111910328f8bSStefan Eßerfi
112010328f8bSStefan Eßer
112144d4804dSStefan Eßer# We need specific stuff for fuzzing.
112210328f8bSStefan Eßerif [ "$fuzz" -ne 0 ]; then
112310328f8bSStefan Eßer	debug=1
112410328f8bSStefan Eßer	hist=0
112510328f8bSStefan Eßer	nls=0
112610328f8bSStefan Eßer	optimization="3"
11273aa99676SStefan Eßerfi
11283aa99676SStefan Eßer
112944d4804dSStefan Eßer# This sets some necessary things for debug mode.
11303aa99676SStefan Eßerif [ "$debug" -eq 1 ]; then
11313aa99676SStefan Eßer
11323aa99676SStefan Eßer	if [ -z "$CFLAGS" ] && [ -z "$optimization" ]; then
11333aa99676SStefan Eßer		CFLAGS="-O0"
11343aa99676SStefan Eßer	fi
11353aa99676SStefan Eßer
11363aa99676SStefan Eßer	CFLAGS="-g $CFLAGS"
11373aa99676SStefan Eßer
11383aa99676SStefan Eßerelse
113944d4804dSStefan Eßer
11403aa99676SStefan Eßer	CPPFLAGS="-DNDEBUG $CPPFLAGS"
114144d4804dSStefan Eßer
11423aa99676SStefan Eßer	if [ "$strip_bin" -ne 0 ]; then
11433aa99676SStefan Eßer		LDFLAGS="-s $LDFLAGS"
11443aa99676SStefan Eßer	fi
11453aa99676SStefan Eßerfi
11463aa99676SStefan Eßer
114744d4804dSStefan Eßer# Set optimization CFLAGS.
11483aa99676SStefan Eßerif [ -n "$optimization" ]; then
11493aa99676SStefan Eßer	CFLAGS="-O$optimization $CFLAGS"
11503aa99676SStefan Eßerfi
11513aa99676SStefan Eßer
115244d4804dSStefan Eßer# Set test coverage defaults.
11533aa99676SStefan Eßerif [ "$coverage" -eq 1 ]; then
11543aa99676SStefan Eßer
11553aa99676SStefan Eßer	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
11563aa99676SStefan Eßer		usage "Can only specify -c without -b or -d"
11573aa99676SStefan Eßer	fi
11583aa99676SStefan Eßer
11593aa99676SStefan Eßer	CFLAGS="-fprofile-arcs -ftest-coverage -g -O0 $CFLAGS"
11603aa99676SStefan Eßer	CPPFLAGS="-DNDEBUG $CPPFLAGS"
11613aa99676SStefan Eßer
11623aa99676SStefan Eßer	COVERAGE_OUTPUT="@gcov -pabcdf \$(GCDA) \$(BC_GCDA) \$(DC_GCDA) \$(HISTORY_GCDA) \$(RAND_GCDA)"
11633aa99676SStefan Eßer	COVERAGE_OUTPUT="$COVERAGE_OUTPUT;\$(RM) -f \$(GEN)*.gc*"
116444d4804dSStefan Eßer	COVERAGE_OUTPUT="$COVERAGE_OUTPUT;gcovr --exclude-unreachable-branches --exclude-throw-branches --html-details --output index.html"
11653aa99676SStefan Eßer	COVERAGE_PREREQS=" test coverage_output"
11663aa99676SStefan Eßer
11673aa99676SStefan Eßerelse
11683aa99676SStefan Eßer	COVERAGE_OUTPUT="@printf 'Coverage not generated\\\\n'"
11693aa99676SStefan Eßer	COVERAGE_PREREQS=""
11703aa99676SStefan Eßerfi
11713aa99676SStefan Eßer
117244d4804dSStefan Eßer
117344d4804dSStefan Eßer# Set some defaults.
11743aa99676SStefan Eßerif [ -z "${DESTDIR+set}" ]; then
11753aa99676SStefan Eßer	destdir=""
11763aa99676SStefan Eßerelse
11773aa99676SStefan Eßer	destdir="DESTDIR = $DESTDIR"
11783aa99676SStefan Eßerfi
11793aa99676SStefan Eßer
11803aa99676SStefan Eßerif [ -z "${PREFIX+set}" ]; then
11813aa99676SStefan Eßer	PREFIX="/usr/local"
11823aa99676SStefan Eßerfi
11833aa99676SStefan Eßer
11843aa99676SStefan Eßerif [ -z "${BINDIR+set}" ]; then
11853aa99676SStefan Eßer	BINDIR="$PREFIX/bin"
11863aa99676SStefan Eßerfi
11873aa99676SStefan Eßer
118850696a6eSStefan Eßerif [ -z "${INCLUDEDIR+set}" ]; then
118950696a6eSStefan Eßer	INCLUDEDIR="$PREFIX/include"
119050696a6eSStefan Eßerfi
119150696a6eSStefan Eßer
119250696a6eSStefan Eßerif [ -z "${LIBDIR+set}" ]; then
119350696a6eSStefan Eßer	LIBDIR="$PREFIX/lib"
119450696a6eSStefan Eßerfi
119550696a6eSStefan Eßer
119610041e99SStefan Eßerif [ -z "${PC_PATH+set}" ]; then
119710041e99SStefan Eßer
119810041e99SStefan Eßer	set +e
119910041e99SStefan Eßer
120010041e99SStefan Eßer	command -v pkg-config > /dev/null
120110041e99SStefan Eßer	err=$?
120210041e99SStefan Eßer
120310041e99SStefan Eßer	set -e
120410041e99SStefan Eßer
120510041e99SStefan Eßer	if [ "$err" -eq 0 ]; then
120610041e99SStefan Eßer		PC_PATH=$(pkg-config --variable=pc_path pkg-config)
120710041e99SStefan Eßer		PC_PATH="${PC_PATH%%:*}"
120810041e99SStefan Eßer	else
120910041e99SStefan Eßer		PC_PATH=""
121010041e99SStefan Eßer	fi
121110041e99SStefan Eßer
121210041e99SStefan Eßerfi
121310041e99SStefan Eßer
121444d4804dSStefan Eßer# Set a default for the DATAROOTDIR. This is done if either manpages will be
121544d4804dSStefan Eßer# installed, or locales are enabled because that's probably where NLS_PATH
121644d4804dSStefan Eßer# points.
12173aa99676SStefan Eßerif [ "$install_manpages" -ne 0 ] || [ "$nls" -ne 0 ]; then
12183aa99676SStefan Eßer	if [ -z "${DATAROOTDIR+set}" ]; then
12193aa99676SStefan Eßer		DATAROOTDIR="$PREFIX/share"
12203aa99676SStefan Eßer	fi
12213aa99676SStefan Eßerfi
12223aa99676SStefan Eßer
122344d4804dSStefan Eßer# Set defaults for manpage environment variables.
12243aa99676SStefan Eßerif [ "$install_manpages" -ne 0 ]; then
12253aa99676SStefan Eßer
12263aa99676SStefan Eßer	if [ -z "${DATADIR+set}" ]; then
12273aa99676SStefan Eßer		DATADIR="$DATAROOTDIR"
12283aa99676SStefan Eßer	fi
12293aa99676SStefan Eßer
12303aa99676SStefan Eßer	if [ -z "${MANDIR+set}" ]; then
12313aa99676SStefan Eßer		MANDIR="$DATADIR/man"
12323aa99676SStefan Eßer	fi
12333aa99676SStefan Eßer
12343aa99676SStefan Eßer	if [ -z "${MAN1DIR+set}" ]; then
12353aa99676SStefan Eßer		MAN1DIR="$MANDIR/man1"
12363aa99676SStefan Eßer	fi
12373aa99676SStefan Eßer
123850696a6eSStefan Eßer	if [ -z "${MAN3DIR+set}" ]; then
123950696a6eSStefan Eßer		MAN3DIR="$MANDIR/man3"
124050696a6eSStefan Eßer	fi
124150696a6eSStefan Eßer
12423aa99676SStefan Eßerelse
124350696a6eSStefan Eßer	install_man_prereqs=""
12443aa99676SStefan Eßer	uninstall_man_prereqs=""
12453aa99676SStefan Eßerfi
12463aa99676SStefan Eßer
124744d4804dSStefan Eßer# Here is where we test NLS (the locale system). This is done by trying to
124844d4804dSStefan Eßer# compile src/vm.c, which has the relevant code. If it fails, then it is
124944d4804dSStefan Eßer# disabled.
12503aa99676SStefan Eßerif [ "$nls" -ne 0 ]; then
12513aa99676SStefan Eßer
12523aa99676SStefan Eßer	set +e
12533aa99676SStefan Eßer
12543aa99676SStefan Eßer	printf 'Testing NLS...\n'
12553aa99676SStefan Eßer
12563aa99676SStefan Eßer	flags="-DBC_ENABLE_NLS=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
125744d4804dSStefan Eßer	flags="$flags -DBC_ENABLE_HISTORY=$hist -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
125810041e99SStefan Eßer	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/"
12593aa99676SStefan Eßer	flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
12603aa99676SStefan Eßer
126110041e99SStefan Eßer	"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/vm.c" -o "./vm.o" > /dev/null 2>&1
12623aa99676SStefan Eßer
12633aa99676SStefan Eßer	err="$?"
12643aa99676SStefan Eßer
126510041e99SStefan Eßer	rm -rf "./vm.o"
12663aa99676SStefan Eßer
12673aa99676SStefan Eßer	# If this errors, it is probably because of building on Windows,
12683aa99676SStefan Eßer	# and NLS is not supported on Windows, so disable it.
12693aa99676SStefan Eßer	if [ "$err" -ne 0 ]; then
12703aa99676SStefan Eßer		printf 'NLS does not work.\n'
12713aa99676SStefan Eßer		if [ $force -eq 0 ]; then
12723aa99676SStefan Eßer			printf 'Disabling NLS...\n\n'
12733aa99676SStefan Eßer			nls=0
12743aa99676SStefan Eßer		else
12753aa99676SStefan Eßer			printf 'Forcing NLS...\n\n'
12763aa99676SStefan Eßer		fi
12773aa99676SStefan Eßer	else
12783aa99676SStefan Eßer		printf 'NLS works.\n\n'
12793aa99676SStefan Eßer
12803aa99676SStefan Eßer		printf 'Testing gencat...\n'
128110041e99SStefan Eßer		gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" > /dev/null 2>&1
12823aa99676SStefan Eßer
12833aa99676SStefan Eßer		err="$?"
12843aa99676SStefan Eßer
128510041e99SStefan Eßer		rm -rf "./en_US.cat"
12863aa99676SStefan Eßer
12873aa99676SStefan Eßer		if [ "$err" -ne 0 ]; then
12883aa99676SStefan Eßer			printf 'gencat does not work.\n'
12893aa99676SStefan Eßer			if [ $force -eq 0 ]; then
12903aa99676SStefan Eßer				printf 'Disabling NLS...\n\n'
12913aa99676SStefan Eßer				nls=0
12923aa99676SStefan Eßer			else
12933aa99676SStefan Eßer				printf 'Forcing NLS...\n\n'
12943aa99676SStefan Eßer			fi
12953aa99676SStefan Eßer		else
12963aa99676SStefan Eßer
12973aa99676SStefan Eßer			printf 'gencat works.\n\n'
12983aa99676SStefan Eßer
129944d4804dSStefan Eßer			# It turns out that POSIX locales are really terrible, and running
130044d4804dSStefan Eßer			# gencat on one machine is not guaranteed to make those cat files
130144d4804dSStefan Eßer			# portable to another machine, so we had better warn the user here.
130244d4804dSStefan Eßer			if [ "$HOSTCC" != "$CC" ] || [ "$OLDHOSTCFLAGS" != "$OLDCFLAGS" ]; then
13033aa99676SStefan Eßer				printf 'Cross-compile detected.\n\n'
13043aa99676SStefan Eßer				printf 'WARNING: Catalog files generated with gencat may not be portable\n'
13053aa99676SStefan Eßer				printf '         across different architectures.\n\n'
13063aa99676SStefan Eßer			fi
13073aa99676SStefan Eßer
13083aa99676SStefan Eßer			if [ -z "$NLSPATH" ]; then
13093aa99676SStefan Eßer				NLSPATH="/usr/share/locale/%L/%N"
13103aa99676SStefan Eßer			fi
13113aa99676SStefan Eßer
13123aa99676SStefan Eßer			install_locales_prereqs=" install_locales"
13133aa99676SStefan Eßer			uninstall_locales_prereqs=" uninstall_locales"
13143aa99676SStefan Eßer
13153aa99676SStefan Eßer		fi
13163aa99676SStefan Eßer
13173aa99676SStefan Eßer	fi
13183aa99676SStefan Eßer
13193aa99676SStefan Eßer	set -e
13203aa99676SStefan Eßer
13213aa99676SStefan Eßerelse
13223aa99676SStefan Eßer	install_locales_prereqs=""
13233aa99676SStefan Eßer	uninstall_locales_prereqs=""
1324cf7becd2SStefan Eßer	all_locales=0
1325cf7becd2SStefan Eßerfi
1326cf7becd2SStefan Eßer
1327cf7becd2SStefan Eßerif [ "$nls" -ne 0 ] && [ "$all_locales" -ne 0 ]; then
1328cf7becd2SStefan Eßer	install_locales="\$(LOCALE_INSTALL) -l \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
1329cf7becd2SStefan Eßerelse
1330cf7becd2SStefan Eßer	install_locales="\$(LOCALE_INSTALL) \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
13313aa99676SStefan Eßerfi
13323aa99676SStefan Eßer
133344d4804dSStefan Eßer# Like the above tested locale support, this tests history.
13343aa99676SStefan Eßerif [ "$hist" -eq 1 ]; then
13353aa99676SStefan Eßer
13363aa99676SStefan Eßer	set +e
13373aa99676SStefan Eßer
13383aa99676SStefan Eßer	printf 'Testing history...\n'
13393aa99676SStefan Eßer
13403aa99676SStefan Eßer	flags="-DBC_ENABLE_HISTORY=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
134144d4804dSStefan Eßer	flags="$flags -DBC_ENABLE_NLS=$nls -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
134210041e99SStefan Eßer	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/"
13433aa99676SStefan Eßer	flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
13443aa99676SStefan Eßer
134510041e99SStefan Eßer	"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/history.c" -o "./history.o" > /dev/null 2>&1
13463aa99676SStefan Eßer
13473aa99676SStefan Eßer	err="$?"
13483aa99676SStefan Eßer
134910041e99SStefan Eßer	rm -rf "./history.o"
13503aa99676SStefan Eßer
13513aa99676SStefan Eßer	# If this errors, it is probably because of building on Windows,
13523aa99676SStefan Eßer	# and history is not supported on Windows, so disable it.
13533aa99676SStefan Eßer	if [ "$err" -ne 0 ]; then
13543aa99676SStefan Eßer		printf 'History does not work.\n'
13553aa99676SStefan Eßer		if [ $force -eq 0 ]; then
13563aa99676SStefan Eßer			printf 'Disabling history...\n\n'
13573aa99676SStefan Eßer			hist=0
13583aa99676SStefan Eßer		else
13593aa99676SStefan Eßer			printf 'Forcing history...\n\n'
13603aa99676SStefan Eßer		fi
13613aa99676SStefan Eßer	else
13623aa99676SStefan Eßer		printf 'History works.\n\n'
13633aa99676SStefan Eßer	fi
13643aa99676SStefan Eßer
13653aa99676SStefan Eßer	set -e
13663aa99676SStefan Eßer
13673aa99676SStefan Eßerfi
13683aa99676SStefan Eßer
136944d4804dSStefan Eßer# We have to disable the history tests if it is disabled or valgrind is on.
137044d4804dSStefan Eßerif [ "$hist" -eq 0 ] || [ "$vg" -ne 0 ]; then
137144d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
137244d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
137344d4804dSStefan Eßer	history_tests="@printf 'Skipping history tests...\\\\n'"
137444d4804dSStefan Eßerelse
137510041e99SStefan Eßer	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'"
137644d4804dSStefan Eßerfi
137744d4804dSStefan Eßer
137844d4804dSStefan Eßer# Test OpenBSD. This is not in an if statement because regardless of whatever
137944d4804dSStefan Eßer# the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE.
138044d4804dSStefan Eßer# No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC
138144d4804dSStefan Eßer# and Clang complain that that is only allowed for system headers. Sigh....So we
138244d4804dSStefan Eßer# have to check at configure time and set it on the compiler command-line. And
138344d4804dSStefan Eßer# we have to set it because we also set _POSIX_C_SOURCE, which OpenBSD headers
138444d4804dSStefan Eßer# detect, and when they detect it, they turn off _BSD_SOURCE unless it is
138544d4804dSStefan Eßer# specifically requested.
138644d4804dSStefan Eßerset +e
138744d4804dSStefan Eßerprintf 'Testing for OpenBSD...\n'
138844d4804dSStefan Eßer
138944d4804dSStefan Eßerflags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0"
139010041e99SStefan Eßer"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/include/status.h" > /dev/null 2>&1
139144d4804dSStefan Eßer
139244d4804dSStefan Eßererr="$?"
139344d4804dSStefan Eßer
139444d4804dSStefan Eßerif [ "$err" -ne 0 ]; then
139544d4804dSStefan Eßer	printf 'On OpenBSD. Using _BSD_SOURCE.\n\n'
139644d4804dSStefan Eßer	bsd="-D_BSD_SOURCE"
139744d4804dSStefan Eßerelse
139844d4804dSStefan Eßer	printf 'Not on OpenBSD.\n\n'
139944d4804dSStefan Eßer	bsd=""
140044d4804dSStefan Eßerfi
140144d4804dSStefan Eßer
140250696a6eSStefan Eßerif [ "$library" -eq 1 ]; then
140350696a6eSStefan Eßer	bc_lib=""
140450696a6eSStefan Eßerfi
140550696a6eSStefan Eßer
140650696a6eSStefan Eßerif [ "$extra_math" -eq 1 ] && [ "$bc" -ne 0 ] && [ "$library" -eq 0 ]; then
14073aa99676SStefan Eßer	BC_LIB2_O="\$(GEN_DIR)/lib2.o"
14083aa99676SStefan Eßerelse
14093aa99676SStefan Eßer	BC_LIB2_O=""
14103aa99676SStefan Eßerfi
14113aa99676SStefan Eßer
141244d4804dSStefan Eßer# These lines set the appropriate targets based on whether `gen/strgen.c` or
141344d4804dSStefan Eßer# `gen/strgen.sh` is used.
14143aa99676SStefan EßerGEN="strgen"
14153aa99676SStefan EßerGEN_EXEC_TARGET="\$(HOSTCC) \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)"
141644d4804dSStefan EßerCLEAN_PREREQS=" clean_gen clean_coverage"
14173aa99676SStefan Eßer
14183aa99676SStefan Eßerif [ -z "${GEN_HOST+set}" ]; then
14193aa99676SStefan Eßer	GEN_HOST=1
14203aa99676SStefan Eßerelse
14213aa99676SStefan Eßer	if [ "$GEN_HOST" -eq 0 ]; then
14223aa99676SStefan Eßer		GEN="strgen.sh"
14233aa99676SStefan Eßer		GEN_EXEC_TARGET="@printf 'Do not need to build gen/strgen.c\\\\n'"
142444d4804dSStefan Eßer		CLEAN_PREREQS=" clean_coverage"
14253aa99676SStefan Eßer	fi
14263aa99676SStefan Eßerfi
14273aa99676SStefan Eßer
14283aa99676SStefan Eßermanpage_args=""
142910328f8bSStefan Eßerunneeded=""
143010328f8bSStefan Eßerheaders="\$(HEADERS)"
14313aa99676SStefan Eßer
143244d4804dSStefan Eßer# This series of if statements figure out what source files are *not* needed.
14333aa99676SStefan Eßerif [ "$extra_math" -eq 0 ]; then
14343aa99676SStefan Eßer	manpage_args="E"
143510328f8bSStefan Eßer	unneeded="$unneeded rand.c"
143610328f8bSStefan Eßerelse
143710328f8bSStefan Eßer	headers="$headers \$(EXTRA_MATH_HEADERS)"
14383aa99676SStefan Eßerfi
14393aa99676SStefan Eßer
144044d4804dSStefan Eßer# All of these next if statements set the build type and mark certain source
144144d4804dSStefan Eßer# files as unneeded so that they won't have targets generated for them.
144244d4804dSStefan Eßer
14433aa99676SStefan Eßerif [ "$hist" -eq 0 ]; then
14443aa99676SStefan Eßer	manpage_args="${manpage_args}H"
144510328f8bSStefan Eßer	unneeded="$unneeded history.c"
144610328f8bSStefan Eßerelse
144710328f8bSStefan Eßer	headers="$headers \$(HISTORY_HEADERS)"
14483aa99676SStefan Eßerfi
14493aa99676SStefan Eßer
14503aa99676SStefan Eßerif [ "$nls" -eq 0 ]; then
14513aa99676SStefan Eßer	manpage_args="${manpage_args}N"
14523aa99676SStefan Eßerfi
14533aa99676SStefan Eßer
145450696a6eSStefan Eßerif [ "$bc" -eq 0 ]; then
145550696a6eSStefan Eßer	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
145610328f8bSStefan Eßerelse
145710328f8bSStefan Eßer	headers="$headers \$(BC_HEADERS)"
145850696a6eSStefan Eßerfi
145950696a6eSStefan Eßer
146050696a6eSStefan Eßerif [ "$dc" -eq 0 ]; then
146150696a6eSStefan Eßer	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
146210328f8bSStefan Eßerelse
146310328f8bSStefan Eßer	headers="$headers \$(DC_HEADERS)"
146450696a6eSStefan Eßerfi
146550696a6eSStefan Eßer
146610041e99SStefan Eßer# This convoluted mess does pull the version out. If you change the format of
146710041e99SStefan Eßer# include/version.h, you may have to change this line.
146810041e99SStefan Eßerversion=$(cat "$scriptdir/include/version.h" | grep "VERSION " - | awk '{ print $3 }' -)
146910041e99SStefan Eßer
147050696a6eSStefan Eßerif [ "$library" -ne 0 ]; then
147110041e99SStefan Eßer
147250696a6eSStefan Eßer	unneeded="$unneeded args.c opt.c read.c file.c main.c"
147350696a6eSStefan Eßer	unneeded="$unneeded lang.c lex.c parse.c program.c"
147450696a6eSStefan Eßer	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
147550696a6eSStefan Eßer	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
147610328f8bSStefan Eßer	headers="$headers \$(LIBRARY_HEADERS)"
147710041e99SStefan Eßer
147810041e99SStefan Eßer	if [ "$PC_PATH" != "" ]; then
147910041e99SStefan Eßer
148010041e99SStefan Eßer		contents=$(cat "$scriptdir/bcl.pc.in")
148110041e99SStefan Eßer
148210041e99SStefan Eßer		contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
148310041e99SStefan Eßer		contents=$(replace "$contents" "LIBDIR" "$LIBDIR")
148410041e99SStefan Eßer		contents=$(replace "$contents" "VERSION" "$version")
148510041e99SStefan Eßer
148610041e99SStefan Eßer		printf '%s\n' "$contents" > "./bcl.pc"
148710041e99SStefan Eßer
148810041e99SStefan Eßer		pkg_config_install="\$(SAFE_INSTALL) \$(PC_INSTALL_ARGS) \"\$(BCL_PC)\" \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
148910041e99SStefan Eßer		pkg_config_uninstall="\$(RM) -f \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
149010041e99SStefan Eßer
149150696a6eSStefan Eßer	else
149210041e99SStefan Eßer
149310041e99SStefan Eßer		pkg_config_install=""
149410041e99SStefan Eßer		pkg_config_uninstall=""
149510041e99SStefan Eßer
149610041e99SStefan Eßer	fi
149710041e99SStefan Eßer
149810041e99SStefan Eßerelse
149910041e99SStefan Eßer
150050696a6eSStefan Eßer	unneeded="$unneeded library.c"
150110041e99SStefan Eßer
150210041e99SStefan Eßer	PC_PATH=""
150310041e99SStefan Eßer	pkg_config_install=""
150410041e99SStefan Eßer	pkg_config_uninstall=""
150510041e99SStefan Eßer
150650696a6eSStefan Eßerfi
150750696a6eSStefan Eßer
150844d4804dSStefan Eßer# library.c is not needed under normal circumstances.
150944d4804dSStefan Eßerif [ "$unneeded" = "" ]; then
151044d4804dSStefan Eßer	unneeded="library.c"
151144d4804dSStefan Eßerfi
151244d4804dSStefan Eßer
151344d4804dSStefan Eßer# This sets the appropriate manpage for a full build.
151410328f8bSStefan Eßerif [ "$manpage_args" = "" ]; then
151510328f8bSStefan Eßer	manpage_args="A"
151610328f8bSStefan Eßerfi
151710328f8bSStefan Eßer
151810328f8bSStefan Eßerif [ "$vg" -ne 0 ]; then
151910328f8bSStefan Eßer	memcheck=1
152010328f8bSStefan Eßerfi
152110328f8bSStefan Eßer
152244d4804dSStefan Eßerif [ "$bc_default_prompt" = "" ]; then
152344d4804dSStefan Eßer	bc_default_prompt="$bc_default_tty_mode"
152444d4804dSStefan Eßerfi
152544d4804dSStefan Eßer
152644d4804dSStefan Eßerif [ "$dc_default_prompt" = "" ]; then
152744d4804dSStefan Eßer	dc_default_prompt="$dc_default_tty_mode"
152844d4804dSStefan Eßerfi
152944d4804dSStefan Eßer
153044d4804dSStefan Eßer# Generate the test targets and prerequisites.
1531d43fa8efSStefan Eßerbc_tests=$(gen_std_test_targets bc)
153210328f8bSStefan Eßerbc_script_tests=$(gen_script_test_targets bc)
1533d43fa8efSStefan Eßerbc_err_tests=$(gen_err_test_targets bc)
1534d43fa8efSStefan Eßerdc_tests=$(gen_std_test_targets dc)
153510328f8bSStefan Eßerdc_script_tests=$(gen_script_test_targets dc)
1536d43fa8efSStefan Eßerdc_err_tests=$(gen_err_test_targets dc)
153710328f8bSStefan Eßer
15383aa99676SStefan Eßer# Print out the values; this is for debugging.
153910041e99SStefan Eßerprintf 'Version: %s\n' "$version"
154010041e99SStefan Eßer
15413aa99676SStefan Eßerif [ "$bc" -ne 0 ]; then
15423aa99676SStefan Eßer	printf 'Building bc\n'
15433aa99676SStefan Eßerelse
15443aa99676SStefan Eßer	printf 'Not building bc\n'
15453aa99676SStefan Eßerfi
15463aa99676SStefan Eßerif [ "$dc" -ne 0 ]; then
15473aa99676SStefan Eßer	printf 'Building dc\n'
15483aa99676SStefan Eßerelse
15493aa99676SStefan Eßer	printf 'Not building dc\n'
15503aa99676SStefan Eßerfi
15513aa99676SStefan Eßerprintf '\n'
155250696a6eSStefan Eßerprintf 'BC_ENABLE_LIBRARY=%s\n\n' "$library"
15533aa99676SStefan Eßerprintf 'BC_ENABLE_HISTORY=%s\n' "$hist"
15543aa99676SStefan Eßerprintf 'BC_ENABLE_EXTRA_MATH=%s\n' "$extra_math"
15553aa99676SStefan Eßerprintf 'BC_ENABLE_NLS=%s\n' "$nls"
155610328f8bSStefan Eßerprintf 'BC_ENABLE_AFL=%s\n' "$fuzz"
15573aa99676SStefan Eßerprintf '\n'
15583aa99676SStefan Eßerprintf 'BC_NUM_KARATSUBA_LEN=%s\n' "$karatsuba_len"
15593aa99676SStefan Eßerprintf '\n'
15603aa99676SStefan Eßerprintf 'CC=%s\n' "$CC"
15613aa99676SStefan Eßerprintf 'CFLAGS=%s\n' "$CFLAGS"
15623aa99676SStefan Eßerprintf 'HOSTCC=%s\n' "$HOSTCC"
15633aa99676SStefan Eßerprintf 'HOSTCFLAGS=%s\n' "$HOSTCFLAGS"
15643aa99676SStefan Eßerprintf 'CPPFLAGS=%s\n' "$CPPFLAGS"
15653aa99676SStefan Eßerprintf 'LDFLAGS=%s\n' "$LDFLAGS"
15663aa99676SStefan Eßerprintf 'PREFIX=%s\n' "$PREFIX"
15673aa99676SStefan Eßerprintf 'BINDIR=%s\n' "$BINDIR"
156850696a6eSStefan Eßerprintf 'INCLUDEDIR=%s\n' "$INCLUDEDIR"
156950696a6eSStefan Eßerprintf 'LIBDIR=%s\n' "$LIBDIR"
15703aa99676SStefan Eßerprintf 'DATAROOTDIR=%s\n' "$DATAROOTDIR"
15713aa99676SStefan Eßerprintf 'DATADIR=%s\n' "$DATADIR"
15723aa99676SStefan Eßerprintf 'MANDIR=%s\n' "$MANDIR"
15733aa99676SStefan Eßerprintf 'MAN1DIR=%s\n' "$MAN1DIR"
157450696a6eSStefan Eßerprintf 'MAN3DIR=%s\n' "$MAN3DIR"
15753aa99676SStefan Eßerprintf 'NLSPATH=%s\n' "$NLSPATH"
157610041e99SStefan Eßerprintf 'PC_PATH=%s\n' "$PC_PATH"
15773aa99676SStefan Eßerprintf 'EXECSUFFIX=%s\n' "$EXECSUFFIX"
15783aa99676SStefan Eßerprintf 'EXECPREFIX=%s\n' "$EXECPREFIX"
15793aa99676SStefan Eßerprintf 'DESTDIR=%s\n' "$DESTDIR"
15803aa99676SStefan Eßerprintf 'LONG_BIT=%s\n' "$LONG_BIT"
15813aa99676SStefan Eßerprintf 'GEN_HOST=%s\n' "$GEN_HOST"
15823aa99676SStefan Eßerprintf 'GEN_EMU=%s\n' "$GEN_EMU"
158344d4804dSStefan Eßerprintf '\n'
158444d4804dSStefan Eßerprintf 'Setting Defaults\n'
158544d4804dSStefan Eßerprintf '================\n'
158644d4804dSStefan Eßerprintf 'bc.banner=%s\n' "$bc_default_banner"
158744d4804dSStefan Eßerprintf 'bc.sigint_reset=%s\n' "$bc_default_sigint_reset"
158844d4804dSStefan Eßerprintf 'dc.sigint_reset=%s\n' "$dc_default_sigint_reset"
158944d4804dSStefan Eßerprintf 'bc.tty_mode=%s\n' "$bc_default_tty_mode"
159044d4804dSStefan Eßerprintf 'dc.tty_mode=%s\n' "$dc_default_tty_mode"
159144d4804dSStefan Eßerprintf 'bc.prompt=%s\n' "$bc_default_prompt"
159244d4804dSStefan Eßerprintf 'dc.prompt=%s\n' "$dc_default_prompt"
159310041e99SStefan Eßerprintf 'bc.expr_exit=%s\n' "$bc_default_expr_exit"
159410041e99SStefan Eßerprintf 'dc.expr_exit=%s\n' "$dc_default_expr_exit"
159544d4804dSStefan Eßer
159644d4804dSStefan Eßer# This is where the real work begins. This is the point at which the Makefile.in
159744d4804dSStefan Eßer# template is edited and output to the Makefile.
15983aa99676SStefan Eßer
15993aa99676SStefan Eßercontents=$(cat "$scriptdir/Makefile.in")
16003aa99676SStefan Eßer
16013aa99676SStefan Eßerneedle="WARNING"
16023aa99676SStefan Eßerreplacement='*** WARNING: Autogenerated from Makefile.in. DO NOT MODIFY ***'
16033aa99676SStefan Eßer
16043aa99676SStefan Eßercontents=$(replace "$contents" "$needle" "$replacement")
16053aa99676SStefan Eßer
160644d4804dSStefan Eßer# The contents are edited to have the list of files to build.
160710328f8bSStefan Eßercontents=$(gen_file_list "$contents" $unneeded)
160810328f8bSStefan Eßer
160910328f8bSStefan EßerSRC_TARGETS=""
161010328f8bSStefan Eßer
161144d4804dSStefan Eßer# This line and loop generates the individual targets for source files. I used
161244d4804dSStefan Eßer# to just use an implicit target, but that was found to be inadequate when I
161344d4804dSStefan Eßer# added the library.
161410328f8bSStefan Eßersrc_files=$(find_src_files $unneeded)
161510328f8bSStefan Eßer
161610328f8bSStefan Eßerfor f in $src_files; do
161710328f8bSStefan Eßer	o=$(replace_ext "$f" "c" "o")
161810041e99SStefan Eßer	o=$(basename "$o")
161910041e99SStefan Eßer	SRC_TARGETS=$(printf '%s\n\nsrc/%s: src %s %s\n\t$(CC) $(CFLAGS) -o src/%s -c %s\n' \
162010328f8bSStefan Eßer		"$SRC_TARGETS" "$o" "$headers" "$f" "$o" "$f")
162110328f8bSStefan Eßerdone
162210328f8bSStefan Eßer
162344d4804dSStefan Eßer# Replace all the placeholders.
162410041e99SStefan Eßercontents=$(replace "$contents" "ROOTDIR" "$scriptdir")
162510041e99SStefan Eßercontents=$(replace "$contents" "BUILDDIR" "$builddir")
162610041e99SStefan Eßer
162710328f8bSStefan Eßercontents=$(replace "$contents" "HEADERS" "$headers")
162810328f8bSStefan Eßer
16293aa99676SStefan Eßercontents=$(replace "$contents" "BC_ENABLED" "$bc")
16303aa99676SStefan Eßercontents=$(replace "$contents" "DC_ENABLED" "$dc")
163110328f8bSStefan Eßer
163210328f8bSStefan Eßercontents=$(replace "$contents" "BC_ALL_TESTS" "$bc_test")
1633d43fa8efSStefan Eßercontents=$(replace "$contents" "BC_ALL_TESTS_NP" "$bc_test_np")
163410328f8bSStefan Eßercontents=$(replace "$contents" "BC_TESTS" "$bc_tests")
163510328f8bSStefan Eßercontents=$(replace "$contents" "BC_SCRIPT_TESTS" "$bc_script_tests")
1636d43fa8efSStefan Eßercontents=$(replace "$contents" "BC_ERROR_TESTS" "$bc_err_tests")
163710328f8bSStefan Eßercontents=$(replace "$contents" "BC_TEST_EXEC" "$bc_test_exec")
163810328f8bSStefan Eßercontents=$(replace "$contents" "TIMECONST_ALL_TESTS" "$timeconst")
163910328f8bSStefan Eßer
164010328f8bSStefan Eßercontents=$(replace "$contents" "DC_ALL_TESTS" "$dc_test")
1641d43fa8efSStefan Eßercontents=$(replace "$contents" "DC_ALL_TESTS_NP" "$dc_test_np")
164210328f8bSStefan Eßercontents=$(replace "$contents" "DC_TESTS" "$dc_tests")
164310328f8bSStefan Eßercontents=$(replace "$contents" "DC_SCRIPT_TESTS" "$dc_script_tests")
1644d43fa8efSStefan Eßercontents=$(replace "$contents" "DC_ERROR_TESTS" "$dc_err_tests")
164510328f8bSStefan Eßercontents=$(replace "$contents" "DC_TEST_EXEC" "$dc_test_exec")
16463aa99676SStefan Eßer
16477e5c51e5SStefan Eßercontents=$(replace "$contents" "BUILD_TYPE" "$manpage_args")
16487e5c51e5SStefan Eßer
164950696a6eSStefan Eßercontents=$(replace "$contents" "LIBRARY" "$library")
16503aa99676SStefan Eßercontents=$(replace "$contents" "HISTORY" "$hist")
16513aa99676SStefan Eßercontents=$(replace "$contents" "EXTRA_MATH" "$extra_math")
16523aa99676SStefan Eßercontents=$(replace "$contents" "NLS" "$nls")
165310328f8bSStefan Eßercontents=$(replace "$contents" "FUZZ" "$fuzz")
165410328f8bSStefan Eßercontents=$(replace "$contents" "MEMCHECK" "$memcheck")
165510328f8bSStefan Eßer
16563aa99676SStefan Eßercontents=$(replace "$contents" "BC_LIB_O" "$bc_lib")
16573aa99676SStefan Eßercontents=$(replace "$contents" "BC_HELP_O" "$bc_help")
16583aa99676SStefan Eßercontents=$(replace "$contents" "DC_HELP_O" "$dc_help")
16593aa99676SStefan Eßercontents=$(replace "$contents" "BC_LIB2_O" "$BC_LIB2_O")
16603aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA_LEN" "$karatsuba_len")
16613aa99676SStefan Eßer
16623aa99676SStefan Eßercontents=$(replace "$contents" "NLSPATH" "$NLSPATH")
16633aa99676SStefan Eßercontents=$(replace "$contents" "DESTDIR" "$destdir")
16643aa99676SStefan Eßercontents=$(replace "$contents" "EXECSUFFIX" "$EXECSUFFIX")
16653aa99676SStefan Eßercontents=$(replace "$contents" "EXECPREFIX" "$EXECPREFIX")
16663aa99676SStefan Eßercontents=$(replace "$contents" "BINDIR" "$BINDIR")
166750696a6eSStefan Eßercontents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
166850696a6eSStefan Eßercontents=$(replace "$contents" "LIBDIR" "$LIBDIR")
16693aa99676SStefan Eßercontents=$(replace "$contents" "MAN1DIR" "$MAN1DIR")
167050696a6eSStefan Eßercontents=$(replace "$contents" "MAN3DIR" "$MAN3DIR")
16713aa99676SStefan Eßercontents=$(replace "$contents" "CFLAGS" "$CFLAGS")
16723aa99676SStefan Eßercontents=$(replace "$contents" "HOSTCFLAGS" "$HOSTCFLAGS")
16733aa99676SStefan Eßercontents=$(replace "$contents" "CPPFLAGS" "$CPPFLAGS")
16743aa99676SStefan Eßercontents=$(replace "$contents" "LDFLAGS" "$LDFLAGS")
16753aa99676SStefan Eßercontents=$(replace "$contents" "CC" "$CC")
16763aa99676SStefan Eßercontents=$(replace "$contents" "HOSTCC" "$HOSTCC")
16773aa99676SStefan Eßercontents=$(replace "$contents" "COVERAGE_OUTPUT" "$COVERAGE_OUTPUT")
16783aa99676SStefan Eßercontents=$(replace "$contents" "COVERAGE_PREREQS" "$COVERAGE_PREREQS")
16793aa99676SStefan Eßercontents=$(replace "$contents" "INSTALL_PREREQS" "$install_prereqs")
168050696a6eSStefan Eßercontents=$(replace "$contents" "INSTALL_MAN_PREREQS" "$install_man_prereqs")
1681cf7becd2SStefan Eßercontents=$(replace "$contents" "INSTALL_LOCALES" "$install_locales")
16823aa99676SStefan Eßercontents=$(replace "$contents" "INSTALL_LOCALES_PREREQS" "$install_locales_prereqs")
16833aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_MAN_PREREQS" "$uninstall_man_prereqs")
16843aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_PREREQS" "$uninstall_prereqs")
16853aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_LOCALES_PREREQS" "$uninstall_locales_prereqs")
16863aa99676SStefan Eßer
168710041e99SStefan Eßercontents=$(replace "$contents" "PC_PATH" "$PC_PATH")
168810041e99SStefan Eßercontents=$(replace "$contents" "PKG_CONFIG_INSTALL" "$pkg_config_install")
168910041e99SStefan Eßercontents=$(replace "$contents" "PKG_CONFIG_UNINSTALL" "$pkg_config_uninstall")
169010041e99SStefan Eßer
169110328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET" "$default_target")
169210328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET_PREREQS" "$default_target_prereqs")
169310328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET_CMD" "$default_target_cmd")
169410328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET" "$second_target")
169510328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET_PREREQS" "$second_target_prereqs")
169610328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET_CMD" "$second_target_cmd")
169710328f8bSStefan Eßer
169850696a6eSStefan Eßercontents=$(replace "$contents" "ALL_PREREQ" "$ALL_PREREQ")
169910328f8bSStefan Eßercontents=$(replace "$contents" "BC_EXEC_PREREQ" "$bc_exec_prereq")
170010328f8bSStefan Eßercontents=$(replace "$contents" "BC_EXEC_CMD" "$bc_exec_cmd")
170110328f8bSStefan Eßercontents=$(replace "$contents" "DC_EXEC_PREREQ" "$dc_exec_prereq")
170210328f8bSStefan Eßercontents=$(replace "$contents" "DC_EXEC_CMD" "$dc_exec_cmd")
170350696a6eSStefan Eßer
17043aa99676SStefan Eßercontents=$(replace "$contents" "EXECUTABLES" "$executables")
17053aa99676SStefan Eßercontents=$(replace "$contents" "MAIN_EXEC" "$main_exec")
17063aa99676SStefan Eßercontents=$(replace "$contents" "EXEC" "$executable")
170750696a6eSStefan Eßercontents=$(replace "$contents" "TESTS" "$tests")
17083aa99676SStefan Eßer
170944d4804dSStefan Eßercontents=$(replace "$contents" "BC_HISTORY_TEST_PREREQS" "$test_bc_history_prereqs")
171044d4804dSStefan Eßercontents=$(replace "$contents" "DC_HISTORY_TEST_PREREQS" "$test_dc_history_prereqs")
171144d4804dSStefan Eßercontents=$(replace "$contents" "HISTORY_TESTS" "$history_tests")
17123aa99676SStefan Eßer
17133aa99676SStefan Eßercontents=$(replace "$contents" "VG_BC_TEST" "$vg_bc_test")
17143aa99676SStefan Eßercontents=$(replace "$contents" "VG_DC_TEST" "$vg_dc_test")
17153aa99676SStefan Eßer
17163aa99676SStefan Eßercontents=$(replace "$contents" "TIMECONST" "$timeconst")
17173aa99676SStefan Eßer
17183aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA" "$karatsuba")
17193aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA_TEST" "$karatsuba_test")
17203aa99676SStefan Eßer
17213aa99676SStefan Eßercontents=$(replace "$contents" "LONG_BIT" "$LONG_BIT")
17223aa99676SStefan Eßercontents=$(replace "$contents" "LONG_BIT_DEFINE" "$LONG_BIT_DEFINE")
17233aa99676SStefan Eßer
17243aa99676SStefan Eßercontents=$(replace "$contents" "GEN" "$GEN")
17253aa99676SStefan Eßercontents=$(replace "$contents" "GEN_EXEC_TARGET" "$GEN_EXEC_TARGET")
17263aa99676SStefan Eßercontents=$(replace "$contents" "CLEAN_PREREQS" "$CLEAN_PREREQS")
17273aa99676SStefan Eßercontents=$(replace "$contents" "GEN_EMU" "$GEN_EMU")
17283aa99676SStefan Eßer
172944d4804dSStefan Eßercontents=$(replace "$contents" "BSD" "$bsd")
173044d4804dSStefan Eßer
173144d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_BANNER" "$bc_default_banner")
173244d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_SIGINT_RESET" "$bc_default_sigint_reset")
173344d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_SIGINT_RESET" "$dc_default_sigint_reset")
173444d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_TTY_MODE" "$bc_default_tty_mode")
173544d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_TTY_MODE" "$dc_default_tty_mode")
173644d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_PROMPT" "$bc_default_prompt")
173744d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_PROMPT" "$dc_default_prompt")
173810041e99SStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_EXPR_EXIT" "$bc_default_expr_exit")
173910041e99SStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_EXPR_EXIT" "$dc_default_expr_exit")
174044d4804dSStefan Eßer
174144d4804dSStefan Eßer# Do the first print to the Makefile.
174210041e99SStefan Eßerprintf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "Makefile"
174310328f8bSStefan Eßer
174444d4804dSStefan Eßer# Generate the individual test targets.
174510328f8bSStefan Eßerif [ "$bc" -ne 0 ]; then
1746d43fa8efSStefan Eßer	gen_std_tests bc "$extra_math" "$time_tests" $bc_test_exec
174710328f8bSStefan Eßer	gen_script_tests bc "$extra_math" "$generate_tests" "$time_tests" $bc_test_exec
1748d43fa8efSStefan Eßer	gen_err_tests bc $bc_test_exec
174910328f8bSStefan Eßerfi
175010328f8bSStefan Eßer
175110328f8bSStefan Eßerif [ "$dc" -ne 0 ]; then
1752d43fa8efSStefan Eßer	gen_std_tests dc "$extra_math" "$time_tests" $dc_test_exec
175310328f8bSStefan Eßer	gen_script_tests dc "$extra_math" "$generate_tests" "$time_tests" $dc_test_exec
1754d43fa8efSStefan Eßer	gen_err_tests dc $dc_test_exec
175510328f8bSStefan Eßerfi
17563aa99676SStefan Eßer
175744d4804dSStefan Eßer# Copy the correct manuals to the expected places.
175810041e99SStefan Eßermkdir -p manuals
175910041e99SStefan Eßercp -f "$scriptdir/manuals/bc/$manpage_args.1.md" manuals/bc.1.md
176010041e99SStefan Eßercp -f "$scriptdir/manuals/bc/$manpage_args.1" manuals/bc.1
176110041e99SStefan Eßercp -f "$scriptdir/manuals/dc/$manpage_args.1.md" manuals/dc.1.md
176210041e99SStefan Eßercp -f "$scriptdir/manuals/dc/$manpage_args.1" manuals/dc.1
17633aa99676SStefan Eßer
17643aa99676SStefan Eßermake clean > /dev/null
1765