xref: /freebsd/contrib/bc/configure.sh (revision 44d4804d1945435745518cd09eb8ae6ab22ecef4)
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
34*44d4804dSStefan Eßer. "$scriptdir/scripts/functions.sh"
353aa99676SStefan Eßer
3610328f8bSStefan Eßercd "$scriptdir"
3710328f8bSStefan Eßer
38*44d4804dSStefan Eßer# Simply prints the help message and quits based on the argument.
39*44d4804dSStefan Eßer# @param val  The value to pass to exit. Must be an integer.
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"
5510328f8bSStefan Eßer	printf '    %s [-a|-bD|-dB|-c] [-CEfgGHlmMNPtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\n' "$script"
563aa99676SStefan Eßer	printf '    %s \\\n' "$script"
5750696a6eSStefan Eßer	printf '       [--library|--bc-only --disable-dc|--dc-only --disable-bc|--coverage]  \\\n'
5850696a6eSStefan Eßer	printf '       [--force --debug --disable-extra-math --disable-generated-tests]      \\\n'
59*44d4804dSStefan Eßer	printf '       [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n'
60*44d4804dSStefan Eßer	printf '       [--install-all-locales] [--opt=OPT_LEVEL]                             \\\n'
61*44d4804dSStefan Eßer	printf '       [--karatsuba-len=KARATSUBA_LEN]                                       \\\n'
623aa99676SStefan Eßer	printf '       [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR]       \\\n'
633aa99676SStefan Eßer	printf '       [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR]             \\\n'
643aa99676SStefan Eßer	printf '\n'
6550696a6eSStefan Eßer	printf '    -a, --library\n'
66*44d4804dSStefan Eßer	printf '        Build the libbcl instead of the programs. This is meant to be used with\n'
6750696a6eSStefan Eßer	printf '        Other software like programming languages that want to make use of the\n'
6850696a6eSStefan Eßer	printf '        parsing and math capabilities. This option will install headers using\n'
6950696a6eSStefan Eßer	printf '        `make install`.\n'
703aa99676SStefan Eßer	printf '    -b, --bc-only\n'
7150696a6eSStefan Eßer	printf '        Build bc only. It is an error if "-d", "--dc-only", "-B", or\n'
7250696a6eSStefan Eßer	printf '        "--disable-bc" are specified too.\n'
733aa99676SStefan Eßer	printf '    -B, --disable-bc\n'
743aa99676SStefan Eßer	printf '        Disable bc. It is an error if "-b", "--bc-only", "-D", or "--disable-dc"\n'
753aa99676SStefan Eßer	printf '        are specified too.\n'
763aa99676SStefan Eßer	printf '    -c, --coverage\n'
77*44d4804dSStefan Eßer	printf '        Generate test coverage code. Requires gcov and gcovr.\n'
783aa99676SStefan Eßer	printf '        It is an error if either "-b" ("-D") or "-d" ("-B") is specified.\n'
793aa99676SStefan Eßer	printf '        Requires a compiler that use gcc-compatible coverage options\n'
8010328f8bSStefan Eßer	printf '    -C, --disable-clean\n'
8110328f8bSStefan Eßer	printf '        Disable the clean that configure.sh does before configure.\n'
823aa99676SStefan Eßer	printf '    -d, --dc-only\n'
8350696a6eSStefan Eßer	printf '        Build dc only. It is an error if "-b", "--bc-only", "-D", or\n'
8450696a6eSStefan Eßer	printf '        "--disable-dc" are specified too.\n'
853aa99676SStefan Eßer	printf '    -D, --disable-dc\n'
8650696a6eSStefan Eßer	printf '        Disable dc. It is an error if "-d", "--dc-only", "-B", or "--disable-bc"\n'
873aa99676SStefan Eßer	printf '        are specified too.\n'
883aa99676SStefan Eßer	printf '    -E, --disable-extra-math\n'
893aa99676SStefan Eßer	printf '        Disable extra math. This includes: "$" operator (truncate to integer),\n'
903aa99676SStefan Eßer	printf '        "@" operator (set number of decimal places), and r(x, p) (rounding\n'
913aa99676SStefan Eßer	printf '        function). Additionally, this option disables the extra printing\n'
923aa99676SStefan Eßer	printf '        functions in the math library.\n'
933aa99676SStefan Eßer	printf '    -f, --force\n'
943aa99676SStefan Eßer	printf '        Force use of all enabled options, even if they do not work. This\n'
953aa99676SStefan Eßer	printf '        option is to allow the maintainer a way to test that certain options\n'
963aa99676SStefan Eßer	printf '        are not failing invisibly. (Development only.)'
973aa99676SStefan Eßer	printf '    -g, --debug\n'
983aa99676SStefan Eßer	printf '        Build in debug mode. Adds the "-g" flag, and if there are no\n'
993aa99676SStefan Eßer	printf '        other CFLAGS, and "-O" was not given, this also adds the "-O0"\n'
1003aa99676SStefan Eßer	printf '        flag. If this flag is *not* given, "-DNDEBUG" is added to CPPFLAGS\n'
1013aa99676SStefan Eßer	printf '        and a strip flag is added to the link stage.\n'
1023aa99676SStefan Eßer	printf '    -G, --disable-generated-tests\n'
1033aa99676SStefan Eßer	printf '        Disable generating tests. This is for platforms that do not have a\n'
1043aa99676SStefan Eßer	printf '        GNU bc-compatible bc to generate tests.\n'
1053aa99676SStefan Eßer	printf '    -h, --help\n'
1063aa99676SStefan Eßer	printf '        Print this help message and exit.\n'
1073aa99676SStefan Eßer	printf '    -H, --disable-history\n'
1083aa99676SStefan Eßer	printf '        Disable history.\n'
1093aa99676SStefan Eßer	printf '    -k KARATSUBA_LEN, --karatsuba-len KARATSUBA_LEN\n'
1103aa99676SStefan Eßer	printf '        Set the karatsuba length to KARATSUBA_LEN (default is 64).\n'
1113aa99676SStefan Eßer	printf '        It is an error if KARATSUBA_LEN is not a number or is less than 16.\n'
112cf7becd2SStefan Eßer	printf '    -l, --install-all-locales\n'
113cf7becd2SStefan Eßer	printf '        Installs all locales, regardless of how many are on the system. This\n'
114cf7becd2SStefan Eßer	printf '        option is useful for package maintainers who want to make sure that\n'
115cf7becd2SStefan Eßer	printf '        a package contains all of the locales that end users might need.\n'
11610328f8bSStefan Eßer	printf '    -m, --enable-memcheck\n'
11710328f8bSStefan Eßer	printf '        Enable memcheck mode, to ensure no memory leaks. For development only.\n'
1183aa99676SStefan Eßer	printf '    -M, --disable-man-pages\n'
1193aa99676SStefan Eßer	printf '        Disable installing manpages.\n'
1203aa99676SStefan Eßer	printf '    -N, --disable-nls\n'
1213aa99676SStefan Eßer	printf '        Disable POSIX locale (NLS) support.\n'
1223aa99676SStefan Eßer	printf '    -O OPT_LEVEL, --opt OPT_LEVEL\n'
1233aa99676SStefan Eßer	printf '        Set the optimization level. This can also be included in the CFLAGS,\n'
1243aa99676SStefan Eßer	printf '        but it is provided, so maintainers can build optimized debug builds.\n'
1253aa99676SStefan Eßer	printf '        This is passed through to the compiler, so it must be supported.\n'
126*44d4804dSStefan Eßer	printf '    -s SETTING, --set-default-on SETTING\n'
127*44d4804dSStefan Eßer	printf '        Set the default named by SETTING to on. See below for possible values\n'
128*44d4804dSStefan Eßer	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
129*44d4804dSStefan Eßer	printf '        setting, the last one is used.\n'
130*44d4804dSStefan Eßer	printf '    -S SETTING, --set-default-off SETTING\n'
131*44d4804dSStefan Eßer	printf '        Set the default named by SETTING to off. See below for possible values\n'
132*44d4804dSStefan Eßer	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
133*44d4804dSStefan Eßer	printf '        setting, the last one is used.\n'
13410328f8bSStefan Eßer	printf '    -t, --enable-test-timing\n'
13510328f8bSStefan Eßer	printf '        Enable the timing of tests. This is for development only.\n'
1363aa99676SStefan Eßer	printf '    -T, --disable-strip\n'
1373aa99676SStefan Eßer	printf '        Disable stripping symbols from the compiled binary or binaries.\n'
1383aa99676SStefan Eßer	printf '        Stripping symbols only happens when debug mode is off.\n'
13910328f8bSStefan Eßer	printf '    -v, --enable-valgrind\n'
14010328f8bSStefan Eßer	printf '        Enable a build appropriate for valgrind. For development only.\n'
14110328f8bSStefan Eßer	printf '    -z, --enable-fuzz-mode\n'
14210328f8bSStefan Eßer	printf '        Enable fuzzing mode. THIS IS FOR DEVELOPMENT ONLY.\n'
1433aa99676SStefan Eßer	printf '    --prefix PREFIX\n'
1443aa99676SStefan Eßer	printf '        The prefix to install to. Overrides "$PREFIX" if it exists.\n'
1453aa99676SStefan Eßer	printf '        If PREFIX is "/usr", install path will be "/usr/bin".\n'
1463aa99676SStefan Eßer	printf '        Default is "/usr/local".\n'
1473aa99676SStefan Eßer	printf '    --bindir BINDIR\n'
14850696a6eSStefan Eßer	printf '        The directory to install binaries in. Overrides "$BINDIR" if it exists.\n'
1493aa99676SStefan Eßer	printf '        Default is "$PREFIX/bin".\n'
15050696a6eSStefan Eßer	printf '    --includedir INCLUDEDIR\n'
15150696a6eSStefan Eßer	printf '        The directory to install headers in. Overrides "$INCLUDEDIR" if it\n'
15250696a6eSStefan Eßer	printf '        exists. Default is "$PREFIX/include".\n'
15350696a6eSStefan Eßer	printf '    --libdir LIBDIR\n'
15450696a6eSStefan Eßer	printf '        The directory to install libraries in. Overrides "$LIBDIR" if it exists.\n'
15550696a6eSStefan Eßer	printf '        Default is "$PREFIX/lib".\n'
1563aa99676SStefan Eßer	printf '    --datarootdir DATAROOTDIR\n'
1573aa99676SStefan Eßer	printf '        The root location for data files. Overrides "$DATAROOTDIR" if it exists.\n'
1583aa99676SStefan Eßer	printf '        Default is "$PREFIX/share".\n'
1593aa99676SStefan Eßer	printf '    --datadir DATADIR\n'
1603aa99676SStefan Eßer	printf '        The location for data files. Overrides "$DATADIR" if it exists.\n'
1613aa99676SStefan Eßer	printf '        Default is "$DATAROOTDIR".\n'
1623aa99676SStefan Eßer	printf '    --mandir MANDIR\n'
1633aa99676SStefan Eßer	printf '        The location to install manpages to. Overrides "$MANDIR" if it exists.\n'
1643aa99676SStefan Eßer	printf '        Default is "$DATADIR/man".\n'
1653aa99676SStefan Eßer	printf '    --man1dir MAN1DIR\n'
1663aa99676SStefan Eßer	printf '        The location to install Section 1 manpages to. Overrides "$MAN1DIR" if\n'
1673aa99676SStefan Eßer	printf '        it exists. Default is "$MANDIR/man1".\n'
16850696a6eSStefan Eßer	printf '    --man3dir MAN3DIR\n'
16950696a6eSStefan Eßer	printf '        The location to install Section 3 manpages to. Overrides "$MAN3DIR" if\n'
17050696a6eSStefan Eßer	printf '        it exists. Default is "$MANDIR/man3".\n'
1713aa99676SStefan Eßer	printf '\n'
1723aa99676SStefan Eßer	printf 'In addition, the following environment variables are used:\n'
1733aa99676SStefan Eßer	printf '\n'
1743aa99676SStefan Eßer	printf '    CC           C compiler. Must be compatible with POSIX c99. If there is a\n'
1753aa99676SStefan Eßer	printf '                 space in the basename of the compiler, the items after the\n'
1763aa99676SStefan Eßer	printf '                 first space are assumed to be compiler flags, and in that case,\n'
1773aa99676SStefan Eßer	printf '                 the flags are automatically moved into CFLAGS. Default is\n'
1783aa99676SStefan Eßer	printf '                 "c99".\n'
1793aa99676SStefan Eßer	printf '    HOSTCC       Host C compiler. Must be compatible with POSIX c99. If there is\n'
1803aa99676SStefan Eßer	printf '                 a space in the basename of the compiler, the items after the\n'
1813aa99676SStefan Eßer	printf '                 first space are assumed to be compiler flags, and in the case,\n'
1823aa99676SStefan Eßer	printf '                 the flags are automatically moved into HOSTCFLAGS. Default is\n'
1833aa99676SStefan Eßer	printf '                 "$CC".\n'
1843aa99676SStefan Eßer	printf '    HOST_CC      Same as HOSTCC. If HOSTCC also exists, it is used.\n'
1853aa99676SStefan Eßer	printf '    CFLAGS       C compiler flags.\n'
1863aa99676SStefan Eßer	printf '    HOSTCFLAGS   CFLAGS for HOSTCC. Default is "$CFLAGS".\n'
1873aa99676SStefan Eßer	printf '    HOST_CFLAGS  Same as HOST_CFLAGS. If HOST_CFLAGS also exists, it is used.\n'
1883aa99676SStefan Eßer	printf '    CPPFLAGS     C preprocessor flags. Default is "".\n'
1893aa99676SStefan Eßer	printf '    LDFLAGS      Linker flags. Default is "".\n'
1903aa99676SStefan Eßer	printf '    PREFIX       The prefix to install to. Default is "/usr/local".\n'
1913aa99676SStefan Eßer	printf '                 If PREFIX is "/usr", install path will be "/usr/bin".\n'
19250696a6eSStefan Eßer	printf '    BINDIR       The directory to install binaries in. Default is "$PREFIX/bin".\n'
19350696a6eSStefan Eßer	printf '    INCLUDEDIR   The directory to install header files in. Default is\n'
19450696a6eSStefan Eßer	printf '                 "$PREFIX/include".\n'
19550696a6eSStefan Eßer	printf '    LIBDIR       The directory to install libraries in. Default is\n'
19650696a6eSStefan Eßer	printf '                 "$PREFIX/lib".\n'
1973aa99676SStefan Eßer	printf '    DATAROOTDIR  The root location for data files. Default is "$PREFIX/share".\n'
1983aa99676SStefan Eßer	printf '    DATADIR      The location for data files. Default is "$DATAROOTDIR".\n'
1993aa99676SStefan Eßer	printf '    MANDIR       The location to install manpages to. Default is "$DATADIR/man".\n'
2003aa99676SStefan Eßer	printf '    MAN1DIR      The location to install Section 1 manpages to. Default is\n'
2013aa99676SStefan Eßer	printf '                 "$MANDIR/man1".\n'
20250696a6eSStefan Eßer	printf '    MAN3DIR      The location to install Section 3 manpages to. Default is\n'
20350696a6eSStefan Eßer	printf '                 "$MANDIR/man3".\n'
2043aa99676SStefan Eßer	printf '    NLSPATH      The location to install locale catalogs to. Must be an absolute\n'
2053aa99676SStefan Eßer	printf '                 path (or contain one). This is treated the same as the POSIX\n'
2063aa99676SStefan Eßer	printf '                 definition of $NLSPATH (see POSIX environment variables for\n'
2073aa99676SStefan Eßer	printf '                 more information). Default is "/usr/share/locale/%%L/%%N".\n'
2083aa99676SStefan Eßer	printf '    EXECSUFFIX   The suffix to append to the executable names, used to not\n'
2093aa99676SStefan Eßer	printf '                 interfere with other installed bc executables. Default is "".\n'
2103aa99676SStefan Eßer	printf '    EXECPREFIX   The prefix to append to the executable names, used to not\n'
2113aa99676SStefan Eßer	printf '                 interfere with other installed bc executables. Default is "".\n'
2123aa99676SStefan Eßer	printf '    DESTDIR      For package creation. Default is "". If it is empty when\n'
2133aa99676SStefan Eßer	printf '                 `%s` is run, it can also be passed to `make install`\n' "$script"
2143aa99676SStefan Eßer	printf '                 later as an environment variable. If both are specified,\n'
2153aa99676SStefan Eßer	printf '                 the one given to `%s` takes precedence.\n' "$script"
2163aa99676SStefan Eßer	printf '    LONG_BIT     The number of bits in a C `long` type. This is mostly for the\n'
2173aa99676SStefan Eßer	printf '                 embedded space since this `bc` uses `long`s internally for\n'
2183aa99676SStefan Eßer	printf '                 overflow checking. In C99, a `long` is required to be 32 bits.\n'
2193aa99676SStefan Eßer	printf '                 For most normal desktop systems, setting this is unnecessary,\n'
2203aa99676SStefan Eßer	printf '                 except that 32-bit platforms with 64-bit longs may want to set\n'
2213aa99676SStefan Eßer	printf '                 it to `32`. Default is the default of `LONG_BIT` for the target\n'
2223aa99676SStefan Eßer	printf '                 platform. Minimum allowed is `32`. It is a build time error if\n'
2233aa99676SStefan Eßer	printf '                 the specified value of `LONG_BIT` is greater than the default\n'
2243aa99676SStefan Eßer	printf '                 value of `LONG_BIT` for the target platform.\n'
2253aa99676SStefan Eßer	printf '    GEN_HOST     Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to\n'
2263aa99676SStefan Eßer	printf '                 produce the C files that contain the help texts as well as the\n'
2273aa99676SStefan Eßer	printf '                 math libraries. By default, `gen/strgen.c` is used, compiled by\n'
2283aa99676SStefan Eßer	printf '                 "$HOSTCC" and run on the host machine. Using `gen/strgen.sh`\n'
2293aa99676SStefan Eßer	printf '                 removes the need to compile and run an executable on the host\n'
2303aa99676SStefan Eßer	printf '                 machine since `gen/strgen.sh` is a POSIX shell script. However,\n'
2313aa99676SStefan Eßer	printf '                 `gen/lib2.bc` is perilously close to 4095 characters, the max\n'
2323aa99676SStefan Eßer	printf '                 supported length of a string literal in C99 (and it could be\n'
2333aa99676SStefan Eßer	printf '                 added to in the future), and `gen/strgen.sh` generates a string\n'
2343aa99676SStefan Eßer	printf '                 literal instead of an array, as `gen/strgen.c` does. For most\n'
2353aa99676SStefan Eßer	printf '                 production-ready compilers, this limit probably is not\n'
2363aa99676SStefan Eßer	printf '                 enforced, but it could be. Both options are still available for\n'
2373aa99676SStefan Eßer	printf '                 this reason. If you are sure your compiler does not have the\n'
2383aa99676SStefan Eßer	printf '                 limit and do not want to compile and run a binary on the host\n'
2393aa99676SStefan Eßer	printf '                 machine, set this variable to "0". Any other value, or a\n'
2403aa99676SStefan Eßer	printf '                 non-existent value, will cause the build system to compile and\n'
2413aa99676SStefan Eßer	printf '                 run `gen/strgen.c`. Default is "".\n'
2423aa99676SStefan Eßer	printf '    GEN_EMU      Emulator to run string generator code under (leave empty if not\n'
2433aa99676SStefan Eßer	printf '                 necessary). This is not necessary when using `gen/strgen.sh`.\n'
2443aa99676SStefan Eßer	printf '                 Default is "".\n'
2453aa99676SStefan Eßer	printf '\n'
2463aa99676SStefan Eßer	printf 'WARNING: even though `configure.sh` supports both option types, short and\n'
2473aa99676SStefan Eßer	printf 'long, it does not support handling both at the same time. Use only one type.\n'
248*44d4804dSStefan Eßer	printf '\n'
249*44d4804dSStefan Eßer	printf 'Settings\n'
250*44d4804dSStefan Eßer	printf '========\n'
251*44d4804dSStefan Eßer	printf '\n'
252*44d4804dSStefan Eßer	printf 'bc and dc have some settings that, while they cannot be removed by build time\n'
253*44d4804dSStefan Eßer	printf 'options, can have their defaults changed at build time by packagers. Users are\n'
254*44d4804dSStefan Eßer	printf 'also able to change each setting with environment variables.\n'
255*44d4804dSStefan Eßer	printf '\n'
256*44d4804dSStefan Eßer	printf 'The following is a table of settings, along with their default values and the\n'
257*44d4804dSStefan Eßer	printf 'environment variables users can use to change them. (For the defaults, non-zero\n'
258*44d4804dSStefan Eßer	printf 'means on, and zero means off.)\n'
259*44d4804dSStefan Eßer	printf '\n'
260*44d4804dSStefan Eßer	printf '| Setting         | Description          | Default      | Env Variable         |\n'
261*44d4804dSStefan Eßer	printf '| =============== | ==================== | ============ | ==================== |\n'
262*44d4804dSStefan Eßer	printf '| bc.banner       | Whether to display   |            0 | BC_BANNER            |\n'
263*44d4804dSStefan Eßer	printf '|                 | the bc version       |              |                      |\n'
264*44d4804dSStefan Eßer	printf '|                 | banner when in       |              |                      |\n'
265*44d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
266*44d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
267*44d4804dSStefan Eßer	printf '| bc.sigint_reset | Whether SIGINT will  |            1 | BC_SIGINT_RESET      |\n'
268*44d4804dSStefan Eßer	printf '|                 | reset bc, instead of |              |                      |\n'
269*44d4804dSStefan Eßer	printf '|                 | exiting, when in     |              |                      |\n'
270*44d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
271*44d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
272*44d4804dSStefan Eßer	printf '| dc.sigint_reset | Whether SIGINT will  |            1 | DC_SIGINT_RESET      |\n'
273*44d4804dSStefan Eßer	printf '|                 | reset dc, instead of |              |                      |\n'
274*44d4804dSStefan Eßer	printf '|                 | exiting, when in     |              |                      |\n'
275*44d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
276*44d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
277*44d4804dSStefan Eßer	printf '| bc.tty_mode     | Whether TTY mode for |            1 | BC_TTY_MODE          |\n'
278*44d4804dSStefan Eßer	printf '|                 | bc should be on when |              |                      |\n'
279*44d4804dSStefan Eßer	printf '|                 | available.           |              |                      |\n'
280*44d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
281*44d4804dSStefan Eßer	printf '| dc.tty_mode     | Whether TTY mode for |            0 | BC_TTY_MODE          |\n'
282*44d4804dSStefan Eßer	printf '|                 | dc should be on when |              |                      |\n'
283*44d4804dSStefan Eßer	printf '|                 | available.           |              |                      |\n'
284*44d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
285*44d4804dSStefan Eßer	printf '| bc.prompt       | Whether the prompt   | $BC_TTY_MODE | BC_PROMPT            |\n'
286*44d4804dSStefan Eßer	printf '|                 | for bc should be on  |              |                      |\n'
287*44d4804dSStefan Eßer	printf '|                 | in tty mode.         |              |                      |\n'
288*44d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
289*44d4804dSStefan Eßer	printf '| dc.prompt       | Whether the prompt   | $DC_TTY_MODE | DC_PROMPT            |\n'
290*44d4804dSStefan Eßer	printf '|                 | for dc should be on  |              |                      |\n'
291*44d4804dSStefan Eßer	printf '|                 | in tty mode.         |              |                      |\n'
292*44d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
293*44d4804dSStefan Eßer	printf '\n'
294*44d4804dSStefan Eßer	printf 'These settings are not meant to be changed on a whim. They are meant to ensure\n'
295*44d4804dSStefan Eßer	printf 'that this bc and dc will conform to the expectations of the user on each\n'
296*44d4804dSStefan Eßer	printf 'platform.\n'
2973aa99676SStefan Eßer
2983aa99676SStefan Eßer	exit "$_usage_val"
2993aa99676SStefan Eßer}
3003aa99676SStefan Eßer
301*44d4804dSStefan Eßer# Replaces a file extension in a filename. This is used mostly to turn filenames
302*44d4804dSStefan Eßer# like `src/num.c` into `src/num.o`. In other words, it helps to link targets to
303*44d4804dSStefan Eßer# the files they depend on.
304*44d4804dSStefan Eßer#
305*44d4804dSStefan Eßer# @param file  The filename.
306*44d4804dSStefan Eßer# @param ext1  The extension to replace.
307*44d4804dSStefan Eßer# @param ext2  The new extension.
3083aa99676SStefan Eßerreplace_ext() {
3093aa99676SStefan Eßer
3103aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3113aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3123aa99676SStefan Eßer	fi
3133aa99676SStefan Eßer
3143aa99676SStefan Eßer	_replace_ext_file="$1"
3153aa99676SStefan Eßer	_replace_ext_ext1="$2"
3163aa99676SStefan Eßer	_replace_ext_ext2="$3"
3173aa99676SStefan Eßer
3189a995fe1SStefan Eßer	_replace_ext_result="${_replace_ext_file%.$_replace_ext_ext1}.$_replace_ext_ext2"
3193aa99676SStefan Eßer
3203aa99676SStefan Eßer	printf '%s\n' "$_replace_ext_result"
3213aa99676SStefan Eßer}
3223aa99676SStefan Eßer
323*44d4804dSStefan Eßer# Replaces a file extension in every filename given in a list. The list is just
324*44d4804dSStefan Eßer# a space-separated list of words, so filenames are expected to *not* have
325*44d4804dSStefan Eßer# spaces in them. See the documentation for `replace_ext()`.
326*44d4804dSStefan Eßer#
327*44d4804dSStefan Eßer# @param files  The list of space-separated filenames to replace extensions for.
328*44d4804dSStefan Eßer# @param ext1   The extension to replace.
329*44d4804dSStefan Eßer# @param ext2   The new extension.
3303aa99676SStefan Eßerreplace_exts() {
3313aa99676SStefan Eßer
3323aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3333aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3343aa99676SStefan Eßer	fi
3353aa99676SStefan Eßer
3363aa99676SStefan Eßer	_replace_exts_files="$1"
3373aa99676SStefan Eßer	_replace_exts_ext1="$2"
3383aa99676SStefan Eßer	_replace_exts_ext2="$3"
3393aa99676SStefan Eßer
3403aa99676SStefan Eßer	for _replace_exts_file in $_replace_exts_files; do
3413aa99676SStefan Eßer		_replace_exts_new_name=$(replace_ext "$_replace_exts_file" "$_replace_exts_ext1" "$_replace_exts_ext2")
3423aa99676SStefan Eßer		_replace_exts_result="$_replace_exts_result $_replace_exts_new_name"
3433aa99676SStefan Eßer	done
3443aa99676SStefan Eßer
3453aa99676SStefan Eßer	printf '%s\n' "$_replace_exts_result"
3463aa99676SStefan Eßer}
3473aa99676SStefan Eßer
348*44d4804dSStefan Eßer# Finds a placeholder in @a str and replaces it. This is the workhorse of
349*44d4804dSStefan Eßer# configure.sh. It's what replaces placeholders in Makefile.in with the data
350*44d4804dSStefan Eßer# needed for the chosen build. Below, you will see a lot of calls to this
351*44d4804dSStefan Eßer# function.
352*44d4804dSStefan Eßer#
353*44d4804dSStefan Eßer# Note that needle can never contain an exclamation point. For more information,
354*44d4804dSStefan Eßer# see substring_replace() in scripts/functions.sh.
355*44d4804dSStefan Eßer#
356*44d4804dSStefan Eßer# @param str          The string to find and replace placeholders in.
357*44d4804dSStefan Eßer# @param needle       The placeholder name.
358*44d4804dSStefan Eßer# @param replacement  The string to use to replace the placeholder.
3593aa99676SStefan Eßerreplace() {
3603aa99676SStefan Eßer
3613aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3623aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3633aa99676SStefan Eßer	fi
3643aa99676SStefan Eßer
3653aa99676SStefan Eßer	_replace_str="$1"
3663aa99676SStefan Eßer	_replace_needle="$2"
3673aa99676SStefan Eßer	_replace_replacement="$3"
3683aa99676SStefan Eßer
3693aa99676SStefan Eßer	substring_replace "$_replace_str" "%%$_replace_needle%%" "$_replace_replacement"
3703aa99676SStefan Eßer}
3713aa99676SStefan Eßer
372*44d4804dSStefan Eßer# This function finds all the source files that need to be built. If there is
373*44d4804dSStefan Eßer# only one argument and it is empty, then all source files are built. Otherwise,
374*44d4804dSStefan Eßer# the arguments are all assumed to be source files that should *not* be built.
37510328f8bSStefan Eßerfind_src_files() {
37610328f8bSStefan Eßer
37710328f8bSStefan Eßer	if [ "$#" -ge 1 ] && [ "$1" != "" ]; then
37810328f8bSStefan Eßer
37910328f8bSStefan Eßer		while [ "$#" -ge 1 ]; do
38010328f8bSStefan Eßer			_find_src_files_a="${1## }"
38110328f8bSStefan Eßer			shift
38210328f8bSStefan Eßer			_find_src_files_args="$_find_src_files_args ! -path src/${_find_src_files_a}"
38310328f8bSStefan Eßer		done
38410328f8bSStefan Eßer
38510328f8bSStefan Eßer	else
38610328f8bSStefan Eßer		_find_src_files_args="-print"
38710328f8bSStefan Eßer	fi
38810328f8bSStefan Eßer
38910328f8bSStefan Eßer	printf '%s\n' $(find src/ -depth -name "*.c" $_find_src_files_args)
39010328f8bSStefan Eßer}
39110328f8bSStefan Eßer
392*44d4804dSStefan Eßer# This function generates a list of files to go into the Makefile. It generates
393*44d4804dSStefan Eßer# the list of object files, as well as the list of test coverage files.
394*44d4804dSStefan Eßer#
395*44d4804dSStefan Eßer# @param contents  The contents of the Makefile template to put the list of
396*44d4804dSStefan Eßer#                  files into.
39750696a6eSStefan Eßergen_file_list() {
3983aa99676SStefan Eßer
39950696a6eSStefan Eßer	if [ "$#" -lt 1 ]; then
4003aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
4013aa99676SStefan Eßer	fi
4023aa99676SStefan Eßer
40350696a6eSStefan Eßer	_gen_file_list_contents="$1"
4043aa99676SStefan Eßer	shift
4053aa99676SStefan Eßer
40650696a6eSStefan Eßer	p=$(pwd)
40750696a6eSStefan Eßer
40850696a6eSStefan Eßer	cd "$scriptdir"
40950696a6eSStefan Eßer
41050696a6eSStefan Eßer	if [ "$#" -ge 1 ]; then
41110328f8bSStefan Eßer		_gen_file_list_unneeded="$@"
4123aa99676SStefan Eßer	else
41310328f8bSStefan Eßer		_gen_file_list_unneeded=""
4143aa99676SStefan Eßer	fi
4153aa99676SStefan Eßer
41650696a6eSStefan Eßer	_gen_file_list_needle_src="SRC"
41750696a6eSStefan Eßer	_gen_file_list_needle_obj="OBJ"
41850696a6eSStefan Eßer	_gen_file_list_needle_gcda="GCDA"
41950696a6eSStefan Eßer	_gen_file_list_needle_gcno="GCNO"
42050696a6eSStefan Eßer
42110328f8bSStefan Eßer	_gen_file_list_replacement=$(find_src_files $_gen_file_list_unneeded | tr '\n' ' ')
42250696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
42350696a6eSStefan Eßer		"$_gen_file_list_needle_src" "$_gen_file_list_replacement")
42450696a6eSStefan Eßer
42550696a6eSStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "c" "o")
42650696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
42750696a6eSStefan Eßer		"$_gen_file_list_needle_obj" "$_gen_file_list_replacement")
42850696a6eSStefan Eßer
42950696a6eSStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "o" "gcda")
43050696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
43150696a6eSStefan Eßer		"$_gen_file_list_needle_gcda" "$_gen_file_list_replacement")
43250696a6eSStefan Eßer
43350696a6eSStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "gcda" "gcno")
43450696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
43550696a6eSStefan Eßer		"$_gen_file_list_needle_gcno" "$_gen_file_list_replacement")
43650696a6eSStefan Eßer
43750696a6eSStefan Eßer	cd "$p"
43850696a6eSStefan Eßer
43950696a6eSStefan Eßer	printf '%s\n' "$_gen_file_list_contents"
4403aa99676SStefan Eßer}
4413aa99676SStefan Eßer
442*44d4804dSStefan Eßer# Generates the proper test targets for each test to have its own target. This
443*44d4804dSStefan Eßer# allows `make test` to run in parallel.
444*44d4804dSStefan Eßer#
445*44d4804dSStefan Eßer# @param name        Which calculator to generate tests for.
446*44d4804dSStefan Eßer# @param extra_math  An integer that, if non-zero, activates extra math tests.
447*44d4804dSStefan Eßer# @param time_tests  An integer that, if non-zero, tells the test suite to time
448*44d4804dSStefan Eßer#                    the execution of each test.
44910328f8bSStefan Eßergen_tests() {
45010328f8bSStefan Eßer
45110328f8bSStefan Eßer	_gen_tests_name="$1"
45210328f8bSStefan Eßer	shift
45310328f8bSStefan Eßer
45410328f8bSStefan Eßer	_gen_tests_extra_math="$1"
45510328f8bSStefan Eßer	shift
45610328f8bSStefan Eßer
45710328f8bSStefan Eßer	_gen_tests_time_tests="$1"
45810328f8bSStefan Eßer	shift
45910328f8bSStefan Eßer
460*44d4804dSStefan Eßer	_gen_tests_extra_required=$(cat "$scriptdir/tests/extra_required.txt")
46110328f8bSStefan Eßer
46210328f8bSStefan Eßer	for _gen_tests_t in $(cat "$scriptdir/tests/$_gen_tests_name/all.txt"); do
46310328f8bSStefan Eßer
46410328f8bSStefan Eßer		if [ "$_gen_tests_extra_math" -eq 0 ]; then
46510328f8bSStefan Eßer
46610328f8bSStefan Eßer			if [ -z "${_gen_tests_extra_required##*$_gen_tests_t*}" ]; then
46710328f8bSStefan Eßer				printf 'test_%s_%s:\n\t@printf "Skipping %s %s\\n"\n\n' \
46810328f8bSStefan Eßer					"$_gen_tests_name" "$_gen_tests_t" "$_gen_tests_name" \
46910328f8bSStefan Eßer					"$_gen_tests_t" >> "$scriptdir/Makefile"
47010328f8bSStefan Eßer				continue
47110328f8bSStefan Eßer			fi
47210328f8bSStefan Eßer
47310328f8bSStefan Eßer		fi
47410328f8bSStefan Eßer
47510328f8bSStefan Eßer		printf 'test_%s_%s:\n\t@sh tests/test.sh %s %s %s %s %s\n\n' \
47610328f8bSStefan Eßer			"$_gen_tests_name" "$_gen_tests_t" "$_gen_tests_name" \
47710328f8bSStefan Eßer			"$_gen_tests_t" "$generate_tests" "$time_tests" \
47810328f8bSStefan Eßer			"$*" >> "$scriptdir/Makefile"
47910328f8bSStefan Eßer
48010328f8bSStefan Eßer	done
48110328f8bSStefan Eßer}
48210328f8bSStefan Eßer
483*44d4804dSStefan Eßer# Generates a list of test targets that will be used as prerequisites for other
484*44d4804dSStefan Eßer# targets.
485*44d4804dSStefan Eßer#
486*44d4804dSStefan Eßer# @param name  The name of the calculator to generate test targets for.
48710328f8bSStefan Eßergen_test_targets() {
48810328f8bSStefan Eßer
48910328f8bSStefan Eßer	_gen_test_targets_name="$1"
49010328f8bSStefan Eßer	shift
49110328f8bSStefan Eßer
49210328f8bSStefan Eßer	_gen_test_targets_tests=$(cat "$scriptdir/tests/${_gen_test_targets_name}/all.txt")
49310328f8bSStefan Eßer
49410328f8bSStefan Eßer	for _gen_test_targets_t in $_gen_test_targets_tests; do
49510328f8bSStefan Eßer		printf ' test_%s_%s' "$_gen_test_targets_name" "$_gen_test_targets_t"
49610328f8bSStefan Eßer	done
49710328f8bSStefan Eßer
49810328f8bSStefan Eßer	printf '\n'
49910328f8bSStefan Eßer}
50010328f8bSStefan Eßer
501*44d4804dSStefan Eßer# Generates the proper script test targets for each script test to have its own
502*44d4804dSStefan Eßer# target. This allows `make test` to run in parallel.
503*44d4804dSStefan Eßer#
504*44d4804dSStefan Eßer# @param name        Which calculator to generate tests for.
505*44d4804dSStefan Eßer# @param extra_math  An integer that, if non-zero, activates extra math tests.
506*44d4804dSStefan Eßer# @param generate    An integer that, if non-zero, activates generated tests.
507*44d4804dSStefan Eßer# @param time_tests  An integer that, if non-zero, tells the test suite to time
508*44d4804dSStefan Eßer#                    the execution of each test.
50910328f8bSStefan Eßergen_script_tests() {
51010328f8bSStefan Eßer
51110328f8bSStefan Eßer	_gen_script_tests_name="$1"
51210328f8bSStefan Eßer	shift
51310328f8bSStefan Eßer
51410328f8bSStefan Eßer	_gen_script_tests_extra_math="$1"
51510328f8bSStefan Eßer	shift
51610328f8bSStefan Eßer
51710328f8bSStefan Eßer	_gen_script_tests_generate="$1"
51810328f8bSStefan Eßer	shift
51910328f8bSStefan Eßer
52010328f8bSStefan Eßer	_gen_script_tests_time="$1"
52110328f8bSStefan Eßer	shift
52210328f8bSStefan Eßer
52310328f8bSStefan Eßer	_gen_script_tests_tests=$(cat "$scriptdir/tests/$_gen_script_tests_name/scripts/all.txt")
52410328f8bSStefan Eßer
52510328f8bSStefan Eßer	for _gen_script_tests_f in $_gen_script_tests_tests; do
52610328f8bSStefan Eßer
52710328f8bSStefan Eßer		_gen_script_tests_b=$(basename "$_gen_script_tests_f" ".${_gen_script_tests_name}")
52810328f8bSStefan Eßer
52910328f8bSStefan Eßer		printf 'test_%s_script_%s:\n\t@sh tests/script.sh %s %s %s 1 %s %s %s\n\n' \
53010328f8bSStefan Eßer			"$_gen_script_tests_name" "$_gen_script_tests_b" "$_gen_script_tests_name" \
53110328f8bSStefan Eßer			"$_gen_script_tests_f" "$_gen_script_tests_extra_math" "$_gen_script_tests_generate" \
53210328f8bSStefan Eßer			"$_gen_script_tests_time" "$*" >> "$scriptdir/Makefile"
53310328f8bSStefan Eßer	done
53410328f8bSStefan Eßer}
53510328f8bSStefan Eßer
536*44d4804dSStefan Eßerset_default() {
537*44d4804dSStefan Eßer
538*44d4804dSStefan Eßer	_set_default_on="$1"
539*44d4804dSStefan Eßer	shift
540*44d4804dSStefan Eßer
541*44d4804dSStefan Eßer	_set_default_name="$1"
542*44d4804dSStefan Eßer	shift
543*44d4804dSStefan Eßer
544*44d4804dSStefan Eßer	# The reason that the variables that are being set do not have the same
545*44d4804dSStefan Eßer	# non-collision avoidance that the other variables do is that we *do* want
546*44d4804dSStefan Eßer	# the settings of these variables to leak out of the function. They adjust
547*44d4804dSStefan Eßer	# the settings outside of the function.
548*44d4804dSStefan Eßer	case "$_set_default_name" in
549*44d4804dSStefan Eßer
550*44d4804dSStefan Eßer		bc.banner) bc_default_banner="$_set_default_on" ;;
551*44d4804dSStefan Eßer		bc.sigint_reset) bc_default_sigint_reset="$_set_default_on" ;;
552*44d4804dSStefan Eßer		dc.sigint_reset) dc_default_sigint_reset="$_set_default_on" ;;
553*44d4804dSStefan Eßer		bc.tty_mode) bc_default_tty_mode="$_set_default_on" ;;
554*44d4804dSStefan Eßer		dc.tty_mode) dc_default_tty_mode="$_set_default_on" ;;
555*44d4804dSStefan Eßer		bc.prompt) bc_default_prompt="$_set_default_on" ;;
556*44d4804dSStefan Eßer		dc.prompt) dc_default_prompt="$_set_default_on" ;;
557*44d4804dSStefan Eßer		?) usage "Invalid setting: $_set_default_name" ;;
558*44d4804dSStefan Eßer
559*44d4804dSStefan Eßer	esac
560*44d4804dSStefan Eßer}
561*44d4804dSStefan Eßer
562*44d4804dSStefan Eßer# Generates a list of script test targets that will be used as prerequisites for
563*44d4804dSStefan Eßer# other targets.
564*44d4804dSStefan Eßer#
565*44d4804dSStefan Eßer# @param name  The name of the calculator to generate script test targets for.
56610328f8bSStefan Eßergen_script_test_targets() {
56710328f8bSStefan Eßer
56810328f8bSStefan Eßer	_gen_script_test_targets_name="$1"
56910328f8bSStefan Eßer	shift
57010328f8bSStefan Eßer
57110328f8bSStefan Eßer	_gen_script_test_targets_tests=$(cat "$scriptdir/tests/$_gen_script_test_targets_name/scripts/all.txt")
57210328f8bSStefan Eßer
57310328f8bSStefan Eßer	for _gen_script_test_targets_f in $_gen_script_test_targets_tests; do
57410328f8bSStefan Eßer		_gen_script_test_targets_b=$(basename "$_gen_script_test_targets_f" \
57510328f8bSStefan Eßer			".$_gen_script_test_targets_name")
57610328f8bSStefan Eßer		printf ' test_%s_script_%s' "$_gen_script_test_targets_name" \
57710328f8bSStefan Eßer			"$_gen_script_test_targets_b"
57810328f8bSStefan Eßer	done
57910328f8bSStefan Eßer
58010328f8bSStefan Eßer	printf '\n'
58110328f8bSStefan Eßer}
58210328f8bSStefan Eßer
583*44d4804dSStefan Eßer# This is a list of defaults, but it is also the list of possible options for
584*44d4804dSStefan Eßer# users to change.
585*44d4804dSStefan Eßer#
586*44d4804dSStefan Eßer# The development options are: force (force options even if they fail), valgrind
587*44d4804dSStefan Eßer# (build in a way suitable for valgrind testing), memcheck (same as valgrind),
588*44d4804dSStefan Eßer# and fuzzing (build in a way suitable for fuzzing).
5893aa99676SStefan Eßerbc_only=0
5903aa99676SStefan Eßerdc_only=0
5913aa99676SStefan Eßercoverage=0
5923aa99676SStefan Eßerkaratsuba_len=32
5933aa99676SStefan Eßerdebug=0
5943aa99676SStefan Eßerhist=1
5953aa99676SStefan Eßerextra_math=1
5963aa99676SStefan Eßeroptimization=""
5973aa99676SStefan Eßergenerate_tests=1
5983aa99676SStefan Eßerinstall_manpages=1
5993aa99676SStefan Eßernls=1
6003aa99676SStefan Eßerforce=0
6013aa99676SStefan Eßerstrip_bin=1
602cf7becd2SStefan Eßerall_locales=0
60350696a6eSStefan Eßerlibrary=0
60410328f8bSStefan Eßerfuzz=0
60510328f8bSStefan Eßertime_tests=0
60610328f8bSStefan Eßervg=0
60710328f8bSStefan Eßermemcheck=0
60810328f8bSStefan Eßerclean=1
6093aa99676SStefan Eßer
610*44d4804dSStefan Eßer# The empty strings are because they depend on TTY mode. If they are directly
611*44d4804dSStefan Eßer# set, though, they will be integers. We test for empty strings later.
612*44d4804dSStefan Eßerbc_default_banner=0
613*44d4804dSStefan Eßerbc_default_sigint_reset=1
614*44d4804dSStefan Eßerdc_default_sigint_reset=1
615*44d4804dSStefan Eßerbc_default_tty_mode=1
616*44d4804dSStefan Eßerdc_default_tty_mode=0
617*44d4804dSStefan Eßerbc_default_prompt=""
618*44d4804dSStefan Eßerdc_default_prompt=""
619*44d4804dSStefan Eßer
620*44d4804dSStefan Eßer# getopts is a POSIX utility, but it cannot handle long options. Thus, the
621*44d4804dSStefan Eßer# handling of long options is done by hand, and that's the reason that short and
622*44d4804dSStefan Eßer# long options cannot be mixed.
623*44d4804dSStefan Eßerwhile getopts "abBcdDEfgGhHk:lMmNO:S:s:tTvz-" opt; do
6243aa99676SStefan Eßer
6253aa99676SStefan Eßer	case "$opt" in
62650696a6eSStefan Eßer		a) library=1 ;;
6273aa99676SStefan Eßer		b) bc_only=1 ;;
6283aa99676SStefan Eßer		B) dc_only=1 ;;
6293aa99676SStefan Eßer		c) coverage=1 ;;
63010328f8bSStefan Eßer		C) clean=0 ;;
6313aa99676SStefan Eßer		d) dc_only=1 ;;
6323aa99676SStefan Eßer		D) bc_only=1 ;;
6333aa99676SStefan Eßer		E) extra_math=0 ;;
6343aa99676SStefan Eßer		f) force=1 ;;
6353aa99676SStefan Eßer		g) debug=1 ;;
6363aa99676SStefan Eßer		G) generate_tests=0 ;;
6373aa99676SStefan Eßer		h) usage ;;
6383aa99676SStefan Eßer		H) hist=0 ;;
6393aa99676SStefan Eßer		k) karatsuba_len="$OPTARG" ;;
640cf7becd2SStefan Eßer		l) all_locales=1 ;;
64110328f8bSStefan Eßer		m) memcheck=1 ;;
6423aa99676SStefan Eßer		M) install_manpages=0 ;;
6433aa99676SStefan Eßer		N) nls=0 ;;
6443aa99676SStefan Eßer		O) optimization="$OPTARG" ;;
645*44d4804dSStefan Eßer		S) set_default 0 "$OPTARG" ;;
646*44d4804dSStefan Eßer		s) set_default 1 "$OPTARG" ;;
64710328f8bSStefan Eßer		t) time_tests=1 ;;
6483aa99676SStefan Eßer		T) strip_bin=0 ;;
64910328f8bSStefan Eßer		v) vg=1 ;;
65010328f8bSStefan Eßer		z) fuzz=1 ;;
6513aa99676SStefan Eßer		-)
6523aa99676SStefan Eßer			arg="$1"
6533aa99676SStefan Eßer			arg="${arg#--}"
6543aa99676SStefan Eßer			LONG_OPTARG="${arg#*=}"
6553aa99676SStefan Eßer			case $arg in
6563aa99676SStefan Eßer				help) usage ;;
65750696a6eSStefan Eßer				library) library=1 ;;
6583aa99676SStefan Eßer				bc-only) bc_only=1 ;;
6593aa99676SStefan Eßer				dc-only) dc_only=1 ;;
6603aa99676SStefan Eßer				coverage) coverage=1 ;;
6613aa99676SStefan Eßer				debug) debug=1 ;;
6623aa99676SStefan Eßer				force) force=1 ;;
6633aa99676SStefan Eßer				prefix=?*) PREFIX="$LONG_OPTARG" ;;
6643aa99676SStefan Eßer				prefix)
6653aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
6663aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
6673aa99676SStefan Eßer					fi
6683aa99676SStefan Eßer					PREFIX="$2"
6693aa99676SStefan Eßer					shift ;;
6703aa99676SStefan Eßer				bindir=?*) BINDIR="$LONG_OPTARG" ;;
6713aa99676SStefan Eßer				bindir)
6723aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
6733aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
6743aa99676SStefan Eßer					fi
6753aa99676SStefan Eßer					BINDIR="$2"
6763aa99676SStefan Eßer					shift ;;
67750696a6eSStefan Eßer				includedir=?*) INCLUDEDIR="$LONG_OPTARG" ;;
67850696a6eSStefan Eßer				includedir)
67950696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
68050696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
68150696a6eSStefan Eßer					fi
68250696a6eSStefan Eßer					INCLUDEDIR="$2"
68350696a6eSStefan Eßer					shift ;;
68450696a6eSStefan Eßer				libdir=?*) LIBDIR="$LONG_OPTARG" ;;
68550696a6eSStefan Eßer				libdir)
68650696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
68750696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
68850696a6eSStefan Eßer					fi
68950696a6eSStefan Eßer					LIBDIR="$2"
69050696a6eSStefan Eßer					shift ;;
6913aa99676SStefan Eßer				datarootdir=?*) DATAROOTDIR="$LONG_OPTARG" ;;
6923aa99676SStefan Eßer				datarootdir)
6933aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
6943aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
6953aa99676SStefan Eßer					fi
6963aa99676SStefan Eßer					DATAROOTDIR="$2"
6973aa99676SStefan Eßer					shift ;;
6983aa99676SStefan Eßer				datadir=?*) DATADIR="$LONG_OPTARG" ;;
6993aa99676SStefan Eßer				datadir)
7003aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7013aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7023aa99676SStefan Eßer					fi
7033aa99676SStefan Eßer					DATADIR="$2"
7043aa99676SStefan Eßer					shift ;;
7053aa99676SStefan Eßer				mandir=?*) MANDIR="$LONG_OPTARG" ;;
7063aa99676SStefan Eßer				mandir)
7073aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7083aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7093aa99676SStefan Eßer					fi
7103aa99676SStefan Eßer					MANDIR="$2"
7113aa99676SStefan Eßer					shift ;;
7123aa99676SStefan Eßer				man1dir=?*) MAN1DIR="$LONG_OPTARG" ;;
7133aa99676SStefan Eßer				man1dir)
7143aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7153aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7163aa99676SStefan Eßer					fi
7173aa99676SStefan Eßer					MAN1DIR="$2"
7183aa99676SStefan Eßer					shift ;;
71950696a6eSStefan Eßer				man3dir=?*) MAN3DIR="$LONG_OPTARG" ;;
72050696a6eSStefan Eßer				man3dir)
72150696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
72250696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
72350696a6eSStefan Eßer					fi
72450696a6eSStefan Eßer					MAN3DIR="$2"
72550696a6eSStefan Eßer					shift ;;
7263aa99676SStefan Eßer				localedir=?*) LOCALEDIR="$LONG_OPTARG" ;;
7273aa99676SStefan Eßer				localedir)
7283aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7293aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7303aa99676SStefan Eßer					fi
7313aa99676SStefan Eßer					LOCALEDIR="$2"
7323aa99676SStefan Eßer					shift ;;
7333aa99676SStefan Eßer				karatsuba-len=?*) karatsuba_len="$LONG_OPTARG" ;;
7343aa99676SStefan Eßer				karatsuba-len)
7353aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7363aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7373aa99676SStefan Eßer					fi
7383aa99676SStefan Eßer					karatsuba_len="$1"
7393aa99676SStefan Eßer					shift ;;
7403aa99676SStefan Eßer				opt=?*) optimization="$LONG_OPTARG" ;;
7413aa99676SStefan Eßer				opt)
7423aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7433aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7443aa99676SStefan Eßer					fi
7453aa99676SStefan Eßer					optimization="$1"
7463aa99676SStefan Eßer					shift ;;
747*44d4804dSStefan Eßer				set-default-on=?*) set_default 1 "$LONG_OPTARG" ;;
748*44d4804dSStefan Eßer				set-default-on)
749*44d4804dSStefan Eßer					if [ "$#" -lt 2 ]; then
750*44d4804dSStefan Eßer						usage "No argument given for '--$arg' option"
751*44d4804dSStefan Eßer					fi
752*44d4804dSStefan Eßer					set_default 1 "$1"
753*44d4804dSStefan Eßer					shift ;;
754*44d4804dSStefan Eßer				set-default-off=?*) set_default 0 "$LONG_OPTARG" ;;
755*44d4804dSStefan Eßer				set-default-off)
756*44d4804dSStefan Eßer					if [ "$#" -lt 2 ]; then
757*44d4804dSStefan Eßer						usage "No argument given for '--$arg' option"
758*44d4804dSStefan Eßer					fi
759*44d4804dSStefan Eßer					set_default 0 "$1"
760*44d4804dSStefan Eßer					shift ;;
7613aa99676SStefan Eßer				disable-bc) dc_only=1 ;;
7623aa99676SStefan Eßer				disable-dc) bc_only=1 ;;
76310328f8bSStefan Eßer				disable-clean) clean=0 ;;
7643aa99676SStefan Eßer				disable-extra-math) extra_math=0 ;;
7653aa99676SStefan Eßer				disable-generated-tests) generate_tests=0 ;;
7663aa99676SStefan Eßer				disable-history) hist=0 ;;
7673aa99676SStefan Eßer				disable-man-pages) install_manpages=0 ;;
7683aa99676SStefan Eßer				disable-nls) nls=0 ;;
7693aa99676SStefan Eßer				disable-strip) strip_bin=0 ;;
77010328f8bSStefan Eßer				enable-test-timing) time_tests=1 ;;
77110328f8bSStefan Eßer				enable-valgrind) vg=1 ;;
77210328f8bSStefan Eßer				enable-fuzz-mode) fuzz=1 ;;
77310328f8bSStefan Eßer				enable-memcheck) memcheck=1 ;;
774cf7becd2SStefan Eßer				install-all-locales) all_locales=1 ;;
7753aa99676SStefan Eßer				help* | bc-only* | dc-only* | coverage* | debug*)
7763aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
77710328f8bSStefan Eßer				disable-bc* | disable-dc* | disable-clean*)
77810328f8bSStefan Eßer					usage "No arg allowed for --$arg option" ;;
77910328f8bSStefan Eßer				disable-extra-math*)
7803aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
7813aa99676SStefan Eßer				disable-generated-tests* | disable-history*)
7823aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
7833aa99676SStefan Eßer				disable-man-pages* | disable-nls* | disable-strip*)
7843aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
78510328f8bSStefan Eßer				enable-fuzz-mode* | enable-test-timing* | enable-valgrind*)
78610328f8bSStefan Eßer					usage "No arg allowed for --$arg option" ;;
78710328f8bSStefan Eßer				enable-memcheck* | install-all-locales*)
788cf7becd2SStefan Eßer					usage "No arg allowed for --$arg option" ;;
7893aa99676SStefan Eßer				'') break ;; # "--" terminates argument processing
7903aa99676SStefan Eßer				* ) usage "Invalid option $LONG_OPTARG" ;;
7913aa99676SStefan Eßer			esac
7923aa99676SStefan Eßer			shift
7933aa99676SStefan Eßer			OPTIND=1 ;;
794*44d4804dSStefan Eßer		?) usage "Invalid option: $opt" ;;
7953aa99676SStefan Eßer	esac
7963aa99676SStefan Eßer
7973aa99676SStefan Eßerdone
7983aa99676SStefan Eßer
799*44d4804dSStefan Eßer# Sometimes, developers don't want configure.sh to do a config clean. But
800*44d4804dSStefan Eßer# sometimes they do.
80110328f8bSStefan Eßerif [ "$clean" -ne 0 ]; then
80210328f8bSStefan Eßer	if [ -f ./Makefile ]; then
80310328f8bSStefan Eßer		make clean_config > /dev/null
80410328f8bSStefan Eßer	fi
80510328f8bSStefan Eßerfi
80610328f8bSStefan Eßer
807*44d4804dSStefan Eßer# It is an error to say that bc only should be built and likewise for dc.
8083aa99676SStefan Eßerif [ "$bc_only" -eq 1 ] && [ "$dc_only" -eq 1 ]; then
8093aa99676SStefan Eßer	usage "Can only specify one of -b(-D) or -d(-B)"
8103aa99676SStefan Eßerfi
8113aa99676SStefan Eßer
812*44d4804dSStefan Eßer# The library is mutually exclusive to the calculators, so it's an error to
813*44d4804dSStefan Eßer# give an option for either of them.
81450696a6eSStefan Eßerif [ "$library" -ne 0 ]; then
81550696a6eSStefan Eßer	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
81650696a6eSStefan Eßer		usage "Must not specify -b(-D) or -d(-B) when building the library"
81750696a6eSStefan Eßer	fi
81850696a6eSStefan Eßerfi
81950696a6eSStefan Eßer
820*44d4804dSStefan Eßer# KARATSUBA_LEN must be an integer and must be 16 or greater.
8213aa99676SStefan Eßercase $karatsuba_len in
8223aa99676SStefan Eßer	(*[!0-9]*|'') usage "KARATSUBA_LEN is not a number" ;;
8233aa99676SStefan Eßer	(*) ;;
8243aa99676SStefan Eßeresac
8253aa99676SStefan Eßer
8263aa99676SStefan Eßerif [ "$karatsuba_len" -lt 16 ]; then
8273aa99676SStefan Eßer	usage "KARATSUBA_LEN is less than 16"
8283aa99676SStefan Eßerfi
8293aa99676SStefan Eßer
8303aa99676SStefan Eßerset -e
8313aa99676SStefan Eßer
8323aa99676SStefan Eßerif [ -z "${LONG_BIT+set}" ]; then
8333aa99676SStefan Eßer	LONG_BIT_DEFINE=""
8343aa99676SStefan Eßerelif [ "$LONG_BIT" -lt 32 ]; then
8353aa99676SStefan Eßer	usage "LONG_BIT is less than 32"
8363aa99676SStefan Eßerelse
8373aa99676SStefan Eßer	LONG_BIT_DEFINE="-DBC_LONG_BIT=\$(BC_LONG_BIT)"
8383aa99676SStefan Eßerfi
8393aa99676SStefan Eßer
8403aa99676SStefan Eßerif [ -z "$CC" ]; then
8413aa99676SStefan Eßer	CC="c99"
8423aa99676SStefan Eßerelse
843*44d4804dSStefan Eßer
844*44d4804dSStefan Eßer	# I had users complain that, if they gave CFLAGS as part of CC, which
845*44d4804dSStefan Eßer	# autotools allows in its braindead way, the build would fail with an error.
846*44d4804dSStefan Eßer	# I don't like adjusting for autotools, but oh well. These lines puts the
847*44d4804dSStefan Eßer	# stuff after the first space into CFLAGS.
8483aa99676SStefan Eßer	ccbase=$(basename "$CC")
8493aa99676SStefan Eßer	suffix=" *"
8503aa99676SStefan Eßer	prefix="* "
8513aa99676SStefan Eßer
8523aa99676SStefan Eßer	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
8533aa99676SStefan Eßer		ccflags="${ccbase#$prefix}"
8543aa99676SStefan Eßer		cc="${ccbase%%$suffix}"
8553aa99676SStefan Eßer		ccdir=$(dirname "$CC")
8563aa99676SStefan Eßer		if [ "$ccdir" = "." ] && [ "${CC#.}" = "$CC" ]; then
8573aa99676SStefan Eßer			ccdir=""
8583aa99676SStefan Eßer		else
8593aa99676SStefan Eßer			ccdir="$ccdir/"
8603aa99676SStefan Eßer		fi
8613aa99676SStefan Eßer		CC="${ccdir}${cc}"
8623aa99676SStefan Eßer		CFLAGS="$CFLAGS $ccflags"
8633aa99676SStefan Eßer	fi
8643aa99676SStefan Eßerfi
8653aa99676SStefan Eßer
8663aa99676SStefan Eßerif [ -z "$HOSTCC" ] && [ -z "$HOST_CC" ]; then
8673aa99676SStefan Eßer	HOSTCC="$CC"
8683aa99676SStefan Eßerelif [ -z "$HOSTCC" ]; then
8693aa99676SStefan Eßer	HOSTCC="$HOST_CC"
8703aa99676SStefan Eßerfi
8713aa99676SStefan Eßer
8723aa99676SStefan Eßerif [ "$HOSTCC" != "$CC" ]; then
873*44d4804dSStefan Eßer
874*44d4804dSStefan Eßer	# Like above, this splits HOSTCC and HOSTCFLAGS.
8753aa99676SStefan Eßer	ccbase=$(basename "$HOSTCC")
8763aa99676SStefan Eßer	suffix=" *"
8773aa99676SStefan Eßer	prefix="* "
8783aa99676SStefan Eßer
8793aa99676SStefan Eßer	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
8803aa99676SStefan Eßer		ccflags="${ccbase#$prefix}"
8813aa99676SStefan Eßer		cc="${ccbase%%$suffix}"
8823aa99676SStefan Eßer		ccdir=$(dirname "$HOSTCC")
8833aa99676SStefan Eßer		if [ "$ccdir" = "." ] && [ "${HOSTCC#.}" = "$HOSTCC" ]; then
8843aa99676SStefan Eßer			ccdir=""
8853aa99676SStefan Eßer		else
8863aa99676SStefan Eßer			ccdir="$ccdir/"
8873aa99676SStefan Eßer		fi
8883aa99676SStefan Eßer		HOSTCC="${ccdir}${cc}"
8893aa99676SStefan Eßer		HOSTCFLAGS="$HOSTCFLAGS $ccflags"
8903aa99676SStefan Eßer	fi
8913aa99676SStefan Eßerfi
8923aa99676SStefan Eßer
8933aa99676SStefan Eßerif [ -z "${HOSTCFLAGS+set}" ] && [ -z "${HOST_CFLAGS+set}" ]; then
8943aa99676SStefan Eßer	HOSTCFLAGS="$CFLAGS"
8953aa99676SStefan Eßerelif [ -z "${HOSTCFLAGS+set}" ]; then
8963aa99676SStefan Eßer	HOSTCFLAGS="$HOST_CFLAGS"
8973aa99676SStefan Eßerfi
8983aa99676SStefan Eßer
899*44d4804dSStefan Eßer# Store these for the cross compilation detection later.
900*44d4804dSStefan EßerOLDCFLAGS="$CFLAGS"
901*44d4804dSStefan EßerOLDHOSTCFLAGS="$HOSTCFLAGS"
902*44d4804dSStefan Eßer
9033aa99676SStefan Eßerlink="@printf 'No link necessary\\\\n'"
9043aa99676SStefan Eßermain_exec="BC"
9053aa99676SStefan Eßerexecutable="BC_EXEC"
9063aa99676SStefan Eßer
907*44d4804dSStefan Eßertests="test_bc timeconst test_dc test_history"
90850696a6eSStefan Eßer
909*44d4804dSStefan Eßerbc_test="@tests/all.sh bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
910*44d4804dSStefan Eßerdc_test="@tests/all.sh dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
9113aa99676SStefan Eßer
9123aa99676SStefan Eßertimeconst="@tests/bc/timeconst.sh tests/bc/scripts/timeconst.bc \$(BC_EXEC)"
9133aa99676SStefan Eßer
9143aa99676SStefan Eßer# In order to have cleanup at exit, we need to be in
9153aa99676SStefan Eßer# debug mode, so don't run valgrind without that.
91610328f8bSStefan Eßerif [ "$vg" -ne 0 ]; then
91710328f8bSStefan Eßer	debug=1
91810328f8bSStefan Eßer	bc_test_exec='valgrind $(VALGRIND_ARGS) $(BC_EXEC)'
91910328f8bSStefan Eßer	dc_test_exec='valgrind $(VALGRIND_ARGS) $(DC_EXEC)'
9203aa99676SStefan Eßerelse
92110328f8bSStefan Eßer	bc_test_exec='$(BC_EXEC)'
92210328f8bSStefan Eßer	dc_test_exec='$(DC_EXEC)'
9233aa99676SStefan Eßerfi
9243aa99676SStefan Eßer
925*44d4804dSStefan Eßertest_bc_history_prereqs="test_bc_history_all"
926*44d4804dSStefan Eßertest_dc_history_prereqs="test_dc_history_all"
927*44d4804dSStefan Eßer
9283aa99676SStefan Eßerkaratsuba="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
9293aa99676SStefan Eßerkaratsuba_test="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
9303aa99676SStefan Eßer
9313aa99676SStefan Eßerbc_lib="\$(GEN_DIR)/lib.o"
9323aa99676SStefan Eßerbc_help="\$(GEN_DIR)/bc_help.o"
9333aa99676SStefan Eßerdc_help="\$(GEN_DIR)/dc_help.o"
9343aa99676SStefan Eßer
93510328f8bSStefan Eßerdefault_target_prereqs="\$(BIN) \$(OBJS)"
93610328f8bSStefan Eßerdefault_target_cmd="\$(CC) \$(CFLAGS) \$(OBJS) \$(LDFLAGS) -o \$(EXEC)"
93710328f8bSStefan Eßerdefault_target="\$(DC_EXEC)"
93810328f8bSStefan Eßer
93910328f8bSStefan Eßersecond_target_prereqs=""
94010328f8bSStefan Eßersecond_target_cmd="$default_target_cmd"
94110328f8bSStefan Eßersecond_target="\$(BC_EXEC)"
94210328f8bSStefan Eßer
943*44d4804dSStefan Eßer# This if/else if chain is for setting the defaults that change based on whether
944*44d4804dSStefan Eßer# the library is being built, bc only, dc only, or both calculators.
94510328f8bSStefan Eßerif [ "$library" -ne 0 ]; then
94610328f8bSStefan Eßer
94710328f8bSStefan Eßer	extra_math=1
94810328f8bSStefan Eßer	nls=0
94910328f8bSStefan Eßer	hist=0
95010328f8bSStefan Eßer	bc=1
95110328f8bSStefan Eßer	dc=1
95210328f8bSStefan Eßer
95310328f8bSStefan Eßer	default_target_prereqs="\$(BIN) \$(OBJ)"
95410328f8bSStefan Eßer	default_target_cmd="ar -r -cu \$(LIBBC) \$(OBJ)"
95510328f8bSStefan Eßer	default_target="\$(LIBBC)"
95610328f8bSStefan Eßer	tests="test_library"
957*44d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
958*44d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
95910328f8bSStefan Eßer
96010328f8bSStefan Eßerelif [ "$bc_only" -eq 1 ]; then
9613aa99676SStefan Eßer
9623aa99676SStefan Eßer	bc=1
9633aa99676SStefan Eßer	dc=0
9643aa99676SStefan Eßer
9653aa99676SStefan Eßer	dc_help=""
9663aa99676SStefan Eßer
9673aa99676SStefan Eßer	executables="bc"
9683aa99676SStefan Eßer
9693aa99676SStefan Eßer	dc_test="@printf 'No dc tests to run\\\\n'"
970*44d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
9713aa99676SStefan Eßer
97250696a6eSStefan Eßer	install_prereqs=" install_execs"
97350696a6eSStefan Eßer	install_man_prereqs=" install_bc_manpage"
9743aa99676SStefan Eßer	uninstall_prereqs=" uninstall_bc"
9753aa99676SStefan Eßer	uninstall_man_prereqs=" uninstall_bc_manpage"
9763aa99676SStefan Eßer
97710328f8bSStefan Eßer	default_target="\$(BC_EXEC)"
97810328f8bSStefan Eßer	second_target="\$(DC_EXEC)"
979*44d4804dSStefan Eßer	tests="test_bc timeconst test_history"
98010328f8bSStefan Eßer
9813aa99676SStefan Eßerelif [ "$dc_only" -eq 1 ]; then
9823aa99676SStefan Eßer
9833aa99676SStefan Eßer	bc=0
9843aa99676SStefan Eßer	dc=1
9853aa99676SStefan Eßer
9863aa99676SStefan Eßer	bc_lib=""
9873aa99676SStefan Eßer	bc_help=""
9883aa99676SStefan Eßer
9893aa99676SStefan Eßer	executables="dc"
9903aa99676SStefan Eßer
9913aa99676SStefan Eßer	main_exec="DC"
9923aa99676SStefan Eßer	executable="DC_EXEC"
9933aa99676SStefan Eßer
9943aa99676SStefan Eßer	bc_test="@printf 'No bc tests to run\\\\n'"
995*44d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
9963aa99676SStefan Eßer
9973aa99676SStefan Eßer	timeconst="@printf 'timeconst cannot be run because bc is not built\\\\n'"
9983aa99676SStefan Eßer
99950696a6eSStefan Eßer	install_prereqs=" install_execs"
100050696a6eSStefan Eßer	install_man_prereqs=" install_dc_manpage"
10013aa99676SStefan Eßer	uninstall_prereqs=" uninstall_dc"
10023aa99676SStefan Eßer	uninstall_man_prereqs=" uninstall_dc_manpage"
10033aa99676SStefan Eßer
1004*44d4804dSStefan Eßer	tests="test_dc test_history"
100510328f8bSStefan Eßer
10063aa99676SStefan Eßerelse
10073aa99676SStefan Eßer
10083aa99676SStefan Eßer	bc=1
10093aa99676SStefan Eßer	dc=1
10103aa99676SStefan Eßer
10113aa99676SStefan Eßer	executables="bc and dc"
10123aa99676SStefan Eßer
10133aa99676SStefan Eßer	karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)"
10143aa99676SStefan Eßer	karatsuba_test="@\$(KARATSUBA) 1 100 \$(BC_EXEC)"
10153aa99676SStefan Eßer
101650696a6eSStefan Eßer	if [ "$library" -eq 0 ]; then
101750696a6eSStefan Eßer		install_prereqs=" install_execs"
101850696a6eSStefan Eßer		install_man_prereqs=" install_bc_manpage install_dc_manpage"
10193aa99676SStefan Eßer		uninstall_prereqs=" uninstall_bc uninstall_dc"
10203aa99676SStefan Eßer		uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage"
102150696a6eSStefan Eßer	else
102250696a6eSStefan Eßer		install_prereqs=" install_library install_bcl_header"
102350696a6eSStefan Eßer		install_man_prereqs=" install_bcl_manpage"
102450696a6eSStefan Eßer		uninstall_prereqs=" uninstall_library uninstall_bcl_header"
102550696a6eSStefan Eßer		uninstall_man_prereqs=" uninstall_bcl_manpage"
102650696a6eSStefan Eßer		tests="test_library"
102750696a6eSStefan Eßer	fi
10283aa99676SStefan Eßer
102910328f8bSStefan Eßer	second_target_prereqs="$default_target_prereqs"
103010328f8bSStefan Eßer	default_target_prereqs="$second_target"
103110328f8bSStefan Eßer	default_target_cmd="\$(LINK) \$(BIN) \$(EXEC_PREFIX)\$(DC)"
103210328f8bSStefan Eßer
103310328f8bSStefan Eßerfi
103410328f8bSStefan Eßer
1035*44d4804dSStefan Eßer# We need specific stuff for fuzzing.
103610328f8bSStefan Eßerif [ "$fuzz" -ne 0 ]; then
103710328f8bSStefan Eßer	debug=1
103810328f8bSStefan Eßer	hist=0
103910328f8bSStefan Eßer	nls=0
104010328f8bSStefan Eßer	optimization="3"
10413aa99676SStefan Eßerfi
10423aa99676SStefan Eßer
1043*44d4804dSStefan Eßer# This sets some necessary things for debug mode.
10443aa99676SStefan Eßerif [ "$debug" -eq 1 ]; then
10453aa99676SStefan Eßer
10463aa99676SStefan Eßer	if [ -z "$CFLAGS" ] && [ -z "$optimization" ]; then
10473aa99676SStefan Eßer		CFLAGS="-O0"
10483aa99676SStefan Eßer	fi
10493aa99676SStefan Eßer
10503aa99676SStefan Eßer	CFLAGS="-g $CFLAGS"
10513aa99676SStefan Eßer
10523aa99676SStefan Eßerelse
1053*44d4804dSStefan Eßer
10543aa99676SStefan Eßer	CPPFLAGS="-DNDEBUG $CPPFLAGS"
1055*44d4804dSStefan Eßer
10563aa99676SStefan Eßer	if [ "$strip_bin" -ne 0 ]; then
10573aa99676SStefan Eßer		LDFLAGS="-s $LDFLAGS"
10583aa99676SStefan Eßer	fi
10593aa99676SStefan Eßerfi
10603aa99676SStefan Eßer
1061*44d4804dSStefan Eßer# Set optimization CFLAGS.
10623aa99676SStefan Eßerif [ -n "$optimization" ]; then
10633aa99676SStefan Eßer	CFLAGS="-O$optimization $CFLAGS"
10643aa99676SStefan Eßerfi
10653aa99676SStefan Eßer
1066*44d4804dSStefan Eßer# Set test coverage defaults.
10673aa99676SStefan Eßerif [ "$coverage" -eq 1 ]; then
10683aa99676SStefan Eßer
10693aa99676SStefan Eßer	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
10703aa99676SStefan Eßer		usage "Can only specify -c without -b or -d"
10713aa99676SStefan Eßer	fi
10723aa99676SStefan Eßer
10733aa99676SStefan Eßer	CFLAGS="-fprofile-arcs -ftest-coverage -g -O0 $CFLAGS"
10743aa99676SStefan Eßer	CPPFLAGS="-DNDEBUG $CPPFLAGS"
10753aa99676SStefan Eßer
10763aa99676SStefan Eßer	COVERAGE_OUTPUT="@gcov -pabcdf \$(GCDA) \$(BC_GCDA) \$(DC_GCDA) \$(HISTORY_GCDA) \$(RAND_GCDA)"
10773aa99676SStefan Eßer	COVERAGE_OUTPUT="$COVERAGE_OUTPUT;\$(RM) -f \$(GEN)*.gc*"
1078*44d4804dSStefan Eßer	COVERAGE_OUTPUT="$COVERAGE_OUTPUT;gcovr --exclude-unreachable-branches --exclude-throw-branches --html-details --output index.html"
10793aa99676SStefan Eßer	COVERAGE_PREREQS=" test coverage_output"
10803aa99676SStefan Eßer
10813aa99676SStefan Eßerelse
10823aa99676SStefan Eßer	COVERAGE_OUTPUT="@printf 'Coverage not generated\\\\n'"
10833aa99676SStefan Eßer	COVERAGE_PREREQS=""
10843aa99676SStefan Eßerfi
10853aa99676SStefan Eßer
1086*44d4804dSStefan Eßer
1087*44d4804dSStefan Eßer# Set some defaults.
10883aa99676SStefan Eßerif [ -z "${DESTDIR+set}" ]; then
10893aa99676SStefan Eßer	destdir=""
10903aa99676SStefan Eßerelse
10913aa99676SStefan Eßer	destdir="DESTDIR = $DESTDIR"
10923aa99676SStefan Eßerfi
10933aa99676SStefan Eßer
10943aa99676SStefan Eßerif [ -z "${PREFIX+set}" ]; then
10953aa99676SStefan Eßer	PREFIX="/usr/local"
10963aa99676SStefan Eßerfi
10973aa99676SStefan Eßer
10983aa99676SStefan Eßerif [ -z "${BINDIR+set}" ]; then
10993aa99676SStefan Eßer	BINDIR="$PREFIX/bin"
11003aa99676SStefan Eßerfi
11013aa99676SStefan Eßer
110250696a6eSStefan Eßerif [ -z "${INCLUDEDIR+set}" ]; then
110350696a6eSStefan Eßer	INCLUDEDIR="$PREFIX/include"
110450696a6eSStefan Eßerfi
110550696a6eSStefan Eßer
110650696a6eSStefan Eßerif [ -z "${LIBDIR+set}" ]; then
110750696a6eSStefan Eßer	LIBDIR="$PREFIX/lib"
110850696a6eSStefan Eßerfi
110950696a6eSStefan Eßer
1110*44d4804dSStefan Eßer# Set a default for the DATAROOTDIR. This is done if either manpages will be
1111*44d4804dSStefan Eßer# installed, or locales are enabled because that's probably where NLS_PATH
1112*44d4804dSStefan Eßer# points.
11133aa99676SStefan Eßerif [ "$install_manpages" -ne 0 ] || [ "$nls" -ne 0 ]; then
11143aa99676SStefan Eßer	if [ -z "${DATAROOTDIR+set}" ]; then
11153aa99676SStefan Eßer		DATAROOTDIR="$PREFIX/share"
11163aa99676SStefan Eßer	fi
11173aa99676SStefan Eßerfi
11183aa99676SStefan Eßer
1119*44d4804dSStefan Eßer# Set defaults for manpage environment variables.
11203aa99676SStefan Eßerif [ "$install_manpages" -ne 0 ]; then
11213aa99676SStefan Eßer
11223aa99676SStefan Eßer	if [ -z "${DATADIR+set}" ]; then
11233aa99676SStefan Eßer		DATADIR="$DATAROOTDIR"
11243aa99676SStefan Eßer	fi
11253aa99676SStefan Eßer
11263aa99676SStefan Eßer	if [ -z "${MANDIR+set}" ]; then
11273aa99676SStefan Eßer		MANDIR="$DATADIR/man"
11283aa99676SStefan Eßer	fi
11293aa99676SStefan Eßer
11303aa99676SStefan Eßer	if [ -z "${MAN1DIR+set}" ]; then
11313aa99676SStefan Eßer		MAN1DIR="$MANDIR/man1"
11323aa99676SStefan Eßer	fi
11333aa99676SStefan Eßer
113450696a6eSStefan Eßer	if [ -z "${MAN3DIR+set}" ]; then
113550696a6eSStefan Eßer		MAN3DIR="$MANDIR/man3"
113650696a6eSStefan Eßer	fi
113750696a6eSStefan Eßer
11383aa99676SStefan Eßerelse
113950696a6eSStefan Eßer	install_man_prereqs=""
11403aa99676SStefan Eßer	uninstall_man_prereqs=""
11413aa99676SStefan Eßerfi
11423aa99676SStefan Eßer
1143*44d4804dSStefan Eßer# Here is where we test NLS (the locale system). This is done by trying to
1144*44d4804dSStefan Eßer# compile src/vm.c, which has the relevant code. If it fails, then it is
1145*44d4804dSStefan Eßer# disabled.
11463aa99676SStefan Eßerif [ "$nls" -ne 0 ]; then
11473aa99676SStefan Eßer
11483aa99676SStefan Eßer	set +e
11493aa99676SStefan Eßer
11503aa99676SStefan Eßer	printf 'Testing NLS...\n'
11513aa99676SStefan Eßer
11523aa99676SStefan Eßer	flags="-DBC_ENABLE_NLS=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
1153*44d4804dSStefan Eßer	flags="$flags -DBC_ENABLE_HISTORY=$hist -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
11543aa99676SStefan Eßer	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I./include/"
11553aa99676SStefan Eßer	flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
11563aa99676SStefan Eßer
11573aa99676SStefan Eßer	"$CC" $CPPFLAGS $CFLAGS $flags -c "src/vm.c" -o "$scriptdir/vm.o" > /dev/null 2>&1
11583aa99676SStefan Eßer
11593aa99676SStefan Eßer	err="$?"
11603aa99676SStefan Eßer
11613aa99676SStefan Eßer	rm -rf "$scriptdir/vm.o"
11623aa99676SStefan Eßer
11633aa99676SStefan Eßer	# If this errors, it is probably because of building on Windows,
11643aa99676SStefan Eßer	# and NLS is not supported on Windows, so disable it.
11653aa99676SStefan Eßer	if [ "$err" -ne 0 ]; then
11663aa99676SStefan Eßer		printf 'NLS does not work.\n'
11673aa99676SStefan Eßer		if [ $force -eq 0 ]; then
11683aa99676SStefan Eßer			printf 'Disabling NLS...\n\n'
11693aa99676SStefan Eßer			nls=0
11703aa99676SStefan Eßer		else
11713aa99676SStefan Eßer			printf 'Forcing NLS...\n\n'
11723aa99676SStefan Eßer		fi
11733aa99676SStefan Eßer	else
11743aa99676SStefan Eßer		printf 'NLS works.\n\n'
11753aa99676SStefan Eßer
11763aa99676SStefan Eßer		printf 'Testing gencat...\n'
11773aa99676SStefan Eßer		gencat "$scriptdir/en_US.cat" "$scriptdir/locales/en_US.msg" > /dev/null 2>&1
11783aa99676SStefan Eßer
11793aa99676SStefan Eßer		err="$?"
11803aa99676SStefan Eßer
11813aa99676SStefan Eßer		rm -rf "$scriptdir/en_US.cat"
11823aa99676SStefan Eßer
11833aa99676SStefan Eßer		if [ "$err" -ne 0 ]; then
11843aa99676SStefan Eßer			printf 'gencat does not work.\n'
11853aa99676SStefan Eßer			if [ $force -eq 0 ]; then
11863aa99676SStefan Eßer				printf 'Disabling NLS...\n\n'
11873aa99676SStefan Eßer				nls=0
11883aa99676SStefan Eßer			else
11893aa99676SStefan Eßer				printf 'Forcing NLS...\n\n'
11903aa99676SStefan Eßer			fi
11913aa99676SStefan Eßer		else
11923aa99676SStefan Eßer
11933aa99676SStefan Eßer			printf 'gencat works.\n\n'
11943aa99676SStefan Eßer
1195*44d4804dSStefan Eßer			# It turns out that POSIX locales are really terrible, and running
1196*44d4804dSStefan Eßer			# gencat on one machine is not guaranteed to make those cat files
1197*44d4804dSStefan Eßer			# portable to another machine, so we had better warn the user here.
1198*44d4804dSStefan Eßer			if [ "$HOSTCC" != "$CC" ] || [ "$OLDHOSTCFLAGS" != "$OLDCFLAGS" ]; then
11993aa99676SStefan Eßer				printf 'Cross-compile detected.\n\n'
12003aa99676SStefan Eßer				printf 'WARNING: Catalog files generated with gencat may not be portable\n'
12013aa99676SStefan Eßer				printf '         across different architectures.\n\n'
12023aa99676SStefan Eßer			fi
12033aa99676SStefan Eßer
12043aa99676SStefan Eßer			if [ -z "$NLSPATH" ]; then
12053aa99676SStefan Eßer				NLSPATH="/usr/share/locale/%L/%N"
12063aa99676SStefan Eßer			fi
12073aa99676SStefan Eßer
12083aa99676SStefan Eßer			install_locales_prereqs=" install_locales"
12093aa99676SStefan Eßer			uninstall_locales_prereqs=" uninstall_locales"
12103aa99676SStefan Eßer
12113aa99676SStefan Eßer		fi
12123aa99676SStefan Eßer
12133aa99676SStefan Eßer	fi
12143aa99676SStefan Eßer
12153aa99676SStefan Eßer	set -e
12163aa99676SStefan Eßer
12173aa99676SStefan Eßerelse
12183aa99676SStefan Eßer	install_locales_prereqs=""
12193aa99676SStefan Eßer	uninstall_locales_prereqs=""
1220cf7becd2SStefan Eßer	all_locales=0
1221cf7becd2SStefan Eßerfi
1222cf7becd2SStefan Eßer
1223cf7becd2SStefan Eßerif [ "$nls" -ne 0 ] && [ "$all_locales" -ne 0 ]; then
1224cf7becd2SStefan Eßer	install_locales="\$(LOCALE_INSTALL) -l \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
1225cf7becd2SStefan Eßerelse
1226cf7becd2SStefan Eßer	install_locales="\$(LOCALE_INSTALL) \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
12273aa99676SStefan Eßerfi
12283aa99676SStefan Eßer
1229*44d4804dSStefan Eßer# Like the above tested locale support, this tests history.
12303aa99676SStefan Eßerif [ "$hist" -eq 1 ]; then
12313aa99676SStefan Eßer
12323aa99676SStefan Eßer	set +e
12333aa99676SStefan Eßer
12343aa99676SStefan Eßer	printf 'Testing history...\n'
12353aa99676SStefan Eßer
12363aa99676SStefan Eßer	flags="-DBC_ENABLE_HISTORY=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
1237*44d4804dSStefan Eßer	flags="$flags -DBC_ENABLE_NLS=$nls -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
12383aa99676SStefan Eßer	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I./include/"
12393aa99676SStefan Eßer	flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
12403aa99676SStefan Eßer
124150696a6eSStefan Eßer	"$CC" $CPPFLAGS $CFLAGS $flags -c "src/history.c" -o "$scriptdir/history.o" > /dev/null 2>&1
12423aa99676SStefan Eßer
12433aa99676SStefan Eßer	err="$?"
12443aa99676SStefan Eßer
12453aa99676SStefan Eßer	rm -rf "$scriptdir/history.o"
12463aa99676SStefan Eßer
12473aa99676SStefan Eßer	# If this errors, it is probably because of building on Windows,
12483aa99676SStefan Eßer	# and history is not supported on Windows, so disable it.
12493aa99676SStefan Eßer	if [ "$err" -ne 0 ]; then
12503aa99676SStefan Eßer		printf 'History does not work.\n'
12513aa99676SStefan Eßer		if [ $force -eq 0 ]; then
12523aa99676SStefan Eßer			printf 'Disabling history...\n\n'
12533aa99676SStefan Eßer			hist=0
12543aa99676SStefan Eßer		else
12553aa99676SStefan Eßer			printf 'Forcing history...\n\n'
12563aa99676SStefan Eßer		fi
12573aa99676SStefan Eßer	else
12583aa99676SStefan Eßer		printf 'History works.\n\n'
12593aa99676SStefan Eßer	fi
12603aa99676SStefan Eßer
12613aa99676SStefan Eßer	set -e
12623aa99676SStefan Eßer
12633aa99676SStefan Eßerfi
12643aa99676SStefan Eßer
1265*44d4804dSStefan Eßer# We have to disable the history tests if it is disabled or valgrind is on.
1266*44d4804dSStefan Eßerif [ "$hist" -eq 0 ] || [ "$vg" -ne 0 ]; then
1267*44d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
1268*44d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
1269*44d4804dSStefan Eßer	history_tests="@printf 'Skipping history tests...\\\\n'"
1270*44d4804dSStefan Eßerelse
1271*44d4804dSStefan Eßer	history_tests="@printf '\$(TEST_STARS)\\\\n\\\\nRunning history tests...\\\\n\\\\n' \&\& tests/history.sh bc -a \&\& tests/history.sh dc -a \&\& printf '\\\\nAll history tests passed.\\\\n\\\\n\$(TEST_STARS)\\\\n'"
1272*44d4804dSStefan Eßerfi
1273*44d4804dSStefan Eßer
1274*44d4804dSStefan Eßer# Test OpenBSD. This is not in an if statement because regardless of whatever
1275*44d4804dSStefan Eßer# the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE.
1276*44d4804dSStefan Eßer# No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC
1277*44d4804dSStefan Eßer# and Clang complain that that is only allowed for system headers. Sigh....So we
1278*44d4804dSStefan Eßer# have to check at configure time and set it on the compiler command-line. And
1279*44d4804dSStefan Eßer# we have to set it because we also set _POSIX_C_SOURCE, which OpenBSD headers
1280*44d4804dSStefan Eßer# detect, and when they detect it, they turn off _BSD_SOURCE unless it is
1281*44d4804dSStefan Eßer# specifically requested.
1282*44d4804dSStefan Eßerset +e
1283*44d4804dSStefan Eßerprintf 'Testing for OpenBSD...\n'
1284*44d4804dSStefan Eßer
1285*44d4804dSStefan Eßerflags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0"
1286*44d4804dSStefan Eßer"$CC" $CPPFLAGS $CFLAGS $flags -I./include -E "include/status.h" > /dev/null 2>&1
1287*44d4804dSStefan Eßer
1288*44d4804dSStefan Eßererr="$?"
1289*44d4804dSStefan Eßer
1290*44d4804dSStefan Eßerif [ "$err" -ne 0 ]; then
1291*44d4804dSStefan Eßer	printf 'On OpenBSD. Using _BSD_SOURCE.\n\n'
1292*44d4804dSStefan Eßer	bsd="-D_BSD_SOURCE"
1293*44d4804dSStefan Eßerelse
1294*44d4804dSStefan Eßer	printf 'Not on OpenBSD.\n\n'
1295*44d4804dSStefan Eßer	bsd=""
1296*44d4804dSStefan Eßerfi
1297*44d4804dSStefan Eßer
129850696a6eSStefan Eßerif [ "$library" -eq 1 ]; then
129950696a6eSStefan Eßer	bc_lib=""
130050696a6eSStefan Eßerfi
130150696a6eSStefan Eßer
130250696a6eSStefan Eßerif [ "$extra_math" -eq 1 ] && [ "$bc" -ne 0 ] && [ "$library" -eq 0 ]; then
13033aa99676SStefan Eßer	BC_LIB2_O="\$(GEN_DIR)/lib2.o"
13043aa99676SStefan Eßerelse
13053aa99676SStefan Eßer	BC_LIB2_O=""
13063aa99676SStefan Eßerfi
13073aa99676SStefan Eßer
1308*44d4804dSStefan Eßer# These lines set the appropriate targets based on whether `gen/strgen.c` or
1309*44d4804dSStefan Eßer# `gen/strgen.sh` is used.
13103aa99676SStefan EßerGEN="strgen"
13113aa99676SStefan EßerGEN_EXEC_TARGET="\$(HOSTCC) \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)"
1312*44d4804dSStefan EßerCLEAN_PREREQS=" clean_gen clean_coverage"
13133aa99676SStefan Eßer
13143aa99676SStefan Eßerif [ -z "${GEN_HOST+set}" ]; then
13153aa99676SStefan Eßer	GEN_HOST=1
13163aa99676SStefan Eßerelse
13173aa99676SStefan Eßer	if [ "$GEN_HOST" -eq 0 ]; then
13183aa99676SStefan Eßer		GEN="strgen.sh"
13193aa99676SStefan Eßer		GEN_EXEC_TARGET="@printf 'Do not need to build gen/strgen.c\\\\n'"
1320*44d4804dSStefan Eßer		CLEAN_PREREQS=" clean_coverage"
13213aa99676SStefan Eßer	fi
13223aa99676SStefan Eßerfi
13233aa99676SStefan Eßer
13243aa99676SStefan Eßermanpage_args=""
132510328f8bSStefan Eßerunneeded=""
132610328f8bSStefan Eßerheaders="\$(HEADERS)"
13273aa99676SStefan Eßer
1328*44d4804dSStefan Eßer# This series of if statements figure out what source files are *not* needed.
13293aa99676SStefan Eßerif [ "$extra_math" -eq 0 ]; then
13303aa99676SStefan Eßer	manpage_args="E"
133110328f8bSStefan Eßer	unneeded="$unneeded rand.c"
133210328f8bSStefan Eßerelse
133310328f8bSStefan Eßer	headers="$headers \$(EXTRA_MATH_HEADERS)"
13343aa99676SStefan Eßerfi
13353aa99676SStefan Eßer
1336*44d4804dSStefan Eßer# All of these next if statements set the build type and mark certain source
1337*44d4804dSStefan Eßer# files as unneeded so that they won't have targets generated for them.
1338*44d4804dSStefan Eßer
13393aa99676SStefan Eßerif [ "$hist" -eq 0 ]; then
13403aa99676SStefan Eßer	manpage_args="${manpage_args}H"
134110328f8bSStefan Eßer	unneeded="$unneeded history.c"
134210328f8bSStefan Eßerelse
134310328f8bSStefan Eßer	headers="$headers \$(HISTORY_HEADERS)"
13443aa99676SStefan Eßerfi
13453aa99676SStefan Eßer
13463aa99676SStefan Eßerif [ "$nls" -eq 0 ]; then
13473aa99676SStefan Eßer	manpage_args="${manpage_args}N"
13483aa99676SStefan Eßerfi
13493aa99676SStefan Eßer
135050696a6eSStefan Eßerif [ "$bc" -eq 0 ]; then
135150696a6eSStefan Eßer	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
135210328f8bSStefan Eßerelse
135310328f8bSStefan Eßer	headers="$headers \$(BC_HEADERS)"
135450696a6eSStefan Eßerfi
135550696a6eSStefan Eßer
135650696a6eSStefan Eßerif [ "$dc" -eq 0 ]; then
135750696a6eSStefan Eßer	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
135810328f8bSStefan Eßerelse
135910328f8bSStefan Eßer	headers="$headers \$(DC_HEADERS)"
136050696a6eSStefan Eßerfi
136150696a6eSStefan Eßer
136250696a6eSStefan Eßerif [ "$library" -ne 0 ]; then
136350696a6eSStefan Eßer	unneeded="$unneeded args.c opt.c read.c file.c main.c"
136450696a6eSStefan Eßer	unneeded="$unneeded lang.c lex.c parse.c program.c"
136550696a6eSStefan Eßer	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
136650696a6eSStefan Eßer	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
136710328f8bSStefan Eßer	headers="$headers \$(LIBRARY_HEADERS)"
136850696a6eSStefan Eßerelse
136950696a6eSStefan Eßer	unneeded="$unneeded library.c"
137050696a6eSStefan Eßerfi
137150696a6eSStefan Eßer
1372*44d4804dSStefan Eßer# library.c is not needed under normal circumstances.
1373*44d4804dSStefan Eßerif [ "$unneeded" = "" ]; then
1374*44d4804dSStefan Eßer	unneeded="library.c"
1375*44d4804dSStefan Eßerfi
1376*44d4804dSStefan Eßer
1377*44d4804dSStefan Eßer# This sets the appropriate manpage for a full build.
137810328f8bSStefan Eßerif [ "$manpage_args" = "" ]; then
137910328f8bSStefan Eßer	manpage_args="A"
138010328f8bSStefan Eßerfi
138110328f8bSStefan Eßer
138210328f8bSStefan Eßerif [ "$vg" -ne 0 ]; then
138310328f8bSStefan Eßer	memcheck=1
138410328f8bSStefan Eßerfi
138510328f8bSStefan Eßer
1386*44d4804dSStefan Eßerif [ "$bc_default_prompt" = "" ]; then
1387*44d4804dSStefan Eßer	bc_default_prompt="$bc_default_tty_mode"
1388*44d4804dSStefan Eßerfi
1389*44d4804dSStefan Eßer
1390*44d4804dSStefan Eßerif [ "$dc_default_prompt" = "" ]; then
1391*44d4804dSStefan Eßer	dc_default_prompt="$dc_default_tty_mode"
1392*44d4804dSStefan Eßerfi
1393*44d4804dSStefan Eßer
1394*44d4804dSStefan Eßer# Generate the test targets and prerequisites.
139510328f8bSStefan Eßerbc_tests=$(gen_test_targets bc)
139610328f8bSStefan Eßerbc_script_tests=$(gen_script_test_targets bc)
139710328f8bSStefan Eßerdc_tests=$(gen_test_targets dc)
139810328f8bSStefan Eßerdc_script_tests=$(gen_script_test_targets dc)
139910328f8bSStefan Eßer
14003aa99676SStefan Eßer# Print out the values; this is for debugging.
14013aa99676SStefan Eßerif [ "$bc" -ne 0 ]; then
14023aa99676SStefan Eßer	printf 'Building bc\n'
14033aa99676SStefan Eßerelse
14043aa99676SStefan Eßer	printf 'Not building bc\n'
14053aa99676SStefan Eßerfi
14063aa99676SStefan Eßerif [ "$dc" -ne 0 ]; then
14073aa99676SStefan Eßer	printf 'Building dc\n'
14083aa99676SStefan Eßerelse
14093aa99676SStefan Eßer	printf 'Not building dc\n'
14103aa99676SStefan Eßerfi
14113aa99676SStefan Eßerprintf '\n'
141250696a6eSStefan Eßerprintf 'BC_ENABLE_LIBRARY=%s\n\n' "$library"
14133aa99676SStefan Eßerprintf 'BC_ENABLE_HISTORY=%s\n' "$hist"
14143aa99676SStefan Eßerprintf 'BC_ENABLE_EXTRA_MATH=%s\n' "$extra_math"
14153aa99676SStefan Eßerprintf 'BC_ENABLE_NLS=%s\n' "$nls"
141610328f8bSStefan Eßerprintf 'BC_ENABLE_AFL=%s\n' "$fuzz"
14173aa99676SStefan Eßerprintf '\n'
14183aa99676SStefan Eßerprintf 'BC_NUM_KARATSUBA_LEN=%s\n' "$karatsuba_len"
14193aa99676SStefan Eßerprintf '\n'
14203aa99676SStefan Eßerprintf 'CC=%s\n' "$CC"
14213aa99676SStefan Eßerprintf 'CFLAGS=%s\n' "$CFLAGS"
14223aa99676SStefan Eßerprintf 'HOSTCC=%s\n' "$HOSTCC"
14233aa99676SStefan Eßerprintf 'HOSTCFLAGS=%s\n' "$HOSTCFLAGS"
14243aa99676SStefan Eßerprintf 'CPPFLAGS=%s\n' "$CPPFLAGS"
14253aa99676SStefan Eßerprintf 'LDFLAGS=%s\n' "$LDFLAGS"
14263aa99676SStefan Eßerprintf 'PREFIX=%s\n' "$PREFIX"
14273aa99676SStefan Eßerprintf 'BINDIR=%s\n' "$BINDIR"
142850696a6eSStefan Eßerprintf 'INCLUDEDIR=%s\n' "$INCLUDEDIR"
142950696a6eSStefan Eßerprintf 'LIBDIR=%s\n' "$LIBDIR"
14303aa99676SStefan Eßerprintf 'DATAROOTDIR=%s\n' "$DATAROOTDIR"
14313aa99676SStefan Eßerprintf 'DATADIR=%s\n' "$DATADIR"
14323aa99676SStefan Eßerprintf 'MANDIR=%s\n' "$MANDIR"
14333aa99676SStefan Eßerprintf 'MAN1DIR=%s\n' "$MAN1DIR"
143450696a6eSStefan Eßerprintf 'MAN3DIR=%s\n' "$MAN3DIR"
14353aa99676SStefan Eßerprintf 'NLSPATH=%s\n' "$NLSPATH"
14363aa99676SStefan Eßerprintf 'EXECSUFFIX=%s\n' "$EXECSUFFIX"
14373aa99676SStefan Eßerprintf 'EXECPREFIX=%s\n' "$EXECPREFIX"
14383aa99676SStefan Eßerprintf 'DESTDIR=%s\n' "$DESTDIR"
14393aa99676SStefan Eßerprintf 'LONG_BIT=%s\n' "$LONG_BIT"
14403aa99676SStefan Eßerprintf 'GEN_HOST=%s\n' "$GEN_HOST"
14413aa99676SStefan Eßerprintf 'GEN_EMU=%s\n' "$GEN_EMU"
1442*44d4804dSStefan Eßerprintf '\n'
1443*44d4804dSStefan Eßerprintf 'Setting Defaults\n'
1444*44d4804dSStefan Eßerprintf '================\n'
1445*44d4804dSStefan Eßerprintf 'bc.banner=%s\n' "$bc_default_banner"
1446*44d4804dSStefan Eßerprintf 'bc.sigint_reset=%s\n' "$bc_default_sigint_reset"
1447*44d4804dSStefan Eßerprintf 'dc.sigint_reset=%s\n' "$dc_default_sigint_reset"
1448*44d4804dSStefan Eßerprintf 'bc.tty_mode=%s\n' "$bc_default_tty_mode"
1449*44d4804dSStefan Eßerprintf 'dc.tty_mode=%s\n' "$dc_default_tty_mode"
1450*44d4804dSStefan Eßerprintf 'bc.prompt=%s\n' "$bc_default_prompt"
1451*44d4804dSStefan Eßerprintf 'dc.prompt=%s\n' "$dc_default_prompt"
1452*44d4804dSStefan Eßer
1453*44d4804dSStefan Eßer# This is where the real work begins. This is the point at which the Makefile.in
1454*44d4804dSStefan Eßer# template is edited and output to the Makefile.
14553aa99676SStefan Eßer
14563aa99676SStefan Eßercontents=$(cat "$scriptdir/Makefile.in")
14573aa99676SStefan Eßer
14583aa99676SStefan Eßerneedle="WARNING"
14593aa99676SStefan Eßerreplacement='*** WARNING: Autogenerated from Makefile.in. DO NOT MODIFY ***'
14603aa99676SStefan Eßer
14613aa99676SStefan Eßercontents=$(replace "$contents" "$needle" "$replacement")
14623aa99676SStefan Eßer
1463*44d4804dSStefan Eßer# The contents are edited to have the list of files to build.
146410328f8bSStefan Eßercontents=$(gen_file_list "$contents" $unneeded)
146510328f8bSStefan Eßer
146610328f8bSStefan EßerSRC_TARGETS=""
146710328f8bSStefan Eßer
1468*44d4804dSStefan Eßer# This line and loop generates the individual targets for source files. I used
1469*44d4804dSStefan Eßer# to just use an implicit target, but that was found to be inadequate when I
1470*44d4804dSStefan Eßer# added the library.
147110328f8bSStefan Eßersrc_files=$(find_src_files $unneeded)
147210328f8bSStefan Eßer
147310328f8bSStefan Eßerfor f in $src_files; do
147410328f8bSStefan Eßer	o=$(replace_ext "$f" "c" "o")
147510328f8bSStefan Eßer	SRC_TARGETS=$(printf '%s\n\n%s: %s %s\n\t$(CC) $(CFLAGS) -o %s -c %s\n' \
147610328f8bSStefan Eßer		"$SRC_TARGETS" "$o" "$headers" "$f" "$o" "$f")
147710328f8bSStefan Eßerdone
147810328f8bSStefan Eßer
1479*44d4804dSStefan Eßer# Replace all the placeholders.
148010328f8bSStefan Eßercontents=$(replace "$contents" "HEADERS" "$headers")
148110328f8bSStefan Eßer
14823aa99676SStefan Eßercontents=$(replace "$contents" "BC_ENABLED" "$bc")
14833aa99676SStefan Eßercontents=$(replace "$contents" "DC_ENABLED" "$dc")
148410328f8bSStefan Eßer
148510328f8bSStefan Eßercontents=$(replace "$contents" "BC_ALL_TESTS" "$bc_test")
148610328f8bSStefan Eßercontents=$(replace "$contents" "BC_TESTS" "$bc_tests")
148710328f8bSStefan Eßercontents=$(replace "$contents" "BC_SCRIPT_TESTS" "$bc_script_tests")
148810328f8bSStefan Eßercontents=$(replace "$contents" "BC_TEST_EXEC" "$bc_test_exec")
148910328f8bSStefan Eßercontents=$(replace "$contents" "TIMECONST_ALL_TESTS" "$timeconst")
149010328f8bSStefan Eßer
149110328f8bSStefan Eßercontents=$(replace "$contents" "DC_ALL_TESTS" "$dc_test")
149210328f8bSStefan Eßercontents=$(replace "$contents" "DC_TESTS" "$dc_tests")
149310328f8bSStefan Eßercontents=$(replace "$contents" "DC_SCRIPT_TESTS" "$dc_script_tests")
149410328f8bSStefan Eßercontents=$(replace "$contents" "DC_TEST_EXEC" "$dc_test_exec")
14953aa99676SStefan Eßer
14967e5c51e5SStefan Eßercontents=$(replace "$contents" "BUILD_TYPE" "$manpage_args")
14977e5c51e5SStefan Eßer
149850696a6eSStefan Eßercontents=$(replace "$contents" "LIBRARY" "$library")
14993aa99676SStefan Eßercontents=$(replace "$contents" "HISTORY" "$hist")
15003aa99676SStefan Eßercontents=$(replace "$contents" "EXTRA_MATH" "$extra_math")
15013aa99676SStefan Eßercontents=$(replace "$contents" "NLS" "$nls")
150210328f8bSStefan Eßercontents=$(replace "$contents" "FUZZ" "$fuzz")
150310328f8bSStefan Eßercontents=$(replace "$contents" "MEMCHECK" "$memcheck")
150410328f8bSStefan Eßer
15053aa99676SStefan Eßercontents=$(replace "$contents" "BC_LIB_O" "$bc_lib")
15063aa99676SStefan Eßercontents=$(replace "$contents" "BC_HELP_O" "$bc_help")
15073aa99676SStefan Eßercontents=$(replace "$contents" "DC_HELP_O" "$dc_help")
15083aa99676SStefan Eßercontents=$(replace "$contents" "BC_LIB2_O" "$BC_LIB2_O")
15093aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA_LEN" "$karatsuba_len")
15103aa99676SStefan Eßer
15113aa99676SStefan Eßercontents=$(replace "$contents" "NLSPATH" "$NLSPATH")
15123aa99676SStefan Eßercontents=$(replace "$contents" "DESTDIR" "$destdir")
15133aa99676SStefan Eßercontents=$(replace "$contents" "EXECSUFFIX" "$EXECSUFFIX")
15143aa99676SStefan Eßercontents=$(replace "$contents" "EXECPREFIX" "$EXECPREFIX")
15153aa99676SStefan Eßercontents=$(replace "$contents" "BINDIR" "$BINDIR")
151650696a6eSStefan Eßercontents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
151750696a6eSStefan Eßercontents=$(replace "$contents" "LIBDIR" "$LIBDIR")
15183aa99676SStefan Eßercontents=$(replace "$contents" "MAN1DIR" "$MAN1DIR")
151950696a6eSStefan Eßercontents=$(replace "$contents" "MAN3DIR" "$MAN3DIR")
15203aa99676SStefan Eßercontents=$(replace "$contents" "CFLAGS" "$CFLAGS")
15213aa99676SStefan Eßercontents=$(replace "$contents" "HOSTCFLAGS" "$HOSTCFLAGS")
15223aa99676SStefan Eßercontents=$(replace "$contents" "CPPFLAGS" "$CPPFLAGS")
15233aa99676SStefan Eßercontents=$(replace "$contents" "LDFLAGS" "$LDFLAGS")
15243aa99676SStefan Eßercontents=$(replace "$contents" "CC" "$CC")
15253aa99676SStefan Eßercontents=$(replace "$contents" "HOSTCC" "$HOSTCC")
15263aa99676SStefan Eßercontents=$(replace "$contents" "COVERAGE_OUTPUT" "$COVERAGE_OUTPUT")
15273aa99676SStefan Eßercontents=$(replace "$contents" "COVERAGE_PREREQS" "$COVERAGE_PREREQS")
15283aa99676SStefan Eßercontents=$(replace "$contents" "INSTALL_PREREQS" "$install_prereqs")
152950696a6eSStefan Eßercontents=$(replace "$contents" "INSTALL_MAN_PREREQS" "$install_man_prereqs")
1530cf7becd2SStefan Eßercontents=$(replace "$contents" "INSTALL_LOCALES" "$install_locales")
15313aa99676SStefan Eßercontents=$(replace "$contents" "INSTALL_LOCALES_PREREQS" "$install_locales_prereqs")
15323aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_MAN_PREREQS" "$uninstall_man_prereqs")
15333aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_PREREQS" "$uninstall_prereqs")
15343aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_LOCALES_PREREQS" "$uninstall_locales_prereqs")
15353aa99676SStefan Eßer
153610328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET" "$default_target")
153710328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET_PREREQS" "$default_target_prereqs")
153810328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET_CMD" "$default_target_cmd")
153910328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET" "$second_target")
154010328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET_PREREQS" "$second_target_prereqs")
154110328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET_CMD" "$second_target_cmd")
154210328f8bSStefan Eßer
154350696a6eSStefan Eßercontents=$(replace "$contents" "ALL_PREREQ" "$ALL_PREREQ")
154410328f8bSStefan Eßercontents=$(replace "$contents" "BC_EXEC_PREREQ" "$bc_exec_prereq")
154510328f8bSStefan Eßercontents=$(replace "$contents" "BC_EXEC_CMD" "$bc_exec_cmd")
154610328f8bSStefan Eßercontents=$(replace "$contents" "DC_EXEC_PREREQ" "$dc_exec_prereq")
154710328f8bSStefan Eßercontents=$(replace "$contents" "DC_EXEC_CMD" "$dc_exec_cmd")
154850696a6eSStefan Eßer
15493aa99676SStefan Eßercontents=$(replace "$contents" "EXECUTABLES" "$executables")
15503aa99676SStefan Eßercontents=$(replace "$contents" "MAIN_EXEC" "$main_exec")
15513aa99676SStefan Eßercontents=$(replace "$contents" "EXEC" "$executable")
155250696a6eSStefan Eßercontents=$(replace "$contents" "TESTS" "$tests")
15533aa99676SStefan Eßer
15543aa99676SStefan Eßercontents=$(replace "$contents" "BC_TEST" "$bc_test")
1555*44d4804dSStefan Eßercontents=$(replace "$contents" "BC_HISTORY_TEST_PREREQS" "$test_bc_history_prereqs")
15563aa99676SStefan Eßercontents=$(replace "$contents" "DC_TEST" "$dc_test")
1557*44d4804dSStefan Eßercontents=$(replace "$contents" "DC_HISTORY_TEST_PREREQS" "$test_dc_history_prereqs")
1558*44d4804dSStefan Eßercontents=$(replace "$contents" "HISTORY_TESTS" "$history_tests")
15593aa99676SStefan Eßer
15603aa99676SStefan Eßercontents=$(replace "$contents" "VG_BC_TEST" "$vg_bc_test")
15613aa99676SStefan Eßercontents=$(replace "$contents" "VG_DC_TEST" "$vg_dc_test")
15623aa99676SStefan Eßer
15633aa99676SStefan Eßercontents=$(replace "$contents" "TIMECONST" "$timeconst")
15643aa99676SStefan Eßer
15653aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA" "$karatsuba")
15663aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA_TEST" "$karatsuba_test")
15673aa99676SStefan Eßer
15683aa99676SStefan Eßercontents=$(replace "$contents" "LONG_BIT" "$LONG_BIT")
15693aa99676SStefan Eßercontents=$(replace "$contents" "LONG_BIT_DEFINE" "$LONG_BIT_DEFINE")
15703aa99676SStefan Eßer
15713aa99676SStefan Eßercontents=$(replace "$contents" "GEN" "$GEN")
15723aa99676SStefan Eßercontents=$(replace "$contents" "GEN_EXEC_TARGET" "$GEN_EXEC_TARGET")
15733aa99676SStefan Eßercontents=$(replace "$contents" "CLEAN_PREREQS" "$CLEAN_PREREQS")
15743aa99676SStefan Eßercontents=$(replace "$contents" "GEN_EMU" "$GEN_EMU")
15753aa99676SStefan Eßer
1576*44d4804dSStefan Eßercontents=$(replace "$contents" "BSD" "$bsd")
1577*44d4804dSStefan Eßer
1578*44d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_BANNER" "$bc_default_banner")
1579*44d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_SIGINT_RESET" "$bc_default_sigint_reset")
1580*44d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_SIGINT_RESET" "$dc_default_sigint_reset")
1581*44d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_TTY_MODE" "$bc_default_tty_mode")
1582*44d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_TTY_MODE" "$dc_default_tty_mode")
1583*44d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_PROMPT" "$bc_default_prompt")
1584*44d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_PROMPT" "$dc_default_prompt")
1585*44d4804dSStefan Eßer
1586*44d4804dSStefan Eßer# Do the first print to the Makefile.
158710328f8bSStefan Eßerprintf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "$scriptdir/Makefile"
158810328f8bSStefan Eßer
1589*44d4804dSStefan Eßer# Generate the individual test targets.
159010328f8bSStefan Eßerif [ "$bc" -ne 0 ]; then
1591*44d4804dSStefan Eßer	gen_tests bc "$extra_math" "$time_tests" $bc_test_exec
159210328f8bSStefan Eßer	gen_script_tests bc "$extra_math" "$generate_tests" "$time_tests" $bc_test_exec
159310328f8bSStefan Eßerfi
159410328f8bSStefan Eßer
159510328f8bSStefan Eßerif [ "$dc" -ne 0 ]; then
1596*44d4804dSStefan Eßer	gen_tests dc "$extra_math" "$time_tests" $dc_test_exec
159710328f8bSStefan Eßer	gen_script_tests dc "$extra_math" "$generate_tests" "$time_tests" $dc_test_exec
159810328f8bSStefan Eßerfi
15993aa99676SStefan Eßer
16003aa99676SStefan Eßercd "$scriptdir"
16013aa99676SStefan Eßer
1602*44d4804dSStefan Eßer# Copy the correct manuals to the expected places.
16033aa99676SStefan Eßercp -f manuals/bc/$manpage_args.1.md manuals/bc.1.md
16043aa99676SStefan Eßercp -f manuals/bc/$manpage_args.1 manuals/bc.1
16053aa99676SStefan Eßercp -f manuals/dc/$manpage_args.1.md manuals/dc.1.md
16063aa99676SStefan Eßercp -f manuals/dc/$manpage_args.1 manuals/dc.1
16073aa99676SStefan Eßer
16083aa99676SStefan Eßermake clean > /dev/null
1609