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