13aa99676SStefan Eßer#! /bin/sh
23aa99676SStefan Eßer#
33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause
43aa99676SStefan Eßer#
5fdc4a7c8SStefan Eßer# Copyright (c) 2018-2025 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
46d101cdd6SStefan 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"
55d101cdd6SStefan Eßer	printf '    %s [-a|-bD|-dB|-c] [-CeEfgGHilmMNPrtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script"
56d101cdd6SStefan Eßer	printf '       [-s SETTING] [-S SETTING] [-p TYPE]\n'
573aa99676SStefan Eßer	printf '    %s \\\n' "$script"
58fdc4a7c8SStefan Eßer	printf '       [--library|--bc-only --disable-dc|--dc-only --disable-bc]             \\\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'
61d101cdd6SStefan Eßer	printf '       [--enable-editline] [--enable-readline] [--enable-internal-history]   \\\n'
62d101cdd6SStefan Eßer	printf '       [--disable-problematic-tests] [--install-all-locales]                 \\\n'
63d101cdd6SStefan Eßer	printf '       [--opt=OPT_LEVEL] [--karatsuba-len=KARATSUBA_LEN]                     \\\n'
6410041e99SStefan Eßer	printf '       [--set-default-on=SETTING] [--set-default-off=SETTING]                \\\n'
65d101cdd6SStefan Eßer	printf '       [--predefined-build-type=TYPE]                                        \\\n'
663aa99676SStefan Eßer	printf '       [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR]       \\\n'
673aa99676SStefan Eßer	printf '       [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR]             \\\n'
68d101cdd6SStefan Eßer	printf '       [--man3dir=MAN3DIR]\n'
69d101cdd6SStefan Eßer
70d101cdd6SStefan Eßer	if [ "$_usage_val" -ne 0 ]; then
7112e0d316SStefan Eßer		exit "$_usage_val"
72d101cdd6SStefan Eßer	fi
73d101cdd6SStefan Eßer
743aa99676SStefan Eßer	printf '\n'
7550696a6eSStefan Eßer	printf '    -a, --library\n'
7644d4804dSStefan Eßer	printf '        Build the libbcl instead of the programs. This is meant to be used with\n'
77fdc4a7c8SStefan Eßer	printf '        other software like programming languages that want to make use of the\n'
7850696a6eSStefan Eßer	printf '        parsing and math capabilities. This option will install headers using\n'
7950696a6eSStefan Eßer	printf '        `make install`.\n'
803aa99676SStefan Eßer	printf '    -b, --bc-only\n'
8150696a6eSStefan Eßer	printf '        Build bc only. It is an error if "-d", "--dc-only", "-B", or\n'
8250696a6eSStefan Eßer	printf '        "--disable-bc" are specified too.\n'
833aa99676SStefan Eßer	printf '    -B, --disable-bc\n'
843aa99676SStefan Eßer	printf '        Disable bc. It is an error if "-b", "--bc-only", "-D", or "--disable-dc"\n'
853aa99676SStefan Eßer	printf '        are specified too.\n'
8610328f8bSStefan Eßer	printf '    -C, --disable-clean\n'
8710328f8bSStefan Eßer	printf '        Disable the clean that configure.sh does before configure.\n'
883aa99676SStefan Eßer	printf '    -d, --dc-only\n'
8950696a6eSStefan Eßer	printf '        Build dc only. It is an error if "-b", "--bc-only", "-D", or\n'
9050696a6eSStefan Eßer	printf '        "--disable-dc" are specified too.\n'
913aa99676SStefan Eßer	printf '    -D, --disable-dc\n'
9250696a6eSStefan Eßer	printf '        Disable dc. It is an error if "-d", "--dc-only", "-B", or "--disable-bc"\n'
933aa99676SStefan Eßer	printf '        are specified too.\n'
9478bc019dSStefan Eßer	printf '    -e, --enable-editline\n'
9578bc019dSStefan Eßer	printf '        Enable the use of libedit/editline. This is meant for those users that\n'
96d101cdd6SStefan Eßer	printf '        want vi-like or Emacs-like behavior in history. This option is ignored\n'
97d101cdd6SStefan Eßer	printf '        if history is disabled. If the -r or -i options are given with this\n'
98d101cdd6SStefan Eßer	printf '        option, the last occurrence of all of the three is used.\n'
993aa99676SStefan Eßer	printf '    -E, --disable-extra-math\n'
1003aa99676SStefan Eßer	printf '        Disable extra math. This includes: "$" operator (truncate to integer),\n'
1013aa99676SStefan Eßer	printf '        "@" operator (set number of decimal places), and r(x, p) (rounding\n'
1023aa99676SStefan Eßer	printf '        function). Additionally, this option disables the extra printing\n'
1033aa99676SStefan Eßer	printf '        functions in the math library.\n'
1043aa99676SStefan Eßer	printf '    -f, --force\n'
1053aa99676SStefan Eßer	printf '        Force use of all enabled options, even if they do not work. This\n'
1063aa99676SStefan Eßer	printf '        option is to allow the maintainer a way to test that certain options\n'
10700698711SStefan Eßer	printf '        are not failing invisibly. (Development only.)\n'
1083aa99676SStefan Eßer	printf '    -g, --debug\n'
1093aa99676SStefan Eßer	printf '        Build in debug mode. Adds the "-g" flag, and if there are no\n'
1103aa99676SStefan Eßer	printf '        other CFLAGS, and "-O" was not given, this also adds the "-O0"\n'
1113aa99676SStefan Eßer	printf '        flag. If this flag is *not* given, "-DNDEBUG" is added to CPPFLAGS\n'
1123aa99676SStefan Eßer	printf '        and a strip flag is added to the link stage.\n'
1133aa99676SStefan Eßer	printf '    -G, --disable-generated-tests\n'
1143aa99676SStefan Eßer	printf '        Disable generating tests. This is for platforms that do not have a\n'
1153aa99676SStefan Eßer	printf '        GNU bc-compatible bc to generate tests.\n'
1163aa99676SStefan Eßer	printf '    -h, --help\n'
1173aa99676SStefan Eßer	printf '        Print this help message and exit.\n'
1183aa99676SStefan Eßer	printf '    -H, --disable-history\n'
1193aa99676SStefan Eßer	printf '        Disable history.\n'
120d101cdd6SStefan Eßer	printf '    -i, --enable-internal-history\n'
121d101cdd6SStefan Eßer	printf '        Enable the internal history implementation and do not depend on either\n'
122d101cdd6SStefan Eßer	printf '        editline or readline. This option is ignored if history is disabled.\n'
123d101cdd6SStefan Eßer	printf '        If this option is given along with -e and -r, the last occurrence of\n'
124d101cdd6SStefan Eßer	printf '        all of the three is used.\n'
1253aa99676SStefan Eßer	printf '    -k KARATSUBA_LEN, --karatsuba-len KARATSUBA_LEN\n'
126a970610aSStefan Eßer	printf '        Set the karatsuba length to KARATSUBA_LEN (default is 32).\n'
1273aa99676SStefan Eßer	printf '        It is an error if KARATSUBA_LEN is not a number or is less than 16.\n'
128cf7becd2SStefan Eßer	printf '    -l, --install-all-locales\n'
129cf7becd2SStefan Eßer	printf '        Installs all locales, regardless of how many are on the system. This\n'
130cf7becd2SStefan Eßer	printf '        option is useful for package maintainers who want to make sure that\n'
131cf7becd2SStefan Eßer	printf '        a package contains all of the locales that end users might need.\n'
1323aa99676SStefan Eßer	printf '    -M, --disable-man-pages\n'
1333aa99676SStefan Eßer	printf '        Disable installing manpages.\n'
1343aa99676SStefan Eßer	printf '    -N, --disable-nls\n'
1353aa99676SStefan Eßer	printf '        Disable POSIX locale (NLS) support.\n'
136d101cdd6SStefan Eßer	printf '        ***WARNING***: Locales ignore the prefix because they *must* be\n'
137d101cdd6SStefan Eßer	printf '        installed at a fixed location to work at all. If you do not want that\n'
138d101cdd6SStefan Eßer	printf '        to happen, you must disable locales (NLS) completely.\n'
1393aa99676SStefan Eßer	printf '    -O OPT_LEVEL, --opt OPT_LEVEL\n'
1403aa99676SStefan Eßer	printf '        Set the optimization level. This can also be included in the CFLAGS,\n'
1413aa99676SStefan Eßer	printf '        but it is provided, so maintainers can build optimized debug builds.\n'
1423aa99676SStefan Eßer	printf '        This is passed through to the compiler, so it must be supported.\n'
143d101cdd6SStefan Eßer	printf '    -p TYPE, --predefined-build-type=TYPE\n'
144d101cdd6SStefan Eßer	printf '        Sets a given predefined build type with specific defaults. This is for\n'
145d101cdd6SStefan Eßer	printf '        easy setting of predefined builds. For example, to get a build that\n'
146d101cdd6SStefan Eßer	printf '        acts like the GNU bc by default, TYPE should be "GNU" (without the\n'
147d101cdd6SStefan Eßer	printf '        quotes) This option *must* come before any others that might change the\n'
148d101cdd6SStefan Eßer	printf '        build options. Currently supported values for TYPE include: "BSD" (for\n'
149d101cdd6SStefan Eßer	printf '        matching the BSD bc and BSD dc), "GNU" (for matching the GNU bc and\n'
150d101cdd6SStefan Eßer	printf '        dc), "GDH" (for the preferred build of the author, Gavin D. Howard),\n'
151d101cdd6SStefan Eßer	printf '        and "DBG" (for the preferred debug build of the author). This will\n'
152d101cdd6SStefan Eßer	printf '        also automatically enable a release build (except for "DBG").\n'
153d101cdd6SStefan Eßer	printf '    -P, --disable-problematic-tests\n'
154d101cdd6SStefan Eßer	printf '        Disables problematic tests. These tests usually include tests that\n'
155d101cdd6SStefan Eßer	printf '        can cause a SIGKILL because of too much memory usage.\n'
15678bc019dSStefan Eßer	printf '    -r, --enable-readline\n'
15778bc019dSStefan Eßer	printf '        Enable the use of libreadline/readline. This is meant for those users\n'
15878bc019dSStefan Eßer	printf '        that want vi-like or Emacs-like behavior in history. This option is\n'
159d101cdd6SStefan Eßer	printf '        ignored if history is disabled. If this option is given along with -e\n'
160a970610aSStefan Eßer	printf '        and -i, the last occurrence of all of the three is used.\n'
16144d4804dSStefan Eßer	printf '    -s SETTING, --set-default-on SETTING\n'
16244d4804dSStefan Eßer	printf '        Set the default named by SETTING to on. See below for possible values\n'
16344d4804dSStefan Eßer	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
16444d4804dSStefan Eßer	printf '        setting, the last one is used.\n'
16544d4804dSStefan Eßer	printf '    -S SETTING, --set-default-off SETTING\n'
16644d4804dSStefan Eßer	printf '        Set the default named by SETTING to off. See below for possible values\n'
16744d4804dSStefan Eßer	printf '        for SETTING. For multiple instances of the -s or -S for the the same\n'
16844d4804dSStefan Eßer	printf '        setting, the last one is used.\n'
1693aa99676SStefan Eßer	printf '    -T, --disable-strip\n'
1703aa99676SStefan Eßer	printf '        Disable stripping symbols from the compiled binary or binaries.\n'
1713aa99676SStefan Eßer	printf '        Stripping symbols only happens when debug mode is off.\n'
1723aa99676SStefan Eßer	printf '    --prefix PREFIX\n'
1733aa99676SStefan Eßer	printf '        The prefix to install to. Overrides "$PREFIX" if it exists.\n'
1743aa99676SStefan Eßer	printf '        If PREFIX is "/usr", install path will be "/usr/bin".\n'
1753aa99676SStefan Eßer	printf '        Default is "/usr/local".\n'
176d101cdd6SStefan Eßer	printf '        ***WARNING***: Locales ignore the prefix because they *must* be\n'
177d101cdd6SStefan Eßer	printf '        installed at a fixed location to work at all. If you do not want that to\n'
178d101cdd6SStefan Eßer	printf '        happen, you must disable locales (NLS) completely.\n'
1793aa99676SStefan Eßer	printf '    --bindir BINDIR\n'
18050696a6eSStefan Eßer	printf '        The directory to install binaries in. Overrides "$BINDIR" if it exists.\n'
1813aa99676SStefan Eßer	printf '        Default is "$PREFIX/bin".\n'
18250696a6eSStefan Eßer	printf '    --includedir INCLUDEDIR\n'
18350696a6eSStefan Eßer	printf '        The directory to install headers in. Overrides "$INCLUDEDIR" if it\n'
18450696a6eSStefan Eßer	printf '        exists. Default is "$PREFIX/include".\n'
18550696a6eSStefan Eßer	printf '    --libdir LIBDIR\n'
18650696a6eSStefan Eßer	printf '        The directory to install libraries in. Overrides "$LIBDIR" if it exists.\n'
18750696a6eSStefan Eßer	printf '        Default is "$PREFIX/lib".\n'
1883aa99676SStefan Eßer	printf '    --datarootdir DATAROOTDIR\n'
1893aa99676SStefan Eßer	printf '        The root location for data files. Overrides "$DATAROOTDIR" if it exists.\n'
1903aa99676SStefan Eßer	printf '        Default is "$PREFIX/share".\n'
1913aa99676SStefan Eßer	printf '    --datadir DATADIR\n'
1923aa99676SStefan Eßer	printf '        The location for data files. Overrides "$DATADIR" if it exists.\n'
1933aa99676SStefan Eßer	printf '        Default is "$DATAROOTDIR".\n'
1943aa99676SStefan Eßer	printf '    --mandir MANDIR\n'
1953aa99676SStefan Eßer	printf '        The location to install manpages to. Overrides "$MANDIR" if it exists.\n'
1963aa99676SStefan Eßer	printf '        Default is "$DATADIR/man".\n'
1973aa99676SStefan Eßer	printf '    --man1dir MAN1DIR\n'
1983aa99676SStefan Eßer	printf '        The location to install Section 1 manpages to. Overrides "$MAN1DIR" if\n'
1993aa99676SStefan Eßer	printf '        it exists. Default is "$MANDIR/man1".\n'
20050696a6eSStefan Eßer	printf '    --man3dir MAN3DIR\n'
20150696a6eSStefan Eßer	printf '        The location to install Section 3 manpages to. Overrides "$MAN3DIR" if\n'
20250696a6eSStefan Eßer	printf '        it exists. Default is "$MANDIR/man3".\n'
2033aa99676SStefan Eßer	printf '\n'
2043aa99676SStefan Eßer	printf 'In addition, the following environment variables are used:\n'
2053aa99676SStefan Eßer	printf '\n'
2063aa99676SStefan Eßer	printf '    CC           C compiler. Must be compatible with POSIX c99. If there is a\n'
2073aa99676SStefan Eßer	printf '                 space in the basename of the compiler, the items after the\n'
2083aa99676SStefan Eßer	printf '                 first space are assumed to be compiler flags, and in that case,\n'
2093aa99676SStefan Eßer	printf '                 the flags are automatically moved into CFLAGS. Default is\n'
2103aa99676SStefan Eßer	printf '                 "c99".\n'
2113aa99676SStefan Eßer	printf '    HOSTCC       Host C compiler. Must be compatible with POSIX c99. If there is\n'
2123aa99676SStefan Eßer	printf '                 a space in the basename of the compiler, the items after the\n'
2133aa99676SStefan Eßer	printf '                 first space are assumed to be compiler flags, and in the case,\n'
2143aa99676SStefan Eßer	printf '                 the flags are automatically moved into HOSTCFLAGS. Default is\n'
2153aa99676SStefan Eßer	printf '                 "$CC".\n'
2163aa99676SStefan Eßer	printf '    HOST_CC      Same as HOSTCC. If HOSTCC also exists, it is used.\n'
2173aa99676SStefan Eßer	printf '    CFLAGS       C compiler flags.\n'
2183aa99676SStefan Eßer	printf '    HOSTCFLAGS   CFLAGS for HOSTCC. Default is "$CFLAGS".\n'
2193aa99676SStefan Eßer	printf '    HOST_CFLAGS  Same as HOST_CFLAGS. If HOST_CFLAGS also exists, it is used.\n'
2203aa99676SStefan Eßer	printf '    CPPFLAGS     C preprocessor flags. Default is "".\n'
2213aa99676SStefan Eßer	printf '    LDFLAGS      Linker flags. Default is "".\n'
2223aa99676SStefan Eßer	printf '    PREFIX       The prefix to install to. Default is "/usr/local".\n'
2233aa99676SStefan Eßer	printf '                 If PREFIX is "/usr", install path will be "/usr/bin".\n'
224d101cdd6SStefan Eßer	printf '                 ***WARNING***: Locales ignore the prefix because they *must* be\n'
225d101cdd6SStefan Eßer	printf '                 installed at a fixed location to work at all. If you do not\n'
226d101cdd6SStefan Eßer	printf '                 want that to happen, you must disable locales (NLS) completely.\n'
22750696a6eSStefan Eßer	printf '    BINDIR       The directory to install binaries in. Default is "$PREFIX/bin".\n'
22850696a6eSStefan Eßer	printf '    INCLUDEDIR   The directory to install header files in. Default is\n'
22950696a6eSStefan Eßer	printf '                 "$PREFIX/include".\n'
23050696a6eSStefan Eßer	printf '    LIBDIR       The directory to install libraries in. Default is\n'
23150696a6eSStefan Eßer	printf '                 "$PREFIX/lib".\n'
2323aa99676SStefan Eßer	printf '    DATAROOTDIR  The root location for data files. Default is "$PREFIX/share".\n'
2333aa99676SStefan Eßer	printf '    DATADIR      The location for data files. Default is "$DATAROOTDIR".\n'
2343aa99676SStefan Eßer	printf '    MANDIR       The location to install manpages to. Default is "$DATADIR/man".\n'
2353aa99676SStefan Eßer	printf '    MAN1DIR      The location to install Section 1 manpages to. Default is\n'
2363aa99676SStefan Eßer	printf '                 "$MANDIR/man1".\n'
23750696a6eSStefan Eßer	printf '    MAN3DIR      The location to install Section 3 manpages to. Default is\n'
23850696a6eSStefan Eßer	printf '                 "$MANDIR/man3".\n'
2393aa99676SStefan Eßer	printf '    NLSPATH      The location to install locale catalogs to. Must be an absolute\n'
2403aa99676SStefan Eßer	printf '                 path (or contain one). This is treated the same as the POSIX\n'
2413aa99676SStefan Eßer	printf '                 definition of $NLSPATH (see POSIX environment variables for\n'
2423aa99676SStefan Eßer	printf '                 more information). Default is "/usr/share/locale/%%L/%%N".\n'
243fdc4a7c8SStefan Eßer	printf '    PC_PATH      The location to install pkg-config files to. Must be a\n'
24410041e99SStefan Eßer	printf '                 path or contain one. Default is the first path given by the\n'
24510041e99SStefan Eßer	printf '                 output of `pkg-config --variable=pc_path pkg-config`.\n'
2463aa99676SStefan Eßer	printf '    EXECSUFFIX   The suffix to append to the executable names, used to not\n'
2473aa99676SStefan Eßer	printf '                 interfere with other installed bc executables. Default is "".\n'
248fdc4a7c8SStefan Eßer	printf '    EXECPREFIX   The prefix to prepend to the executable names, used to not\n'
2493aa99676SStefan Eßer	printf '                 interfere with other installed bc executables. Default is "".\n'
2503aa99676SStefan Eßer	printf '    DESTDIR      For package creation. Default is "". If it is empty when\n'
2513aa99676SStefan Eßer	printf '                 `%s` is run, it can also be passed to `make install`\n' "$script"
2523aa99676SStefan Eßer	printf '                 later as an environment variable. If both are specified,\n'
2533aa99676SStefan Eßer	printf '                 the one given to `%s` takes precedence.\n' "$script"
2543aa99676SStefan Eßer	printf '    LONG_BIT     The number of bits in a C `long` type. This is mostly for the\n'
2553aa99676SStefan Eßer	printf '                 embedded space since this `bc` uses `long`s internally for\n'
2563aa99676SStefan Eßer	printf '                 overflow checking. In C99, a `long` is required to be 32 bits.\n'
2573aa99676SStefan Eßer	printf '                 For most normal desktop systems, setting this is unnecessary,\n'
2583aa99676SStefan Eßer	printf '                 except that 32-bit platforms with 64-bit longs may want to set\n'
2593aa99676SStefan Eßer	printf '                 it to `32`. Default is the default of `LONG_BIT` for the target\n'
2603aa99676SStefan Eßer	printf '                 platform. Minimum allowed is `32`. It is a build time error if\n'
2613aa99676SStefan Eßer	printf '                 the specified value of `LONG_BIT` is greater than the default\n'
2623aa99676SStefan Eßer	printf '                 value of `LONG_BIT` for the target platform.\n'
2633aa99676SStefan Eßer	printf '    GEN_HOST     Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to\n'
2643aa99676SStefan Eßer	printf '                 produce the C files that contain the help texts as well as the\n'
2653aa99676SStefan Eßer	printf '                 math libraries. By default, `gen/strgen.c` is used, compiled by\n'
2663aa99676SStefan Eßer	printf '                 "$HOSTCC" and run on the host machine. Using `gen/strgen.sh`\n'
2673aa99676SStefan Eßer	printf '                 removes the need to compile and run an executable on the host\n'
2683aa99676SStefan Eßer	printf '                 machine since `gen/strgen.sh` is a POSIX shell script. However,\n'
26978bc019dSStefan Eßer	printf '                 `gen/lib2.bc` is over 4095 characters, the max supported length\n'
27078bc019dSStefan Eßer	printf '                 of a string literal in C99, and `gen/strgen.sh` generates a\n'
27178bc019dSStefan Eßer	printf '                 string literal instead of an array, as `gen/strgen.c` does. For\n'
27278bc019dSStefan Eßer	printf '                 most production-ready compilers, this limit probably is not\n'
2733aa99676SStefan Eßer	printf '                 enforced, but it could be. Both options are still available for\n'
2743aa99676SStefan Eßer	printf '                 this reason. If you are sure your compiler does not have the\n'
2753aa99676SStefan Eßer	printf '                 limit and do not want to compile and run a binary on the host\n'
2763aa99676SStefan Eßer	printf '                 machine, set this variable to "0". Any other value, or a\n'
2773aa99676SStefan Eßer	printf '                 non-existent value, will cause the build system to compile and\n'
2783aa99676SStefan Eßer	printf '                 run `gen/strgen.c`. Default is "".\n'
2793aa99676SStefan Eßer	printf '    GEN_EMU      Emulator to run string generator code under (leave empty if not\n'
2803aa99676SStefan Eßer	printf '                 necessary). This is not necessary when using `gen/strgen.sh`.\n'
2813aa99676SStefan Eßer	printf '                 Default is "".\n'
2823aa99676SStefan Eßer	printf '\n'
2833aa99676SStefan Eßer	printf 'WARNING: even though `configure.sh` supports both option types, short and\n'
2843aa99676SStefan Eßer	printf 'long, it does not support handling both at the same time. Use only one type.\n'
28544d4804dSStefan Eßer	printf '\n'
28644d4804dSStefan Eßer	printf 'Settings\n'
28744d4804dSStefan Eßer	printf '========\n'
28844d4804dSStefan Eßer	printf '\n'
28944d4804dSStefan Eßer	printf 'bc and dc have some settings that, while they cannot be removed by build time\n'
29044d4804dSStefan Eßer	printf 'options, can have their defaults changed at build time by packagers. Users are\n'
29144d4804dSStefan Eßer	printf 'also able to change each setting with environment variables.\n'
29244d4804dSStefan Eßer	printf '\n'
29344d4804dSStefan Eßer	printf 'The following is a table of settings, along with their default values and the\n'
29444d4804dSStefan Eßer	printf 'environment variables users can use to change them. (For the defaults, non-zero\n'
29544d4804dSStefan Eßer	printf 'means on, and zero means off.)\n'
29644d4804dSStefan Eßer	printf '\n'
29744d4804dSStefan Eßer	printf '| Setting         | Description          | Default      | Env Variable         |\n'
29844d4804dSStefan Eßer	printf '| =============== | ==================== | ============ | ==================== |\n'
29944d4804dSStefan Eßer	printf '| bc.banner       | Whether to display   |            0 | BC_BANNER            |\n'
30044d4804dSStefan Eßer	printf '|                 | the bc version       |              |                      |\n'
30144d4804dSStefan Eßer	printf '|                 | banner when in       |              |                      |\n'
30244d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
30344d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
30444d4804dSStefan Eßer	printf '| bc.sigint_reset | Whether SIGINT will  |            1 | BC_SIGINT_RESET      |\n'
30544d4804dSStefan Eßer	printf '|                 | reset bc, instead of |              |                      |\n'
30644d4804dSStefan Eßer	printf '|                 | exiting, when in     |              |                      |\n'
30744d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
30844d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
30944d4804dSStefan Eßer	printf '| dc.sigint_reset | Whether SIGINT will  |            1 | DC_SIGINT_RESET      |\n'
31044d4804dSStefan Eßer	printf '|                 | reset dc, instead of |              |                      |\n'
31144d4804dSStefan Eßer	printf '|                 | exiting, when in     |              |                      |\n'
31244d4804dSStefan Eßer	printf '|                 | interactive mode.    |              |                      |\n'
31344d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
31444d4804dSStefan Eßer	printf '| bc.tty_mode     | Whether TTY mode for |            1 | BC_TTY_MODE          |\n'
31544d4804dSStefan Eßer	printf '|                 | bc should be on when |              |                      |\n'
31644d4804dSStefan Eßer	printf '|                 | available.           |              |                      |\n'
31744d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
31844d4804dSStefan Eßer	printf '| dc.tty_mode     | Whether TTY mode for |            0 | BC_TTY_MODE          |\n'
31944d4804dSStefan Eßer	printf '|                 | dc should be on when |              |                      |\n'
32044d4804dSStefan Eßer	printf '|                 | available.           |              |                      |\n'
32144d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
32244d4804dSStefan Eßer	printf '| bc.prompt       | Whether the prompt   | $BC_TTY_MODE | BC_PROMPT            |\n'
32344d4804dSStefan Eßer	printf '|                 | for bc should be on  |              |                      |\n'
32444d4804dSStefan Eßer	printf '|                 | in tty mode.         |              |                      |\n'
32544d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
32644d4804dSStefan Eßer	printf '| dc.prompt       | Whether the prompt   | $DC_TTY_MODE | DC_PROMPT            |\n'
32744d4804dSStefan Eßer	printf '|                 | for dc should be on  |              |                      |\n'
32844d4804dSStefan Eßer	printf '|                 | in tty mode.         |              |                      |\n'
32944d4804dSStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
33010041e99SStefan Eßer	printf '| bc.expr_exit    | Whether to exit bc   |            1 | BC_EXPR_EXIT         |\n'
33110041e99SStefan Eßer	printf '|                 | if an expression or  |              |                      |\n'
33210041e99SStefan Eßer	printf '|                 | expression file is   |              |                      |\n'
33310041e99SStefan Eßer	printf '|                 | given with the -e or |              |                      |\n'
33410041e99SStefan Eßer	printf '|                 | -f options.          |              |                      |\n'
33510041e99SStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
33610041e99SStefan Eßer	printf '| dc.expr_exit    | Whether to exit dc   |            1 | DC_EXPR_EXIT         |\n'
33710041e99SStefan Eßer	printf '|                 | if an expression or  |              |                      |\n'
33810041e99SStefan Eßer	printf '|                 | expression file is   |              |                      |\n'
33910041e99SStefan Eßer	printf '|                 | given with the -e or |              |                      |\n'
34010041e99SStefan Eßer	printf '|                 | -f options.          |              |                      |\n'
34110041e99SStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
342d101cdd6SStefan Eßer	printf '| bc.digit_clamp  | Whether to have bc   |            0 | BC_DIGIT_CLAMP       |\n'
343d101cdd6SStefan Eßer	printf '|                 | clamp digits that    |              |                      |\n'
344d101cdd6SStefan Eßer	printf '|                 | are greater than or  |              |                      |\n'
345d101cdd6SStefan Eßer	printf '|                 | equal to the current |              |                      |\n'
346d101cdd6SStefan Eßer	printf '|                 | ibase when parsing   |              |                      |\n'
347d101cdd6SStefan Eßer	printf '|                 | numbers.             |              |                      |\n'
348d101cdd6SStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
349d101cdd6SStefan Eßer	printf '| dc.digit_clamp  | Whether to have dc   |            0 | DC_DIGIT_CLAMP       |\n'
350d101cdd6SStefan Eßer	printf '|                 | clamp digits that    |              |                      |\n'
351d101cdd6SStefan Eßer	printf '|                 | are greater than or  |              |                      |\n'
352d101cdd6SStefan Eßer	printf '|                 | equal to the current |              |                      |\n'
353d101cdd6SStefan Eßer	printf '|                 | ibase when parsing   |              |                      |\n'
354d101cdd6SStefan Eßer	printf '|                 | numbers.             |              |                      |\n'
355d101cdd6SStefan Eßer	printf '| --------------- | -------------------- | ------------ | -------------------- |\n'
35644d4804dSStefan Eßer	printf '\n'
35744d4804dSStefan Eßer	printf 'These settings are not meant to be changed on a whim. They are meant to ensure\n'
35844d4804dSStefan Eßer	printf 'that this bc and dc will conform to the expectations of the user on each\n'
35944d4804dSStefan Eßer	printf 'platform.\n'
3603aa99676SStefan Eßer
3613aa99676SStefan Eßer	exit "$_usage_val"
3623aa99676SStefan Eßer}
3633aa99676SStefan Eßer
36444d4804dSStefan Eßer# Replaces a file extension in a filename. This is used mostly to turn filenames
36544d4804dSStefan Eßer# like `src/num.c` into `src/num.o`. In other words, it helps to link targets to
36644d4804dSStefan Eßer# the files they depend on.
36744d4804dSStefan Eßer#
36844d4804dSStefan Eßer# @param file  The filename.
36944d4804dSStefan Eßer# @param ext1  The extension to replace.
37044d4804dSStefan Eßer# @param ext2  The new extension.
3713aa99676SStefan Eßerreplace_ext() {
3723aa99676SStefan Eßer
3733aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3743aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3753aa99676SStefan Eßer	fi
3763aa99676SStefan Eßer
3773aa99676SStefan Eßer	_replace_ext_file="$1"
3783aa99676SStefan Eßer	_replace_ext_ext1="$2"
3793aa99676SStefan Eßer	_replace_ext_ext2="$3"
3803aa99676SStefan Eßer
3819a995fe1SStefan Eßer	_replace_ext_result="${_replace_ext_file%.$_replace_ext_ext1}.$_replace_ext_ext2"
3823aa99676SStefan Eßer
3833aa99676SStefan Eßer	printf '%s\n' "$_replace_ext_result"
3843aa99676SStefan Eßer}
3853aa99676SStefan Eßer
38644d4804dSStefan Eßer# Replaces a file extension in every filename given in a list. The list is just
38744d4804dSStefan Eßer# a space-separated list of words, so filenames are expected to *not* have
38844d4804dSStefan Eßer# spaces in them. See the documentation for `replace_ext()`.
38944d4804dSStefan Eßer#
39044d4804dSStefan Eßer# @param files  The list of space-separated filenames to replace extensions for.
39144d4804dSStefan Eßer# @param ext1   The extension to replace.
39244d4804dSStefan Eßer# @param ext2   The new extension.
3933aa99676SStefan Eßerreplace_exts() {
3943aa99676SStefan Eßer
3953aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
3963aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
3973aa99676SStefan Eßer	fi
3983aa99676SStefan Eßer
3993aa99676SStefan Eßer	_replace_exts_files="$1"
4003aa99676SStefan Eßer	_replace_exts_ext1="$2"
4013aa99676SStefan Eßer	_replace_exts_ext2="$3"
4023aa99676SStefan Eßer
4033aa99676SStefan Eßer	for _replace_exts_file in $_replace_exts_files; do
4043aa99676SStefan Eßer		_replace_exts_new_name=$(replace_ext "$_replace_exts_file" "$_replace_exts_ext1" "$_replace_exts_ext2")
4053aa99676SStefan Eßer		_replace_exts_result="$_replace_exts_result $_replace_exts_new_name"
4063aa99676SStefan Eßer	done
4073aa99676SStefan Eßer
4083aa99676SStefan Eßer	printf '%s\n' "$_replace_exts_result"
4093aa99676SStefan Eßer}
4103aa99676SStefan Eßer
41144d4804dSStefan Eßer# Finds a placeholder in @a str and replaces it. This is the workhorse of
41244d4804dSStefan Eßer# configure.sh. It's what replaces placeholders in Makefile.in with the data
41344d4804dSStefan Eßer# needed for the chosen build. Below, you will see a lot of calls to this
41444d4804dSStefan Eßer# function.
41544d4804dSStefan Eßer#
41644d4804dSStefan Eßer# Note that needle can never contain an exclamation point. For more information,
41744d4804dSStefan Eßer# see substring_replace() in scripts/functions.sh.
41844d4804dSStefan Eßer#
41944d4804dSStefan Eßer# @param str          The string to find and replace placeholders in.
42044d4804dSStefan Eßer# @param needle       The placeholder name.
42144d4804dSStefan Eßer# @param replacement  The string to use to replace the placeholder.
4223aa99676SStefan Eßerreplace() {
4233aa99676SStefan Eßer
4243aa99676SStefan Eßer	if [ "$#" -ne 3 ]; then
4253aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
4263aa99676SStefan Eßer	fi
4273aa99676SStefan Eßer
4283aa99676SStefan Eßer	_replace_str="$1"
4293aa99676SStefan Eßer	_replace_needle="$2"
4303aa99676SStefan Eßer	_replace_replacement="$3"
4313aa99676SStefan Eßer
4323aa99676SStefan Eßer	substring_replace "$_replace_str" "%%$_replace_needle%%" "$_replace_replacement"
4333aa99676SStefan Eßer}
4343aa99676SStefan Eßer
43544d4804dSStefan Eßer# This function finds all the source files that need to be built. If there is
43644d4804dSStefan Eßer# only one argument and it is empty, then all source files are built. Otherwise,
43744d4804dSStefan Eßer# the arguments are all assumed to be source files that should *not* be built.
43810328f8bSStefan Eßerfind_src_files() {
43910328f8bSStefan Eßer
44010041e99SStefan Eßer	_find_src_files_args=""
44110041e99SStefan Eßer
44210328f8bSStefan Eßer	if [ "$#" -ge 1 ] && [ "$1" != "" ]; then
44310328f8bSStefan Eßer
44410328f8bSStefan Eßer		while [ "$#" -ge 1 ]; do
44510328f8bSStefan Eßer			_find_src_files_a="${1## }"
44610328f8bSStefan Eßer			shift
44710041e99SStefan Eßer			_find_src_files_args=$(printf '%s\n%s/src/%s\n' "$_find_src_files_args" "$scriptdir" "${_find_src_files_a}")
44810328f8bSStefan Eßer		done
44910328f8bSStefan Eßer
45010328f8bSStefan Eßer	fi
45110328f8bSStefan Eßer
452e6857bd4SStefan Eßer	_find_src_files_files=$(find "$scriptdir/src" -depth -name "*.c" -print | LC_ALL=C sort)
45310041e99SStefan Eßer
45410041e99SStefan Eßer	_find_src_files_result=""
45510041e99SStefan Eßer
45610041e99SStefan Eßer	for _find_src_files_f in $_find_src_files_files; do
45710041e99SStefan Eßer
45810041e99SStefan Eßer		# If this is true, the file is part of args, and therefore, unneeded.
45910041e99SStefan Eßer		if [ "${_find_src_files_args##*$_find_src_files_f}" != "${_find_src_files_args}" ]; then
46010041e99SStefan Eßer			continue
46110041e99SStefan Eßer		fi
46210041e99SStefan Eßer
46310041e99SStefan Eßer		_find_src_files_result=$(printf '%s\n%s\n' "$_find_src_files_result" "$_find_src_files_f")
46410041e99SStefan Eßer
46510041e99SStefan Eßer	done
46610041e99SStefan Eßer
46710041e99SStefan Eßer	printf '%s\n' "$_find_src_files_result"
46810328f8bSStefan Eßer}
46910328f8bSStefan Eßer
47044d4804dSStefan Eßer# This function generates a list of files to go into the Makefile. It generates
471fdc4a7c8SStefan Eßer# the list of object files.
47244d4804dSStefan Eßer#
47344d4804dSStefan Eßer# @param contents  The contents of the Makefile template to put the list of
47444d4804dSStefan Eßer#                  files into.
47550696a6eSStefan Eßergen_file_list() {
4763aa99676SStefan Eßer
47750696a6eSStefan Eßer	if [ "$#" -lt 1 ]; then
4783aa99676SStefan Eßer		err_exit "Invalid number of args to $0"
4793aa99676SStefan Eßer	fi
4803aa99676SStefan Eßer
48150696a6eSStefan Eßer	_gen_file_list_contents="$1"
4823aa99676SStefan Eßer	shift
4833aa99676SStefan Eßer
48450696a6eSStefan Eßer	if [ "$#" -ge 1 ]; then
48510328f8bSStefan Eßer		_gen_file_list_unneeded="$@"
4863aa99676SStefan Eßer	else
48710328f8bSStefan Eßer		_gen_file_list_unneeded=""
4883aa99676SStefan Eßer	fi
4893aa99676SStefan Eßer
49050696a6eSStefan Eßer	_gen_file_list_needle_src="SRC"
49150696a6eSStefan Eßer	_gen_file_list_needle_obj="OBJ"
49250696a6eSStefan Eßer
49310328f8bSStefan Eßer	_gen_file_list_replacement=$(find_src_files $_gen_file_list_unneeded | tr '\n' ' ')
49450696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
49550696a6eSStefan Eßer		"$_gen_file_list_needle_src" "$_gen_file_list_replacement")
49650696a6eSStefan Eßer
49710041e99SStefan Eßer	_gen_file_list_cbases=""
49810041e99SStefan Eßer
49910041e99SStefan Eßer	for _gen_file_list_f in $_gen_file_list_replacement; do
50010041e99SStefan Eßer		_gen_file_list_b=$(basename "$_gen_file_list_f")
50110041e99SStefan Eßer		_gen_file_list_cbases="$_gen_file_list_cbases src/$_gen_file_list_b"
50210041e99SStefan Eßer	done
50310041e99SStefan Eßer
50410041e99SStefan Eßer	_gen_file_list_replacement=$(replace_exts "$_gen_file_list_cbases" "c" "o")
50550696a6eSStefan Eßer	_gen_file_list_contents=$(replace "$_gen_file_list_contents" \
50650696a6eSStefan Eßer		"$_gen_file_list_needle_obj" "$_gen_file_list_replacement")
50750696a6eSStefan Eßer
50850696a6eSStefan Eßer	printf '%s\n' "$_gen_file_list_contents"
5093aa99676SStefan Eßer}
5103aa99676SStefan Eßer
51144d4804dSStefan Eßerset_default() {
51244d4804dSStefan Eßer
51344d4804dSStefan Eßer	_set_default_on="$1"
51444d4804dSStefan Eßer	shift
51544d4804dSStefan Eßer
51644d4804dSStefan Eßer	_set_default_name="$1"
51744d4804dSStefan Eßer	shift
51844d4804dSStefan Eßer
51944d4804dSStefan Eßer	# The reason that the variables that are being set do not have the same
52044d4804dSStefan Eßer	# non-collision avoidance that the other variables do is that we *do* want
52144d4804dSStefan Eßer	# the settings of these variables to leak out of the function. They adjust
52244d4804dSStefan Eßer	# the settings outside of the function.
52344d4804dSStefan Eßer	case "$_set_default_name" in
52444d4804dSStefan Eßer
52544d4804dSStefan Eßer		bc.banner) bc_default_banner="$_set_default_on" ;;
52644d4804dSStefan Eßer		bc.sigint_reset) bc_default_sigint_reset="$_set_default_on" ;;
52744d4804dSStefan Eßer		dc.sigint_reset) dc_default_sigint_reset="$_set_default_on" ;;
52844d4804dSStefan Eßer		bc.tty_mode) bc_default_tty_mode="$_set_default_on" ;;
52944d4804dSStefan Eßer		dc.tty_mode) dc_default_tty_mode="$_set_default_on" ;;
53044d4804dSStefan Eßer		bc.prompt) bc_default_prompt="$_set_default_on" ;;
53144d4804dSStefan Eßer		dc.prompt) dc_default_prompt="$_set_default_on" ;;
53210041e99SStefan Eßer		bc.expr_exit) bc_default_expr_exit="$_set_default_on";;
53310041e99SStefan Eßer		dc.expr_exit) dc_default_expr_exit="$_set_default_on";;
534d101cdd6SStefan Eßer		bc.digit_clamp) bc_default_digit_clamp="$_set_default_on";;
535d101cdd6SStefan Eßer		dc.digit_clamp) dc_default_digit_clamp="$_set_default_on";;
53644d4804dSStefan Eßer		?) usage "Invalid setting: $_set_default_name" ;;
53744d4804dSStefan Eßer
53844d4804dSStefan Eßer	esac
53944d4804dSStefan Eßer}
54044d4804dSStefan Eßer
541d101cdd6SStefan Eßerpredefined_build() {
542d101cdd6SStefan Eßer
543d101cdd6SStefan Eßer	_predefined_build_type="$1"
544d101cdd6SStefan Eßer	shift
545d101cdd6SStefan Eßer
546d101cdd6SStefan Eßer	# The reason that the variables that are being set do not have the same
547d101cdd6SStefan Eßer	# non-collision avoidance that the other variables do is that we *do* want
548d101cdd6SStefan Eßer	# the settings of these variables to leak out of the function. They adjust
549d101cdd6SStefan Eßer	# the settings outside of the function.
550d101cdd6SStefan Eßer	case "$_predefined_build_type" in
551d101cdd6SStefan Eßer
552d101cdd6SStefan Eßer		BSD)
553d101cdd6SStefan Eßer			bc_only=0
554d101cdd6SStefan Eßer			dc_only=0
555d101cdd6SStefan Eßer			debug=0
556d101cdd6SStefan Eßer			optimization="3"
557d101cdd6SStefan Eßer			hist=1
558d101cdd6SStefan Eßer			hist_impl="editline"
559d101cdd6SStefan Eßer			extra_math=1
560d101cdd6SStefan Eßer			generate_tests=$generate_tests
561d101cdd6SStefan Eßer			install_manpages=0
562d101cdd6SStefan Eßer			nls=1
563d101cdd6SStefan Eßer			force=0
564d101cdd6SStefan Eßer			strip_bin=1
565d101cdd6SStefan Eßer			all_locales=0
566d101cdd6SStefan Eßer			library=0
567d101cdd6SStefan Eßer			clean=1
568d101cdd6SStefan Eßer			bc_default_banner=0
569d101cdd6SStefan Eßer			bc_default_sigint_reset=1
570d101cdd6SStefan Eßer			dc_default_sigint_reset=1
571d101cdd6SStefan Eßer			bc_default_tty_mode=1
572d101cdd6SStefan Eßer			dc_default_tty_mode=0
573d101cdd6SStefan Eßer			bc_default_prompt=""
574d101cdd6SStefan Eßer			dc_default_prompt=""
575d101cdd6SStefan Eßer			bc_default_expr_exit=1
576d101cdd6SStefan Eßer			dc_default_expr_exit=1
577d101cdd6SStefan Eßer			bc_default_digit_clamp=0
578d101cdd6SStefan Eßer			dc_default_digit_clamp=0;;
579d101cdd6SStefan Eßer
580d101cdd6SStefan Eßer		GNU)
581d101cdd6SStefan Eßer			bc_only=0
582d101cdd6SStefan Eßer			dc_only=0
583d101cdd6SStefan Eßer			debug=0
584d101cdd6SStefan Eßer			optimization="3"
585d101cdd6SStefan Eßer			hist=1
586d101cdd6SStefan Eßer			hist_impl="internal"
587d101cdd6SStefan Eßer			extra_math=1
588d101cdd6SStefan Eßer			generate_tests=$generate_tests
589d101cdd6SStefan Eßer			install_manpages=1
590d101cdd6SStefan Eßer			nls=1
591d101cdd6SStefan Eßer			force=0
592d101cdd6SStefan Eßer			strip_bin=1
593d101cdd6SStefan Eßer			all_locales=0
594d101cdd6SStefan Eßer			library=0
595d101cdd6SStefan Eßer			clean=1
596d101cdd6SStefan Eßer			bc_default_banner=1
597d101cdd6SStefan Eßer			bc_default_sigint_reset=1
598d101cdd6SStefan Eßer			dc_default_sigint_reset=0
599d101cdd6SStefan Eßer			bc_default_tty_mode=1
600d101cdd6SStefan Eßer			dc_default_tty_mode=0
601d101cdd6SStefan Eßer			bc_default_prompt=""
602d101cdd6SStefan Eßer			dc_default_prompt=""
603d101cdd6SStefan Eßer			bc_default_expr_exit=1
604d101cdd6SStefan Eßer			dc_default_expr_exit=1
605d101cdd6SStefan Eßer			bc_default_digit_clamp=1
606d101cdd6SStefan Eßer			dc_default_digit_clamp=0;;
607d101cdd6SStefan Eßer
608d101cdd6SStefan Eßer		GDH)
60912e0d316SStefan Eßer			CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories"
610fdc4a7c8SStefan Eßer			CFLAGS="$CFLAGS -Wno-unknown-warning-option -Wno-switch-default -Wno-pre-c11-compat"
611fdc4a7c8SStefan Eßer			CFLAGS="$CFLAGS -Werror -pedantic -std=c11"
612d101cdd6SStefan Eßer			bc_only=0
613d101cdd6SStefan Eßer			dc_only=0
614d101cdd6SStefan Eßer			debug=0
615d101cdd6SStefan Eßer			optimization="3"
616d101cdd6SStefan Eßer			hist=1
617d101cdd6SStefan Eßer			hist_impl="internal"
618d101cdd6SStefan Eßer			extra_math=1
619d101cdd6SStefan Eßer			generate_tests=1
620d101cdd6SStefan Eßer			install_manpages=1
621d101cdd6SStefan Eßer			nls=0
622d101cdd6SStefan Eßer			force=0
623d101cdd6SStefan Eßer			strip_bin=1
624d101cdd6SStefan Eßer			all_locales=0
625d101cdd6SStefan Eßer			library=0
626d101cdd6SStefan Eßer			clean=1
627d101cdd6SStefan Eßer			bc_default_banner=1
628d101cdd6SStefan Eßer			bc_default_sigint_reset=1
629d101cdd6SStefan Eßer			dc_default_sigint_reset=1
630d101cdd6SStefan Eßer			bc_default_tty_mode=1
631d101cdd6SStefan Eßer			dc_default_tty_mode=1
632d101cdd6SStefan Eßer			bc_default_prompt=""
633d101cdd6SStefan Eßer			dc_default_prompt=""
634d101cdd6SStefan Eßer			bc_default_expr_exit=0
635d101cdd6SStefan Eßer			dc_default_expr_exit=0
636d101cdd6SStefan Eßer			bc_default_digit_clamp=1
637d101cdd6SStefan Eßer			dc_default_digit_clamp=1;;
638d101cdd6SStefan Eßer
639d101cdd6SStefan Eßer		DBG)
64012e0d316SStefan Eßer			CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories"
641fdc4a7c8SStefan Eßer			CFLAGS="$CFLAGS -Wno-unknown-warning-option -Wno-switch-default -Wno-pre-c11-compat"
642fdc4a7c8SStefan Eßer			CFLAGS="$CFLAGS -Werror -pedantic -std=c11"
643d101cdd6SStefan Eßer			bc_only=0
644d101cdd6SStefan Eßer			dc_only=0
645d101cdd6SStefan Eßer			debug=1
646d101cdd6SStefan Eßer			optimization="0"
647d101cdd6SStefan Eßer			hist=1
648d101cdd6SStefan Eßer			hist_impl="internal"
649d101cdd6SStefan Eßer			extra_math=1
650d101cdd6SStefan Eßer			generate_tests=1
651d101cdd6SStefan Eßer			install_manpages=1
652d101cdd6SStefan Eßer			nls=1
653d101cdd6SStefan Eßer			force=0
654d101cdd6SStefan Eßer			strip_bin=1
655d101cdd6SStefan Eßer			all_locales=0
656d101cdd6SStefan Eßer			library=0
657d101cdd6SStefan Eßer			clean=1
658d101cdd6SStefan Eßer			bc_default_banner=1
659d101cdd6SStefan Eßer			bc_default_sigint_reset=1
660d101cdd6SStefan Eßer			dc_default_sigint_reset=1
661d101cdd6SStefan Eßer			bc_default_tty_mode=1
662d101cdd6SStefan Eßer			dc_default_tty_mode=1
663d101cdd6SStefan Eßer			bc_default_prompt=""
664d101cdd6SStefan Eßer			dc_default_prompt=""
665d101cdd6SStefan Eßer			bc_default_expr_exit=0
666d101cdd6SStefan Eßer			dc_default_expr_exit=0
667d101cdd6SStefan Eßer			bc_default_digit_clamp=1
668d101cdd6SStefan Eßer			dc_default_digit_clamp=1;;
669d101cdd6SStefan Eßer
670d101cdd6SStefan Eßer		?|'') usage "Invalid user build: \"$_predefined_build_type\". Accepted types are BSD, GNU, GDH, DBG.";;
671d101cdd6SStefan Eßer
672d101cdd6SStefan Eßer	esac
673d101cdd6SStefan Eßer}
674d101cdd6SStefan Eßer
67544d4804dSStefan Eßer# This is a list of defaults, but it is also the list of possible options for
67644d4804dSStefan Eßer# users to change.
67744d4804dSStefan Eßer#
678fdc4a7c8SStefan Eßer# The development options are: force (force options even if they fail).
6793aa99676SStefan Eßerbc_only=0
6803aa99676SStefan Eßerdc_only=0
6813aa99676SStefan Eßerkaratsuba_len=32
6823aa99676SStefan Eßerdebug=0
6833aa99676SStefan Eßerhist=1
684d101cdd6SStefan Eßerhist_impl="internal"
6853aa99676SStefan Eßerextra_math=1
6863aa99676SStefan Eßeroptimization=""
6873aa99676SStefan Eßergenerate_tests=1
6883aa99676SStefan Eßerinstall_manpages=1
6893aa99676SStefan Eßernls=1
6903aa99676SStefan Eßerforce=0
6913aa99676SStefan Eßerstrip_bin=1
692cf7becd2SStefan Eßerall_locales=0
69350696a6eSStefan Eßerlibrary=0
69410328f8bSStefan Eßerclean=1
695d101cdd6SStefan Eßerproblematic_tests=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
708d101cdd6SStefan Eßerbc_default_digit_clamp=0
709d101cdd6SStefan Eßerdc_default_digit_clamp=0
71044d4804dSStefan Eßer
71144d4804dSStefan Eßer# getopts is a POSIX utility, but it cannot handle long options. Thus, the
71244d4804dSStefan Eßer# handling of long options is done by hand, and that's the reason that short and
71344d4804dSStefan Eßer# long options cannot be mixed.
714fdc4a7c8SStefan Eßerwhile getopts "abBcdDeEfgGhHik:lMNO:p:PrS:s:T-" opt; do
7153aa99676SStefan Eßer
7163aa99676SStefan Eßer	case "$opt" in
71750696a6eSStefan Eßer		a) library=1 ;;
7183aa99676SStefan Eßer		b) bc_only=1 ;;
7193aa99676SStefan Eßer		B) dc_only=1 ;;
72010328f8bSStefan Eßer		C) clean=0 ;;
7213aa99676SStefan Eßer		d) dc_only=1 ;;
7223aa99676SStefan Eßer		D) bc_only=1 ;;
723d101cdd6SStefan Eßer		e) hist_impl="editline" ;;
7243aa99676SStefan Eßer		E) extra_math=0 ;;
7253aa99676SStefan Eßer		f) force=1 ;;
7263aa99676SStefan Eßer		g) debug=1 ;;
7273aa99676SStefan Eßer		G) generate_tests=0 ;;
7283aa99676SStefan Eßer		h) usage ;;
7293aa99676SStefan Eßer		H) hist=0 ;;
730d101cdd6SStefan Eßer		i) hist_impl="internal" ;;
7313aa99676SStefan Eßer		k) karatsuba_len="$OPTARG" ;;
732cf7becd2SStefan Eßer		l) all_locales=1 ;;
7333aa99676SStefan Eßer		M) install_manpages=0 ;;
7343aa99676SStefan Eßer		N) nls=0 ;;
7353aa99676SStefan Eßer		O) optimization="$OPTARG" ;;
736d101cdd6SStefan Eßer		p) predefined_build "$OPTARG" ;;
737d101cdd6SStefan Eßer		P) problematic_tests=0 ;;
738d101cdd6SStefan Eßer		r) hist_impl="readline" ;;
73944d4804dSStefan Eßer		S) set_default 0 "$OPTARG" ;;
74044d4804dSStefan Eßer		s) set_default 1 "$OPTARG" ;;
7413aa99676SStefan Eßer		T) strip_bin=0 ;;
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				debug) debug=1 ;;
7523aa99676SStefan Eßer				force) force=1 ;;
7533aa99676SStefan Eßer				prefix=?*) PREFIX="$LONG_OPTARG" ;;
7543aa99676SStefan Eßer				prefix)
7553aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7563aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7573aa99676SStefan Eßer					fi
7583aa99676SStefan Eßer					PREFIX="$2"
7593aa99676SStefan Eßer					shift ;;
7603aa99676SStefan Eßer				bindir=?*) BINDIR="$LONG_OPTARG" ;;
7613aa99676SStefan Eßer				bindir)
7623aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7633aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7643aa99676SStefan Eßer					fi
7653aa99676SStefan Eßer					BINDIR="$2"
7663aa99676SStefan Eßer					shift ;;
76750696a6eSStefan Eßer				includedir=?*) INCLUDEDIR="$LONG_OPTARG" ;;
76850696a6eSStefan Eßer				includedir)
76950696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
77050696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
77150696a6eSStefan Eßer					fi
77250696a6eSStefan Eßer					INCLUDEDIR="$2"
77350696a6eSStefan Eßer					shift ;;
77450696a6eSStefan Eßer				libdir=?*) LIBDIR="$LONG_OPTARG" ;;
77550696a6eSStefan Eßer				libdir)
77650696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
77750696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
77850696a6eSStefan Eßer					fi
77950696a6eSStefan Eßer					LIBDIR="$2"
78050696a6eSStefan Eßer					shift ;;
7813aa99676SStefan Eßer				datarootdir=?*) DATAROOTDIR="$LONG_OPTARG" ;;
7823aa99676SStefan Eßer				datarootdir)
7833aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7843aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7853aa99676SStefan Eßer					fi
7863aa99676SStefan Eßer					DATAROOTDIR="$2"
7873aa99676SStefan Eßer					shift ;;
7883aa99676SStefan Eßer				datadir=?*) DATADIR="$LONG_OPTARG" ;;
7893aa99676SStefan Eßer				datadir)
7903aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7913aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7923aa99676SStefan Eßer					fi
7933aa99676SStefan Eßer					DATADIR="$2"
7943aa99676SStefan Eßer					shift ;;
7953aa99676SStefan Eßer				mandir=?*) MANDIR="$LONG_OPTARG" ;;
7963aa99676SStefan Eßer				mandir)
7973aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
7983aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
7993aa99676SStefan Eßer					fi
8003aa99676SStefan Eßer					MANDIR="$2"
8013aa99676SStefan Eßer					shift ;;
8023aa99676SStefan Eßer				man1dir=?*) MAN1DIR="$LONG_OPTARG" ;;
8033aa99676SStefan Eßer				man1dir)
8043aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8053aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8063aa99676SStefan Eßer					fi
8073aa99676SStefan Eßer					MAN1DIR="$2"
8083aa99676SStefan Eßer					shift ;;
80950696a6eSStefan Eßer				man3dir=?*) MAN3DIR="$LONG_OPTARG" ;;
81050696a6eSStefan Eßer				man3dir)
81150696a6eSStefan Eßer					if [ "$#" -lt 2 ]; then
81250696a6eSStefan Eßer						usage "No argument given for '--$arg' option"
81350696a6eSStefan Eßer					fi
81450696a6eSStefan Eßer					MAN3DIR="$2"
81550696a6eSStefan Eßer					shift ;;
8163aa99676SStefan Eßer				karatsuba-len=?*) karatsuba_len="$LONG_OPTARG" ;;
8173aa99676SStefan Eßer				karatsuba-len)
8183aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8193aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8203aa99676SStefan Eßer					fi
8213aa99676SStefan Eßer					karatsuba_len="$1"
8223aa99676SStefan Eßer					shift ;;
8233aa99676SStefan Eßer				opt=?*) optimization="$LONG_OPTARG" ;;
8243aa99676SStefan Eßer				opt)
8253aa99676SStefan Eßer					if [ "$#" -lt 2 ]; then
8263aa99676SStefan Eßer						usage "No argument given for '--$arg' option"
8273aa99676SStefan Eßer					fi
8283aa99676SStefan Eßer					optimization="$1"
8293aa99676SStefan Eßer					shift ;;
83044d4804dSStefan Eßer				set-default-on=?*) set_default 1 "$LONG_OPTARG" ;;
83144d4804dSStefan Eßer				set-default-on)
83244d4804dSStefan Eßer					if [ "$#" -lt 2 ]; then
83344d4804dSStefan Eßer						usage "No argument given for '--$arg' option"
83444d4804dSStefan Eßer					fi
83544d4804dSStefan Eßer					set_default 1 "$1"
83644d4804dSStefan Eßer					shift ;;
83744d4804dSStefan Eßer				set-default-off=?*) set_default 0 "$LONG_OPTARG" ;;
83844d4804dSStefan Eßer				set-default-off)
83944d4804dSStefan Eßer					if [ "$#" -lt 2 ]; then
84044d4804dSStefan Eßer						usage "No argument given for '--$arg' option"
84144d4804dSStefan Eßer					fi
84244d4804dSStefan Eßer					set_default 0 "$1"
84344d4804dSStefan Eßer					shift ;;
844d101cdd6SStefan Eßer				predefined-build-type=?*) predefined_build "$LONG_OPTARG" ;;
845d101cdd6SStefan Eßer				predefined-build-type)
846d101cdd6SStefan Eßer					if [ "$#" -lt 2 ]; then
847d101cdd6SStefan Eßer						usage "No argument given for '--$arg' option"
848d101cdd6SStefan Eßer					fi
849d101cdd6SStefan Eßer					predefined_build "$1"
850d101cdd6SStefan Eßer					shift ;;
8513aa99676SStefan Eßer				disable-bc) dc_only=1 ;;
8523aa99676SStefan Eßer				disable-dc) bc_only=1 ;;
85310328f8bSStefan Eßer				disable-clean) clean=0 ;;
8543aa99676SStefan Eßer				disable-extra-math) extra_math=0 ;;
8553aa99676SStefan Eßer				disable-generated-tests) generate_tests=0 ;;
8563aa99676SStefan Eßer				disable-history) hist=0 ;;
8573aa99676SStefan Eßer				disable-man-pages) install_manpages=0 ;;
8583aa99676SStefan Eßer				disable-nls) nls=0 ;;
8593aa99676SStefan Eßer				disable-strip) strip_bin=0 ;;
860d101cdd6SStefan Eßer				disable-problematic-tests) problematic_tests=0 ;;
861d101cdd6SStefan Eßer				enable-editline) hist_impl="editline" ;;
862d101cdd6SStefan Eßer				enable-readline) hist_impl="readline" ;;
863d101cdd6SStefan Eßer				enable-internal-history) hist_impl="internal" ;;
864cf7becd2SStefan Eßer				install-all-locales) all_locales=1 ;;
865fdc4a7c8SStefan Eßer				help* | bc-only* | dc-only* | debug*)
8663aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
86710328f8bSStefan Eßer				disable-bc* | disable-dc* | disable-clean*)
86810328f8bSStefan Eßer					usage "No arg allowed for --$arg option" ;;
86910328f8bSStefan Eßer				disable-extra-math*)
8703aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
871fdc4a7c8SStefan Eßer				disable-history*)
8723aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
8733aa99676SStefan Eßer				disable-man-pages* | disable-nls* | disable-strip*)
8743aa99676SStefan Eßer					usage "No arg allowed for --$arg option" ;;
875d101cdd6SStefan Eßer				disable-problematic-tests*)
876d101cdd6SStefan Eßer					usage "No arg allowed for --$arg option" ;;
877fdc4a7c8SStefan Eßer				install-all-locales*)
878cf7becd2SStefan Eßer					usage "No arg allowed for --$arg option" ;;
87978bc019dSStefan Eßer				enable-editline* | enable-readline*)
88078bc019dSStefan Eßer					usage "No arg allowed for --$arg option" ;;
881d101cdd6SStefan Eßer				enable-internal-history*)
882d101cdd6SStefan Eßer					usage "No arg allowed for --$arg option" ;;
8833aa99676SStefan Eßer				'') break ;; # "--" terminates argument processing
8843aa99676SStefan Eßer				* ) usage "Invalid option $LONG_OPTARG" ;;
8853aa99676SStefan Eßer			esac
8863aa99676SStefan Eßer			shift
8873aa99676SStefan Eßer			OPTIND=1 ;;
88844d4804dSStefan Eßer		?) usage "Invalid option: $opt" ;;
8893aa99676SStefan Eßer	esac
8903aa99676SStefan Eßer
8913aa99676SStefan Eßerdone
8923aa99676SStefan Eßer
89344d4804dSStefan Eßer# Sometimes, developers don't want configure.sh to do a config clean. But
89444d4804dSStefan Eßer# sometimes they do.
89510328f8bSStefan Eßerif [ "$clean" -ne 0 ]; then
89610328f8bSStefan Eßer	if [ -f ./Makefile ]; then
89710328f8bSStefan Eßer		make clean_config > /dev/null
89810328f8bSStefan Eßer	fi
89910328f8bSStefan Eßerfi
90010328f8bSStefan Eßer
90144d4804dSStefan Eßer# It is an error to say that bc only should be built and likewise for dc.
9023aa99676SStefan Eßerif [ "$bc_only" -eq 1 ] && [ "$dc_only" -eq 1 ]; then
9033aa99676SStefan Eßer	usage "Can only specify one of -b(-D) or -d(-B)"
9043aa99676SStefan Eßerfi
9053aa99676SStefan Eßer
90644d4804dSStefan Eßer# The library is mutually exclusive to the calculators, so it's an error to
90744d4804dSStefan Eßer# give an option for either of them.
90850696a6eSStefan Eßerif [ "$library" -ne 0 ]; then
90950696a6eSStefan Eßer	if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then
91050696a6eSStefan Eßer		usage "Must not specify -b(-D) or -d(-B) when building the library"
91150696a6eSStefan Eßer	fi
91250696a6eSStefan Eßerfi
91350696a6eSStefan Eßer
91444d4804dSStefan Eßer# KARATSUBA_LEN must be an integer and must be 16 or greater.
9153aa99676SStefan Eßercase $karatsuba_len in
9163aa99676SStefan Eßer	(*[!0-9]*|'') usage "KARATSUBA_LEN is not a number" ;;
9173aa99676SStefan Eßer	(*) ;;
9183aa99676SStefan Eßeresac
9193aa99676SStefan Eßer
9203aa99676SStefan Eßerif [ "$karatsuba_len" -lt 16 ]; then
9213aa99676SStefan Eßer	usage "KARATSUBA_LEN is less than 16"
9223aa99676SStefan Eßerfi
9233aa99676SStefan Eßer
9243aa99676SStefan Eßerset -e
9253aa99676SStefan Eßer
9263aa99676SStefan Eßerif [ -z "${LONG_BIT+set}" ]; then
9273aa99676SStefan Eßer	LONG_BIT_DEFINE=""
9283aa99676SStefan Eßerelif [ "$LONG_BIT" -lt 32 ]; then
9293aa99676SStefan Eßer	usage "LONG_BIT is less than 32"
9303aa99676SStefan Eßerelse
931d101cdd6SStefan Eßer	LONG_BIT_DEFINE="-DBC_LONG_BIT=$LONG_BIT"
9323aa99676SStefan Eßerfi
9333aa99676SStefan Eßer
9343aa99676SStefan Eßerif [ -z "$CC" ]; then
9353aa99676SStefan Eßer	CC="c99"
9363aa99676SStefan Eßerelse
93744d4804dSStefan Eßer
93844d4804dSStefan Eßer	# I had users complain that, if they gave CFLAGS as part of CC, which
93944d4804dSStefan Eßer	# autotools allows in its braindead way, the build would fail with an error.
94044d4804dSStefan Eßer	# I don't like adjusting for autotools, but oh well. These lines puts the
94144d4804dSStefan Eßer	# stuff after the first space into CFLAGS.
9423aa99676SStefan Eßer	ccbase=$(basename "$CC")
9433aa99676SStefan Eßer	suffix=" *"
9443aa99676SStefan Eßer	prefix="* "
9453aa99676SStefan Eßer
9463aa99676SStefan Eßer	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
9473aa99676SStefan Eßer		ccflags="${ccbase#$prefix}"
9483aa99676SStefan Eßer		cc="${ccbase%%$suffix}"
9493aa99676SStefan Eßer		ccdir=$(dirname "$CC")
9503aa99676SStefan Eßer		if [ "$ccdir" = "." ] && [ "${CC#.}" = "$CC" ]; then
9513aa99676SStefan Eßer			ccdir=""
9523aa99676SStefan Eßer		else
9533aa99676SStefan Eßer			ccdir="$ccdir/"
9543aa99676SStefan Eßer		fi
9553aa99676SStefan Eßer		CC="${ccdir}${cc}"
9563aa99676SStefan Eßer		CFLAGS="$CFLAGS $ccflags"
9573aa99676SStefan Eßer	fi
9583aa99676SStefan Eßerfi
9593aa99676SStefan Eßer
9603aa99676SStefan Eßerif [ -z "$HOSTCC" ] && [ -z "$HOST_CC" ]; then
9613aa99676SStefan Eßer	HOSTCC="$CC"
9623aa99676SStefan Eßerelif [ -z "$HOSTCC" ]; then
9633aa99676SStefan Eßer	HOSTCC="$HOST_CC"
9643aa99676SStefan Eßerfi
9653aa99676SStefan Eßer
9663aa99676SStefan Eßerif [ "$HOSTCC" != "$CC" ]; then
96744d4804dSStefan Eßer
96844d4804dSStefan Eßer	# Like above, this splits HOSTCC and HOSTCFLAGS.
9693aa99676SStefan Eßer	ccbase=$(basename "$HOSTCC")
9703aa99676SStefan Eßer	suffix=" *"
9713aa99676SStefan Eßer	prefix="* "
9723aa99676SStefan Eßer
9733aa99676SStefan Eßer	if [ "${ccbase%%$suffix}" != "$ccbase" ]; then
9743aa99676SStefan Eßer		ccflags="${ccbase#$prefix}"
9753aa99676SStefan Eßer		cc="${ccbase%%$suffix}"
9763aa99676SStefan Eßer		ccdir=$(dirname "$HOSTCC")
9773aa99676SStefan Eßer		if [ "$ccdir" = "." ] && [ "${HOSTCC#.}" = "$HOSTCC" ]; then
9783aa99676SStefan Eßer			ccdir=""
9793aa99676SStefan Eßer		else
9803aa99676SStefan Eßer			ccdir="$ccdir/"
9813aa99676SStefan Eßer		fi
9823aa99676SStefan Eßer		HOSTCC="${ccdir}${cc}"
9833aa99676SStefan Eßer		HOSTCFLAGS="$HOSTCFLAGS $ccflags"
9843aa99676SStefan Eßer	fi
9853aa99676SStefan Eßerfi
9863aa99676SStefan Eßer
9873aa99676SStefan Eßerif [ -z "${HOSTCFLAGS+set}" ] && [ -z "${HOST_CFLAGS+set}" ]; then
9883aa99676SStefan Eßer	HOSTCFLAGS="$CFLAGS"
9893aa99676SStefan Eßerelif [ -z "${HOSTCFLAGS+set}" ]; then
9903aa99676SStefan Eßer	HOSTCFLAGS="$HOST_CFLAGS"
9913aa99676SStefan Eßerfi
9923aa99676SStefan Eßer
99344d4804dSStefan Eßer# Store these for the cross compilation detection later.
99444d4804dSStefan EßerOLDCFLAGS="$CFLAGS"
99544d4804dSStefan EßerOLDHOSTCFLAGS="$HOSTCFLAGS"
99644d4804dSStefan Eßer
9973aa99676SStefan Eßerlink="@printf 'No link necessary\\\\n'"
9983aa99676SStefan Eßermain_exec="BC"
9993aa99676SStefan Eßerexecutable="BC_EXEC"
10003aa99676SStefan Eßer
10013aa99676SStefan Eßerkaratsuba="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'"
10023aa99676SStefan Eßer
10033aa99676SStefan Eßerbc_lib="\$(GEN_DIR)/lib.o"
10043aa99676SStefan Eßerbc_help="\$(GEN_DIR)/bc_help.o"
10053aa99676SStefan Eßerdc_help="\$(GEN_DIR)/dc_help.o"
10063aa99676SStefan Eßer
100710328f8bSStefan Eßerdefault_target_prereqs="\$(BIN) \$(OBJS)"
100810328f8bSStefan Eßerdefault_target_cmd="\$(CC) \$(CFLAGS) \$(OBJS) \$(LDFLAGS) -o \$(EXEC)"
100910328f8bSStefan Eßerdefault_target="\$(DC_EXEC)"
101010328f8bSStefan Eßer
101110328f8bSStefan Eßersecond_target_prereqs=""
101210328f8bSStefan Eßersecond_target_cmd="$default_target_cmd"
101310328f8bSStefan Eßersecond_target="\$(BC_EXEC)"
101410328f8bSStefan Eßer
101544d4804dSStefan Eßer# This if/else if chain is for setting the defaults that change based on whether
101644d4804dSStefan Eßer# the library is being built, bc only, dc only, or both calculators.
101710328f8bSStefan Eßerif [ "$library" -ne 0 ]; then
101810328f8bSStefan Eßer
101910328f8bSStefan Eßer	extra_math=1
102010328f8bSStefan Eßer	nls=0
102110328f8bSStefan Eßer	hist=0
102210328f8bSStefan Eßer	bc=1
102310328f8bSStefan Eßer	dc=1
102410328f8bSStefan Eßer
102510328f8bSStefan Eßer	default_target_prereqs="\$(BIN) \$(OBJ)"
102610328f8bSStefan Eßer	default_target_cmd="ar -r -cu \$(LIBBC) \$(OBJ)"
102710328f8bSStefan Eßer	default_target="\$(LIBBC)"
102810328f8bSStefan Eßer
102910041e99SStefan Eßer	install_prereqs=" install_library"
103010041e99SStefan Eßer	uninstall_prereqs=" uninstall_library"
103110041e99SStefan Eßer	install_man_prereqs=" install_bcl_manpage"
103210041e99SStefan Eßer	uninstall_man_prereqs=" uninstall_bcl_manpage"
103310041e99SStefan Eßer
103410328f8bSStefan Eßerelif [ "$bc_only" -eq 1 ]; then
10353aa99676SStefan Eßer
10363aa99676SStefan Eßer	bc=1
10373aa99676SStefan Eßer	dc=0
10383aa99676SStefan Eßer
10393aa99676SStefan Eßer	dc_help=""
10403aa99676SStefan Eßer
10413aa99676SStefan Eßer	executables="bc"
10423aa99676SStefan Eßer
104350696a6eSStefan Eßer	install_prereqs=" install_execs"
104450696a6eSStefan Eßer	install_man_prereqs=" install_bc_manpage"
10453aa99676SStefan Eßer	uninstall_prereqs=" uninstall_bc"
10463aa99676SStefan Eßer	uninstall_man_prereqs=" uninstall_bc_manpage"
10473aa99676SStefan Eßer
104810328f8bSStefan Eßer	default_target="\$(BC_EXEC)"
104910328f8bSStefan Eßer	second_target="\$(DC_EXEC)"
105010328f8bSStefan Eßer
10513aa99676SStefan Eßerelif [ "$dc_only" -eq 1 ]; then
10523aa99676SStefan Eßer
10533aa99676SStefan Eßer	bc=0
10543aa99676SStefan Eßer	dc=1
10553aa99676SStefan Eßer
10563aa99676SStefan Eßer	bc_lib=""
10573aa99676SStefan Eßer	bc_help=""
10583aa99676SStefan Eßer
10593aa99676SStefan Eßer	executables="dc"
10603aa99676SStefan Eßer
10613aa99676SStefan Eßer	main_exec="DC"
10623aa99676SStefan Eßer	executable="DC_EXEC"
10633aa99676SStefan Eßer
106450696a6eSStefan Eßer	install_prereqs=" install_execs"
106550696a6eSStefan Eßer	install_man_prereqs=" install_dc_manpage"
10663aa99676SStefan Eßer	uninstall_prereqs=" uninstall_dc"
10673aa99676SStefan Eßer	uninstall_man_prereqs=" uninstall_dc_manpage"
10683aa99676SStefan Eßer
10693aa99676SStefan Eßerelse
10703aa99676SStefan Eßer
10713aa99676SStefan Eßer	bc=1
10723aa99676SStefan Eßer	dc=1
10733aa99676SStefan Eßer
10743aa99676SStefan Eßer	executables="bc and dc"
10753aa99676SStefan Eßer
10763aa99676SStefan Eßer	karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)"
10773aa99676SStefan Eßer
107850696a6eSStefan Eßer	if [ "$library" -eq 0 ]; then
107950696a6eSStefan Eßer		install_prereqs=" install_execs"
108050696a6eSStefan Eßer		install_man_prereqs=" install_bc_manpage install_dc_manpage"
10813aa99676SStefan Eßer		uninstall_prereqs=" uninstall_bc uninstall_dc"
10823aa99676SStefan Eßer		uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage"
108350696a6eSStefan Eßer	else
108450696a6eSStefan Eßer		install_prereqs=" install_library install_bcl_header"
108550696a6eSStefan Eßer		install_man_prereqs=" install_bcl_manpage"
108650696a6eSStefan Eßer		uninstall_prereqs=" uninstall_library uninstall_bcl_header"
108750696a6eSStefan Eßer		uninstall_man_prereqs=" uninstall_bcl_manpage"
108850696a6eSStefan Eßer	fi
10893aa99676SStefan Eßer
109010328f8bSStefan Eßer	second_target_prereqs="$default_target_prereqs"
109110328f8bSStefan Eßer	default_target_prereqs="$second_target"
109210328f8bSStefan Eßer	default_target_cmd="\$(LINK) \$(BIN) \$(EXEC_PREFIX)\$(DC)"
109310328f8bSStefan Eßer
109410328f8bSStefan Eßerfi
109510328f8bSStefan Eßer
109644d4804dSStefan Eßer# This sets some necessary things for debug mode.
10973aa99676SStefan Eßerif [ "$debug" -eq 1 ]; then
10983aa99676SStefan Eßer
10993aa99676SStefan Eßer	if [ -z "$CFLAGS" ] && [ -z "$optimization" ]; then
11003aa99676SStefan Eßer		CFLAGS="-O0"
11013aa99676SStefan Eßer	fi
11023aa99676SStefan Eßer
11033aa99676SStefan Eßer	CFLAGS="-g $CFLAGS"
11043aa99676SStefan Eßer
11053aa99676SStefan Eßerelse
11063aa99676SStefan Eßer	CPPFLAGS="-DNDEBUG $CPPFLAGS"
11073aa99676SStefan Eßerfi
11083aa99676SStefan Eßer
110944d4804dSStefan Eßer# Set optimization CFLAGS.
11103aa99676SStefan Eßerif [ -n "$optimization" ]; then
11113aa99676SStefan Eßer	CFLAGS="-O$optimization $CFLAGS"
11123aa99676SStefan Eßerfi
11133aa99676SStefan Eßer
111444d4804dSStefan Eßer# Set some defaults.
11153aa99676SStefan Eßerif [ -z "${DESTDIR+set}" ]; then
11163aa99676SStefan Eßer	destdir=""
11173aa99676SStefan Eßerelse
11183aa99676SStefan Eßer	destdir="DESTDIR = $DESTDIR"
11193aa99676SStefan Eßerfi
11203aa99676SStefan Eßer
1121d101cdd6SStefan Eßer# defprefix is for a warning about locales later.
11223aa99676SStefan Eßerif [ -z "${PREFIX+set}" ]; then
11233aa99676SStefan Eßer	PREFIX="/usr/local"
1124d101cdd6SStefan Eßer	defprefix=1
1125d101cdd6SStefan Eßerelse
1126d101cdd6SStefan Eßer	defprefix=0
11273aa99676SStefan Eßerfi
11283aa99676SStefan Eßer
11293aa99676SStefan Eßerif [ -z "${BINDIR+set}" ]; then
11303aa99676SStefan Eßer	BINDIR="$PREFIX/bin"
11313aa99676SStefan Eßerfi
11323aa99676SStefan Eßer
113350696a6eSStefan Eßerif [ -z "${INCLUDEDIR+set}" ]; then
113450696a6eSStefan Eßer	INCLUDEDIR="$PREFIX/include"
113550696a6eSStefan Eßerfi
113650696a6eSStefan Eßer
113750696a6eSStefan Eßerif [ -z "${LIBDIR+set}" ]; then
113850696a6eSStefan Eßer	LIBDIR="$PREFIX/lib"
113950696a6eSStefan Eßerfi
114050696a6eSStefan Eßer
114110041e99SStefan Eßerif [ -z "${PC_PATH+set}" ]; then
114210041e99SStefan Eßer
114310041e99SStefan Eßer	set +e
114410041e99SStefan Eßer
114510041e99SStefan Eßer	command -v pkg-config > /dev/null
114610041e99SStefan Eßer	err=$?
114710041e99SStefan Eßer
114810041e99SStefan Eßer	set -e
114910041e99SStefan Eßer
115010041e99SStefan Eßer	if [ "$err" -eq 0 ]; then
115110041e99SStefan Eßer		PC_PATH=$(pkg-config --variable=pc_path pkg-config)
115210041e99SStefan Eßer		PC_PATH="${PC_PATH%%:*}"
115310041e99SStefan Eßer	else
115410041e99SStefan Eßer		PC_PATH=""
115510041e99SStefan Eßer	fi
115610041e99SStefan Eßer
115710041e99SStefan Eßerfi
115810041e99SStefan Eßer
115944d4804dSStefan Eßer# Set a default for the DATAROOTDIR. This is done if either manpages will be
1160d101cdd6SStefan Eßer# installed, or locales are enabled because that's probably where NLSPATH
116144d4804dSStefan Eßer# points.
11623aa99676SStefan Eßerif [ "$install_manpages" -ne 0 ] || [ "$nls" -ne 0 ]; then
11633aa99676SStefan Eßer	if [ -z "${DATAROOTDIR+set}" ]; then
11643aa99676SStefan Eßer		DATAROOTDIR="$PREFIX/share"
11653aa99676SStefan Eßer	fi
11663aa99676SStefan Eßerfi
11673aa99676SStefan Eßer
116844d4804dSStefan Eßer# Set defaults for manpage environment variables.
11693aa99676SStefan Eßerif [ "$install_manpages" -ne 0 ]; then
11703aa99676SStefan Eßer
11713aa99676SStefan Eßer	if [ -z "${DATADIR+set}" ]; then
11723aa99676SStefan Eßer		DATADIR="$DATAROOTDIR"
11733aa99676SStefan Eßer	fi
11743aa99676SStefan Eßer
11753aa99676SStefan Eßer	if [ -z "${MANDIR+set}" ]; then
11763aa99676SStefan Eßer		MANDIR="$DATADIR/man"
11773aa99676SStefan Eßer	fi
11783aa99676SStefan Eßer
11793aa99676SStefan Eßer	if [ -z "${MAN1DIR+set}" ]; then
11803aa99676SStefan Eßer		MAN1DIR="$MANDIR/man1"
11813aa99676SStefan Eßer	fi
11823aa99676SStefan Eßer
118350696a6eSStefan Eßer	if [ -z "${MAN3DIR+set}" ]; then
118450696a6eSStefan Eßer		MAN3DIR="$MANDIR/man3"
118550696a6eSStefan Eßer	fi
118650696a6eSStefan Eßer
11873aa99676SStefan Eßerelse
118850696a6eSStefan Eßer	install_man_prereqs=""
11893aa99676SStefan Eßer	uninstall_man_prereqs=""
11903aa99676SStefan Eßerfi
11913aa99676SStefan Eßer
119244d4804dSStefan Eßer# Here is where we test NLS (the locale system). This is done by trying to
119344d4804dSStefan Eßer# compile src/vm.c, which has the relevant code. If it fails, then it is
119444d4804dSStefan Eßer# disabled.
11953aa99676SStefan Eßerif [ "$nls" -ne 0 ]; then
11963aa99676SStefan Eßer
11973aa99676SStefan Eßer	set +e
11983aa99676SStefan Eßer
11993aa99676SStefan Eßer	printf 'Testing NLS...\n'
12003aa99676SStefan Eßer
12013aa99676SStefan Eßer	flags="-DBC_ENABLE_NLS=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
120244d4804dSStefan Eßer	flags="$flags -DBC_ENABLE_HISTORY=$hist -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
120312e0d316SStefan Eßer	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -DBC_ENABLE_OSSFUZZ=0"
120412e0d316SStefan Eßer	flags="$flags -I$scriptdir/include/ -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
12053aa99676SStefan Eßer
1206d101cdd6SStefan Eßer	ccbase=$(basename "$CC")
1207d101cdd6SStefan Eßer
1208d101cdd6SStefan Eßer	if [ "$ccbase" = "clang" ]; then
1209d101cdd6SStefan Eßer		flags="$flags -Wno-unreachable-code"
1210d101cdd6SStefan Eßer	fi
1211d101cdd6SStefan Eßer
121212e0d316SStefan Eßer	"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/vm.c" -E > /dev/null
12133aa99676SStefan Eßer
12143aa99676SStefan Eßer	err="$?"
12153aa99676SStefan Eßer
121610041e99SStefan Eßer	rm -rf "./vm.o"
12173aa99676SStefan Eßer
121812e0d316SStefan Eßer	# If this errors, it is probably because of building on Windows or musl,
121912e0d316SStefan Eßer	# and NLS is not supported on Windows or musl, so disable it.
12203aa99676SStefan Eßer	if [ "$err" -ne 0 ]; then
12213aa99676SStefan Eßer		printf 'NLS does not work.\n'
12223aa99676SStefan Eßer		if [ $force -eq 0 ]; then
12233aa99676SStefan Eßer			printf 'Disabling NLS...\n\n'
12243aa99676SStefan Eßer			nls=0
12253aa99676SStefan Eßer		else
12263aa99676SStefan Eßer			printf 'Forcing NLS...\n\n'
12273aa99676SStefan Eßer		fi
12283aa99676SStefan Eßer	else
12293aa99676SStefan Eßer		printf 'NLS works.\n\n'
12303aa99676SStefan Eßer
12313aa99676SStefan Eßer		printf 'Testing gencat...\n'
1232fdc4a7c8SStefan Eßer		gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" 2>&1
12333aa99676SStefan Eßer
12343aa99676SStefan Eßer		err="$?"
12353aa99676SStefan Eßer
123610041e99SStefan Eßer		rm -rf "./en_US.cat"
12373aa99676SStefan Eßer
12383aa99676SStefan Eßer		if [ "$err" -ne 0 ]; then
12393aa99676SStefan Eßer			printf 'gencat does not work.\n'
12403aa99676SStefan Eßer			if [ $force -eq 0 ]; then
12413aa99676SStefan Eßer				printf 'Disabling NLS...\n\n'
12423aa99676SStefan Eßer				nls=0
12433aa99676SStefan Eßer			else
12443aa99676SStefan Eßer				printf 'Forcing NLS...\n\n'
12453aa99676SStefan Eßer			fi
12463aa99676SStefan Eßer		else
12473aa99676SStefan Eßer
12483aa99676SStefan Eßer			printf 'gencat works.\n\n'
12493aa99676SStefan Eßer
125044d4804dSStefan Eßer			# It turns out that POSIX locales are really terrible, and running
125144d4804dSStefan Eßer			# gencat on one machine is not guaranteed to make those cat files
125244d4804dSStefan Eßer			# portable to another machine, so we had better warn the user here.
125344d4804dSStefan Eßer			if [ "$HOSTCC" != "$CC" ] || [ "$OLDHOSTCFLAGS" != "$OLDCFLAGS" ]; then
12543aa99676SStefan Eßer				printf 'Cross-compile detected.\n\n'
12553aa99676SStefan Eßer				printf 'WARNING: Catalog files generated with gencat may not be portable\n'
12563aa99676SStefan Eßer				printf '         across different architectures.\n\n'
12573aa99676SStefan Eßer			fi
12583aa99676SStefan Eßer
12593aa99676SStefan Eßer			if [ -z "$NLSPATH" ]; then
12603aa99676SStefan Eßer				NLSPATH="/usr/share/locale/%L/%N"
12613aa99676SStefan Eßer			fi
12623aa99676SStefan Eßer
12633aa99676SStefan Eßer			install_locales_prereqs=" install_locales"
12643aa99676SStefan Eßer			uninstall_locales_prereqs=" uninstall_locales"
12653aa99676SStefan Eßer
12663aa99676SStefan Eßer		fi
12673aa99676SStefan Eßer
12683aa99676SStefan Eßer	fi
12693aa99676SStefan Eßer
12703aa99676SStefan Eßer	set -e
12713aa99676SStefan Eßer
12723aa99676SStefan Eßerelse
12733aa99676SStefan Eßer	install_locales_prereqs=""
12743aa99676SStefan Eßer	uninstall_locales_prereqs=""
1275cf7becd2SStefan Eßer	all_locales=0
1276cf7becd2SStefan Eßerfi
1277cf7becd2SStefan Eßer
1278cf7becd2SStefan Eßerif [ "$nls" -ne 0 ] && [ "$all_locales" -ne 0 ]; then
1279cf7becd2SStefan Eßer	install_locales="\$(LOCALE_INSTALL) -l \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
1280cf7becd2SStefan Eßerelse
1281cf7becd2SStefan Eßer	install_locales="\$(LOCALE_INSTALL) \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)"
12823aa99676SStefan Eßerfi
12833aa99676SStefan Eßer
128444d4804dSStefan Eßer# Like the above tested locale support, this tests history.
12853aa99676SStefan Eßerif [ "$hist" -eq 1 ]; then
12863aa99676SStefan Eßer
1287d101cdd6SStefan Eßer	if [ "$hist_impl" = "editline" ]; then
1288d101cdd6SStefan Eßer		editline=1
1289d101cdd6SStefan Eßer		readline=0
1290d101cdd6SStefan Eßer	elif [ "$hist_impl" = "readline" ]; then
1291d101cdd6SStefan Eßer		editline=0
1292d101cdd6SStefan Eßer		readline=1
1293d101cdd6SStefan Eßer	else
1294d101cdd6SStefan Eßer		editline=0
1295d101cdd6SStefan Eßer		readline=0
129678bc019dSStefan Eßer	fi
129778bc019dSStefan Eßer
12983aa99676SStefan Eßer	set +e
12993aa99676SStefan Eßer
13003aa99676SStefan Eßer	printf 'Testing history...\n'
13013aa99676SStefan Eßer
13023aa99676SStefan Eßer	flags="-DBC_ENABLE_HISTORY=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc"
130344d4804dSStefan Eßer	flags="$flags -DBC_ENABLE_NLS=$nls -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0"
130478bc019dSStefan Eßer	flags="$flags -DBC_ENABLE_EDITLINE=$editline -DBC_ENABLE_READLINE=$readline"
130512e0d316SStefan Eßer	flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -DBC_ENABLE_OSSFUZZ=0"
130612e0d316SStefan Eßer	flags="$flags -I$scriptdir/include/ -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
13073aa99676SStefan Eßer
130812e0d316SStefan Eßer	"$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/history.c" -E > /dev/null
13093aa99676SStefan Eßer
13103aa99676SStefan Eßer	err="$?"
13113aa99676SStefan Eßer
131210041e99SStefan Eßer	rm -rf "./history.o"
13133aa99676SStefan Eßer
13143aa99676SStefan Eßer	# If this errors, it is probably because of building on Windows,
13153aa99676SStefan Eßer	# and history is not supported on Windows, so disable it.
13163aa99676SStefan Eßer	if [ "$err" -ne 0 ]; then
13173aa99676SStefan Eßer		printf 'History does not work.\n'
13183aa99676SStefan Eßer		if [ $force -eq 0 ]; then
13193aa99676SStefan Eßer			printf 'Disabling history...\n\n'
13203aa99676SStefan Eßer			hist=0
13213aa99676SStefan Eßer		else
13223aa99676SStefan Eßer			printf 'Forcing history...\n\n'
13233aa99676SStefan Eßer		fi
13243aa99676SStefan Eßer	else
13253aa99676SStefan Eßer		printf 'History works.\n\n'
13263aa99676SStefan Eßer	fi
13273aa99676SStefan Eßer
13283aa99676SStefan Eßer	set -e
13293aa99676SStefan Eßer
1330d101cdd6SStefan Eßerelse
1331d101cdd6SStefan Eßer
1332d101cdd6SStefan Eßer	editline=0
1333d101cdd6SStefan Eßer	readline=0
1334d101cdd6SStefan Eßer
13353aa99676SStefan Eßerfi
13363aa99676SStefan Eßer
1337fdc4a7c8SStefan Eßerif [ "$hist" -eq 0 ]; then
133878bc019dSStefan Eßer	CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0"
133944d4804dSStefan Eßerelse
134078bc019dSStefan Eßer
134178bc019dSStefan Eßer	# We are also setting the CFLAGS and LDFLAGS here.
134278bc019dSStefan Eßer	if [ "$editline" -ne 0 ]; then
134378bc019dSStefan Eßer		LDFLAGS="$LDFLAGS -ledit"
134476238846SStefan Eßer		CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=1 -DBC_ENABLE_READLINE=0"
134578bc019dSStefan Eßer	elif [ "$readline" -ne 0 ]; then
134678bc019dSStefan Eßer		LDFLAGS="$LDFLAGS -lreadline"
134776238846SStefan Eßer		CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=1"
134878bc019dSStefan Eßer	else
134976238846SStefan Eßer		CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0"
135078bc019dSStefan Eßer	fi
135178bc019dSStefan Eßer
135278bc019dSStefan Eßerfi
135378bc019dSStefan Eßer
135478bc019dSStefan Eßer# Test FreeBSD. This is not in an if statement because regardless of whatever
135578bc019dSStefan Eßer# the user says, we need to know if we are on FreeBSD. If we are, we cannot set
135678bc019dSStefan Eßer# _POSIX_C_SOURCE and _XOPEN_SOURCE. The FreeBSD headers turn *off* stuff when
135778bc019dSStefan Eßer# that is done.
135878bc019dSStefan Eßerset +e
135978bc019dSStefan Eßerprintf 'Testing for FreeBSD...\n'
136078bc019dSStefan Eßer
136178bc019dSStefan Eßerflags="-DBC_TEST_FREEBSD -DBC_ENABLE_AFL=0"
136212e0d316SStefan Eßer"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null
136378bc019dSStefan Eßer
136478bc019dSStefan Eßererr="$?"
136578bc019dSStefan Eßer
136678bc019dSStefan Eßerif [ "$err" -ne 0 ]; then
136778bc019dSStefan Eßer	printf 'On FreeBSD. Not using _POSIX_C_SOURCE and _XOPEN_SOURCE.\n\n'
136878bc019dSStefan Eßerelse
136978bc019dSStefan Eßer	printf 'Not on FreeBSD. Using _POSIX_C_SOURCE and _XOPEN_SOURCE.\n\n'
137078bc019dSStefan Eßer	CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700"
137144d4804dSStefan Eßerfi
137244d4804dSStefan Eßer
1373a970610aSStefan Eßer# Test macOS. This is not in an if statement because regardless of whatever the
1374a970610aSStefan Eßer# user says, we need to know if we are on macOS. If we are, we have to set
137576238846SStefan Eßer# _DARWIN_C_SOURCE.
1376a970610aSStefan Eßerprintf 'Testing for macOS...\n'
137776238846SStefan Eßer
137876238846SStefan Eßerflags="-DBC_TEST_APPLE -DBC_ENABLE_AFL=0"
137912e0d316SStefan Eßer"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null
138076238846SStefan Eßer
138176238846SStefan Eßererr="$?"
138276238846SStefan Eßer
138376238846SStefan Eßerif [ "$err" -ne 0 ]; then
1384a970610aSStefan Eßer	printf 'On macOS. Using _DARWIN_C_SOURCE.\n\n'
138576238846SStefan Eßer	apple="-D_DARWIN_C_SOURCE"
138676238846SStefan Eßerelse
1387a970610aSStefan Eßer	printf 'Not on macOS.\n\n'
138876238846SStefan Eßer	apple=""
138976238846SStefan Eßerfi
139076238846SStefan Eßer
1391a970610aSStefan Eßer# We can't use the linker's strip flag on macOS.
1392a970610aSStefan Eßerif [ "$debug" -eq 0 ] && [ "$apple" = "" ] && [ "$strip_bin" -ne 0 ]; then
1393e6857bd4SStefan Eßer	LDFLAGS="-s $LDFLAGS"
1394e6857bd4SStefan Eßerfi
1395e6857bd4SStefan Eßer
139644d4804dSStefan Eßer# Test OpenBSD. This is not in an if statement because regardless of whatever
139744d4804dSStefan Eßer# the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE.
139844d4804dSStefan Eßer# No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC
139944d4804dSStefan Eßer# and Clang complain that that is only allowed for system headers. Sigh....So we
140044d4804dSStefan Eßer# have to check at configure time and set it on the compiler command-line. And
140144d4804dSStefan Eßer# we have to set it because we also set _POSIX_C_SOURCE, which OpenBSD headers
140244d4804dSStefan Eßer# detect, and when they detect it, they turn off _BSD_SOURCE unless it is
140344d4804dSStefan Eßer# specifically requested.
140444d4804dSStefan Eßerprintf 'Testing for OpenBSD...\n'
140544d4804dSStefan Eßer
140644d4804dSStefan Eßerflags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0"
140712e0d316SStefan Eßer"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null
140844d4804dSStefan Eßer
140944d4804dSStefan Eßererr="$?"
141044d4804dSStefan Eßer
141144d4804dSStefan Eßerif [ "$err" -ne 0 ]; then
1412d101cdd6SStefan Eßer
141344d4804dSStefan Eßer	printf 'On OpenBSD. Using _BSD_SOURCE.\n\n'
141444d4804dSStefan Eßer	bsd="-D_BSD_SOURCE"
1415d101cdd6SStefan Eßer
1416d101cdd6SStefan Eßer	# Readline errors on OpenBSD, for some weird reason.
1417d101cdd6SStefan Eßer	if [ "$readline" -ne 0 ]; then
1418d101cdd6SStefan Eßer		usage "Cannot use readline on OpenBSD"
1419d101cdd6SStefan Eßer	fi
1420d101cdd6SStefan Eßer
142144d4804dSStefan Eßerelse
142244d4804dSStefan Eßer	printf 'Not on OpenBSD.\n\n'
142344d4804dSStefan Eßer	bsd=""
142444d4804dSStefan Eßerfi
142544d4804dSStefan Eßer
142676238846SStefan Eßerset -e
142776238846SStefan Eßer
142850696a6eSStefan Eßerif [ "$library" -eq 1 ]; then
142950696a6eSStefan Eßer	bc_lib=""
143050696a6eSStefan Eßerfi
143150696a6eSStefan Eßer
143250696a6eSStefan Eßerif [ "$extra_math" -eq 1 ] && [ "$bc" -ne 0 ] && [ "$library" -eq 0 ]; then
14333aa99676SStefan Eßer	BC_LIB2_O="\$(GEN_DIR)/lib2.o"
14343aa99676SStefan Eßerelse
14353aa99676SStefan Eßer	BC_LIB2_O=""
14363aa99676SStefan Eßerfi
14373aa99676SStefan Eßer
1438d101cdd6SStefan EßerGEN_DIR="$scriptdir/gen"
1439d101cdd6SStefan Eßer
144044d4804dSStefan Eßer# These lines set the appropriate targets based on whether `gen/strgen.c` or
144144d4804dSStefan Eßer# `gen/strgen.sh` is used.
14423aa99676SStefan EßerGEN="strgen"
144312e0d316SStefan EßerGEN_EXEC_TARGET="\$(HOSTCC) -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -I$scriptdir/include/ \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)"
1444fdc4a7c8SStefan EßerCLEAN_PREREQS=" clean_gen"
14453aa99676SStefan Eßer
14463aa99676SStefan Eßerif [ -z "${GEN_HOST+set}" ]; then
14473aa99676SStefan Eßer	GEN_HOST=1
14483aa99676SStefan Eßerelse
14493aa99676SStefan Eßer	if [ "$GEN_HOST" -eq 0 ]; then
14503aa99676SStefan Eßer		GEN="strgen.sh"
14513aa99676SStefan Eßer		GEN_EXEC_TARGET="@printf 'Do not need to build gen/strgen.c\\\\n'"
14523aa99676SStefan Eßer	fi
14533aa99676SStefan Eßerfi
14543aa99676SStefan Eßer
145512e0d316SStefan Eßer# The fuzzer files are always unneeded because they'll be built separately.
14563aa99676SStefan Eßermanpage_args=""
145712e0d316SStefan Eßerunneeded="bc_fuzzer.c dc_fuzzer.c"
145810328f8bSStefan Eßerheaders="\$(HEADERS)"
14593aa99676SStefan Eßer
146044d4804dSStefan Eßer# This series of if statements figure out what source files are *not* needed.
14613aa99676SStefan Eßerif [ "$extra_math" -eq 0 ]; then
146278bc019dSStefan Eßer	exclude_extra_math=1
14633aa99676SStefan Eßer	manpage_args="E"
146410328f8bSStefan Eßer	unneeded="$unneeded rand.c"
146510328f8bSStefan Eßerelse
146678bc019dSStefan Eßer	exclude_extra_math=0
146710328f8bSStefan Eßer	headers="$headers \$(EXTRA_MATH_HEADERS)"
14683aa99676SStefan Eßerfi
14693aa99676SStefan Eßer
147044d4804dSStefan Eßer# All of these next if statements set the build type and mark certain source
147144d4804dSStefan Eßer# files as unneeded so that they won't have targets generated for them.
147244d4804dSStefan Eßer
14733aa99676SStefan Eßerif [ "$hist" -eq 0 ]; then
14743aa99676SStefan Eßer	manpage_args="${manpage_args}H"
147510328f8bSStefan Eßer	unneeded="$unneeded history.c"
147610328f8bSStefan Eßerelse
147710328f8bSStefan Eßer	headers="$headers \$(HISTORY_HEADERS)"
14783aa99676SStefan Eßerfi
14793aa99676SStefan Eßer
14803aa99676SStefan Eßerif [ "$nls" -eq 0 ]; then
14813aa99676SStefan Eßer	manpage_args="${manpage_args}N"
14823aa99676SStefan Eßerfi
14833aa99676SStefan Eßer
148450696a6eSStefan Eßerif [ "$bc" -eq 0 ]; then
148550696a6eSStefan Eßer	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
148610328f8bSStefan Eßerelse
148710328f8bSStefan Eßer	headers="$headers \$(BC_HEADERS)"
148850696a6eSStefan Eßerfi
148950696a6eSStefan Eßer
149050696a6eSStefan Eßerif [ "$dc" -eq 0 ]; then
149150696a6eSStefan Eßer	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
149210328f8bSStefan Eßerelse
149310328f8bSStefan Eßer	headers="$headers \$(DC_HEADERS)"
149450696a6eSStefan Eßerfi
149550696a6eSStefan Eßer
1496fdc4a7c8SStefan Eßerversion=$(cat "$scriptdir/VERSION.txt" | head -n1)
149710041e99SStefan Eßer
149850696a6eSStefan Eßerif [ "$library" -ne 0 ]; then
149910041e99SStefan Eßer
150050696a6eSStefan Eßer	unneeded="$unneeded args.c opt.c read.c file.c main.c"
150150696a6eSStefan Eßer	unneeded="$unneeded lang.c lex.c parse.c program.c"
150250696a6eSStefan Eßer	unneeded="$unneeded bc.c bc_lex.c bc_parse.c"
150350696a6eSStefan Eßer	unneeded="$unneeded dc.c dc_lex.c dc_parse.c"
150410328f8bSStefan Eßer	headers="$headers \$(LIBRARY_HEADERS)"
150510041e99SStefan Eßer
150610041e99SStefan Eßer	if [ "$PC_PATH" != "" ]; then
150710041e99SStefan Eßer
150810041e99SStefan Eßer		contents=$(cat "$scriptdir/bcl.pc.in")
150910041e99SStefan Eßer
151010041e99SStefan Eßer		contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
151110041e99SStefan Eßer		contents=$(replace "$contents" "LIBDIR" "$LIBDIR")
151210041e99SStefan Eßer		contents=$(replace "$contents" "VERSION" "$version")
151310041e99SStefan Eßer
1514175a4d10SStefan Eßer		printf '%s\n' "$contents" > "$scriptdir/bcl.pc"
151510041e99SStefan Eßer
151610041e99SStefan Eßer		pkg_config_install="\$(SAFE_INSTALL) \$(PC_INSTALL_ARGS) \"\$(BCL_PC)\" \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
151710041e99SStefan Eßer		pkg_config_uninstall="\$(RM) -f \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\""
151810041e99SStefan Eßer
151950696a6eSStefan Eßer	else
152010041e99SStefan Eßer
152110041e99SStefan Eßer		pkg_config_install=""
152210041e99SStefan Eßer		pkg_config_uninstall=""
152310041e99SStefan Eßer
152410041e99SStefan Eßer	fi
152510041e99SStefan Eßer
152610041e99SStefan Eßerelse
152710041e99SStefan Eßer
152850696a6eSStefan Eßer	unneeded="$unneeded library.c"
152910041e99SStefan Eßer
153010041e99SStefan Eßer	PC_PATH=""
153110041e99SStefan Eßer	pkg_config_install=""
153210041e99SStefan Eßer	pkg_config_uninstall=""
153310041e99SStefan Eßer
153450696a6eSStefan Eßerfi
153550696a6eSStefan Eßer
153612e0d316SStefan Eßer# library.c, bc_fuzzer.c, and dc_fuzzer.c are not needed under normal
153712e0d316SStefan Eßer# circumstances.
153844d4804dSStefan Eßerif [ "$unneeded" = "" ]; then
153912e0d316SStefan Eßer	unneeded="library.c bc_fuzzer.c dc_fuzzer.c"
154044d4804dSStefan Eßerfi
154144d4804dSStefan Eßer
154244d4804dSStefan Eßer# This sets the appropriate manpage for a full build.
154310328f8bSStefan Eßerif [ "$manpage_args" = "" ]; then
154410328f8bSStefan Eßer	manpage_args="A"
154510328f8bSStefan Eßerfi
154610328f8bSStefan Eßer
154744d4804dSStefan Eßerif [ "$bc_default_prompt" = "" ]; then
154844d4804dSStefan Eßer	bc_default_prompt="$bc_default_tty_mode"
154944d4804dSStefan Eßerfi
155044d4804dSStefan Eßer
155144d4804dSStefan Eßerif [ "$dc_default_prompt" = "" ]; then
155244d4804dSStefan Eßer	dc_default_prompt="$dc_default_tty_mode"
155344d4804dSStefan Eßerfi
155444d4804dSStefan Eßer
1555e6857bd4SStefan Eßerprintf 'unneeded: %s\n' "$unneeded"
1556e6857bd4SStefan Eßer
15573aa99676SStefan Eßer# Print out the values; this is for debugging.
155810041e99SStefan Eßerprintf 'Version: %s\n' "$version"
155910041e99SStefan Eßer
15603aa99676SStefan Eßerif [ "$bc" -ne 0 ]; then
15613aa99676SStefan Eßer	printf 'Building bc\n'
15623aa99676SStefan Eßerelse
15633aa99676SStefan Eßer	printf 'Not building bc\n'
15643aa99676SStefan Eßerfi
15653aa99676SStefan Eßerif [ "$dc" -ne 0 ]; then
15663aa99676SStefan Eßer	printf 'Building dc\n'
15673aa99676SStefan Eßerelse
15683aa99676SStefan Eßer	printf 'Not building dc\n'
15693aa99676SStefan Eßerfi
15703aa99676SStefan Eßerprintf '\n'
157150696a6eSStefan Eßerprintf 'BC_ENABLE_LIBRARY=%s\n\n' "$library"
15723aa99676SStefan Eßerprintf 'BC_ENABLE_HISTORY=%s\n' "$hist"
15733aa99676SStefan Eßerprintf 'BC_ENABLE_EXTRA_MATH=%s\n' "$extra_math"
1574d101cdd6SStefan Eßerprintf 'BC_ENABLE_NLS=%s\n\n' "$nls"
15753aa99676SStefan Eßerprintf '\n'
15763aa99676SStefan Eßerprintf 'BC_NUM_KARATSUBA_LEN=%s\n' "$karatsuba_len"
15773aa99676SStefan Eßerprintf '\n'
15783aa99676SStefan Eßerprintf 'CC=%s\n' "$CC"
15793aa99676SStefan Eßerprintf 'CFLAGS=%s\n' "$CFLAGS"
15803aa99676SStefan Eßerprintf 'HOSTCC=%s\n' "$HOSTCC"
15813aa99676SStefan Eßerprintf 'HOSTCFLAGS=%s\n' "$HOSTCFLAGS"
15823aa99676SStefan Eßerprintf 'CPPFLAGS=%s\n' "$CPPFLAGS"
15833aa99676SStefan Eßerprintf 'LDFLAGS=%s\n' "$LDFLAGS"
15843aa99676SStefan Eßerprintf 'PREFIX=%s\n' "$PREFIX"
15853aa99676SStefan Eßerprintf 'BINDIR=%s\n' "$BINDIR"
158650696a6eSStefan Eßerprintf 'INCLUDEDIR=%s\n' "$INCLUDEDIR"
158750696a6eSStefan Eßerprintf 'LIBDIR=%s\n' "$LIBDIR"
15883aa99676SStefan Eßerprintf 'DATAROOTDIR=%s\n' "$DATAROOTDIR"
15893aa99676SStefan Eßerprintf 'DATADIR=%s\n' "$DATADIR"
15903aa99676SStefan Eßerprintf 'MANDIR=%s\n' "$MANDIR"
15913aa99676SStefan Eßerprintf 'MAN1DIR=%s\n' "$MAN1DIR"
159250696a6eSStefan Eßerprintf 'MAN3DIR=%s\n' "$MAN3DIR"
15933aa99676SStefan Eßerprintf 'NLSPATH=%s\n' "$NLSPATH"
159410041e99SStefan Eßerprintf 'PC_PATH=%s\n' "$PC_PATH"
15953aa99676SStefan Eßerprintf 'EXECSUFFIX=%s\n' "$EXECSUFFIX"
15963aa99676SStefan Eßerprintf 'EXECPREFIX=%s\n' "$EXECPREFIX"
15973aa99676SStefan Eßerprintf 'DESTDIR=%s\n' "$DESTDIR"
15983aa99676SStefan Eßerprintf 'LONG_BIT=%s\n' "$LONG_BIT"
15993aa99676SStefan Eßerprintf 'GEN_HOST=%s\n' "$GEN_HOST"
16003aa99676SStefan Eßerprintf 'GEN_EMU=%s\n' "$GEN_EMU"
160144d4804dSStefan Eßerprintf '\n'
160244d4804dSStefan Eßerprintf 'Setting Defaults\n'
160344d4804dSStefan Eßerprintf '================\n'
160444d4804dSStefan Eßerprintf 'bc.banner=%s\n' "$bc_default_banner"
160544d4804dSStefan Eßerprintf 'bc.sigint_reset=%s\n' "$bc_default_sigint_reset"
160644d4804dSStefan Eßerprintf 'dc.sigint_reset=%s\n' "$dc_default_sigint_reset"
160744d4804dSStefan Eßerprintf 'bc.tty_mode=%s\n' "$bc_default_tty_mode"
160844d4804dSStefan Eßerprintf 'dc.tty_mode=%s\n' "$dc_default_tty_mode"
160944d4804dSStefan Eßerprintf 'bc.prompt=%s\n' "$bc_default_prompt"
161044d4804dSStefan Eßerprintf 'dc.prompt=%s\n' "$dc_default_prompt"
161110041e99SStefan Eßerprintf 'bc.expr_exit=%s\n' "$bc_default_expr_exit"
161210041e99SStefan Eßerprintf 'dc.expr_exit=%s\n' "$dc_default_expr_exit"
1613d101cdd6SStefan Eßerprintf 'bc.digit_clamp=%s\n' "$bc_default_digit_clamp"
1614d101cdd6SStefan Eßerprintf 'dc.digit_clamp=%s\n' "$dc_default_digit_clamp"
1615d101cdd6SStefan Eßer
1616d101cdd6SStefan Eßer# This code outputs a warning. The warning is to not surprise users when locales
1617d101cdd6SStefan Eßer# are installed outside of the prefix. This warning is suppressed when the
1618d101cdd6SStefan Eßer# default prefix is used, as well, so as not to panic users just installing by
1619d101cdd6SStefan Eßer# hand. I believe this will be okay because NLSPATH is usually in /usr and the
1620d101cdd6SStefan Eßer# default prefix is /usr/local, so they'll be close that way.
1621d101cdd6SStefan Eßerif [ "$nls" -ne 0 ] && [ "${NLSPATH#$PREFIX}" = "${NLSPATH}" ] && [ "$defprefix" -eq 0 ]; then
1622d101cdd6SStefan Eßer	printf '\n********************************************************************************\n\n'
1623d101cdd6SStefan Eßer	printf 'WARNING: Locales will *NOT* be installed in $PREFIX (%s).\n' "$PREFIX"
1624d101cdd6SStefan Eßer	printf '\n'
1625d101cdd6SStefan Eßer	printf '         This is because they *MUST* be installed at a fixed location to even\n'
1626d101cdd6SStefan Eßer	printf '         work, and that fixed location is $NLSPATH (%s).\n' "$NLSPATH"
1627d101cdd6SStefan Eßer	printf '\n'
1628d101cdd6SStefan Eßer	printf '         This location is *outside* of $PREFIX. If you do not wish to install\n'
1629d101cdd6SStefan Eßer	printf '         locales outside of $PREFIX, you must disable NLS with the -N or the\n'
1630d101cdd6SStefan Eßer	printf '         --disable-nls options.\n'
1631d101cdd6SStefan Eßer	printf '\n'
1632d101cdd6SStefan Eßer	printf '         The author apologizes for the inconvenience, but the need to install\n'
1633d101cdd6SStefan Eßer	printf '         the locales at a fixed location is mandated by POSIX, and it is not\n'
1634d101cdd6SStefan Eßer	printf '         possible for the author to change that requirement.\n'
1635d101cdd6SStefan Eßer	printf '\n********************************************************************************\n'
1636d101cdd6SStefan Eßerfi
163744d4804dSStefan Eßer
163844d4804dSStefan Eßer# This is where the real work begins. This is the point at which the Makefile.in
163944d4804dSStefan Eßer# template is edited and output to the Makefile.
16403aa99676SStefan Eßer
16413aa99676SStefan Eßercontents=$(cat "$scriptdir/Makefile.in")
16423aa99676SStefan Eßer
16433aa99676SStefan Eßerneedle="WARNING"
16443aa99676SStefan Eßerreplacement='*** WARNING: Autogenerated from Makefile.in. DO NOT MODIFY ***'
16453aa99676SStefan Eßer
16463aa99676SStefan Eßercontents=$(replace "$contents" "$needle" "$replacement")
16473aa99676SStefan Eßer
164844d4804dSStefan Eßer# The contents are edited to have the list of files to build.
164910328f8bSStefan Eßercontents=$(gen_file_list "$contents" $unneeded)
165010328f8bSStefan Eßer
165110328f8bSStefan EßerSRC_TARGETS=""
165210328f8bSStefan Eßer
165344d4804dSStefan Eßer# This line and loop generates the individual targets for source files. I used
165444d4804dSStefan Eßer# to just use an implicit target, but that was found to be inadequate when I
165544d4804dSStefan Eßer# added the library.
165610328f8bSStefan Eßersrc_files=$(find_src_files $unneeded)
165710328f8bSStefan Eßer
165810328f8bSStefan Eßerfor f in $src_files; do
165910328f8bSStefan Eßer	o=$(replace_ext "$f" "c" "o")
166010041e99SStefan Eßer	o=$(basename "$o")
166110041e99SStefan Eßer	SRC_TARGETS=$(printf '%s\n\nsrc/%s: src %s %s\n\t$(CC) $(CFLAGS) -o src/%s -c %s\n' \
166210328f8bSStefan Eßer		"$SRC_TARGETS" "$o" "$headers" "$f" "$o" "$f")
166310328f8bSStefan Eßerdone
166410328f8bSStefan Eßer
166544d4804dSStefan Eßer# Replace all the placeholders.
166610041e99SStefan Eßercontents=$(replace "$contents" "ROOTDIR" "$scriptdir")
166710041e99SStefan Eßercontents=$(replace "$contents" "BUILDDIR" "$builddir")
166810041e99SStefan Eßer
166910328f8bSStefan Eßercontents=$(replace "$contents" "HEADERS" "$headers")
167010328f8bSStefan Eßer
1671fdc4a7c8SStefan Eßercontents=$(replace "$contents" "VERSION" "$version")
1672fdc4a7c8SStefan Eßer
16733aa99676SStefan Eßercontents=$(replace "$contents" "BC_ENABLED" "$bc")
16743aa99676SStefan Eßercontents=$(replace "$contents" "DC_ENABLED" "$dc")
167510328f8bSStefan Eßer
16767e5c51e5SStefan Eßercontents=$(replace "$contents" "BUILD_TYPE" "$manpage_args")
167778bc019dSStefan Eßercontents=$(replace "$contents" "EXCLUDE_EXTRA_MATH" "$exclude_extra_math")
16787e5c51e5SStefan Eßer
167950696a6eSStefan Eßercontents=$(replace "$contents" "LIBRARY" "$library")
16803aa99676SStefan Eßercontents=$(replace "$contents" "HISTORY" "$hist")
16813aa99676SStefan Eßercontents=$(replace "$contents" "EXTRA_MATH" "$extra_math")
16823aa99676SStefan Eßercontents=$(replace "$contents" "NLS" "$nls")
168310328f8bSStefan Eßer
16843aa99676SStefan Eßercontents=$(replace "$contents" "BC_LIB_O" "$bc_lib")
16853aa99676SStefan Eßercontents=$(replace "$contents" "BC_HELP_O" "$bc_help")
16863aa99676SStefan Eßercontents=$(replace "$contents" "DC_HELP_O" "$dc_help")
16873aa99676SStefan Eßercontents=$(replace "$contents" "BC_LIB2_O" "$BC_LIB2_O")
16883aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA_LEN" "$karatsuba_len")
16893aa99676SStefan Eßer
16903aa99676SStefan Eßercontents=$(replace "$contents" "NLSPATH" "$NLSPATH")
16913aa99676SStefan Eßercontents=$(replace "$contents" "DESTDIR" "$destdir")
16923aa99676SStefan Eßercontents=$(replace "$contents" "EXECSUFFIX" "$EXECSUFFIX")
16933aa99676SStefan Eßercontents=$(replace "$contents" "EXECPREFIX" "$EXECPREFIX")
16943aa99676SStefan Eßercontents=$(replace "$contents" "BINDIR" "$BINDIR")
169550696a6eSStefan Eßercontents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR")
169650696a6eSStefan Eßercontents=$(replace "$contents" "LIBDIR" "$LIBDIR")
16973aa99676SStefan Eßercontents=$(replace "$contents" "MAN1DIR" "$MAN1DIR")
169850696a6eSStefan Eßercontents=$(replace "$contents" "MAN3DIR" "$MAN3DIR")
16993aa99676SStefan Eßercontents=$(replace "$contents" "CFLAGS" "$CFLAGS")
17003aa99676SStefan Eßercontents=$(replace "$contents" "HOSTCFLAGS" "$HOSTCFLAGS")
17013aa99676SStefan Eßercontents=$(replace "$contents" "CPPFLAGS" "$CPPFLAGS")
17023aa99676SStefan Eßercontents=$(replace "$contents" "LDFLAGS" "$LDFLAGS")
17033aa99676SStefan Eßercontents=$(replace "$contents" "CC" "$CC")
17043aa99676SStefan Eßercontents=$(replace "$contents" "HOSTCC" "$HOSTCC")
17053aa99676SStefan Eßercontents=$(replace "$contents" "INSTALL_PREREQS" "$install_prereqs")
170650696a6eSStefan Eßercontents=$(replace "$contents" "INSTALL_MAN_PREREQS" "$install_man_prereqs")
1707cf7becd2SStefan Eßercontents=$(replace "$contents" "INSTALL_LOCALES" "$install_locales")
17083aa99676SStefan Eßercontents=$(replace "$contents" "INSTALL_LOCALES_PREREQS" "$install_locales_prereqs")
17093aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_MAN_PREREQS" "$uninstall_man_prereqs")
17103aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_PREREQS" "$uninstall_prereqs")
17113aa99676SStefan Eßercontents=$(replace "$contents" "UNINSTALL_LOCALES_PREREQS" "$uninstall_locales_prereqs")
17123aa99676SStefan Eßer
171310041e99SStefan Eßercontents=$(replace "$contents" "PC_PATH" "$PC_PATH")
171410041e99SStefan Eßercontents=$(replace "$contents" "PKG_CONFIG_INSTALL" "$pkg_config_install")
171510041e99SStefan Eßercontents=$(replace "$contents" "PKG_CONFIG_UNINSTALL" "$pkg_config_uninstall")
171610041e99SStefan Eßer
171710328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET" "$default_target")
171810328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET_PREREQS" "$default_target_prereqs")
171910328f8bSStefan Eßercontents=$(replace "$contents" "DEFAULT_TARGET_CMD" "$default_target_cmd")
172010328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET" "$second_target")
172110328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET_PREREQS" "$second_target_prereqs")
172210328f8bSStefan Eßercontents=$(replace "$contents" "SECOND_TARGET_CMD" "$second_target_cmd")
172310328f8bSStefan Eßer
172450696a6eSStefan Eßercontents=$(replace "$contents" "ALL_PREREQ" "$ALL_PREREQ")
172510328f8bSStefan Eßercontents=$(replace "$contents" "BC_EXEC_PREREQ" "$bc_exec_prereq")
172610328f8bSStefan Eßercontents=$(replace "$contents" "BC_EXEC_CMD" "$bc_exec_cmd")
172710328f8bSStefan Eßercontents=$(replace "$contents" "DC_EXEC_PREREQ" "$dc_exec_prereq")
172810328f8bSStefan Eßercontents=$(replace "$contents" "DC_EXEC_CMD" "$dc_exec_cmd")
172950696a6eSStefan Eßer
1730fdc4a7c8SStefan Eßercontents=$(replace "$contents" "GENERATE_TESTS" "$generate_tests")
1731fdc4a7c8SStefan Eßercontents=$(replace "$contents" "PROBLEMATIC_TESTS" "$problematic_tests")
1732fdc4a7c8SStefan Eßer
17333aa99676SStefan Eßercontents=$(replace "$contents" "EXECUTABLES" "$executables")
17343aa99676SStefan Eßercontents=$(replace "$contents" "MAIN_EXEC" "$main_exec")
17353aa99676SStefan Eßercontents=$(replace "$contents" "EXEC" "$executable")
17363aa99676SStefan Eßer
17373aa99676SStefan Eßercontents=$(replace "$contents" "KARATSUBA" "$karatsuba")
17383aa99676SStefan Eßer
17393aa99676SStefan Eßercontents=$(replace "$contents" "LONG_BIT_DEFINE" "$LONG_BIT_DEFINE")
17403aa99676SStefan Eßer
1741d101cdd6SStefan Eßercontents=$(replace "$contents" "GEN_DIR" "$GEN_DIR")
17423aa99676SStefan Eßercontents=$(replace "$contents" "GEN" "$GEN")
17433aa99676SStefan Eßercontents=$(replace "$contents" "GEN_EXEC_TARGET" "$GEN_EXEC_TARGET")
17443aa99676SStefan Eßercontents=$(replace "$contents" "CLEAN_PREREQS" "$CLEAN_PREREQS")
17453aa99676SStefan Eßercontents=$(replace "$contents" "GEN_EMU" "$GEN_EMU")
17463aa99676SStefan Eßer
174744d4804dSStefan Eßercontents=$(replace "$contents" "BSD" "$bsd")
174876238846SStefan Eßercontents=$(replace "$contents" "APPLE" "$apple")
174944d4804dSStefan Eßer
175044d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_BANNER" "$bc_default_banner")
175144d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_SIGINT_RESET" "$bc_default_sigint_reset")
175244d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_SIGINT_RESET" "$dc_default_sigint_reset")
175344d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_TTY_MODE" "$bc_default_tty_mode")
175444d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_TTY_MODE" "$dc_default_tty_mode")
175544d4804dSStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_PROMPT" "$bc_default_prompt")
175644d4804dSStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_PROMPT" "$dc_default_prompt")
175710041e99SStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_EXPR_EXIT" "$bc_default_expr_exit")
175810041e99SStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_EXPR_EXIT" "$dc_default_expr_exit")
1759d101cdd6SStefan Eßercontents=$(replace "$contents" "BC_DEFAULT_DIGIT_CLAMP" "$bc_default_digit_clamp")
1760d101cdd6SStefan Eßercontents=$(replace "$contents" "DC_DEFAULT_DIGIT_CLAMP" "$dc_default_digit_clamp")
176144d4804dSStefan Eßer
176244d4804dSStefan Eßer# Do the first print to the Makefile.
176310041e99SStefan Eßerprintf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "Makefile"
176410328f8bSStefan Eßer
176544d4804dSStefan Eßer# Copy the correct manuals to the expected places.
176610041e99SStefan Eßermkdir -p manuals
176710041e99SStefan Eßercp -f "$scriptdir/manuals/bc/$manpage_args.1.md" manuals/bc.1.md
176810041e99SStefan Eßercp -f "$scriptdir/manuals/bc/$manpage_args.1" manuals/bc.1
176910041e99SStefan Eßercp -f "$scriptdir/manuals/dc/$manpage_args.1.md" manuals/dc.1.md
177010041e99SStefan Eßercp -f "$scriptdir/manuals/dc/$manpage_args.1" manuals/dc.1
17713aa99676SStefan Eßer
17723aa99676SStefan Eßermake clean > /dev/null
1773