xref: /freebsd/contrib/bc/configure.sh (revision 78bc019d220e05abb5b12f678f9b4a847019bbcc)
13aa99676SStefan Eßer#! /bin/sh
23aa99676SStefan Eßer#
33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause
43aa99676SStefan Eßer#
510328f8bSStefan Eßer# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
63aa99676SStefan Eßer#
73aa99676SStefan Eßer# Redistribution and use in source and binary forms, with or without
83aa99676SStefan Eßer# modification, are permitted provided that the following conditions are met:
93aa99676SStefan Eßer#
103aa99676SStefan Eßer# * Redistributions of source code must retain the above copyright notice, this
113aa99676SStefan Eßer#   list of conditions and the following disclaimer.
123aa99676SStefan Eßer#
133aa99676SStefan Eßer# * Redistributions in binary form must reproduce the above copyright notice,
143aa99676SStefan Eßer#   this list of conditions and the following disclaimer in the documentation
153aa99676SStefan Eßer#   and/or other materials provided with the distribution.
163aa99676SStefan Eßer#
173aa99676SStefan Eßer# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
183aa99676SStefan Eßer# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
193aa99676SStefan Eßer# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
203aa99676SStefan Eßer# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
213aa99676SStefan Eßer# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
223aa99676SStefan Eßer# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
233aa99676SStefan Eßer# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
243aa99676SStefan Eßer# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
253aa99676SStefan Eßer# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
263aa99676SStefan Eßer# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
273aa99676SStefan Eßer# POSSIBILITY OF SUCH DAMAGE.
283aa99676SStefan Eßer#
293aa99676SStefan Eßer
303aa99676SStefan Eßerscript="$0"
313aa99676SStefan Eßerscriptdir=$(dirname "$script")
323aa99676SStefan Eßerscript=$(basename "$script")
333aa99676SStefan Eßer
3410041e99SStefan Eßerbuilddir=$(pwd)
353aa99676SStefan Eßer
3610041e99SStefan Eßer. "$scriptdir/scripts/functions.sh"
3710328f8bSStefan Eßer
3844d4804dSStefan Eßer# Simply prints the help message and quits based on the argument.
3900698711SStefan Eßer# @param msg  The help message to print.
403aa99676SStefan Eßerusage() {
413aa99676SStefan Eßer
423aa99676SStefan Eßer	if [ $# -gt 0 ]; then
433aa99676SStefan Eßer
443aa99676SStefan Eßer		_usage_val=1
453aa99676SStefan Eßer
463aa99676SStefan Eßer		printf "%s\n\n" "$1"
473aa99676SStefan Eßer
483aa99676SStefan Eßer	else
493aa99676SStefan Eßer		_usage_val=0
503aa99676SStefan Eßer	fi
513aa99676SStefan Eßer
5250696a6eSStefan Eßer	printf 'usage:\n'
5350696a6eSStefan Eßer	printf '    %s -h\n' "$script"
543aa99676SStefan Eßer	printf '    %s --help\n' "$script"
55*78bc019dSStefan Eßer	printf '    %s [-a|-bD|-dB|-c] [-CeEfgGHlmMNrtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script"
5610041e99SStefan Eßer	printf '       [-s SETTING] [-S SETTING]\n'
573aa99676SStefan Eßer	printf '    %s \\\n' "$script"
5850696a6eSStefan Eßer	printf '       [--library|--bc-only --disable-dc|--dc-only --disable-bc|--coverage]  \\\n'
5950696a6eSStefan Eßer	printf '       [--force --debug --disable-extra-math --disable-generated-tests]      \\\n'
6044d4804dSStefan Eßer	printf '       [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n'
61*78bc019dSStefan Eßer	printf '       [--enable-editline] [--enable-readline]                               \\\n'
6244d4804dSStefan Eßer	printf '       [--install-all-locales] [--opt=OPT_LEVEL]                             \\\n'
6344d4804dSStefan Eßer	printf '       [--karatsuba-len=KARATSUBA_LEN]                                       \\\n'
6410041e99SStefan Eßer	printf '       [--set-default-on=SETTING] [--set-default-off=SETTING]                \\\n'
653aa99676SStefan Eßer	printf '       [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR]       \\\n'
663aa99676SStefan Eßer	printf '       [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR]             \\\n'
673aa99676SStefan Eßer	printf '\n'
6850696a6eSStefan Eßer	printf '    -a, --library\n'
6944d4804dSStefan Eßer	printf '        Build the libbcl instead of the programs. This is meant to be used with\n'
7050696a6eSStefan Eßer	printf '        Other software like programming languages that want to make use of the\n'
7150696a6eSStefan Eßer	printf '        parsing and math capabilities. This option will install headers using\n'
7250696a6eSStefan Eßer	printf '        `make install`.\n'
733aa99676SStefan Eßer	printf '    -b, --bc-only\n'
7450696a6eSStefan Eßer	printf '        Build bc only. It is an error if "-d", "--dc-only", "-B", or\n'
7550696a6eSStefan Eßer	printf '        "--disable-bc" are specified too.\n'
763aa99676SStefan Eßer	printf '    -B, --disable-bc\n'
773aa99676SStefan Eßer	printf '        Disable bc. It is an error if "-b", "--bc-only", "-D", or "--disable-dc"\n'
783aa99676SStefan Eßer	printf '        are specified too.\n'
793aa99676SStefan Eßer	printf '    -c, --coverage\n'
8044d4804dSStefan Eßer	printf '        Generate test coverage code. Requires gcov and gcovr.\n'
813aa99676SStefan Eßer	printf '        It is an error if either "-b" ("-D") or "-d" ("-B") is specified.\n'
823aa99676SStefan Eßer	printf '        Requires a compiler that use gcc-compatible coverage options\n'
8310328f8bSStefan Eßer	printf '    -C, --disable-clean\n'
8410328f8bSStefan Eßer	printf '        Disable the clean that configure.sh does before configure.\n'
853aa99676SStefan Eßer	printf '    -d, --dc-only\n'
8650696a6eSStefan Eßer	printf '        Build dc only. It is an error if "-b", "--bc-only", "-D", or\n'
8750696a6eSStefan Eßer	printf '        "--disable-dc" are specified too.\n'
883aa99676SStefan Eßer	printf '    -D, --disable-dc\n'
8950696a6eSStefan Eßer	printf '        Disable dc. It is an error if "-d", "--dc-only", "-B", or "--disable-bc"\n'
903aa99676SStefan Eßer	printf '        are specified too.\n'
91*78bc019dSStefan Eßer	printf '    -e, --enable-editline\n'
92*78bc019dSStefan Eßer	printf '        Enable the use of libedit/editline. This is meant for those users that\n'
93*78bc019dSStefan Eßer	printf '        want vi-like or Emacs-like behavior in history.This option is ignored if\n'
94*78bc019dSStefan Eßer	printf '        history is disabled. It is an error if this option is enabled when the\n'
95*78bc019dSStefan Eßer	printf '        -r/--enable-readline option is enabled.\n'
963aa99676SStefan Eßer	printf '    -E, --disable-extra-math\n'
973aa99676SStefan Eßer	printf '        Disable extra math. This includes: "$" operator (truncate to integer),\n'
983aa99676SStefan Eßer	printf '        "@" operator (set number of decimal places), and r(x, p) (rounding\n'
993aa99676SStefan Eßer	printf '        function). Additionally, this option disables the extra printing\n'
1003aa99676SStefan Eßer	printf '        functions in the math library.\n'
1013aa99676SStefan Eßer	printf '    -f, --force\n'
1023aa99676SStefan Eßer	printf '        Force use of all enabled options, even if they do not work. This\n'
1033aa99676SStefan Eßer	printf '        option is to allow the maintainer a way to test that certain options\n'
10400698711SStefan Eßer	printf '        are not failing invisibly. (Development only.)\n'
1053aa99676SStefan Eßer	printf '    -g, --debug\n'
1063aa99676SStefan Eßer	printf '        Build in debug mode. Adds the "-g" flag, and if there are no\n'
1073aa99676SStefan Eßer	printf '        other CFLAGS, and "-O" was not given, this also adds the "-O0"\n'
1083aa99676SStefan Eßer	printf '        flag. If this flag is *not* given, "-DNDEBUG" is added to CPPFLAGS\n'
1093aa99676SStefan Eßer	printf '        and a strip flag is added to the link stage.\n'
1103aa99676SStefan Eßer	printf '    -G, --disable-generated-tests\n'
1113aa99676SStefan Eßer	printf '        Disable generating tests. This is for platforms that do not have a\n'
1123aa99676SStefan Eßer	printf '        GNU bc-compatible bc to generate tests.\n'
1133aa99676SStefan Eßer	printf '    -h, --help\n'
1143aa99676SStefan Eßer	printf '        Print this help message and exit.\n'
1153aa99676SStefan Eßer	printf '    -H, --disable-history\n'
1163aa99676SStefan Eßer	printf '        Disable history.\n'
1173aa99676SStefan Eßer	printf '    -k KARATSUBA_LEN, --karatsuba-len KARATSUBA_LEN\n'
1183aa99676SStefan Eßer	printf '        Set the karatsuba length to KARATSUBA_LEN (default is 64).\n'
1193aa99676SStefan Eßer	printf '        It is an error if KARATSUBA_LEN is not a number or is less than 16.\n'
120cf7becd2SStefan Eßer	printf '    -l, --install-all-locales\n'
121cf7becd2SStefan Eßer	printf '        Installs all locales, regardless of how many are on the system. This\n'
122cf7becd2SStefan Eßer	printf '        option is useful for package maintainers who want to make sure that\n'
123cf7becd2SStefan Eßer	printf '        a package contains all of the locales that end users might need.\n'
12410328f8bSStefan Eßer	printf '    -m, --enable-memcheck\n'
12510328f8bSStefan Eßer	printf '        Enable memcheck mode, to ensure no memory leaks. For development only.\n'
1263aa99676SStefan Eßer	printf '    -M, --disable-man-pages\n'
1273aa99676SStefan Eßer	printf '        Disable installing manpages.\n'
1283aa99676SStefan Eßer	printf '    -N, --disable-nls\n'
1293aa99676SStefan Eßer	printf '        Disable POSIX locale (NLS) support.\n'
1303aa99676SStefan Eßer	printf '    -O OPT_LEVEL, --opt OPT_LEVEL\n'
1313aa99676SStefan Eßer	printf '        Set the optimization level. This can also be included in the CFLAGS,\n'
1323aa99676SStefan Eßer	printf '        but it is provided, so maintainers can build optimized debug builds.\n'
1333aa99676SStefan Eßer	printf '        This is passed through to the compiler, so it must be supported.\n'
134*78bc019dSStefan Eßer	printf '    -r, --enable-readline\n'
135*78bc019dSStefan Eßer	printf '        Enable the use of libreadline/readline. This is meant for those users\n'
136*78bc019dSStefan Eßer	printf '        that want vi-like or Emacs-like behavior in history.This option is\n'
137*78bc019dSStefan Eßer	printf '        ignored if history is disabled. It is an error if this option is\n'
138*78bc019dSStefan Eßer	printf '        enabled when the -e/--enable-editline option is enabled.\n'
13944d4804dSStefan Eßer	printf '    -s SETTING, --set-default-on SETTING\n'
14044d4804dSStefan Eßer	printf '        Set the default named by SETTING to on. See below for possible values\n'
14144d4804dSStefan Eßer	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
14244d4804dSStefan Eßer	printf '        setting, the last one is used.\n'
14344d4804dSStefan Eßer	printf '    -S SETTING, --set-default-off SETTING\n'
14444d4804dSStefan Eßer	printf '        Set the default named by SETTING to off. See below for possible values\n'
14544d4804dSStefan Eßer	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
14644d4804dSStefan Eßer	printf '        setting, the last one is used.\n'
14710328f8bSStefan Eßer	printf '    -t, --enable-test-timing\n'
14810328f8bSStefan Eßer	printf '        Enable the timing of tests. This is for development only.\n'
1493aa99676SStefan Eßer	printf '    -T, --disable-strip\n'
1503aa99676SStefan Eßer	printf '        Disable stripping symbols from the compiled binary or binaries.\n'
1513aa99676SStefan Eßer	printf '        Stripping symbols only happens when debug mode is off.\n'
15210328f8bSStefan Eßer	printf '    -v, --enable-valgrind\n'
15310328f8bSStefan Eßer	printf '        Enable a build appropriate for valgrind. For development only.\n'
15410328f8bSStefan Eßer	printf '    -z, --enable-fuzz-mode\n'
15510328f8bSStefan Eßer	printf '        Enable fuzzing mode. THIS IS FOR DEVELOPMENT ONLY.\n'
1563aa99676SStefan Eßer	printf '    --prefix PREFIX\n'
1573aa99676SStefan Eßer	printf '        The prefix to install to. Overrides "$PREFIX" if it exists.\n'
1583aa99676SStefan Eßer	printf '        If PREFIX is "/usr", install path will be "/usr/bin".\n'
1593aa99676SStefan Eßer	printf '        Default is "/usr/local".\n'
1603aa99676SStefan Eßer	printf '    --bindir BINDIR\n'
16150696a6eSStefan Eßer	printf '        The directory to install binaries in. Overrides "$BINDIR" if it exists.\n'
1623aa99676SStefan Eßer	printf '        Default is "$PREFIX/bin".\n'
16350696a6eSStefan Eßer	printf '    --includedir INCLUDEDIR\n'
16450696a6eSStefan Eßer	printf '        The directory to install headers in. Overrides "$INCLUDEDIR" if it\n'
16550696a6eSStefan Eßer	printf '        exists. Default is "$PREFIX/include".\n'
16650696a6eSStefan Eßer	printf '    --libdir LIBDIR\n'
16750696a6eSStefan Eßer	printf '        The directory to install libraries in. Overrides "$LIBDIR" if it exists.\n'
16850696a6eSStefan Eßer	printf '        Default is "$PREFIX/lib".\n'
1693aa99676SStefan Eßer	printf '    --datarootdir DATAROOTDIR\n'
1703aa99676SStefan Eßer	printf '        The root location for data files. Overrides "$DATAROOTDIR" if it exists.\n'
1713aa99676SStefan Eßer	printf '        Default is "$PREFIX/share".\n'
1723aa99676SStefan Eßer	printf '    --datadir DATADIR\n'
1733aa99676SStefan Eßer	printf '        The location for data files. Overrides "$DATADIR" if it exists.\n'
1743aa99676SStefan Eßer	printf '        Default is "$DATAROOTDIR".\n'
1753aa99676SStefan Eßer	printf '    --mandir MANDIR\n'
1763aa99676SStefan Eßer	printf '        The location to install manpages to. Overrides "$MANDIR" if it exists.\n'
1773aa99676SStefan Eßer	printf '        Default is "$DATADIR/man".\n'
1783aa99676SStefan Eßer	printf '    --man1dir MAN1DIR\n'
1793aa99676SStefan Eßer	printf '        The location to install Section 1 manpages to. Overrides "$MAN1DIR" if\n'
1803aa99676SStefan Eßer	printf '        it exists. Default is "$MANDIR/man1".\n'
18150696a6eSStefan Eßer	printf '    --man3dir MAN3DIR\n'
18250696a6eSStefan Eßer	printf '        The location to install Section 3 manpages to. Overrides "$MAN3DIR" if\n'
18350696a6eSStefan Eßer	printf '        it exists. Default is "$MANDIR/man3".\n'
1843aa99676SStefan Eßer	printf '\n'
1853aa99676SStefan Eßer	printf 'In addition, the following environment variables are used:\n'
1863aa99676SStefan Eßer	printf '\n'
1873aa99676SStefan Eßer	printf '    CC           C compiler. Must be compatible with POSIX c99. If there is a\n'
1883aa99676SStefan Eßer	printf '                 space in the basename of the compiler, the items after the\n'
1893aa99676SStefan Eßer	printf '                 first space are assumed to be compiler flags, and in that case,\n'
1903aa99676SStefan Eßer	printf '                 the flags are automatically moved into CFLAGS. Default is\n'
1913aa99676SStefan Eßer	printf '                 "c99".\n'
1923aa99676SStefan Eßer	printf '    HOSTCC       Host C compiler. Must be compatible with POSIX c99. If there is\n'
1933aa99676SStefan Eßer	printf '                 a space in the basename of the compiler, the items after the\n'
1943aa99676SStefan Eßer	printf '                 first space are assumed to be compiler flags, and in the case,\n'
1953aa99676SStefan Eßer	printf '                 the flags are automatically moved into HOSTCFLAGS. Default is\n'
1963aa99676SStefan Eßer	printf '                 "$CC".\n'
1973aa99676SStefan Eßer	printf '    HOST_CC      Same as HOSTCC. If HOSTCC also exists, it is used.\n'
1983aa99676SStefan Eßer	printf '    CFLAGS       C compiler flags.\n'
1993aa99676SStefan Eßer	printf '    HOSTCFLAGS   CFLAGS for HOSTCC. Default is "$CFLAGS".\n'
2003aa99676SStefan Eßer	printf '    HOST_CFLAGS  Same as HOST_CFLAGS. If HOST_CFLAGS also exists, it is used.\n'
2013aa99676SStefan Eßer	printf '    CPPFLAGS     C preprocessor flags. Default is "".\n'
2023aa99676SStefan Eßer	printf '    LDFLAGS      Linker flags. Default is "".\n'
2033aa99676SStefan Eßer	printf '    PREFIX       The prefix to install to. Default is "/usr/local".\n'
2043aa99676SStefan Eßer	printf '                 If PREFIX is "/usr", install path will be "/usr/bin".\n'
20550696a6eSStefan Eßer	printf '    BINDIR       The directory to install binaries in. Default is "$PREFIX/bin".\n'
20650696a6eSStefan Eßer	printf '    INCLUDEDIR   The directory to install header files in. Default is\n'
20750696a6eSStefan Eßer	printf '                 "$PREFIX/include".\n'
20850696a6eSStefan Eßer	printf '    LIBDIR       The directory to install libraries in. Default is\n'
20950696a6eSStefan Eßer	printf '                 "$PREFIX/lib".\n'
2103aa99676SStefan Eßer	printf '    DATAROOTDIR  The root location for data files. Default is "$PREFIX/share".\n'
2113aa99676SStefan Eßer	printf '    DATADIR      The location for data files. Default is "$DATAROOTDIR".\n'
2123aa99676SStefan Eßer	printf '    MANDIR       The location to install manpages to. Default is "$DATADIR/man".\n'
2133aa99676SStefan Eßer	printf '    MAN1DIR      The location to install Section 1 manpages to. Default is\n'
2143aa99676SStefan Eßer	printf '                 "$MANDIR/man1".\n'
21550696a6eSStefan Eßer	printf '    MAN3DIR      The location to install Section 3 manpages to. Default is\n'
21650696a6eSStefan Eßer	printf '                 "$MANDIR/man3".\n'
2173aa99676SStefan Eßer	printf '    NLSPATH      The location to install locale catalogs to. Must be an absolute\n'
2183aa99676SStefan Eßer	printf '                 path (or contain one). This is treated the same as the POSIX\n'
2193aa99676SStefan Eßer	printf '                 definition of $NLSPATH (see POSIX environment variables for\n'
2203aa99676SStefan Eßer	printf '                 more information). Default is "/usr/share/locale/%%L/%%N".\n'
22110041e99SStefan Eßer	printf '    PC_PATH      The location to install pkg-config files to. Must be an\n'
22210041e99SStefan Eßer	printf '                 path or contain one. Default is the first path given by the\n'
22310041e99SStefan Eßer	printf '                 output of `pkg-config --variable=pc_path pkg-config`.\n'
2243aa99676SStefan Eßer	printf '    EXECSUFFIX   The suffix to append to the executable names, used to not\n'
2253aa99676SStefan Eßer	printf '                 interfere with other installed bc executables. Default is "".\n'
2263aa99676SStefan Eßer	printf '    EXECPREFIX   The prefix to append to the executable names, used to not\n'
2273aa99676SStefan Eßer	printf '                 interfere with other installed bc executables. Default is "".\n'
2283aa99676SStefan Eßer	printf '    DESTDIR      For package creation. Default is "". If it is empty when\n'
2293aa99676SStefan Eßer	printf '                 `%s` is run, it can also be passed to `make install`\n' "$script"
2303aa99676SStefan Eßer	printf '                 later as an environment variable. If both are specified,\n'
2313aa99676SStefan Eßer	printf '                 the one given to `%s` takes precedence.\n' "$script"
2323aa99676SStefan Eßer	printf '    LONG_BIT     The number of bits in a C `long` type. This is mostly for the\n'
2333aa99676SStefan Eßer	printf '                 embedded space since this `bc` uses `long`s internally for\n'
2343aa99676SStefan Eßer	printf '                 overflow checking. In C99, a `long` is required to be 32 bits.\n'
2353aa99676SStefan Eßer	printf '                 For most normal desktop systems, setting this is unnecessary,\n'
2363aa99676SStefan Eßer	printf '                 except that 32-bit platforms with 64-bit longs may want to set\n'
2373aa99676SStefan Eßer	printf '                 it to `32`. Default is the default of `LONG_BIT` for the target\n'
2383aa99676SStefan Eßer	printf '                 platform. Minimum allowed is `32`. It is a build time error if\n'
2393aa99676SStefan Eßer	printf '                 the specified value of `LONG_BIT` is greater than the default\n'
2403aa99676SStefan Eßer	printf '                 value of `LONG_BIT` for the target platform.\n'
2413aa99676SStefan Eßer	printf '    GEN_HOST     Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to\n'
2423aa99676SStefan Eßer	printf '                 produce the C files that contain the help texts as well as the\n'
2433aa99676SStefan Eßer	printf '                 math libraries. By default, `gen/strgen.c` is used, compiled by\n'
2443aa99676SStefan Eßer	printf '                 "$HOSTCC" and run on the host machine. Using `gen/strgen.sh`\n'
2453aa99676SStefan Eßer	printf '                 removes the need to compile and run an executable on the host\n'
2463aa99676SStefan Eßer	printf '                 machine since `gen/strgen.sh` is a POSIX shell script. However,\n'
247*78bc019dSStefan Eßer	printf '                 `gen/lib2.bc` is over 4095 characters, the max supported length\n'
248*78bc019dSStefan Eßer	printf '                 of a string literal in C99, and `gen/strgen.sh` generates a\n'
249*78bc019dSStefan Eßer	printf '                 string literal instead of an array, as `gen/strgen.c` does. For\n'
250*78bc019dSStefan Eßer	printf '                 most production-ready compilers, this limit probably is not\n'
2513aa99676SStefan Eßer	printf '                 enforced, but it could be. Both options are still available for\n'
2523aa99676SStefan Eßer	printf '                 this reason. If you are sure your compiler does not have the\n'
2533aa99676SStefan Eßer	printf '                 limit and do not want to compile and run a binary on the host\n'
2543aa99676SStefan Eßer	printf '                 machine, set this variable to "0". Any other value, or a\n'
2553aa99676SStefan Eßer	printf '                 non-existent value, will cause the build system to compile and\n'
2563aa99676SStefan Eßer	printf '                 run `gen/strgen.c`. Default is "".\n'
2573aa99676SStefan Eßer	printf '    GEN_EMU      Emulator to run string generator code under (leave empty if not\n'
2583aa99676SStefan Eßer	printf '                 necessary). This is not necessary when using `gen/strgen.sh`.\n'
2593aa99676SStefan Eßer	printf '                 Default is "".\n'
2603aa99676SStefan Eßer	printf '\n'
2613aa99676SStefan Eßer	printf 'WARNING: even though `configure.sh` supports both option types, short and\n'
2623aa99676SStefan Eßer	printf 'long, it does not support handling both at the same time. Use only one type.\n'
26344d4804dSStefan Eßer	printf '\n'
26444d4804dSStefan Eßer	printf 'Settings\n'
26544d4804dSStefan Eßer	printf '========\n'
26644d4804dSStefan Eßer	printf '\n'
26744d4804dSStefan Eßer	printf 'bc and dc have some settings that, while they cannot be removed by build time\n'
26844d4804dSStefan Eßer	printf 'options, can have their defaults changed at build time by packagers. Users are\n'
26944d4804dSStefan Eßer	printf 'also able to change each setting with environment variables.\n'
27044d4804dSStefan Eßer	printf '\n'
27144d4804dSStefan Eßer	printf 'The following is a table of settings, along with their default values and the\n'
27244d4804dSStefan Eßer	printf 'environment variables users can use to change them. (For the defaults, non-zero\n'
27344d4804dSStefan Eßer	printf 'means on, and zero means off.)\n'
27444d4804dSStefan Eßer	printf '\n'
27544d4804dSStefan Eßer	printf '| Setting         | Description          | Default      | Env Variable         |\n'
27644d4804dSStefan Eßer	printf '| =============== | ==================== | ============ | ==================== |\n'
27744d4804dSStefan Eßer	printf '| bc.banner       | Whether to display   |            0 | BC_BANNER            |\n'
27844d4804dSStefan Eßer	printf '|                 | the bc version       |              |                      |\n'
27944d4804dSStefan Eßer	printf '|                 | banner when in       |              |                      |\n'
28044d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
28144d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
28244d4804dSStefan Eßer	printf '| bc.sigint_reset | Whether SIGINT will  |            1 | BC_SIGINT_RESET      |\n'
28344d4804dSStefan Eßer	printf '|                 | reset bc, instead of |              |                      |\n'
28444d4804dSStefan Eßer	printf '|                 | exiting, when in     |              |                      |\n'
28544d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
28644d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
28744d4804dSStefan Eßer	printf '| dc.sigint_reset | Whether SIGINT will  |            1 | DC_SIGINT_RESET      |\n'
28844d4804dSStefan Eßer	printf '|                 | reset dc, instead of |              |                      |\n'
28944d4804dSStefan Eßer	printf '|                 | exiting, when in     |              |                      |\n'
29044d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
29144d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
29244d4804dSStefan Eßer	printf '| bc.tty_mode     | Whether TTY mode for |            1 | BC_TTY_MODE          |\n'
29344d4804dSStefan Eßer	printf '|                 | bc should be on when |              |                      |\n'
29444d4804dSStefan Eßer	printf '|                 | available.           |              |                      |\n'
29544d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
29644d4804dSStefan Eßer	printf '| dc.tty_mode     | Whether TTY mode for |            0 | BC_TTY_MODE          |\n'
29744d4804dSStefan Eßer	printf '|                 | dc should be on when |              |                      |\n'
29844d4804dSStefan Eßer	printf '|                 | available.           |              |                      |\n'
29944d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
30044d4804dSStefan Eßer	printf '| bc.prompt       | Whether the prompt   | $BC_TTY_MODE | BC_PROMPT            |\n'
30144d4804dSStefan Eßer	printf '|                 | for bc should be on  |              |                      |\n'
30244d4804dSStefan Eßer	printf '|                 | in tty mode.         |              |                      |\n'
30344d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
30444d4804dSStefan Eßer	printf '| dc.prompt       | Whether the prompt   | $DC_TTY_MODE | DC_PROMPT            |\n'
30544d4804dSStefan Eßer	printf '|                 | for dc should be on  |              |                      |\n'
30644d4804dSStefan Eßer	printf '|                 | in tty mode.         |              |                      |\n'
30744d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
30810041e99SStefan Eßer	printf '| bc.expr_exit    | Whether to exit bc   |            1 | BC_EXPR_EXIT         |\n'
30910041e99SStefan Eßer	printf '|                 | if an expression or  |              |                      |\n'
31010041e99SStefan Eßer	printf '|                 | expression file is   |              |                      |\n'
31110041e99SStefan Eßer	printf '|                 | given with the -e or |              |                      |\n'
31210041e99SStefan Eßer	printf '|                 | -f options.          |              |                      |\n'
31310041e99SStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
31410041e99SStefan Eßer	printf '| dc.expr_exit    | Whether to exit dc   |            1 | DC_EXPR_EXIT         |\n'
31510041e99SStefan Eßer	printf '|                 | if an expression or  |              |                      |\n'
31610041e99SStefan Eßer	printf '|                 | expression file is   |              |                      |\n'
31710041e99SStefan Eßer	printf '|                 | given with the -e or |              |                      |\n'
31810041e99SStefan Eßer	printf '|                 | -f options.          |              |                      |\n'
31910041e99SStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
32044d4804dSStefan Eßer	printf '\n'
32144d4804dSStefan Eßer	printf 'These settings are not meant to be changed on a whim. They are meant to ensure\n'
32244d4804dSStefan Eßer	printf 'that this bc and dc will conform to the expectations of the user on each\n'
32344d4804dSStefan Eßer	printf 'platform.\n'
3243aa99676SStefan Eßer
3253aa99676SStefan Eßer	exit "$_usage_val"
3263aa99676SStefan Eßer}
3273aa99676SStefan Eßer
32844d4804dSStefan Eßer# Replaces a file extension in a filename. This is used mostly to turn filenames
32944d4804dSStefan Eßer# like `src/num.c` into `src/num.o`. In other words, it helps to link targets to
33044d4804dSStefan Eßer# the files they depend on.
33144d4804dSStefan Eßer#
33244d4804dSStefan Eßer# @param file  The filename.
33344d4804dSStefan Eßer# @param ext1  The extension to replace.
33444d4804dSStefan Eßer# @param ext2  The new extension.
3353aa99676SStefan Eßerreplace_ext() {
3363aa99676SStefan Eßer
3373aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3383aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3393aa99676SStefan Eßer	fi
3403aa99676SStefan Eßer
3413aa99676SStefan Eßer	_replace_ext_file="$1"
3423aa99676SStefan Eßer	_replace_ext_ext1="$2"
3433aa99676SStefan Eßer	_replace_ext_ext2="$3"
3443aa99676SStefan Eßer
3459a995fe1SStefan Eßer	_replace_ext_result="${_replace_ext_file%.$_replace_ext_ext1}.$_replace_ext_ext2"
3463aa99676SStefan Eßer
3473aa99676SStefan Eßer	printf '%s\n' "$_replace_ext_result"
3483aa99676SStefan Eßer}
3493aa99676SStefan Eßer
35044d4804dSStefan Eßer# Replaces a file extension in every filename given in a list. The list is just
35144d4804dSStefan Eßer# a space-separated list of words, so filenames are expected to *not* have
35244d4804dSStefan Eßer# spaces in them. See the documentation for `replace_ext()`.
35344d4804dSStefan Eßer#
35444d4804dSStefan Eßer# @param files  The list of space-separated filenames to replace extensions for.
35544d4804dSStefan Eßer# @param ext1   The extension to replace.
35644d4804dSStefan Eßer# @param ext2   The new extension.
3573aa99676SStefan Eßerreplace_exts() {
3583aa99676SStefan Eßer
3593aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3603aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3613aa99676SStefan Eßer	fi
3623aa99676SStefan Eßer
3633aa99676SStefan Eßer	_replace_exts_files="$1"
3643aa99676SStefan Eßer	_replace_exts_ext1="$2"
3653aa99676SStefan Eßer	_replace_exts_ext2="$3"
3663aa99676SStefan Eßer
3673aa99676SStefan Eßer	for _replace_exts_file in $_replace_exts_files; do
3683aa99676SStefan Eßer		_replace_exts_new_name=$(replace_ext "$_replace_exts_file" "$_replace_exts_ext1" "$_replace_exts_ext2")
3693aa99676SStefan Eßer		_replace_exts_result="$_replace_exts_result $_replace_exts_new_name"
3703aa99676SStefan Eßer	done
3713aa99676SStefan Eßer
3723aa99676SStefan Eßer	printf '%s\n' "$_replace_exts_result"
3733aa99676SStefan Eßer}
3743aa99676SStefan Eßer
37544d4804dSStefan Eßer# Finds a placeholder in @a str and replaces it. This is the workhorse of
37644d4804dSStefan Eßer# configure.sh. It's what replaces placeholders in Makefile.in with the data
37744d4804dSStefan Eßer# needed for the chosen build. Below, you will see a lot of calls to this
37844d4804dSStefan Eßer# function.
37944d4804dSStefan Eßer#
38044d4804dSStefan Eßer# Note that needle can never contain an exclamation point. For more information,
38144d4804dSStefan Eßer# see substring_replace() in scripts/functions.sh.
38244d4804dSStefan Eßer#
38344d4804dSStefan Eßer# @param str          The string to find and replace placeholders in.
38444d4804dSStefan Eßer# @param needle       The placeholder name.
38544d4804dSStefan Eßer# @param replacement  The string to use to replace the placeholder.
3863aa99676SStefan Eßerreplace() {
3873aa99676SStefan Eßer
3883aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3893aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3903aa99676SStefan Eßer	fi
3913aa99676SStefan Eßer
3923aa99676SStefan Eßer	_replace_str="$1"
3933aa99676SStefan Eßer	_replace_needle="$2"
3943aa99676SStefan Eßer	_replace_replacement="$3"
3953aa99676SStefan Eßer
3963aa99676SStefan Eßer	substring_replace "$_replace_str" "%%$_replace_needle%%" "$_replace_replacement"
3973aa99676SStefan Eßer}
3983aa99676SStefan Eßer
39944d4804dSStefan Eßer# This function finds all the source files that need to be built. If there is
40044d4804dSStefan Eßer# only one argument and it is empty, then all source files are built. Otherwise,
40144d4804dSStefan Eßer# the arguments are all assumed to be source files that should *not* be built.
40210328f8bSStefan Eßerfind_src_files() {
40310328f8bSStefan Eßer
40410041e99SStefan Eßer	_find_src_files_args=""
40510041e99SStefan Eßer
40610328f8bSStefan Eßer	if [ "$#" -ge 1 ] && [ "$1" != "" ]; then
40710328f8bSStefan Eßer
40810328f8bSStefan Eßer		while [ "$#" -ge 1 ]; do
40910328f8bSStefan Eßer			_find_src_files_a="${1## }"
41010328f8bSStefan Eßer			shift
41110041e99SStefan Eßer			_find_src_files_args=$(printf '%s\n%s/src/%s\n' "$_find_src_files_args" "$scriptdir" "${_find_src_files_a}")
41210328f8bSStefan Eßer		done
41310328f8bSStefan Eßer
41410328f8bSStefan Eßer	fi
41510328f8bSStefan Eßer
41610041e99SStefan Eßer	_find_src_files_files=$(find "$scriptdir/src/" -depth -name "*.c" -print)
41710041e99SStefan Eßer
41810041e99SStefan Eßer	_find_src_files_result=""
41910041e99SStefan Eßer
42010041e99SStefan Eßer	for _find_src_files_f in $_find_src_files_files; do
42110041e99SStefan Eßer
42210041e99SStefan Eßer		# If this is true, the file is part of args, and therefore, unneeded.
42310041e99SStefan Eßer		if [ "${_find_src_files_args##*$_find_src_files_f}" != "${_find_src_files_args}" ]; then
42410041e99SStefan Eßer			continue
42510041e99SStefan Eßer		fi
42610041e99SStefan Eßer
42710041e99SStefan Eßer		_find_src_files_result=$(printf '%s\n%s\n' "$_find_src_files_result" "$_find_src_files_f")
42810041e99SStefan Eßer
42910041e99SStefan Eßer	done
43010041e99SStefan Eßer
43110041e99SStefan Eßer	printf '%s\n' "$_find_src_files_result"
43210328f8bSStefan Eßer}
43310328f8bSStefan Eßer
43444d4804dSStefan Eßer# This function generates a list of files to go into the Makefile. It generates
43544d4804dSStefan Eßer# the list of object files, as well as the list of test coverage files.
43644d4804dSStefan Eßer#
43744d4804dSStefan Eßer# @param contents  The contents of the Makefile template to put the list of
43844d4804dSStefan Eßer#                  files into.
43950696a6eSStefan Eßergen_file_list() {
4403aa99676SStefan Eßer
44150696a6eSStefan Eßer	if [ "$#" -lt 1 ]; then
4423aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
4433aa99676SStefan Eßer	fi
4443aa99676SStefan Eßer
44550696a6eSStefan Eßer	_gen_file_list_contents="$1"
4463aa99676SStefan Eßer	shift
4473aa99676SStefan Eßer
44850696a6eSStefan Eßer	if [ "$#" -ge 1 ]; then
44910328f8bSStefan Eßer		_gen_file_list_unneeded="$@"
4503aa99676SStefan Eßer	else
45110328f8bSStefan Eßer		_gen_file_list_unneeded=""
4523aa99676SStefan Eßer	fi
4533aa99676SStefan Eßer
45450696a6eSStefan Eßer	_gen_file_list_needle_src="SRC"
45550696a6eSStefan Eßer	_gen_file_list_needle_obj="OBJ"
45650696a6eSStefan Eßer	_gen_file_list_needle_gcda="GCDA"
45750696a6eSStefan Eßer	_gen_file_list_needle_gcno="GCNO"
45850696a6eSStefan Eßer
45910328f8bSStefan Eßer	_gen_file_list_replacement=$(find_src_files $_gen_file_list_unneeded | tr '\n' ' ')
46050696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
46150696a6eSStefan Eßer		"$_gen_file_list_needle_src" "$_gen_file_list_replacement")
46250696a6eSStefan Eßer
46310041e99SStefan Eßer	_gen_file_list_cbases=""
46410041e99SStefan Eßer
46510041e99SStefan Eßer	for _gen_file_list_f in $_gen_file_list_replacement; do
46610041e99SStefan Eßer		_gen_file_list_b=$(basename "$_gen_file_list_f")
46710041e99SStefan Eßer		_gen_file_list_cbases="$_gen_file_list_cbases src/$_gen_file_list_b"
46810041e99SStefan Eßer	done
46910041e99SStefan Eßer
47010041e99SStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_cbases" "c" "o")
47150696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
47250696a6eSStefan Eßer		"$_gen_file_list_needle_obj" "$_gen_file_list_replacement")
47350696a6eSStefan Eßer
47450696a6eSStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "o" "gcda")
47550696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
47650696a6eSStefan Eßer		"$_gen_file_list_needle_gcda" "$_gen_file_list_replacement")
47750696a6eSStefan Eßer
47850696a6eSStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "gcda" "gcno")
47950696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
48050696a6eSStefan Eßer		"$_gen_file_list_needle_gcno" "$_gen_file_list_replacement")
48150696a6eSStefan Eßer
48250696a6eSStefan Eßer	printf '%s\n' "$_gen_file_list_contents"
4833aa99676SStefan Eßer}
4843aa99676SStefan Eßer
48544d4804dSStefan Eßer# Generates the proper test targets for each test to have its own target. This
48644d4804dSStefan Eßer# allows `make test` to run in parallel.
48744d4804dSStefan Eßer#
48844d4804dSStefan Eßer# @param name        Which calculator to generate tests for.
48944d4804dSStefan Eßer# @param extra_math  An integer that, if non-zero, activates extra math tests.
49044d4804dSStefan Eßer# @param time_tests  An integer that, if non-zero, tells the test suite to time
49144d4804dSStefan Eßer#                    the execution of each test.
492d43fa8efSStefan Eßergen_std_tests() {
49310328f8bSStefan Eßer
494d43fa8efSStefan Eßer	_gen_std_tests_name="$1"
49510328f8bSStefan Eßer	shift
49610328f8bSStefan Eßer
497d43fa8efSStefan Eßer	_gen_std_tests_extra_math="$1"
49810328f8bSStefan Eßer	shift
49910328f8bSStefan Eßer
500d43fa8efSStefan Eßer	_gen_std_tests_time_tests="$1"
50110328f8bSStefan Eßer	shift
50210328f8bSStefan Eßer
503d43fa8efSStefan Eßer	_gen_std_tests_extra_required=$(cat "$scriptdir/tests/extra_required.txt")
50410328f8bSStefan Eßer
505d43fa8efSStefan Eßer	for _gen_std_tests_t in $(cat "$scriptdir/tests/$_gen_std_tests_name/all.txt"); do
50610328f8bSStefan Eßer
507d43fa8efSStefan Eßer		if [ "$_gen_std_tests_extra_math" -eq 0 ]; then
50810328f8bSStefan Eßer
509d43fa8efSStefan Eßer			if [ -z "${_gen_std_tests_extra_required##*$_gen_std_tests_t*}" ]; then
51010328f8bSStefan Eßer				printf 'test_%s_%s:\n\t@printf "Skipping %s %s\\n"\n\n' \
511d43fa8efSStefan Eßer					"$_gen_std_tests_name" "$_gen_std_tests_t" "$_gen_std_tests_name" \
51210041e99SStefan Eßer					"$_gen_std_tests_t" >> "Makefile"
51310328f8bSStefan Eßer				continue
51410328f8bSStefan Eßer			fi
51510328f8bSStefan Eßer
51610328f8bSStefan Eßer		fi
51710328f8bSStefan Eßer
51810041e99SStefan Eßer		printf 'test_%s_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/test.sh %s %s %s %s %s\n\n' \
51910041e99SStefan Eßer			"$_gen_std_tests_name" "$_gen_std_tests_t" "$builddir" "$_gen_std_tests_name" \
520d43fa8efSStefan Eßer			"$_gen_std_tests_t" "$generate_tests" "$time_tests" \
52110041e99SStefan Eßer			"$*" >> "Makefile"
52210328f8bSStefan Eßer
52310328f8bSStefan Eßer	done
52410328f8bSStefan Eßer}
52510328f8bSStefan Eßer
52644d4804dSStefan Eßer# Generates a list of test targets that will be used as prerequisites for other
52744d4804dSStefan Eßer# targets.
52844d4804dSStefan Eßer#
52944d4804dSStefan Eßer# @param name  The name of the calculator to generate test targets for.
530d43fa8efSStefan Eßergen_std_test_targets() {
53110328f8bSStefan Eßer
532d43fa8efSStefan Eßer	_gen_std_test_targets_name="$1"
53310328f8bSStefan Eßer	shift
53410328f8bSStefan Eßer
535d43fa8efSStefan Eßer	_gen_std_test_targets_tests=$(cat "$scriptdir/tests/${_gen_std_test_targets_name}/all.txt")
53610328f8bSStefan Eßer
537d43fa8efSStefan Eßer	for _gen_std_test_targets_t in $_gen_std_test_targets_tests; do
538d43fa8efSStefan Eßer		printf ' test_%s_%s' "$_gen_std_test_targets_name" "$_gen_std_test_targets_t"
539d43fa8efSStefan Eßer	done
540d43fa8efSStefan Eßer
541d43fa8efSStefan Eßer	printf '\n'
542d43fa8efSStefan Eßer}
543d43fa8efSStefan Eßer
544d43fa8efSStefan Eßer# Generates the proper test targets for each error test to have its own target.
545d43fa8efSStefan Eßer# This allows `make test_bc_errors` and `make test_dc_errors` to run in
546d43fa8efSStefan Eßer# parallel.
547d43fa8efSStefan Eßer#
548d43fa8efSStefan Eßer# @param name  Which calculator to generate tests for.
549d43fa8efSStefan Eßergen_err_tests() {
550d43fa8efSStefan Eßer
551d43fa8efSStefan Eßer	_gen_err_tests_name="$1"
552d43fa8efSStefan Eßer	shift
553d43fa8efSStefan Eßer
554d43fa8efSStefan Eßer	_gen_err_tests_fs=$(ls "$scriptdir/tests/$_gen_err_tests_name/errors/")
555d43fa8efSStefan Eßer
556d43fa8efSStefan Eßer	for _gen_err_tests_t in $_gen_err_tests_fs; do
557d43fa8efSStefan Eßer
55810041e99SStefan Eßer		printf 'test_%s_error_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/error.sh %s %s %s\n\n' \
55910041e99SStefan Eßer			"$_gen_err_tests_name" "$_gen_err_tests_t" "$builddir" "$_gen_err_tests_name" \
56010041e99SStefan Eßer			"$_gen_err_tests_t" "$*" >> "Makefile"
561d43fa8efSStefan Eßer
562d43fa8efSStefan Eßer	done
563d43fa8efSStefan Eßer
564d43fa8efSStefan Eßer}
565d43fa8efSStefan Eßer
566d43fa8efSStefan Eßer# Generates a list of error test targets that will be used as prerequisites for
567d43fa8efSStefan Eßer# other targets.
568d43fa8efSStefan Eßer#
569d43fa8efSStefan Eßer# @param name  The name of the calculator to generate test targets for.
570d43fa8efSStefan Eßergen_err_test_targets() {
571d43fa8efSStefan Eßer
572d43fa8efSStefan Eßer	_gen_err_test_targets_name="$1"
573d43fa8efSStefan Eßer	shift
574d43fa8efSStefan Eßer
575d43fa8efSStefan Eßer	_gen_err_test_targets_tests=$(ls "$scriptdir/tests/$_gen_err_test_targets_name/errors/")
576d43fa8efSStefan Eßer
577d43fa8efSStefan Eßer	for _gen_err_test_targets_t in $_gen_err_test_targets_tests; do
578d43fa8efSStefan Eßer		printf ' test_%s_error_%s' "$_gen_err_test_targets_name" "$_gen_err_test_targets_t"
57910328f8bSStefan Eßer	done
58010328f8bSStefan Eßer
58110328f8bSStefan Eßer	printf '\n'
58210328f8bSStefan Eßer}
58310328f8bSStefan Eßer
58444d4804dSStefan Eßer# Generates the proper script test targets for each script test to have its own
58544d4804dSStefan Eßer# target. This allows `make test` to run in parallel.
58644d4804dSStefan Eßer#
58744d4804dSStefan Eßer# @param name        Which calculator to generate tests for.
58844d4804dSStefan Eßer# @param extra_math  An integer that, if non-zero, activates extra math tests.
58944d4804dSStefan Eßer# @param generate    An integer that, if non-zero, activates generated tests.
59044d4804dSStefan Eßer# @param time_tests  An integer that, if non-zero, tells the test suite to time
59144d4804dSStefan Eßer#                    the execution of each test.
59210328f8bSStefan Eßergen_script_tests() {
59310328f8bSStefan Eßer
59410328f8bSStefan Eßer	_gen_script_tests_name="$1"
59510328f8bSStefan Eßer	shift
59610328f8bSStefan Eßer
59710328f8bSStefan Eßer	_gen_script_tests_extra_math="$1"
59810328f8bSStefan Eßer	shift
59910328f8bSStefan Eßer
60010328f8bSStefan Eßer	_gen_script_tests_generate="$1"
60110328f8bSStefan Eßer	shift
60210328f8bSStefan Eßer
60310328f8bSStefan Eßer	_gen_script_tests_time="$1"
60410328f8bSStefan Eßer	shift
60510328f8bSStefan Eßer
60610328f8bSStefan Eßer	_gen_script_tests_tests=$(cat "$scriptdir/tests/$_gen_script_tests_name/scripts/all.txt")
60710328f8bSStefan Eßer
60810328f8bSStefan Eßer	for _gen_script_tests_f in $_gen_script_tests_tests; do
60910328f8bSStefan Eßer
61010328f8bSStefan Eßer		_gen_script_tests_b=$(basename "$_gen_script_tests_f" ".${_gen_script_tests_name}")
61110328f8bSStefan Eßer
61210041e99SStefan Eßer		printf 'test_%s_script_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/script.sh %s %s %s 1 %s %s %s\n\n' \
61310041e99SStefan Eßer			"$_gen_script_tests_name" "$_gen_script_tests_b" "$builddir" "$_gen_script_tests_name" \
61410328f8bSStefan Eßer			"$_gen_script_tests_f" "$_gen_script_tests_extra_math" "$_gen_script_tests_generate" \
61510041e99SStefan Eßer			"$_gen_script_tests_time" "$*" >> "Makefile"
61610328f8bSStefan Eßer	done
61710328f8bSStefan Eßer}
61810328f8bSStefan Eßer
61944d4804dSStefan Eßerset_default() {
62044d4804dSStefan Eßer
62144d4804dSStefan Eßer	_set_default_on="$1"
62244d4804dSStefan Eßer	shift
62344d4804dSStefan Eßer
62444d4804dSStefan Eßer	_set_default_name="$1"
62544d4804dSStefan Eßer	shift
62644d4804dSStefan Eßer
62744d4804dSStefan Eßer	# The reason that the variables that are being set do not have the same
62844d4804dSStefan Eßer	# non-collision avoidance that the other variables do is that we *do* want
62944d4804dSStefan Eßer	# the settings of these variables to leak out of the function. They adjust
63044d4804dSStefan Eßer	# the settings outside of the function.
63144d4804dSStefan Eßer	case "$_set_default_name" in
63244d4804dSStefan Eßer
63344d4804dSStefan Eßer		bc.banner) bc_default_banner="$_set_default_on" ;;
63444d4804dSStefan Eßer		bc.sigint_reset) bc_default_sigint_reset="$_set_default_on" ;;
63544d4804dSStefan Eßer		dc.sigint_reset) dc_default_sigint_reset="$_set_default_on" ;;
63644d4804dSStefan Eßer		bc.tty_mode) bc_default_tty_mode="$_set_default_on" ;;
63744d4804dSStefan Eßer		dc.tty_mode) dc_default_tty_mode="$_set_default_on" ;;
63844d4804dSStefan Eßer		bc.prompt) bc_default_prompt="$_set_default_on" ;;
63944d4804dSStefan Eßer		dc.prompt) dc_default_prompt="$_set_default_on" ;;
64010041e99SStefan Eßer		bc.expr_exit) bc_default_expr_exit="$_set_default_on";;
64110041e99SStefan Eßer		dc.expr_exit) dc_default_expr_exit="$_set_default_on";;
64244d4804dSStefan Eßer		?) usage "Invalid setting: $_set_default_name" ;;
64344d4804dSStefan Eßer
64444d4804dSStefan Eßer	esac
64544d4804dSStefan Eßer}
64644d4804dSStefan Eßer
64744d4804dSStefan Eßer# Generates a list of script test targets that will be used as prerequisites for
64844d4804dSStefan Eßer# other targets.
64944d4804dSStefan Eßer#
65044d4804dSStefan Eßer# @param name  The name of the calculator to generate script test targets for.
65110328f8bSStefan Eßergen_script_test_targets() {
65210328f8bSStefan Eßer
65310328f8bSStefan Eßer	_gen_script_test_targets_name="$1"
65410328f8bSStefan Eßer	shift
65510328f8bSStefan Eßer
65610328f8bSStefan Eßer	_gen_script_test_targets_tests=$(cat "$scriptdir/tests/$_gen_script_test_targets_name/scripts/all.txt")
65710328f8bSStefan Eßer
65810328f8bSStefan Eßer	for _gen_script_test_targets_f in $_gen_script_test_targets_tests; do
65910328f8bSStefan Eßer		_gen_script_test_targets_b=$(basename "$_gen_script_test_targets_f" \
66010328f8bSStefan Eßer			".$_gen_script_test_targets_name")
66110328f8bSStefan Eßer		printf ' test_%s_script_%s' "$_gen_script_test_targets_name" \
66210328f8bSStefan Eßer			"$_gen_script_test_targets_b"
66310328f8bSStefan Eßer	done
66410328f8bSStefan Eßer
66510328f8bSStefan Eßer	printf '\n'
66610328f8bSStefan Eßer}
66710328f8bSStefan Eßer
66844d4804dSStefan Eßer# This is a list of defaults, but it is also the list of possible options for
66944d4804dSStefan Eßer# users to change.
67044d4804dSStefan Eßer#
67144d4804dSStefan Eßer# The development options are: force (force options even if they fail), valgrind
67244d4804dSStefan Eßer# (build in a way suitable for valgrind testing), memcheck (same as valgrind),
67344d4804dSStefan Eßer# and fuzzing (build in a way suitable for fuzzing).
6743aa99676SStefan Eßerbc_only=0
6753aa99676SStefan Eßerdc_only=0
6763aa99676SStefan Eßercoverage=0
6773aa99676SStefan Eßerkaratsuba_len=32
6783aa99676SStefan Eßerdebug=0
6793aa99676SStefan Eßerhist=1
680*78bc019dSStefan Eßereditline=0
681*78bc019dSStefan Eßerreadline=0
6823aa99676SStefan Eßerextra_math=1
6833aa99676SStefan Eßeroptimization=""
6843aa99676SStefan Eßergenerate_tests=1
6853aa99676SStefan Eßerinstall_manpages=1
6863aa99676SStefan Eßernls=1
6873aa99676SStefan Eßerforce=0
6883aa99676SStefan Eßerstrip_bin=1
689cf7becd2SStefan Eßerall_locales=0
69050696a6eSStefan Eßerlibrary=0
69110328f8bSStefan Eßerfuzz=0
69210328f8bSStefan Eßertime_tests=0
69310328f8bSStefan Eßervg=0
69410328f8bSStefan Eßermemcheck=0
69510328f8bSStefan Eßerclean=1
6963aa99676SStefan Eßer
69744d4804dSStefan Eßer# The empty strings are because they depend on TTY mode. If they are directly
69844d4804dSStefan Eßer# set, though, they will be integers. We test for empty strings later.
69944d4804dSStefan Eßerbc_default_banner=0
70044d4804dSStefan Eßerbc_default_sigint_reset=1
70144d4804dSStefan Eßerdc_default_sigint_reset=1
70244d4804dSStefan Eßerbc_default_tty_mode=1
70344d4804dSStefan Eßerdc_default_tty_mode=0
70444d4804dSStefan Eßerbc_default_prompt=""
70544d4804dSStefan Eßerdc_default_prompt=""
70610041e99SStefan Eßerbc_default_expr_exit=1
70710041e99SStefan Eßerdc_default_expr_exit=1
70844d4804dSStefan Eßer
70944d4804dSStefan Eßer# getopts is a POSIX utility, but it cannot handle long options. Thus, the
71044d4804dSStefan Eßer# handling of long options is done by hand, and that's the reason that short and
71144d4804dSStefan Eßer# long options cannot be mixed.
712*78bc019dSStefan Eßerwhile getopts "abBcdDeEfgGhHk:lMmNO:rS:s:tTvz-" opt; do
7133aa99676SStefan Eßer
7143aa99676SStefan Eßer	case "$opt" in
71550696a6eSStefan Eßer		a) library=1 ;;
7163aa99676SStefan Eßer		b) bc_only=1 ;;
7173aa99676SStefan Eßer		B) dc_only=1 ;;
7183aa99676SStefan Eßer		c) coverage=1 ;;
71910328f8bSStefan Eßer		C) clean=0 ;;
7203aa99676SStefan Eßer		d) dc_only=1 ;;
7213aa99676SStefan Eßer		D) bc_only=1 ;;
722*78bc019dSStefan Eßer		e) editline=1 ;;
7233aa99676SStefan Eßer		E) extra_math=0 ;;
7243aa99676SStefan Eßer		f) force=1 ;;
7253aa99676SStefan Eßer		g) debug=1 ;;
7263aa99676SStefan Eßer		G) generate_tests=0 ;;
7273aa99676SStefan Eßer		h) usage ;;
7283aa99676SStefan Eßer		H) hist=0 ;;
7293aa99676SStefan Eßer		k) karatsuba_len="$OPTARG" ;;
730cf7becd2SStefan Eßer		l) all_locales=1 ;;
73110328f8bSStefan Eßer		m) memcheck=1 ;;
7323aa99676SStefan Eßer		M) install_manpages=0 ;;
7333aa99676SStefan Eßer		N) nls=0 ;;
7343aa99676SStefan Eßer		O) optimization="$OPTARG" ;;
735*78bc019dSStefan Eßer		r) readline=1 ;;
73644d4804dSStefan Eßer		S) set_default 0 "$OPTARG" ;;
73744d4804dSStefan Eßer		s) set_default 1 "$OPTARG" ;;
73810328f8bSStefan Eßer		t) time_tests=1 ;;
7393aa99676SStefan Eßer		T) strip_bin=0 ;;
74010328f8bSStefan Eßer		v) vg=1 ;;
74110328f8bSStefan Eßer		z) fuzz=1 ;;
7423aa99676SStefan Eßer		-)
7433aa99676SStefan Eßer			arg="$1"
7443aa99676SStefan Eßer			arg="${arg#--}"
7453aa99676SStefan Eßer			LONG_OPTARG="${arg#*=}"
7463aa99676SStefan Eßer			case $arg in
7473aa99676SStefan Eßer				help) usage ;;
74850696a6eSStefan Eßer				library) library=1 ;;
7493aa99676SStefan Eßer				bc-only) bc_only=1 ;;
7503aa99676SStefan Eßer				dc-only) dc_only=1 ;;
7513aa99676SStefan Eßer				coverage) coverage=1 ;;
7523aa99676SStefan Eßer				debug) debug=1 ;;
7533aa99676SStefan Eßer				force) force=1 ;;
7543aa99676SStefan Eßer				prefix=?*) PREFIX="$LONG_OPTARG" ;;
7553aa99676SStefan Eßer				prefix)
7563aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7573aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7583aa99676SStefan Eßer					fi
7593aa99676SStefan Eßer					PREFIX="$2"
7603aa99676SStefan Eßer					shift ;;
7613aa99676SStefan Eßer				bindir=?*) BINDIR="$LONG_OPTARG" ;;
7623aa99676SStefan Eßer				bindir)
7633aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7643aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7653aa99676SStefan Eßer					fi
7663aa99676SStefan Eßer					BINDIR="$2"
7673aa99676SStefan Eßer					shift ;;
76850696a6eSStefan Eßer				includedir=?*) INCLUDEDIR="$LONG_OPTARG" ;;
76950696a6eSStefan Eßer				includedir)
77050696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
77150696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
77250696a6eSStefan Eßer					fi
77350696a6eSStefan Eßer					INCLUDEDIR="$2"
77450696a6eSStefan Eßer					shift ;;
77550696a6eSStefan Eßer				libdir=?*) LIBDIR="$LONG_OPTARG" ;;
77650696a6eSStefan Eßer				libdir)
77750696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
77850696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
77950696a6eSStefan Eßer					fi
78050696a6eSStefan Eßer					LIBDIR="$2"
78150696a6eSStefan Eßer					shift ;;
7823aa99676SStefan Eßer				datarootdir=?*) DATAROOTDIR="$LONG_OPTARG" ;;
7833aa99676SStefan Eßer				datarootdir)
7843aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7853aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7863aa99676SStefan Eßer					fi
7873aa99676SStefan Eßer					DATAROOTDIR="$2"
7883aa99676SStefan Eßer					shift ;;
7893aa99676SStefan Eßer				datadir=?*) DATADIR="$LONG_OPTARG" ;;
7903aa99676SStefan Eßer				datadir)
7913aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7923aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7933aa99676SStefan Eßer					fi
7943aa99676SStefan Eßer					DATADIR="$2"
7953aa99676SStefan Eßer					shift ;;
7963aa99676SStefan Eßer				mandir=?*) MANDIR="$LONG_OPTARG" ;;
7973aa99676SStefan Eßer				mandir)
7983aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7993aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8003aa99676SStefan Eßer					fi
8013aa99676SStefan Eßer					MANDIR="$2"
8023aa99676SStefan Eßer					shift ;;
8033aa99676SStefan Eßer				man1dir=?*) MAN1DIR="$LONG_OPTARG" ;;
8043aa99676SStefan Eßer				man1dir)
8053aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8063aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8073aa99676SStefan Eßer					fi
8083aa99676SStefan Eßer					MAN1DIR="$2"
8093aa99676SStefan Eßer					shift ;;
81050696a6eSStefan Eßer				man3dir=?*) MAN3DIR="$LONG_OPTARG" ;;
81150696a6eSStefan Eßer				man3dir)
81250696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
81350696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
81450696a6eSStefan Eßer					fi
81550696a6eSStefan Eßer					MAN3DIR="$2"
81650696a6eSStefan Eßer					shift ;;
8173aa99676SStefan Eßer				localedir=?*) LOCALEDIR="$LONG_OPTARG" ;;
8183aa99676SStefan Eßer				localedir)
8193aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8203aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8213aa99676SStefan Eßer					fi
8223aa99676SStefan Eßer					LOCALEDIR="$2"
8233aa99676SStefan Eßer					shift ;;
8243aa99676SStefan Eßer				karatsuba-len=?*) karatsuba_len="$LONG_OPTARG" ;;
8253aa99676SStefan Eßer				karatsuba-len)
8263aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8273aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8283aa99676SStefan Eßer					fi
8293aa99676SStefan Eßer					karatsuba_len="$1"
8303aa99676SStefan Eßer					shift ;;
8313aa99676SStefan Eßer				opt=?*) optimization="$LONG_OPTARG" ;;
8323aa99676SStefan Eßer				opt)
8333aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8343aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8353aa99676SStefan Eßer					fi
8363aa99676SStefan Eßer					optimization="$1"
8373aa99676SStefan Eßer					shift ;;
83844d4804dSStefan Eßer				set-default-on=?*) set_default 1 "$LONG_OPTARG" ;;
83944d4804dSStefan Eßer				set-default-on)
84044d4804dSStefan Eßer					if [ "$#" -lt 2 ]; then
84144d4804dSStefan Eßer						usage "No argument given for '--$arg' option"
84244d4804dSStefan Eßer					fi
84344d4804dSStefan Eßer					set_default 1 "$1"
84444d4804dSStefan Eßer					shift ;;
84544d4804dSStefan Eßer				set-default-off=?*) set_default 0 "$LONG_OPTARG" ;;
84644d4804dSStefan Eßer				set-default-off)
84744d4804dSStefan Eßer					if [ "$#" -lt 2 ]; then
84844d4804dSStefan Eßer						usage "No argument given for '--$arg' option"
84944d4804dSStefan Eßer					fi
85044d4804dSStefan Eßer					set_default 0 "$1"
85144d4804dSStefan Eßer					shift ;;
8523aa99676SStefan Eßer				disable-bc) dc_only=1 ;;
8533aa99676SStefan Eßer				disable-dc) bc_only=1 ;;
85410328f8bSStefan Eßer				disable-clean) clean=0 ;;
8553aa99676SStefan Eßer				disable-extra-math) extra_math=0 ;;
8563aa99676SStefan Eßer				disable-generated-tests) generate_tests=0 ;;
8573aa99676SStefan Eßer				disable-history) hist=0 ;;
8583aa99676SStefan Eßer				disable-man-pages) install_manpages=0 ;;
8593aa99676SStefan Eßer				disable-nls) nls=0 ;;
8603aa99676SStefan Eßer				disable-strip) strip_bin=0 ;;
861*78bc019dSStefan Eßer				enable-editline) editline=1 ;;
862*78bc019dSStefan Eßer				enable-readline) readline=1 ;;
86310328f8bSStefan Eßer				enable-test-timing) time_tests=1 ;;
86410328f8bSStefan Eßer				enable-valgrind) vg=1 ;;
86510328f8bSStefan Eßer				enable-fuzz-mode) fuzz=1 ;;
86610328f8bSStefan Eßer				enable-memcheck) memcheck=1 ;;
867cf7becd2SStefan Eßer				install-all-locales) all_locales=1 ;;
8683aa99676SStefan Eßer				help* | bc-only* | dc-only* | coverage* | debug*)
8693aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
87010328f8bSStefan Eßer				disable-bc* | disable-dc* | disable-clean*)
87110328f8bSStefan Eßer					usage "No arg allowed for --$arg option" ;;
87210328f8bSStefan Eßer				disable-extra-math*)
8733aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
8743aa99676SStefan Eßer				disable-generated-tests* | disable-history*)
8753aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
8763aa99676SStefan Eßer				disable-man-pages* | disable-nls* | disable-strip*)
8773aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
87810328f8bSStefan Eßer				enable-fuzz-mode* | enable-test-timing* | enable-valgrind*)
87910328f8bSStefan Eßer					usage "No arg allowed for --$arg option" ;;
88010328f8bSStefan Eßer				enable-memcheck* | install-all-locales*)
881cf7becd2SStefan Eßer					usage "No arg allowed for --$arg option" ;;
882*78bc019dSStefan Eßer				enable-editline* | enable-readline*)
883*78bc019dSStefan Eßer					usage "No arg allowed for --$arg option" ;;
8843aa99676SStefan Eßer				'') break ;; # "--" terminates argument processing
8853aa99676SStefan Eßer				* ) usage "Invalid option $LONG_OPTARG" ;;
8863aa99676SStefan Eßer			esac
8873aa99676SStefan Eßer			shift
8883aa99676SStefan Eßer			OPTIND=1 ;;
88944d4804dSStefan Eßer		?) usage "Invalid option: $opt" ;;
8903aa99676SStefan Eßer	esac
8913aa99676SStefan Eßer
8923aa99676SStefan Eßerdone
8933aa99676SStefan Eßer
89444d4804dSStefan Eßer# Sometimes, developers don't want configure.sh to do a config clean. But
89544d4804dSStefan Eßer# sometimes they do.
89610328f8bSStefan Eßerif [ "$clean" -ne 0 ]; then
89710328f8bSStefan Eßer	if [ -f ./Makefile ]; then
89810328f8bSStefan Eßer		make clean_config > /dev/null
89910328f8bSStefan Eßer	fi
90010328f8bSStefan Eßerfi
90110328f8bSStefan Eßer
90244d4804dSStefan Eßer# It is an error to say that bc only should be built and likewise for dc.
9033aa99676SStefan Eßerif [ "$bc_only" -eq 1 ] && [ "$dc_only" -eq 1 ]; then
9043aa99676SStefan Eßer	usage "Can only specify one of -b(-D) or -d(-B)"
9053aa99676SStefan Eßerfi
9063aa99676SStefan Eßer
90744d4804dSStefan Eßer# The library is mutually exclusive to the calculators, so it's an error to
90844d4804dSStefan Eßer# give an option for either of them.
90950696a6eSStefan Eßerif [ "$library" -ne 0 ]; then
91050696a6eSStefan Eßer	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
91150696a6eSStefan Eßer		usage "Must not specify -b(-D) or -d(-B) when building the library"
91250696a6eSStefan Eßer	fi
91350696a6eSStefan Eßerfi
91450696a6eSStefan Eßer
91544d4804dSStefan Eßer# KARATSUBA_LEN must be an integer and must be 16 or greater.
9163aa99676SStefan Eßercase $karatsuba_len in
9173aa99676SStefan Eßer	(*[!0-9]*|'') usage "KARATSUBA_LEN is not a number" ;;
9183aa99676SStefan Eßer	(*) ;;
9193aa99676SStefan Eßeresac
9203aa99676SStefan Eßer
9213aa99676SStefan Eßerif [ "$karatsuba_len" -lt 16 ]; then
9223aa99676SStefan Eßer	usage "KARATSUBA_LEN is less than 16"
9233aa99676SStefan Eßerfi
9243aa99676SStefan Eßer
9253aa99676SStefan Eßerset -e
9263aa99676SStefan Eßer
9273aa99676SStefan Eßerif [ -z "${LONG_BIT+set}" ]; then
9283aa99676SStefan Eßer	LONG_BIT_DEFINE=""
9293aa99676SStefan Eßerelif [ "$LONG_BIT" -lt 32 ]; then
9303aa99676SStefan Eßer	usage "LONG_BIT is less than 32"
9313aa99676SStefan Eßerelse
9323aa99676SStefan Eßer	LONG_BIT_DEFINE="-DBC_LONG_BIT=\$(BC_LONG_BIT)"
9333aa99676SStefan Eßerfi
9343aa99676SStefan Eßer
9353aa99676SStefan Eßerif [ -z "$CC" ]; then
9363aa99676SStefan Eßer	CC="c99"
9373aa99676SStefan Eßerelse
93844d4804dSStefan Eßer
93944d4804dSStefan Eßer	# I had users complain that, if they gave CFLAGS as part of CC, which
94044d4804dSStefan Eßer	# autotools allows in its braindead way, the build would fail with an error.
94144d4804dSStefan Eßer	# I don't like adjusting for autotools, but oh well. These lines puts the
94244d4804dSStefan Eßer	# stuff after the first space into CFLAGS.
9433aa99676SStefan Eßer	ccbase=$(basename "$CC")
9443aa99676SStefan Eßer	suffix=" *"
9453aa99676SStefan Eßer	prefix="* "
9463aa99676SStefan Eßer
9473aa99676SStefan Eßer	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
9483aa99676SStefan Eßer		ccflags="${ccbase#$prefix}"
9493aa99676SStefan Eßer		cc="${ccbase%%$suffix}"
9503aa99676SStefan Eßer		ccdir=$(dirname "$CC")
9513aa99676SStefan Eßer		if [ "$ccdir" = "." ] && [ "${CC#.}" = "$CC" ]; then
9523aa99676SStefan Eßer			ccdir=""
9533aa99676SStefan Eßer		else
9543aa99676SStefan Eßer			ccdir="$ccdir/"
9553aa99676SStefan Eßer		fi
9563aa99676SStefan Eßer		CC="${ccdir}${cc}"
9573aa99676SStefan Eßer		CFLAGS="$CFLAGS $ccflags"
9583aa99676SStefan Eßer	fi
9593aa99676SStefan Eßerfi
9603aa99676SStefan Eßer
9613aa99676SStefan Eßerif [ -z "$HOSTCC" ] && [ -z "$HOST_CC" ]; then
9623aa99676SStefan Eßer	HOSTCC="$CC"
9633aa99676SStefan Eßerelif [ -z "$HOSTCC" ]; then
9643aa99676SStefan Eßer	HOSTCC="$HOST_CC"
9653aa99676SStefan Eßerfi
9663aa99676SStefan Eßer
9673aa99676SStefan Eßerif [ "$HOSTCC" != "$CC" ]; then
96844d4804dSStefan Eßer
96944d4804dSStefan Eßer	# Like above, this splits HOSTCC and HOSTCFLAGS.
9703aa99676SStefan Eßer	ccbase=$(basename "$HOSTCC")
9713aa99676SStefan Eßer	suffix=" *"
9723aa99676SStefan Eßer	prefix="* "
9733aa99676SStefan Eßer
9743aa99676SStefan Eßer	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
9753aa99676SStefan Eßer		ccflags="${ccbase#$prefix}"
9763aa99676SStefan Eßer		cc="${ccbase%%$suffix}"
9773aa99676SStefan Eßer		ccdir=$(dirname "$HOSTCC")
9783aa99676SStefan Eßer		if [ "$ccdir" = "." ] && [ "${HOSTCC#.}" = "$HOSTCC" ]; then
9793aa99676SStefan Eßer			ccdir=""
9803aa99676SStefan Eßer		else
9813aa99676SStefan Eßer			ccdir="$ccdir/"
9823aa99676SStefan Eßer		fi
9833aa99676SStefan Eßer		HOSTCC="${ccdir}${cc}"
9843aa99676SStefan Eßer		HOSTCFLAGS="$HOSTCFLAGS $ccflags"
9853aa99676SStefan Eßer	fi
9863aa99676SStefan Eßerfi
9873aa99676SStefan Eßer
9883aa99676SStefan Eßerif [ -z "${HOSTCFLAGS+set}" ] && [ -z "${HOST_CFLAGS+set}" ]; then
9893aa99676SStefan Eßer	HOSTCFLAGS="$CFLAGS"
9903aa99676SStefan Eßerelif [ -z "${HOSTCFLAGS+set}" ]; then
9913aa99676SStefan Eßer	HOSTCFLAGS="$HOST_CFLAGS"
9923aa99676SStefan Eßerfi
9933aa99676SStefan Eßer
99444d4804dSStefan Eßer# Store these for the cross compilation detection later.
99544d4804dSStefan EßerOLDCFLAGS="$CFLAGS"
99644d4804dSStefan EßerOLDHOSTCFLAGS="$HOSTCFLAGS"
99744d4804dSStefan Eßer
9983aa99676SStefan Eßerlink="@printf 'No link necessary\\\\n'"
9993aa99676SStefan Eßermain_exec="BC"
10003aa99676SStefan Eßerexecutable="BC_EXEC"
10013aa99676SStefan Eßer
1002d43fa8efSStefan Eßertests="test_bc timeconst test_dc"
100350696a6eSStefan Eßer
100410041e99SStefan Eßerbc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
100510041e99SStefan Eßerbc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
100610041e99SStefan Eßerdc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
100710041e99SStefan Eßerdc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
10083aa99676SStefan Eßer
100910041e99SStefan Eßertimeconst="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/bc/timeconst.sh \$(TESTSDIR)/bc/scripts/timeconst.bc \$(BC_EXEC)"
10103aa99676SStefan Eßer
10113aa99676SStefan Eßer# In order to have cleanup at exit, we need to be in
10123aa99676SStefan Eßer# debug mode, so don't run valgrind without that.
101310328f8bSStefan Eßerif [ "$vg" -ne 0 ]; then
101410328f8bSStefan Eßer	debug=1
101510328f8bSStefan Eßer	bc_test_exec='valgrind $(VALGRIND_ARGS) $(BC_EXEC)'
101610328f8bSStefan Eßer	dc_test_exec='valgrind $(VALGRIND_ARGS) $(DC_EXEC)'
10173aa99676SStefan Eßerelse
101810328f8bSStefan Eßer	bc_test_exec='$(BC_EXEC)'
101910328f8bSStefan Eßer	dc_test_exec='$(DC_EXEC)'
10203aa99676SStefan Eßerfi
10213aa99676SStefan Eßer
102244d4804dSStefan Eßertest_bc_history_prereqs="test_bc_history_all"
102344d4804dSStefan Eßertest_dc_history_prereqs="test_dc_history_all"
102444d4804dSStefan Eßer
10253aa99676SStefan Eßerkaratsuba="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
10263aa99676SStefan Eßerkaratsuba_test="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
10273aa99676SStefan Eßer
10283aa99676SStefan Eßerbc_lib="\$(GEN_DIR)/lib.o"
10293aa99676SStefan Eßerbc_help="\$(GEN_DIR)/bc_help.o"
10303aa99676SStefan Eßerdc_help="\$(GEN_DIR)/dc_help.o"
10313aa99676SStefan Eßer
103210328f8bSStefan Eßerdefault_target_prereqs="\$(BIN) \$(OBJS)"
103310328f8bSStefan Eßerdefault_target_cmd="\$(CC) \$(CFLAGS) \$(OBJS) \$(LDFLAGS) -o \$(EXEC)"
103410328f8bSStefan Eßerdefault_target="\$(DC_EXEC)"
103510328f8bSStefan Eßer
103610328f8bSStefan Eßersecond_target_prereqs=""
103710328f8bSStefan Eßersecond_target_cmd="$default_target_cmd"
103810328f8bSStefan Eßersecond_target="\$(BC_EXEC)"
103910328f8bSStefan Eßer
104044d4804dSStefan Eßer# This if/else if chain is for setting the defaults that change based on whether
104144d4804dSStefan Eßer# the library is being built, bc only, dc only, or both calculators.
104210328f8bSStefan Eßerif [ "$library" -ne 0 ]; then
104310328f8bSStefan Eßer
104410328f8bSStefan Eßer	extra_math=1
104510328f8bSStefan Eßer	nls=0
104610328f8bSStefan Eßer	hist=0
104710328f8bSStefan Eßer	bc=1
104810328f8bSStefan Eßer	dc=1
104910328f8bSStefan Eßer
105010328f8bSStefan Eßer	default_target_prereqs="\$(BIN) \$(OBJ)"
105110328f8bSStefan Eßer	default_target_cmd="ar -r -cu \$(LIBBC) \$(OBJ)"
105210328f8bSStefan Eßer	default_target="\$(LIBBC)"
105310328f8bSStefan Eßer	tests="test_library"
105444d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
105544d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
105610328f8bSStefan Eßer
105710041e99SStefan Eßer	install_prereqs=" install_library"
105810041e99SStefan Eßer	uninstall_prereqs=" uninstall_library"
105910041e99SStefan Eßer	install_man_prereqs=" install_bcl_manpage"
106010041e99SStefan Eßer	uninstall_man_prereqs=" uninstall_bcl_manpage"
106110041e99SStefan Eßer
106210328f8bSStefan Eßerelif [ "$bc_only" -eq 1 ]; then
10633aa99676SStefan Eßer
10643aa99676SStefan Eßer	bc=1
10653aa99676SStefan Eßer	dc=0
10663aa99676SStefan Eßer
10673aa99676SStefan Eßer	dc_help=""
10683aa99676SStefan Eßer
10693aa99676SStefan Eßer	executables="bc"
10703aa99676SStefan Eßer
10713aa99676SStefan Eßer	dc_test="@printf 'No dc tests to run\\\\n'"
1072d43fa8efSStefan Eßer	dc_test_np="@printf 'No dc tests to run\\\\n'"
107344d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
10743aa99676SStefan Eßer
107550696a6eSStefan Eßer	install_prereqs=" install_execs"
107650696a6eSStefan Eßer	install_man_prereqs=" install_bc_manpage"
10773aa99676SStefan Eßer	uninstall_prereqs=" uninstall_bc"
10783aa99676SStefan Eßer	uninstall_man_prereqs=" uninstall_bc_manpage"
10793aa99676SStefan Eßer
108010328f8bSStefan Eßer	default_target="\$(BC_EXEC)"
108110328f8bSStefan Eßer	second_target="\$(DC_EXEC)"
1082d43fa8efSStefan Eßer	tests="test_bc timeconst"
108310328f8bSStefan Eßer
10843aa99676SStefan Eßerelif [ "$dc_only" -eq 1 ]; then
10853aa99676SStefan Eßer
10863aa99676SStefan Eßer	bc=0
10873aa99676SStefan Eßer	dc=1
10883aa99676SStefan Eßer
10893aa99676SStefan Eßer	bc_lib=""
10903aa99676SStefan Eßer	bc_help=""
10913aa99676SStefan Eßer
10923aa99676SStefan Eßer	executables="dc"
10933aa99676SStefan Eßer
10943aa99676SStefan Eßer	main_exec="DC"
10953aa99676SStefan Eßer	executable="DC_EXEC"
10963aa99676SStefan Eßer
10973aa99676SStefan Eßer	bc_test="@printf 'No bc tests to run\\\\n'"
1098d43fa8efSStefan Eßer	bc_test_np="@printf 'No bc tests to run\\\\n'"
109944d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
11003aa99676SStefan Eßer
11013aa99676SStefan Eßer	timeconst="@printf 'timeconst cannot be run because bc is not built\\\\n'"
11023aa99676SStefan Eßer
110350696a6eSStefan Eßer	install_prereqs=" install_execs"
110450696a6eSStefan Eßer	install_man_prereqs=" install_dc_manpage"
11053aa99676SStefan Eßer	uninstall_prereqs=" uninstall_dc"
11063aa99676SStefan Eßer	uninstall_man_prereqs=" uninstall_dc_manpage"
11073aa99676SStefan Eßer
1108d43fa8efSStefan Eßer	tests="test_dc"
110910328f8bSStefan Eßer
11103aa99676SStefan Eßerelse
11113aa99676SStefan Eßer
11123aa99676SStefan Eßer	bc=1
11133aa99676SStefan Eßer	dc=1
11143aa99676SStefan Eßer
11153aa99676SStefan Eßer	executables="bc and dc"
11163aa99676SStefan Eßer
11173aa99676SStefan Eßer	karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)"
11183aa99676SStefan Eßer	karatsuba_test="@\$(KARATSUBA) 1 100 \$(BC_EXEC)"
11193aa99676SStefan Eßer
112050696a6eSStefan Eßer	if [ "$library" -eq 0 ]; then
112150696a6eSStefan Eßer		install_prereqs=" install_execs"
112250696a6eSStefan Eßer		install_man_prereqs=" install_bc_manpage install_dc_manpage"
11233aa99676SStefan Eßer		uninstall_prereqs=" uninstall_bc uninstall_dc"
11243aa99676SStefan Eßer		uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage"
112550696a6eSStefan Eßer	else
112650696a6eSStefan Eßer		install_prereqs=" install_library install_bcl_header"
112750696a6eSStefan Eßer		install_man_prereqs=" install_bcl_manpage"
112850696a6eSStefan Eßer		uninstall_prereqs=" uninstall_library uninstall_bcl_header"
112950696a6eSStefan Eßer		uninstall_man_prereqs=" uninstall_bcl_manpage"
113050696a6eSStefan Eßer		tests="test_library"
113150696a6eSStefan Eßer	fi
11323aa99676SStefan Eßer
113310328f8bSStefan Eßer	second_target_prereqs="$default_target_prereqs"
113410328f8bSStefan Eßer	default_target_prereqs="$second_target"
113510328f8bSStefan Eßer	default_target_cmd="\$(LINK) \$(BIN) \$(EXEC_PREFIX)\$(DC)"
113610328f8bSStefan Eßer
113710328f8bSStefan Eßerfi
113810328f8bSStefan Eßer
113944d4804dSStefan Eßer# We need specific stuff for fuzzing.
114010328f8bSStefan Eßerif [ "$fuzz" -ne 0 ]; then
114110328f8bSStefan Eßer	debug=1
114210328f8bSStefan Eßer	hist=0
114310328f8bSStefan Eßer	nls=0
114410328f8bSStefan Eßer	optimization="3"
11453aa99676SStefan Eßerfi
11463aa99676SStefan Eßer
114744d4804dSStefan Eßer# This sets some necessary things for debug mode.
11483aa99676SStefan Eßerif [ "$debug" -eq 1 ]; then
11493aa99676SStefan Eßer
11503aa99676SStefan Eßer	if [ -z "$CFLAGS" ] && [ -z "$optimization" ]; then
11513aa99676SStefan Eßer		CFLAGS="-O0"
11523aa99676SStefan Eßer	fi
11533aa99676SStefan Eßer
11543aa99676SStefan Eßer	CFLAGS="-g $CFLAGS"
11553aa99676SStefan Eßer
11563aa99676SStefan Eßerelse
115744d4804dSStefan Eßer
11583aa99676SStefan Eßer	CPPFLAGS="-DNDEBUG $CPPFLAGS"
115944d4804dSStefan Eßer
11603aa99676SStefan Eßer	if [ "$strip_bin" -ne 0 ]; then
11613aa99676SStefan Eßer		LDFLAGS="-s $LDFLAGS"
11623aa99676SStefan Eßer	fi
11633aa99676SStefan Eßerfi
11643aa99676SStefan Eßer
116544d4804dSStefan Eßer# Set optimization CFLAGS.
11663aa99676SStefan Eßerif [ -n "$optimization" ]; then
11673aa99676SStefan Eßer	CFLAGS="-O$optimization $CFLAGS"
11683aa99676SStefan Eßerfi
11693aa99676SStefan Eßer
117044d4804dSStefan Eßer# Set test coverage defaults.
11713aa99676SStefan Eßerif [ "$coverage" -eq 1 ]; then
11723aa99676SStefan Eßer
11733aa99676SStefan Eßer	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
11743aa99676SStefan Eßer		usage "Can only specify -c without -b or -d"
11753aa99676SStefan Eßer	fi
11763aa99676SStefan Eßer
11773aa99676SStefan Eßer	CFLAGS="-fprofile-arcs -ftest-coverage -g -O0 $CFLAGS"
11783aa99676SStefan Eßer	CPPFLAGS="-DNDEBUG $CPPFLAGS"
11793aa99676SStefan Eßer
11803aa99676SStefan Eßer	COVERAGE_OUTPUT="@gcov -pabcdf \$(GCDA) \$(BC_GCDA) \$(DC_GCDA) \$(HISTORY_GCDA) \$(RAND_GCDA)"
11813aa99676SStefan Eßer	COVERAGE_OUTPUT="$COVERAGE_OUTPUT;\$(RM) -f \$(GEN)*.gc*"
118244d4804dSStefan Eßer	COVERAGE_OUTPUT="$COVERAGE_OUTPUT;gcovr --exclude-unreachable-branches --exclude-throw-branches --html-details --output index.html"
11833aa99676SStefan Eßer	COVERAGE_PREREQS=" test coverage_output"
11843aa99676SStefan Eßer
11853aa99676SStefan Eßerelse
11863aa99676SStefan Eßer	COVERAGE_OUTPUT="@printf 'Coverage not generated\\\\n'"
11873aa99676SStefan Eßer	COVERAGE_PREREQS=""
11883aa99676SStefan Eßerfi
11893aa99676SStefan Eßer
119044d4804dSStefan Eßer
119144d4804dSStefan Eßer# Set some defaults.
11923aa99676SStefan Eßerif [ -z "${DESTDIR+set}" ]; then
11933aa99676SStefan Eßer	destdir=""
11943aa99676SStefan Eßerelse
11953aa99676SStefan Eßer	destdir="DESTDIR = $DESTDIR"
11963aa99676SStefan Eßerfi
11973aa99676SStefan Eßer
11983aa99676SStefan Eßerif [ -z "${PREFIX+set}" ]; then
11993aa99676SStefan Eßer	PREFIX="/usr/local"
12003aa99676SStefan Eßerfi
12013aa99676SStefan Eßer
12023aa99676SStefan Eßerif [ -z "${BINDIR+set}" ]; then
12033aa99676SStefan Eßer	BINDIR="$PREFIX/bin"
12043aa99676SStefan Eßerfi
12053aa99676SStefan Eßer
120650696a6eSStefan Eßerif [ -z "${INCLUDEDIR+set}" ]; then
120750696a6eSStefan Eßer	INCLUDEDIR="$PREFIX/include"
120850696a6eSStefan Eßerfi
120950696a6eSStefan Eßer
121050696a6eSStefan Eßerif [ -z "${LIBDIR+set}" ]; then
121150696a6eSStefan Eßer	LIBDIR="$PREFIX/lib"
121250696a6eSStefan Eßerfi
121350696a6eSStefan Eßer
121410041e99SStefan Eßerif [ -z "${PC_PATH+set}" ]; then
121510041e99SStefan Eßer
121610041e99SStefan Eßer	set +e
121710041e99SStefan Eßer
121810041e99SStefan Eßer	command -v pkg-config > /dev/null
121910041e99SStefan Eßer	err=$?
122010041e99SStefan Eßer
122110041e99SStefan Eßer	set -e
122210041e99SStefan Eßer
122310041e99SStefan Eßer	if [ "$err" -eq 0 ]; then
122410041e99SStefan Eßer		PC_PATH=$(pkg-config --variable=pc_path pkg-config)
122510041e99SStefan Eßer		PC_PATH="${PC_PATH%%:*}"
122610041e99SStefan Eßer	else
122710041e99SStefan Eßer		PC_PATH=""
122810041e99SStefan Eßer	fi
122910041e99SStefan Eßer
123010041e99SStefan Eßerfi
123110041e99SStefan Eßer
123244d4804dSStefan Eßer# Set a default for the DATAROOTDIR. This is done if either manpages will be
123344d4804dSStefan Eßer# installed, or locales are enabled because that's probably where NLS_PATH
123444d4804dSStefan Eßer# points.
12353aa99676SStefan Eßerif [ "$install_manpages" -ne 0 ] || [ "$nls" -ne 0 ]; then
12363aa99676SStefan Eßer	if [ -z "${DATAROOTDIR+set}" ]; then
12373aa99676SStefan Eßer		DATAROOTDIR="$PREFIX/share"
12383aa99676SStefan Eßer	fi
12393aa99676SStefan Eßerfi
12403aa99676SStefan Eßer
124144d4804dSStefan Eßer# Set defaults for manpage environment variables.
12423aa99676SStefan Eßerif [ "$install_manpages" -ne 0 ]; then
12433aa99676SStefan Eßer
12443aa99676SStefan Eßer	if [ -z "${DATADIR+set}" ]; then
12453aa99676SStefan Eßer		DATADIR="$DATAROOTDIR"
12463aa99676SStefan Eßer	fi
12473aa99676SStefan Eßer
12483aa99676SStefan Eßer	if [ -z "${MANDIR+set}" ]; then
12493aa99676SStefan Eßer		MANDIR="$DATADIR/man"
12503aa99676SStefan Eßer	fi
12513aa99676SStefan Eßer
12523aa99676SStefan Eßer	if [ -z "${MAN1DIR+set}" ]; then
12533aa99676SStefan Eßer		MAN1DIR="$MANDIR/man1"
12543aa99676SStefan Eßer	fi
12553aa99676SStefan Eßer
125650696a6eSStefan Eßer	if [ -z "${MAN3DIR+set}" ]; then
125750696a6eSStefan Eßer		MAN3DIR="$MANDIR/man3"
125850696a6eSStefan Eßer	fi
125950696a6eSStefan Eßer
12603aa99676SStefan Eßerelse
126150696a6eSStefan Eßer	install_man_prereqs=""
12623aa99676SStefan Eßer	uninstall_man_prereqs=""
12633aa99676SStefan Eßerfi
12643aa99676SStefan Eßer
126544d4804dSStefan Eßer# Here is where we test NLS (the locale system). This is done by trying to
126644d4804dSStefan Eßer# compile src/vm.c, which has the relevant code. If it fails, then it is
126744d4804dSStefan Eßer# disabled.
12683aa99676SStefan Eßerif [ "$nls" -ne 0 ]; then
12693aa99676SStefan Eßer
12703aa99676SStefan Eßer	set +e
12713aa99676SStefan Eßer
12723aa99676SStefan Eßer	printf 'Testing NLS...\n'
12733aa99676SStefan Eßer
12743aa99676SStefan Eßer	flags="-DBC_ENABLE_NLS=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
127544d4804dSStefan Eßer	flags="$flags -DBC_ENABLE_HISTORY=$hist -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
127610041e99SStefan Eßer	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/"
12773aa99676SStefan Eßer	flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
12783aa99676SStefan Eßer
127910041e99SStefan Eßer	"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/vm.c" -o "./vm.o" > /dev/null 2>&1
12803aa99676SStefan Eßer
12813aa99676SStefan Eßer	err="$?"
12823aa99676SStefan Eßer
128310041e99SStefan Eßer	rm -rf "./vm.o"
12843aa99676SStefan Eßer
12853aa99676SStefan Eßer	# If this errors, it is probably because of building on Windows,
12863aa99676SStefan Eßer	# and NLS is not supported on Windows, so disable it.
12873aa99676SStefan Eßer	if [ "$err" -ne 0 ]; then
12883aa99676SStefan Eßer		printf 'NLS does not work.\n'
12893aa99676SStefan Eßer		if [ $force -eq 0 ]; then
12903aa99676SStefan Eßer			printf 'Disabling NLS...\n\n'
12913aa99676SStefan Eßer			nls=0
12923aa99676SStefan Eßer		else
12933aa99676SStefan Eßer			printf 'Forcing NLS...\n\n'
12943aa99676SStefan Eßer		fi
12953aa99676SStefan Eßer	else
12963aa99676SStefan Eßer		printf 'NLS works.\n\n'
12973aa99676SStefan Eßer
12983aa99676SStefan Eßer		printf 'Testing gencat...\n'
129910041e99SStefan Eßer		gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" > /dev/null 2>&1
13003aa99676SStefan Eßer
13013aa99676SStefan Eßer		err="$?"
13023aa99676SStefan Eßer
130310041e99SStefan Eßer		rm -rf "./en_US.cat"
13043aa99676SStefan Eßer
13053aa99676SStefan Eßer		if [ "$err" -ne 0 ]; then
13063aa99676SStefan Eßer			printf 'gencat does not work.\n'
13073aa99676SStefan Eßer			if [ $force -eq 0 ]; then
13083aa99676SStefan Eßer				printf 'Disabling NLS...\n\n'
13093aa99676SStefan Eßer				nls=0
13103aa99676SStefan Eßer			else
13113aa99676SStefan Eßer				printf 'Forcing NLS...\n\n'
13123aa99676SStefan Eßer			fi
13133aa99676SStefan Eßer		else
13143aa99676SStefan Eßer
13153aa99676SStefan Eßer			printf 'gencat works.\n\n'
13163aa99676SStefan Eßer
131744d4804dSStefan Eßer			# It turns out that POSIX locales are really terrible, and running
131844d4804dSStefan Eßer			# gencat on one machine is not guaranteed to make those cat files
131944d4804dSStefan Eßer			# portable to another machine, so we had better warn the user here.
132044d4804dSStefan Eßer			if [ "$HOSTCC" != "$CC" ] || [ "$OLDHOSTCFLAGS" != "$OLDCFLAGS" ]; then
13213aa99676SStefan Eßer				printf 'Cross-compile detected.\n\n'
13223aa99676SStefan Eßer				printf 'WARNING: Catalog files generated with gencat may not be portable\n'
13233aa99676SStefan Eßer				printf '         across different architectures.\n\n'
13243aa99676SStefan Eßer			fi
13253aa99676SStefan Eßer
13263aa99676SStefan Eßer			if [ -z "$NLSPATH" ]; then
13273aa99676SStefan Eßer				NLSPATH="/usr/share/locale/%L/%N"
13283aa99676SStefan Eßer			fi
13293aa99676SStefan Eßer
13303aa99676SStefan Eßer			install_locales_prereqs=" install_locales"
13313aa99676SStefan Eßer			uninstall_locales_prereqs=" uninstall_locales"
13323aa99676SStefan Eßer
13333aa99676SStefan Eßer		fi
13343aa99676SStefan Eßer
13353aa99676SStefan Eßer	fi
13363aa99676SStefan Eßer
13373aa99676SStefan Eßer	set -e
13383aa99676SStefan Eßer
13393aa99676SStefan Eßerelse
13403aa99676SStefan Eßer	install_locales_prereqs=""
13413aa99676SStefan Eßer	uninstall_locales_prereqs=""
1342cf7becd2SStefan Eßer	all_locales=0
1343cf7becd2SStefan Eßerfi
1344cf7becd2SStefan Eßer
1345cf7becd2SStefan Eßerif [ "$nls" -ne 0 ] && [ "$all_locales" -ne 0 ]; then
1346cf7becd2SStefan Eßer	install_locales="\$(LOCALE_INSTALL) -l \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
1347cf7becd2SStefan Eßerelse
1348cf7becd2SStefan Eßer	install_locales="\$(LOCALE_INSTALL) \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
13493aa99676SStefan Eßerfi
13503aa99676SStefan Eßer
135144d4804dSStefan Eßer# Like the above tested locale support, this tests history.
13523aa99676SStefan Eßerif [ "$hist" -eq 1 ]; then
13533aa99676SStefan Eßer
1354*78bc019dSStefan Eßer	if [ "$editline" -ne 0 ] && [ "$readline" -ne 0 ]; then
1355*78bc019dSStefan Eßer		usage "Must only enable one of readline or editline"
1356*78bc019dSStefan Eßer	fi
1357*78bc019dSStefan Eßer
13583aa99676SStefan Eßer	set +e
13593aa99676SStefan Eßer
13603aa99676SStefan Eßer	printf 'Testing history...\n'
13613aa99676SStefan Eßer
13623aa99676SStefan Eßer	flags="-DBC_ENABLE_HISTORY=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
136344d4804dSStefan Eßer	flags="$flags -DBC_ENABLE_NLS=$nls -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
1364*78bc019dSStefan Eßer	flags="$flags -DBC_ENABLE_EDITLINE=$editline -DBC_ENABLE_READLINE=$readline"
136510041e99SStefan Eßer	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/"
13663aa99676SStefan Eßer	flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
13673aa99676SStefan Eßer
136810041e99SStefan Eßer	"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/history.c" -o "./history.o" > /dev/null 2>&1
13693aa99676SStefan Eßer
13703aa99676SStefan Eßer	err="$?"
13713aa99676SStefan Eßer
137210041e99SStefan Eßer	rm -rf "./history.o"
13733aa99676SStefan Eßer
13743aa99676SStefan Eßer	# If this errors, it is probably because of building on Windows,
13753aa99676SStefan Eßer	# and history is not supported on Windows, so disable it.
13763aa99676SStefan Eßer	if [ "$err" -ne 0 ]; then
13773aa99676SStefan Eßer		printf 'History does not work.\n'
13783aa99676SStefan Eßer		if [ $force -eq 0 ]; then
13793aa99676SStefan Eßer			printf 'Disabling history...\n\n'
13803aa99676SStefan Eßer			hist=0
13813aa99676SStefan Eßer		else
13823aa99676SStefan Eßer			printf 'Forcing history...\n\n'
13833aa99676SStefan Eßer		fi
13843aa99676SStefan Eßer	else
13853aa99676SStefan Eßer		printf 'History works.\n\n'
13863aa99676SStefan Eßer	fi
13873aa99676SStefan Eßer
13883aa99676SStefan Eßer	set -e
13893aa99676SStefan Eßer
13903aa99676SStefan Eßerfi
13913aa99676SStefan Eßer
1392*78bc019dSStefan Eßer# We have to disable the history tests if it is disabled or valgrind is on. Or
1393*78bc019dSStefan Eßer# if we are using editline or readline.
139444d4804dSStefan Eßerif [ "$hist" -eq 0 ] || [ "$vg" -ne 0 ]; then
139544d4804dSStefan Eßer	test_bc_history_prereqs=" test_bc_history_skip"
139644d4804dSStefan Eßer	test_dc_history_prereqs=" test_dc_history_skip"
139744d4804dSStefan Eßer	history_tests="@printf 'Skipping history tests...\\\\n'"
1398*78bc019dSStefan Eßer	CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0"
139944d4804dSStefan Eßerelse
1400*78bc019dSStefan Eßer
1401*78bc019dSStefan Eßer	if [ "$editline" -eq 0 ] && [ "$readline" -eq 0 ]; then
1402*78bc019dSStefan Eßer		history_tests="@printf '\$(TEST_STARS)\\\\n\\\\nRunning history tests...\\\\n\\\\n'"
1403*78bc019dSStefan Eßer		history_tests="$history_tests \&\& \$(TESTSDIR)/history.sh bc -a \&\&"
1404*78bc019dSStefan Eßer		history_tests="$history_tests \$(TESTSDIR)/history.sh dc -a \&\& printf"
1405*78bc019dSStefan Eßer		history_tests="$history_tests '\\\\nAll history tests passed.\\\\n\\\\n\$(TEST_STARS)\\\\n'"
1406*78bc019dSStefan Eßer	else
1407*78bc019dSStefan Eßer		test_bc_history_prereqs=" test_bc_history_skip"
1408*78bc019dSStefan Eßer		test_dc_history_prereqs=" test_dc_history_skip"
1409*78bc019dSStefan Eßer		history_tests="@printf 'Skipping history tests...\\\\n'"
1410*78bc019dSStefan Eßer	fi
1411*78bc019dSStefan Eßer
1412*78bc019dSStefan Eßer	# We are also setting the CFLAGS and LDFLAGS here.
1413*78bc019dSStefan Eßer	if [ "$editline" -ne 0 ]; then
1414*78bc019dSStefan Eßer		LDFLAGS="$LDFLAGS -ledit"
1415*78bc019dSStefan Eßer		CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=1 -DBC_ENABLE_READLINE=0"
1416*78bc019dSStefan Eßer	elif [ "$readline" -ne 0 ]; then
1417*78bc019dSStefan Eßer		LDFLAGS="$LDFLAGS -lreadline"
1418*78bc019dSStefan Eßer		CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=1"
1419*78bc019dSStefan Eßer	else
1420*78bc019dSStefan Eßer		CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0"
1421*78bc019dSStefan Eßer	fi
1422*78bc019dSStefan Eßer
1423*78bc019dSStefan Eßerfi
1424*78bc019dSStefan Eßer
1425*78bc019dSStefan Eßer# Test FreeBSD. This is not in an if statement because regardless of whatever
1426*78bc019dSStefan Eßer# the user says, we need to know if we are on FreeBSD. If we are, we cannot set
1427*78bc019dSStefan Eßer# _POSIX_C_SOURCE and _XOPEN_SOURCE. The FreeBSD headers turn *off* stuff when
1428*78bc019dSStefan Eßer# that is done.
1429*78bc019dSStefan Eßerset +e
1430*78bc019dSStefan Eßerprintf 'Testing for FreeBSD...\n'
1431*78bc019dSStefan Eßer
1432*78bc019dSStefan Eßerflags="-DBC_TEST_FREEBSD -DBC_ENABLE_AFL=0"
1433*78bc019dSStefan Eßer"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/include/status.h" > /dev/null 2>&1
1434*78bc019dSStefan Eßer
1435*78bc019dSStefan Eßererr="$?"
1436*78bc019dSStefan Eßer
1437*78bc019dSStefan Eßerif [ "$err" -ne 0 ]; then
1438*78bc019dSStefan Eßer	printf 'On FreeBSD. Not using _POSIX_C_SOURCE and _XOPEN_SOURCE.\n\n'
1439*78bc019dSStefan Eßerelse
1440*78bc019dSStefan Eßer	printf 'Not on FreeBSD. Using _POSIX_C_SOURCE and _XOPEN_SOURCE.\n\n'
1441*78bc019dSStefan Eßer	CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
144244d4804dSStefan Eßerfi
144344d4804dSStefan Eßer
144444d4804dSStefan Eßer# Test OpenBSD. This is not in an if statement because regardless of whatever
144544d4804dSStefan Eßer# the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE.
144644d4804dSStefan Eßer# No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC
144744d4804dSStefan Eßer# and Clang complain that that is only allowed for system headers. Sigh....So we
144844d4804dSStefan Eßer# have to check at configure time and set it on the compiler command-line. And
144944d4804dSStefan Eßer# we have to set it because we also set _POSIX_C_SOURCE, which OpenBSD headers
145044d4804dSStefan Eßer# detect, and when they detect it, they turn off _BSD_SOURCE unless it is
145144d4804dSStefan Eßer# specifically requested.
145244d4804dSStefan Eßerset +e
145344d4804dSStefan Eßerprintf 'Testing for OpenBSD...\n'
145444d4804dSStefan Eßer
145544d4804dSStefan Eßerflags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0"
145610041e99SStefan Eßer"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/include/status.h" > /dev/null 2>&1
145744d4804dSStefan Eßer
145844d4804dSStefan Eßererr="$?"
145944d4804dSStefan Eßer
146044d4804dSStefan Eßerif [ "$err" -ne 0 ]; then
146144d4804dSStefan Eßer	printf 'On OpenBSD. Using _BSD_SOURCE.\n\n'
146244d4804dSStefan Eßer	bsd="-D_BSD_SOURCE"
146344d4804dSStefan Eßerelse
146444d4804dSStefan Eßer	printf 'Not on OpenBSD.\n\n'
146544d4804dSStefan Eßer	bsd=""
146644d4804dSStefan Eßerfi
146744d4804dSStefan Eßer
146850696a6eSStefan Eßerif [ "$library" -eq 1 ]; then
146950696a6eSStefan Eßer	bc_lib=""
147050696a6eSStefan Eßerfi
147150696a6eSStefan Eßer
147250696a6eSStefan Eßerif [ "$extra_math" -eq 1 ] && [ "$bc" -ne 0 ] && [ "$library" -eq 0 ]; then
14733aa99676SStefan Eßer	BC_LIB2_O="\$(GEN_DIR)/lib2.o"
14743aa99676SStefan Eßerelse
14753aa99676SStefan Eßer	BC_LIB2_O=""
14763aa99676SStefan Eßerfi
14773aa99676SStefan Eßer
147844d4804dSStefan Eßer# These lines set the appropriate targets based on whether `gen/strgen.c` or
147944d4804dSStefan Eßer# `gen/strgen.sh` is used.
14803aa99676SStefan EßerGEN="strgen"
14813aa99676SStefan EßerGEN_EXEC_TARGET="\$(HOSTCC) \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)"
148244d4804dSStefan EßerCLEAN_PREREQS=" clean_gen clean_coverage"
14833aa99676SStefan Eßer
14843aa99676SStefan Eßerif [ -z "${GEN_HOST+set}" ]; then
14853aa99676SStefan Eßer	GEN_HOST=1
14863aa99676SStefan Eßerelse
14873aa99676SStefan Eßer	if [ "$GEN_HOST" -eq 0 ]; then
14883aa99676SStefan Eßer		GEN="strgen.sh"
14893aa99676SStefan Eßer		GEN_EXEC_TARGET="@printf 'Do not need to build gen/strgen.c\\\\n'"
149044d4804dSStefan Eßer		CLEAN_PREREQS=" clean_coverage"
14913aa99676SStefan Eßer	fi
14923aa99676SStefan Eßerfi
14933aa99676SStefan Eßer
14943aa99676SStefan Eßermanpage_args=""
149510328f8bSStefan Eßerunneeded=""
149610328f8bSStefan Eßerheaders="\$(HEADERS)"
14973aa99676SStefan Eßer
149844d4804dSStefan Eßer# This series of if statements figure out what source files are *not* needed.
14993aa99676SStefan Eßerif [ "$extra_math" -eq 0 ]; then
1500*78bc019dSStefan Eßer	exclude_extra_math=1
15013aa99676SStefan Eßer	manpage_args="E"
150210328f8bSStefan Eßer	unneeded="$unneeded rand.c"
150310328f8bSStefan Eßerelse
1504*78bc019dSStefan Eßer	exclude_extra_math=0
150510328f8bSStefan Eßer	headers="$headers \$(EXTRA_MATH_HEADERS)"
15063aa99676SStefan Eßerfi
15073aa99676SStefan Eßer
150844d4804dSStefan Eßer# All of these next if statements set the build type and mark certain source
150944d4804dSStefan Eßer# files as unneeded so that they won't have targets generated for them.
151044d4804dSStefan Eßer
15113aa99676SStefan Eßerif [ "$hist" -eq 0 ]; then
15123aa99676SStefan Eßer	manpage_args="${manpage_args}H"
151310328f8bSStefan Eßer	unneeded="$unneeded history.c"
151410328f8bSStefan Eßerelse
151510328f8bSStefan Eßer	headers="$headers \$(HISTORY_HEADERS)"
15163aa99676SStefan Eßerfi
15173aa99676SStefan Eßer
15183aa99676SStefan Eßerif [ "$nls" -eq 0 ]; then
15193aa99676SStefan Eßer	manpage_args="${manpage_args}N"
15203aa99676SStefan Eßerfi
15213aa99676SStefan Eßer
152250696a6eSStefan Eßerif [ "$bc" -eq 0 ]; then
152350696a6eSStefan Eßer	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
152410328f8bSStefan Eßerelse
152510328f8bSStefan Eßer	headers="$headers \$(BC_HEADERS)"
152650696a6eSStefan Eßerfi
152750696a6eSStefan Eßer
152850696a6eSStefan Eßerif [ "$dc" -eq 0 ]; then
152950696a6eSStefan Eßer	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
153010328f8bSStefan Eßerelse
153110328f8bSStefan Eßer	headers="$headers \$(DC_HEADERS)"
153250696a6eSStefan Eßerfi
153350696a6eSStefan Eßer
153410041e99SStefan Eßer# This convoluted mess does pull the version out. If you change the format of
153510041e99SStefan Eßer# include/version.h, you may have to change this line.
153610041e99SStefan Eßerversion=$(cat "$scriptdir/include/version.h" | grep "VERSION " - | awk '{ print $3 }' -)
153710041e99SStefan Eßer
153850696a6eSStefan Eßerif [ "$library" -ne 0 ]; then
153910041e99SStefan Eßer
154050696a6eSStefan Eßer	unneeded="$unneeded args.c opt.c read.c file.c main.c"
154150696a6eSStefan Eßer	unneeded="$unneeded lang.c lex.c parse.c program.c"
154250696a6eSStefan Eßer	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
154350696a6eSStefan Eßer	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
154410328f8bSStefan Eßer	headers="$headers \$(LIBRARY_HEADERS)"
154510041e99SStefan Eßer
154610041e99SStefan Eßer	if [ "$PC_PATH" != "" ]; then
154710041e99SStefan Eßer
154810041e99SStefan Eßer		contents=$(cat "$scriptdir/bcl.pc.in")
154910041e99SStefan Eßer
155010041e99SStefan Eßer		contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
155110041e99SStefan Eßer		contents=$(replace "$contents" "LIBDIR" "$LIBDIR")
155210041e99SStefan Eßer		contents=$(replace "$contents" "VERSION" "$version")
155310041e99SStefan Eßer
155410041e99SStefan Eßer		printf '%s\n' "$contents" > "./bcl.pc"
155510041e99SStefan Eßer
155610041e99SStefan Eßer		pkg_config_install="\$(SAFE_INSTALL) \$(PC_INSTALL_ARGS) \"\$(BCL_PC)\" \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
155710041e99SStefan Eßer		pkg_config_uninstall="\$(RM) -f \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
155810041e99SStefan Eßer
155950696a6eSStefan Eßer	else
156010041e99SStefan Eßer
156110041e99SStefan Eßer		pkg_config_install=""
156210041e99SStefan Eßer		pkg_config_uninstall=""
156310041e99SStefan Eßer
156410041e99SStefan Eßer	fi
156510041e99SStefan Eßer
156610041e99SStefan Eßerelse
156710041e99SStefan Eßer
156850696a6eSStefan Eßer	unneeded="$unneeded library.c"
156910041e99SStefan Eßer
157010041e99SStefan Eßer	PC_PATH=""
157110041e99SStefan Eßer	pkg_config_install=""
157210041e99SStefan Eßer	pkg_config_uninstall=""
157310041e99SStefan Eßer
157450696a6eSStefan Eßerfi
157550696a6eSStefan Eßer
157644d4804dSStefan Eßer# library.c is not needed under normal circumstances.
157744d4804dSStefan Eßerif [ "$unneeded" = "" ]; then
157844d4804dSStefan Eßer	unneeded="library.c"
157944d4804dSStefan Eßerfi
158044d4804dSStefan Eßer
158144d4804dSStefan Eßer# This sets the appropriate manpage for a full build.
158210328f8bSStefan Eßerif [ "$manpage_args" = "" ]; then
158310328f8bSStefan Eßer	manpage_args="A"
158410328f8bSStefan Eßerfi
158510328f8bSStefan Eßer
158610328f8bSStefan Eßerif [ "$vg" -ne 0 ]; then
158710328f8bSStefan Eßer	memcheck=1
158810328f8bSStefan Eßerfi
158910328f8bSStefan Eßer
159044d4804dSStefan Eßerif [ "$bc_default_prompt" = "" ]; then
159144d4804dSStefan Eßer	bc_default_prompt="$bc_default_tty_mode"
159244d4804dSStefan Eßerfi
159344d4804dSStefan Eßer
159444d4804dSStefan Eßerif [ "$dc_default_prompt" = "" ]; then
159544d4804dSStefan Eßer	dc_default_prompt="$dc_default_tty_mode"
159644d4804dSStefan Eßerfi
159744d4804dSStefan Eßer
159844d4804dSStefan Eßer# Generate the test targets and prerequisites.
1599d43fa8efSStefan Eßerbc_tests=$(gen_std_test_targets bc)
160010328f8bSStefan Eßerbc_script_tests=$(gen_script_test_targets bc)
1601d43fa8efSStefan Eßerbc_err_tests=$(gen_err_test_targets bc)
1602d43fa8efSStefan Eßerdc_tests=$(gen_std_test_targets dc)
160310328f8bSStefan Eßerdc_script_tests=$(gen_script_test_targets dc)
1604d43fa8efSStefan Eßerdc_err_tests=$(gen_err_test_targets dc)
160510328f8bSStefan Eßer
16063aa99676SStefan Eßer# Print out the values; this is for debugging.
160710041e99SStefan Eßerprintf 'Version: %s\n' "$version"
160810041e99SStefan Eßer
16093aa99676SStefan Eßerif [ "$bc" -ne 0 ]; then
16103aa99676SStefan Eßer	printf 'Building bc\n'
16113aa99676SStefan Eßerelse
16123aa99676SStefan Eßer	printf 'Not building bc\n'
16133aa99676SStefan Eßerfi
16143aa99676SStefan Eßerif [ "$dc" -ne 0 ]; then
16153aa99676SStefan Eßer	printf 'Building dc\n'
16163aa99676SStefan Eßerelse
16173aa99676SStefan Eßer	printf 'Not building dc\n'
16183aa99676SStefan Eßerfi
16193aa99676SStefan Eßerprintf '\n'
162050696a6eSStefan Eßerprintf 'BC_ENABLE_LIBRARY=%s\n\n' "$library"
16213aa99676SStefan Eßerprintf 'BC_ENABLE_HISTORY=%s\n' "$hist"
16223aa99676SStefan Eßerprintf 'BC_ENABLE_EXTRA_MATH=%s\n' "$extra_math"
16233aa99676SStefan Eßerprintf 'BC_ENABLE_NLS=%s\n' "$nls"
162410328f8bSStefan Eßerprintf 'BC_ENABLE_AFL=%s\n' "$fuzz"
16253aa99676SStefan Eßerprintf '\n'
16263aa99676SStefan Eßerprintf 'BC_NUM_KARATSUBA_LEN=%s\n' "$karatsuba_len"
16273aa99676SStefan Eßerprintf '\n'
16283aa99676SStefan Eßerprintf 'CC=%s\n' "$CC"
16293aa99676SStefan Eßerprintf 'CFLAGS=%s\n' "$CFLAGS"
16303aa99676SStefan Eßerprintf 'HOSTCC=%s\n' "$HOSTCC"
16313aa99676SStefan Eßerprintf 'HOSTCFLAGS=%s\n' "$HOSTCFLAGS"
16323aa99676SStefan Eßerprintf 'CPPFLAGS=%s\n' "$CPPFLAGS"
16333aa99676SStefan Eßerprintf 'LDFLAGS=%s\n' "$LDFLAGS"
16343aa99676SStefan Eßerprintf 'PREFIX=%s\n' "$PREFIX"
16353aa99676SStefan Eßerprintf 'BINDIR=%s\n' "$BINDIR"
163650696a6eSStefan Eßerprintf 'INCLUDEDIR=%s\n' "$INCLUDEDIR"
163750696a6eSStefan Eßerprintf 'LIBDIR=%s\n' "$LIBDIR"
16383aa99676SStefan Eßerprintf 'DATAROOTDIR=%s\n' "$DATAROOTDIR"
16393aa99676SStefan Eßerprintf 'DATADIR=%s\n' "$DATADIR"
16403aa99676SStefan Eßerprintf 'MANDIR=%s\n' "$MANDIR"
16413aa99676SStefan Eßerprintf 'MAN1DIR=%s\n' "$MAN1DIR"
164250696a6eSStefan Eßerprintf 'MAN3DIR=%s\n' "$MAN3DIR"
16433aa99676SStefan Eßerprintf 'NLSPATH=%s\n' "$NLSPATH"
164410041e99SStefan Eßerprintf 'PC_PATH=%s\n' "$PC_PATH"
16453aa99676SStefan Eßerprintf 'EXECSUFFIX=%s\n' "$EXECSUFFIX"
16463aa99676SStefan Eßerprintf 'EXECPREFIX=%s\n' "$EXECPREFIX"
16473aa99676SStefan Eßerprintf 'DESTDIR=%s\n' "$DESTDIR"
16483aa99676SStefan Eßerprintf 'LONG_BIT=%s\n' "$LONG_BIT"
16493aa99676SStefan Eßerprintf 'GEN_HOST=%s\n' "$GEN_HOST"
16503aa99676SStefan Eßerprintf 'GEN_EMU=%s\n' "$GEN_EMU"
165144d4804dSStefan Eßerprintf '\n'
165244d4804dSStefan Eßerprintf 'Setting Defaults\n'
165344d4804dSStefan Eßerprintf '================\n'
165444d4804dSStefan Eßerprintf 'bc.banner=%s\n' "$bc_default_banner"
165544d4804dSStefan Eßerprintf 'bc.sigint_reset=%s\n' "$bc_default_sigint_reset"
165644d4804dSStefan Eßerprintf 'dc.sigint_reset=%s\n' "$dc_default_sigint_reset"
165744d4804dSStefan Eßerprintf 'bc.tty_mode=%s\n' "$bc_default_tty_mode"
165844d4804dSStefan Eßerprintf 'dc.tty_mode=%s\n' "$dc_default_tty_mode"
165944d4804dSStefan Eßerprintf 'bc.prompt=%s\n' "$bc_default_prompt"
166044d4804dSStefan Eßerprintf 'dc.prompt=%s\n' "$dc_default_prompt"
166110041e99SStefan Eßerprintf 'bc.expr_exit=%s\n' "$bc_default_expr_exit"
166210041e99SStefan Eßerprintf 'dc.expr_exit=%s\n' "$dc_default_expr_exit"
166344d4804dSStefan Eßer
166444d4804dSStefan Eßer# This is where the real work begins. This is the point at which the Makefile.in
166544d4804dSStefan Eßer# template is edited and output to the Makefile.
16663aa99676SStefan Eßer
16673aa99676SStefan Eßercontents=$(cat "$scriptdir/Makefile.in")
16683aa99676SStefan Eßer
16693aa99676SStefan Eßerneedle="WARNING"
16703aa99676SStefan Eßerreplacement='*** WARNING: Autogenerated from Makefile.in. DO NOT MODIFY ***'
16713aa99676SStefan Eßer
16723aa99676SStefan Eßercontents=$(replace "$contents" "$needle" "$replacement")
16733aa99676SStefan Eßer
167444d4804dSStefan Eßer# The contents are edited to have the list of files to build.
167510328f8bSStefan Eßercontents=$(gen_file_list "$contents" $unneeded)
167610328f8bSStefan Eßer
167710328f8bSStefan EßerSRC_TARGETS=""
167810328f8bSStefan Eßer
167944d4804dSStefan Eßer# This line and loop generates the individual targets for source files. I used
168044d4804dSStefan Eßer# to just use an implicit target, but that was found to be inadequate when I
168144d4804dSStefan Eßer# added the library.
168210328f8bSStefan Eßersrc_files=$(find_src_files $unneeded)
168310328f8bSStefan Eßer
168410328f8bSStefan Eßerfor f in $src_files; do
168510328f8bSStefan Eßer	o=$(replace_ext "$f" "c" "o")
168610041e99SStefan Eßer	o=$(basename "$o")
168710041e99SStefan Eßer	SRC_TARGETS=$(printf '%s\n\nsrc/%s: src %s %s\n\t$(CC) $(CFLAGS) -o src/%s -c %s\n' \
168810328f8bSStefan Eßer		"$SRC_TARGETS" "$o" "$headers" "$f" "$o" "$f")
168910328f8bSStefan Eßerdone
169010328f8bSStefan Eßer
169144d4804dSStefan Eßer# Replace all the placeholders.
169210041e99SStefan Eßercontents=$(replace "$contents" "ROOTDIR" "$scriptdir")
169310041e99SStefan Eßercontents=$(replace "$contents" "BUILDDIR" "$builddir")
169410041e99SStefan Eßer
169510328f8bSStefan Eßercontents=$(replace "$contents" "HEADERS" "$headers")
169610328f8bSStefan Eßer
16973aa99676SStefan Eßercontents=$(replace "$contents" "BC_ENABLED" "$bc")
16983aa99676SStefan Eßercontents=$(replace "$contents" "DC_ENABLED" "$dc")
169910328f8bSStefan Eßer
170010328f8bSStefan Eßercontents=$(replace "$contents" "BC_ALL_TESTS" "$bc_test")
1701d43fa8efSStefan Eßercontents=$(replace "$contents" "BC_ALL_TESTS_NP" "$bc_test_np")
170210328f8bSStefan Eßercontents=$(replace "$contents" "BC_TESTS" "$bc_tests")
170310328f8bSStefan Eßercontents=$(replace "$contents" "BC_SCRIPT_TESTS" "$bc_script_tests")
1704d43fa8efSStefan Eßercontents=$(replace "$contents" "BC_ERROR_TESTS" "$bc_err_tests")
170510328f8bSStefan Eßercontents=$(replace "$contents" "BC_TEST_EXEC" "$bc_test_exec")
170610328f8bSStefan Eßercontents=$(replace "$contents" "TIMECONST_ALL_TESTS" "$timeconst")
170710328f8bSStefan Eßer
170810328f8bSStefan Eßercontents=$(replace "$contents" "DC_ALL_TESTS" "$dc_test")
1709d43fa8efSStefan Eßercontents=$(replace "$contents" "DC_ALL_TESTS_NP" "$dc_test_np")
171010328f8bSStefan Eßercontents=$(replace "$contents" "DC_TESTS" "$dc_tests")
171110328f8bSStefan Eßercontents=$(replace "$contents" "DC_SCRIPT_TESTS" "$dc_script_tests")
1712d43fa8efSStefan Eßercontents=$(replace "$contents" "DC_ERROR_TESTS" "$dc_err_tests")
171310328f8bSStefan Eßercontents=$(replace "$contents" "DC_TEST_EXEC" "$dc_test_exec")
17143aa99676SStefan Eßer
17157e5c51e5SStefan Eßercontents=$(replace "$contents" "BUILD_TYPE" "$manpage_args")
1716*78bc019dSStefan Eßercontents=$(replace "$contents" "EXCLUDE_EXTRA_MATH" "$exclude_extra_math")
17177e5c51e5SStefan Eßer
171850696a6eSStefan Eßercontents=$(replace "$contents" "LIBRARY" "$library")
17193aa99676SStefan Eßercontents=$(replace "$contents" "HISTORY" "$hist")
17203aa99676SStefan Eßercontents=$(replace "$contents" "EXTRA_MATH" "$extra_math")
17213aa99676SStefan Eßercontents=$(replace "$contents" "NLS" "$nls")
172210328f8bSStefan Eßercontents=$(replace "$contents" "FUZZ" "$fuzz")
172310328f8bSStefan Eßercontents=$(replace "$contents" "MEMCHECK" "$memcheck")
172410328f8bSStefan Eßer
17253aa99676SStefan Eßercontents=$(replace "$contents" "BC_LIB_O" "$bc_lib")
17263aa99676SStefan Eßercontents=$(replace "$contents" "BC_HELP_O" "$bc_help")
17273aa99676SStefan Eßercontents=$(replace "$contents" "DC_HELP_O" "$dc_help")
17283aa99676SStefan Eßercontents=$(replace "$contents" "BC_LIB2_O" "$BC_LIB2_O")
17293aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA_LEN" "$karatsuba_len")
17303aa99676SStefan Eßer
17313aa99676SStefan Eßercontents=$(replace "$contents" "NLSPATH" "$NLSPATH")
17323aa99676SStefan Eßercontents=$(replace "$contents" "DESTDIR" "$destdir")
17333aa99676SStefan Eßercontents=$(replace "$contents" "EXECSUFFIX" "$EXECSUFFIX")
17343aa99676SStefan Eßercontents=$(replace "$contents" "EXECPREFIX" "$EXECPREFIX")
17353aa99676SStefan Eßercontents=$(replace "$contents" "BINDIR" "$BINDIR")
173650696a6eSStefan Eßercontents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
173750696a6eSStefan Eßercontents=$(replace "$contents" "LIBDIR" "$LIBDIR")
17383aa99676SStefan Eßercontents=$(replace "$contents" "MAN1DIR" "$MAN1DIR")
173950696a6eSStefan Eßercontents=$(replace "$contents" "MAN3DIR" "$MAN3DIR")
17403aa99676SStefan Eßercontents=$(replace "$contents" "CFLAGS" "$CFLAGS")
17413aa99676SStefan Eßercontents=$(replace "$contents" "HOSTCFLAGS" "$HOSTCFLAGS")
17423aa99676SStefan Eßercontents=$(replace "$contents" "CPPFLAGS" "$CPPFLAGS")
17433aa99676SStefan Eßercontents=$(replace "$contents" "LDFLAGS" "$LDFLAGS")
17443aa99676SStefan Eßercontents=$(replace "$contents" "CC" "$CC")
17453aa99676SStefan Eßercontents=$(replace "$contents" "HOSTCC" "$HOSTCC")
17463aa99676SStefan Eßercontents=$(replace "$contents" "COVERAGE_OUTPUT" "$COVERAGE_OUTPUT")
17473aa99676SStefan Eßercontents=$(replace "$contents" "COVERAGE_PREREQS" "$COVERAGE_PREREQS")
17483aa99676SStefan Eßercontents=$(replace "$contents" "INSTALL_PREREQS" "$install_prereqs")
174950696a6eSStefan Eßercontents=$(replace "$contents" "INSTALL_MAN_PREREQS" "$install_man_prereqs")
1750cf7becd2SStefan Eßercontents=$(replace "$contents" "INSTALL_LOCALES" "$install_locales")
17513aa99676SStefan Eßercontents=$(replace "$contents" "INSTALL_LOCALES_PREREQS" "$install_locales_prereqs")
17523aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_MAN_PREREQS" "$uninstall_man_prereqs")
17533aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_PREREQS" "$uninstall_prereqs")
17543aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_LOCALES_PREREQS" "$uninstall_locales_prereqs")
17553aa99676SStefan Eßer
175610041e99SStefan Eßercontents=$(replace "$contents" "PC_PATH" "$PC_PATH")
175710041e99SStefan Eßercontents=$(replace "$contents" "PKG_CONFIG_INSTALL" "$pkg_config_install")
175810041e99SStefan Eßercontents=$(replace "$contents" "PKG_CONFIG_UNINSTALL" "$pkg_config_uninstall")
175910041e99SStefan Eßer
176010328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET" "$default_target")
176110328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET_PREREQS" "$default_target_prereqs")
176210328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET_CMD" "$default_target_cmd")
176310328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET" "$second_target")
176410328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET_PREREQS" "$second_target_prereqs")
176510328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET_CMD" "$second_target_cmd")
176610328f8bSStefan Eßer
176750696a6eSStefan Eßercontents=$(replace "$contents" "ALL_PREREQ" "$ALL_PREREQ")
176810328f8bSStefan Eßercontents=$(replace "$contents" "BC_EXEC_PREREQ" "$bc_exec_prereq")
176910328f8bSStefan Eßercontents=$(replace "$contents" "BC_EXEC_CMD" "$bc_exec_cmd")
177010328f8bSStefan Eßercontents=$(replace "$contents" "DC_EXEC_PREREQ" "$dc_exec_prereq")
177110328f8bSStefan Eßercontents=$(replace "$contents" "DC_EXEC_CMD" "$dc_exec_cmd")
177250696a6eSStefan Eßer
17733aa99676SStefan Eßercontents=$(replace "$contents" "EXECUTABLES" "$executables")
17743aa99676SStefan Eßercontents=$(replace "$contents" "MAIN_EXEC" "$main_exec")
17753aa99676SStefan Eßercontents=$(replace "$contents" "EXEC" "$executable")
177650696a6eSStefan Eßercontents=$(replace "$contents" "TESTS" "$tests")
17773aa99676SStefan Eßer
177844d4804dSStefan Eßercontents=$(replace "$contents" "BC_HISTORY_TEST_PREREQS" "$test_bc_history_prereqs")
177944d4804dSStefan Eßercontents=$(replace "$contents" "DC_HISTORY_TEST_PREREQS" "$test_dc_history_prereqs")
178044d4804dSStefan Eßercontents=$(replace "$contents" "HISTORY_TESTS" "$history_tests")
17813aa99676SStefan Eßer
17823aa99676SStefan Eßercontents=$(replace "$contents" "VG_BC_TEST" "$vg_bc_test")
17833aa99676SStefan Eßercontents=$(replace "$contents" "VG_DC_TEST" "$vg_dc_test")
17843aa99676SStefan Eßer
17853aa99676SStefan Eßercontents=$(replace "$contents" "TIMECONST" "$timeconst")
17863aa99676SStefan Eßer
17873aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA" "$karatsuba")
17883aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA_TEST" "$karatsuba_test")
17893aa99676SStefan Eßer
17903aa99676SStefan Eßercontents=$(replace "$contents" "LONG_BIT" "$LONG_BIT")
17913aa99676SStefan Eßercontents=$(replace "$contents" "LONG_BIT_DEFINE" "$LONG_BIT_DEFINE")
17923aa99676SStefan Eßer
17933aa99676SStefan Eßercontents=$(replace "$contents" "GEN" "$GEN")
17943aa99676SStefan Eßercontents=$(replace "$contents" "GEN_EXEC_TARGET" "$GEN_EXEC_TARGET")
17953aa99676SStefan Eßercontents=$(replace "$contents" "CLEAN_PREREQS" "$CLEAN_PREREQS")
17963aa99676SStefan Eßercontents=$(replace "$contents" "GEN_EMU" "$GEN_EMU")
17973aa99676SStefan Eßer
179844d4804dSStefan Eßercontents=$(replace "$contents" "BSD" "$bsd")
179944d4804dSStefan Eßer
180044d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_BANNER" "$bc_default_banner")
180144d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_SIGINT_RESET" "$bc_default_sigint_reset")
180244d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_SIGINT_RESET" "$dc_default_sigint_reset")
180344d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_TTY_MODE" "$bc_default_tty_mode")
180444d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_TTY_MODE" "$dc_default_tty_mode")
180544d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_PROMPT" "$bc_default_prompt")
180644d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_PROMPT" "$dc_default_prompt")
180710041e99SStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_EXPR_EXIT" "$bc_default_expr_exit")
180810041e99SStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_EXPR_EXIT" "$dc_default_expr_exit")
180944d4804dSStefan Eßer
181044d4804dSStefan Eßer# Do the first print to the Makefile.
181110041e99SStefan Eßerprintf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "Makefile"
181210328f8bSStefan Eßer
181344d4804dSStefan Eßer# Generate the individual test targets.
181410328f8bSStefan Eßerif [ "$bc" -ne 0 ]; then
1815d43fa8efSStefan Eßer	gen_std_tests bc "$extra_math" "$time_tests" $bc_test_exec
181610328f8bSStefan Eßer	gen_script_tests bc "$extra_math" "$generate_tests" "$time_tests" $bc_test_exec
1817d43fa8efSStefan Eßer	gen_err_tests bc $bc_test_exec
181810328f8bSStefan Eßerfi
181910328f8bSStefan Eßer
182010328f8bSStefan Eßerif [ "$dc" -ne 0 ]; then
1821d43fa8efSStefan Eßer	gen_std_tests dc "$extra_math" "$time_tests" $dc_test_exec
182210328f8bSStefan Eßer	gen_script_tests dc "$extra_math" "$generate_tests" "$time_tests" $dc_test_exec
1823d43fa8efSStefan Eßer	gen_err_tests dc $dc_test_exec
182410328f8bSStefan Eßerfi
18253aa99676SStefan Eßer
182644d4804dSStefan Eßer# Copy the correct manuals to the expected places.
182710041e99SStefan Eßermkdir -p manuals
182810041e99SStefan Eßercp -f "$scriptdir/manuals/bc/$manpage_args.1.md" manuals/bc.1.md
182910041e99SStefan Eßercp -f "$scriptdir/manuals/bc/$manpage_args.1" manuals/bc.1
183010041e99SStefan Eßercp -f "$scriptdir/manuals/dc/$manpage_args.1.md" manuals/dc.1.md
183110041e99SStefan Eßercp -f "$scriptdir/manuals/dc/$manpage_args.1" manuals/dc.1
18323aa99676SStefan Eßer
18333aa99676SStefan Eßermake clean > /dev/null
1834