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