1#! /bin/sh 2# 3# SPDX-License-Identifier: BSD-2-Clause 4# 5# Copyright (c) 2018-2021 Gavin D. Howard and contributors. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions are met: 9# 10# * Redistributions of source code must retain the above copyright notice, this 11# list of conditions and the following disclaimer. 12# 13# * Redistributions in binary form must reproduce the above copyright notice, 14# this list of conditions and the following disclaimer in the documentation 15# and/or other materials provided with the distribution. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27# POSSIBILITY OF SUCH DAMAGE. 28# 29 30script="$0" 31scriptdir=$(dirname "$script") 32script=$(basename "$script") 33 34builddir=$(pwd) 35 36. "$scriptdir/scripts/functions.sh" 37 38# Simply prints the help message and quits based on the argument. 39# @param msg The help message to print. 40usage() { 41 42 if [ $# -gt 0 ]; then 43 44 _usage_val=1 45 46 printf "%s\n\n" "$1" 47 48 else 49 _usage_val=0 50 fi 51 52 printf 'usage:\n' 53 printf ' %s -h\n' "$script" 54 printf ' %s --help\n' "$script" 55 printf ' %s [-a|-bD|-dB|-c] [-CeEfgGHlmMNrtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script" 56 printf ' [-s SETTING] [-S SETTING]\n' 57 printf ' %s \\\n' "$script" 58 printf ' [--library|--bc-only --disable-dc|--dc-only --disable-bc|--coverage] \\\n' 59 printf ' [--force --debug --disable-extra-math --disable-generated-tests] \\\n' 60 printf ' [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n' 61 printf ' [--enable-editline] [--enable-readline] \\\n' 62 printf ' [--install-all-locales] [--opt=OPT_LEVEL] \\\n' 63 printf ' [--karatsuba-len=KARATSUBA_LEN] \\\n' 64 printf ' [--set-default-on=SETTING] [--set-default-off=SETTING] \\\n' 65 printf ' [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR] \\\n' 66 printf ' [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR] \\\n' 67 printf '\n' 68 printf ' -a, --library\n' 69 printf ' Build the libbcl instead of the programs. This is meant to be used with\n' 70 printf ' Other software like programming languages that want to make use of the\n' 71 printf ' parsing and math capabilities. This option will install headers using\n' 72 printf ' `make install`.\n' 73 printf ' -b, --bc-only\n' 74 printf ' Build bc only. It is an error if "-d", "--dc-only", "-B", or\n' 75 printf ' "--disable-bc" are specified too.\n' 76 printf ' -B, --disable-bc\n' 77 printf ' Disable bc. It is an error if "-b", "--bc-only", "-D", or "--disable-dc"\n' 78 printf ' are specified too.\n' 79 printf ' -c, --coverage\n' 80 printf ' Generate test coverage code. Requires gcov and gcovr.\n' 81 printf ' It is an error if either "-b" ("-D") or "-d" ("-B") is specified.\n' 82 printf ' Requires a compiler that use gcc-compatible coverage options\n' 83 printf ' -C, --disable-clean\n' 84 printf ' Disable the clean that configure.sh does before configure.\n' 85 printf ' -d, --dc-only\n' 86 printf ' Build dc only. It is an error if "-b", "--bc-only", "-D", or\n' 87 printf ' "--disable-dc" are specified too.\n' 88 printf ' -D, --disable-dc\n' 89 printf ' Disable dc. It is an error if "-d", "--dc-only", "-B", or "--disable-bc"\n' 90 printf ' are specified too.\n' 91 printf ' -e, --enable-editline\n' 92 printf ' Enable the use of libedit/editline. This is meant for those users that\n' 93 printf ' want vi-like or Emacs-like behavior in history.This option is ignored if\n' 94 printf ' history is disabled. It is an error if this option is enabled when the\n' 95 printf ' -r/--enable-readline option is enabled.\n' 96 printf ' -E, --disable-extra-math\n' 97 printf ' Disable extra math. This includes: "$" operator (truncate to integer),\n' 98 printf ' "@" operator (set number of decimal places), and r(x, p) (rounding\n' 99 printf ' function). Additionally, this option disables the extra printing\n' 100 printf ' functions in the math library.\n' 101 printf ' -f, --force\n' 102 printf ' Force use of all enabled options, even if they do not work. This\n' 103 printf ' option is to allow the maintainer a way to test that certain options\n' 104 printf ' are not failing invisibly. (Development only.)\n' 105 printf ' -g, --debug\n' 106 printf ' Build in debug mode. Adds the "-g" flag, and if there are no\n' 107 printf ' other CFLAGS, and "-O" was not given, this also adds the "-O0"\n' 108 printf ' flag. If this flag is *not* given, "-DNDEBUG" is added to CPPFLAGS\n' 109 printf ' and a strip flag is added to the link stage.\n' 110 printf ' -G, --disable-generated-tests\n' 111 printf ' Disable generating tests. This is for platforms that do not have a\n' 112 printf ' GNU bc-compatible bc to generate tests.\n' 113 printf ' -h, --help\n' 114 printf ' Print this help message and exit.\n' 115 printf ' -H, --disable-history\n' 116 printf ' Disable history.\n' 117 printf ' -k KARATSUBA_LEN, --karatsuba-len KARATSUBA_LEN\n' 118 printf ' Set the karatsuba length to KARATSUBA_LEN (default is 64).\n' 119 printf ' It is an error if KARATSUBA_LEN is not a number or is less than 16.\n' 120 printf ' -l, --install-all-locales\n' 121 printf ' Installs all locales, regardless of how many are on the system. This\n' 122 printf ' option is useful for package maintainers who want to make sure that\n' 123 printf ' a package contains all of the locales that end users might need.\n' 124 printf ' -m, --enable-memcheck\n' 125 printf ' Enable memcheck mode, to ensure no memory leaks. For development only.\n' 126 printf ' -M, --disable-man-pages\n' 127 printf ' Disable installing manpages.\n' 128 printf ' -N, --disable-nls\n' 129 printf ' Disable POSIX locale (NLS) support.\n' 130 printf ' -O OPT_LEVEL, --opt OPT_LEVEL\n' 131 printf ' Set the optimization level. This can also be included in the CFLAGS,\n' 132 printf ' but it is provided, so maintainers can build optimized debug builds.\n' 133 printf ' This is passed through to the compiler, so it must be supported.\n' 134 printf ' -r, --enable-readline\n' 135 printf ' Enable the use of libreadline/readline. This is meant for those users\n' 136 printf ' that want vi-like or Emacs-like behavior in history.This option is\n' 137 printf ' ignored if history is disabled. It is an error if this option is\n' 138 printf ' enabled when the -e/--enable-editline option is enabled.\n' 139 printf ' -s SETTING, --set-default-on SETTING\n' 140 printf ' Set the default named by SETTING to on. See below for possible values\n' 141 printf ' for SETTING. For multiple instances of the -s or -S for the the same\n' 142 printf ' setting, the last one is used.\n' 143 printf ' -S SETTING, --set-default-off SETTING\n' 144 printf ' Set the default named by SETTING to off. See below for possible values\n' 145 printf ' for SETTING. For multiple instances of the -s or -S for the the same\n' 146 printf ' setting, the last one is used.\n' 147 printf ' -t, --enable-test-timing\n' 148 printf ' Enable the timing of tests. This is for development only.\n' 149 printf ' -T, --disable-strip\n' 150 printf ' Disable stripping symbols from the compiled binary or binaries.\n' 151 printf ' Stripping symbols only happens when debug mode is off.\n' 152 printf ' -v, --enable-valgrind\n' 153 printf ' Enable a build appropriate for valgrind. For development only.\n' 154 printf ' -z, --enable-fuzz-mode\n' 155 printf ' Enable fuzzing mode. THIS IS FOR DEVELOPMENT ONLY.\n' 156 printf ' --prefix PREFIX\n' 157 printf ' The prefix to install to. Overrides "$PREFIX" if it exists.\n' 158 printf ' If PREFIX is "/usr", install path will be "/usr/bin".\n' 159 printf ' Default is "/usr/local".\n' 160 printf ' --bindir BINDIR\n' 161 printf ' The directory to install binaries in. Overrides "$BINDIR" if it exists.\n' 162 printf ' Default is "$PREFIX/bin".\n' 163 printf ' --includedir INCLUDEDIR\n' 164 printf ' The directory to install headers in. Overrides "$INCLUDEDIR" if it\n' 165 printf ' exists. Default is "$PREFIX/include".\n' 166 printf ' --libdir LIBDIR\n' 167 printf ' The directory to install libraries in. Overrides "$LIBDIR" if it exists.\n' 168 printf ' Default is "$PREFIX/lib".\n' 169 printf ' --datarootdir DATAROOTDIR\n' 170 printf ' The root location for data files. Overrides "$DATAROOTDIR" if it exists.\n' 171 printf ' Default is "$PREFIX/share".\n' 172 printf ' --datadir DATADIR\n' 173 printf ' The location for data files. Overrides "$DATADIR" if it exists.\n' 174 printf ' Default is "$DATAROOTDIR".\n' 175 printf ' --mandir MANDIR\n' 176 printf ' The location to install manpages to. Overrides "$MANDIR" if it exists.\n' 177 printf ' Default is "$DATADIR/man".\n' 178 printf ' --man1dir MAN1DIR\n' 179 printf ' The location to install Section 1 manpages to. Overrides "$MAN1DIR" if\n' 180 printf ' it exists. Default is "$MANDIR/man1".\n' 181 printf ' --man3dir MAN3DIR\n' 182 printf ' The location to install Section 3 manpages to. Overrides "$MAN3DIR" if\n' 183 printf ' it exists. Default is "$MANDIR/man3".\n' 184 printf '\n' 185 printf 'In addition, the following environment variables are used:\n' 186 printf '\n' 187 printf ' CC C compiler. Must be compatible with POSIX c99. If there is a\n' 188 printf ' space in the basename of the compiler, the items after the\n' 189 printf ' first space are assumed to be compiler flags, and in that case,\n' 190 printf ' the flags are automatically moved into CFLAGS. Default is\n' 191 printf ' "c99".\n' 192 printf ' HOSTCC Host C compiler. Must be compatible with POSIX c99. If there is\n' 193 printf ' a space in the basename of the compiler, the items after the\n' 194 printf ' first space are assumed to be compiler flags, and in the case,\n' 195 printf ' the flags are automatically moved into HOSTCFLAGS. Default is\n' 196 printf ' "$CC".\n' 197 printf ' HOST_CC Same as HOSTCC. If HOSTCC also exists, it is used.\n' 198 printf ' CFLAGS C compiler flags.\n' 199 printf ' HOSTCFLAGS CFLAGS for HOSTCC. Default is "$CFLAGS".\n' 200 printf ' HOST_CFLAGS Same as HOST_CFLAGS. If HOST_CFLAGS also exists, it is used.\n' 201 printf ' CPPFLAGS C preprocessor flags. Default is "".\n' 202 printf ' LDFLAGS Linker flags. Default is "".\n' 203 printf ' PREFIX The prefix to install to. Default is "/usr/local".\n' 204 printf ' If PREFIX is "/usr", install path will be "/usr/bin".\n' 205 printf ' BINDIR The directory to install binaries in. Default is "$PREFIX/bin".\n' 206 printf ' INCLUDEDIR The directory to install header files in. Default is\n' 207 printf ' "$PREFIX/include".\n' 208 printf ' LIBDIR The directory to install libraries in. Default is\n' 209 printf ' "$PREFIX/lib".\n' 210 printf ' DATAROOTDIR The root location for data files. Default is "$PREFIX/share".\n' 211 printf ' DATADIR The location for data files. Default is "$DATAROOTDIR".\n' 212 printf ' MANDIR The location to install manpages to. Default is "$DATADIR/man".\n' 213 printf ' MAN1DIR The location to install Section 1 manpages to. Default is\n' 214 printf ' "$MANDIR/man1".\n' 215 printf ' MAN3DIR The location to install Section 3 manpages to. Default is\n' 216 printf ' "$MANDIR/man3".\n' 217 printf ' NLSPATH The location to install locale catalogs to. Must be an absolute\n' 218 printf ' path (or contain one). This is treated the same as the POSIX\n' 219 printf ' definition of $NLSPATH (see POSIX environment variables for\n' 220 printf ' more information). Default is "/usr/share/locale/%%L/%%N".\n' 221 printf ' PC_PATH The location to install pkg-config files to. Must be an\n' 222 printf ' path or contain one. Default is the first path given by the\n' 223 printf ' output of `pkg-config --variable=pc_path pkg-config`.\n' 224 printf ' EXECSUFFIX The suffix to append to the executable names, used to not\n' 225 printf ' interfere with other installed bc executables. Default is "".\n' 226 printf ' EXECPREFIX The prefix to append to the executable names, used to not\n' 227 printf ' interfere with other installed bc executables. Default is "".\n' 228 printf ' DESTDIR For package creation. Default is "". If it is empty when\n' 229 printf ' `%s` is run, it can also be passed to `make install`\n' "$script" 230 printf ' later as an environment variable. If both are specified,\n' 231 printf ' the one given to `%s` takes precedence.\n' "$script" 232 printf ' LONG_BIT The number of bits in a C `long` type. This is mostly for the\n' 233 printf ' embedded space since this `bc` uses `long`s internally for\n' 234 printf ' overflow checking. In C99, a `long` is required to be 32 bits.\n' 235 printf ' For most normal desktop systems, setting this is unnecessary,\n' 236 printf ' except that 32-bit platforms with 64-bit longs may want to set\n' 237 printf ' it to `32`. Default is the default of `LONG_BIT` for the target\n' 238 printf ' platform. Minimum allowed is `32`. It is a build time error if\n' 239 printf ' the specified value of `LONG_BIT` is greater than the default\n' 240 printf ' value of `LONG_BIT` for the target platform.\n' 241 printf ' GEN_HOST Whether to use `gen/strgen.c`, instead of `gen/strgen.sh`, to\n' 242 printf ' produce the C files that contain the help texts as well as the\n' 243 printf ' math libraries. By default, `gen/strgen.c` is used, compiled by\n' 244 printf ' "$HOSTCC" and run on the host machine. Using `gen/strgen.sh`\n' 245 printf ' removes the need to compile and run an executable on the host\n' 246 printf ' machine since `gen/strgen.sh` is a POSIX shell script. However,\n' 247 printf ' `gen/lib2.bc` is over 4095 characters, the max supported length\n' 248 printf ' of a string literal in C99, and `gen/strgen.sh` generates a\n' 249 printf ' string literal instead of an array, as `gen/strgen.c` does. For\n' 250 printf ' most production-ready compilers, this limit probably is not\n' 251 printf ' enforced, but it could be. Both options are still available for\n' 252 printf ' this reason. If you are sure your compiler does not have the\n' 253 printf ' limit and do not want to compile and run a binary on the host\n' 254 printf ' machine, set this variable to "0". Any other value, or a\n' 255 printf ' non-existent value, will cause the build system to compile and\n' 256 printf ' run `gen/strgen.c`. Default is "".\n' 257 printf ' GEN_EMU Emulator to run string generator code under (leave empty if not\n' 258 printf ' necessary). This is not necessary when using `gen/strgen.sh`.\n' 259 printf ' Default is "".\n' 260 printf '\n' 261 printf 'WARNING: even though `configure.sh` supports both option types, short and\n' 262 printf 'long, it does not support handling both at the same time. Use only one type.\n' 263 printf '\n' 264 printf 'Settings\n' 265 printf '========\n' 266 printf '\n' 267 printf 'bc and dc have some settings that, while they cannot be removed by build time\n' 268 printf 'options, can have their defaults changed at build time by packagers. Users are\n' 269 printf 'also able to change each setting with environment variables.\n' 270 printf '\n' 271 printf 'The following is a table of settings, along with their default values and the\n' 272 printf 'environment variables users can use to change them. (For the defaults, non-zero\n' 273 printf 'means on, and zero means off.)\n' 274 printf '\n' 275 printf '| Setting | Description | Default | Env Variable |\n' 276 printf '| =============== | ==================== | ============ | ==================== |\n' 277 printf '| bc.banner | Whether to display | 0 | BC_BANNER |\n' 278 printf '| | the bc version | | |\n' 279 printf '| | banner when in | | |\n' 280 printf '| | interactive mode. | | |\n' 281 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 282 printf '| bc.sigint_reset | Whether SIGINT will | 1 | BC_SIGINT_RESET |\n' 283 printf '| | reset bc, instead of | | |\n' 284 printf '| | exiting, when in | | |\n' 285 printf '| | interactive mode. | | |\n' 286 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 287 printf '| dc.sigint_reset | Whether SIGINT will | 1 | DC_SIGINT_RESET |\n' 288 printf '| | reset dc, instead of | | |\n' 289 printf '| | exiting, when in | | |\n' 290 printf '| | interactive mode. | | |\n' 291 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 292 printf '| bc.tty_mode | Whether TTY mode for | 1 | BC_TTY_MODE |\n' 293 printf '| | bc should be on when | | |\n' 294 printf '| | available. | | |\n' 295 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 296 printf '| dc.tty_mode | Whether TTY mode for | 0 | BC_TTY_MODE |\n' 297 printf '| | dc should be on when | | |\n' 298 printf '| | available. | | |\n' 299 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 300 printf '| bc.prompt | Whether the prompt | $BC_TTY_MODE | BC_PROMPT |\n' 301 printf '| | for bc should be on | | |\n' 302 printf '| | in tty mode. | | |\n' 303 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 304 printf '| dc.prompt | Whether the prompt | $DC_TTY_MODE | DC_PROMPT |\n' 305 printf '| | for dc should be on | | |\n' 306 printf '| | in tty mode. | | |\n' 307 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 308 printf '| bc.expr_exit | Whether to exit bc | 1 | BC_EXPR_EXIT |\n' 309 printf '| | if an expression or | | |\n' 310 printf '| | expression file is | | |\n' 311 printf '| | given with the -e or | | |\n' 312 printf '| | -f options. | | |\n' 313 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 314 printf '| dc.expr_exit | Whether to exit dc | 1 | DC_EXPR_EXIT |\n' 315 printf '| | if an expression or | | |\n' 316 printf '| | expression file is | | |\n' 317 printf '| | given with the -e or | | |\n' 318 printf '| | -f options. | | |\n' 319 printf '| --------------- | -------------------- | ------------ | -------------------- |\n' 320 printf '\n' 321 printf 'These settings are not meant to be changed on a whim. They are meant to ensure\n' 322 printf 'that this bc and dc will conform to the expectations of the user on each\n' 323 printf 'platform.\n' 324 325 exit "$_usage_val" 326} 327 328# Replaces a file extension in a filename. This is used mostly to turn filenames 329# like `src/num.c` into `src/num.o`. In other words, it helps to link targets to 330# the files they depend on. 331# 332# @param file The filename. 333# @param ext1 The extension to replace. 334# @param ext2 The new extension. 335replace_ext() { 336 337 if [ "$#" -ne 3 ]; then 338 err_exit "Invalid number of args to $0" 339 fi 340 341 _replace_ext_file="$1" 342 _replace_ext_ext1="$2" 343 _replace_ext_ext2="$3" 344 345 _replace_ext_result="${_replace_ext_file%.$_replace_ext_ext1}.$_replace_ext_ext2" 346 347 printf '%s\n' "$_replace_ext_result" 348} 349 350# Replaces a file extension in every filename given in a list. The list is just 351# a space-separated list of words, so filenames are expected to *not* have 352# spaces in them. See the documentation for `replace_ext()`. 353# 354# @param files The list of space-separated filenames to replace extensions for. 355# @param ext1 The extension to replace. 356# @param ext2 The new extension. 357replace_exts() { 358 359 if [ "$#" -ne 3 ]; then 360 err_exit "Invalid number of args to $0" 361 fi 362 363 _replace_exts_files="$1" 364 _replace_exts_ext1="$2" 365 _replace_exts_ext2="$3" 366 367 for _replace_exts_file in $_replace_exts_files; do 368 _replace_exts_new_name=$(replace_ext "$_replace_exts_file" "$_replace_exts_ext1" "$_replace_exts_ext2") 369 _replace_exts_result="$_replace_exts_result $_replace_exts_new_name" 370 done 371 372 printf '%s\n' "$_replace_exts_result" 373} 374 375# Finds a placeholder in @a str and replaces it. This is the workhorse of 376# configure.sh. It's what replaces placeholders in Makefile.in with the data 377# needed for the chosen build. Below, you will see a lot of calls to this 378# function. 379# 380# Note that needle can never contain an exclamation point. For more information, 381# see substring_replace() in scripts/functions.sh. 382# 383# @param str The string to find and replace placeholders in. 384# @param needle The placeholder name. 385# @param replacement The string to use to replace the placeholder. 386replace() { 387 388 if [ "$#" -ne 3 ]; then 389 err_exit "Invalid number of args to $0" 390 fi 391 392 _replace_str="$1" 393 _replace_needle="$2" 394 _replace_replacement="$3" 395 396 substring_replace "$_replace_str" "%%$_replace_needle%%" "$_replace_replacement" 397} 398 399# This function finds all the source files that need to be built. If there is 400# only one argument and it is empty, then all source files are built. Otherwise, 401# the arguments are all assumed to be source files that should *not* be built. 402find_src_files() { 403 404 _find_src_files_args="" 405 406 if [ "$#" -ge 1 ] && [ "$1" != "" ]; then 407 408 while [ "$#" -ge 1 ]; do 409 _find_src_files_a="${1## }" 410 shift 411 _find_src_files_args=$(printf '%s\n%s/src/%s\n' "$_find_src_files_args" "$scriptdir" "${_find_src_files_a}") 412 done 413 414 fi 415 416 _find_src_files_files=$(find "$scriptdir/src/" -depth -name "*.c" -print) 417 418 _find_src_files_result="" 419 420 for _find_src_files_f in $_find_src_files_files; do 421 422 # If this is true, the file is part of args, and therefore, unneeded. 423 if [ "${_find_src_files_args##*$_find_src_files_f}" != "${_find_src_files_args}" ]; then 424 continue 425 fi 426 427 _find_src_files_result=$(printf '%s\n%s\n' "$_find_src_files_result" "$_find_src_files_f") 428 429 done 430 431 printf '%s\n' "$_find_src_files_result" 432} 433 434# This function generates a list of files to go into the Makefile. It generates 435# the list of object files, as well as the list of test coverage files. 436# 437# @param contents The contents of the Makefile template to put the list of 438# files into. 439gen_file_list() { 440 441 if [ "$#" -lt 1 ]; then 442 err_exit "Invalid number of args to $0" 443 fi 444 445 _gen_file_list_contents="$1" 446 shift 447 448 if [ "$#" -ge 1 ]; then 449 _gen_file_list_unneeded="$@" 450 else 451 _gen_file_list_unneeded="" 452 fi 453 454 _gen_file_list_needle_src="SRC" 455 _gen_file_list_needle_obj="OBJ" 456 _gen_file_list_needle_gcda="GCDA" 457 _gen_file_list_needle_gcno="GCNO" 458 459 _gen_file_list_replacement=$(find_src_files $_gen_file_list_unneeded | tr '\n' ' ') 460 _gen_file_list_contents=$(replace "$_gen_file_list_contents" \ 461 "$_gen_file_list_needle_src" "$_gen_file_list_replacement") 462 463 _gen_file_list_cbases="" 464 465 for _gen_file_list_f in $_gen_file_list_replacement; do 466 _gen_file_list_b=$(basename "$_gen_file_list_f") 467 _gen_file_list_cbases="$_gen_file_list_cbases src/$_gen_file_list_b" 468 done 469 470 _gen_file_list_replacement=$(replace_exts "$_gen_file_list_cbases" "c" "o") 471 _gen_file_list_contents=$(replace "$_gen_file_list_contents" \ 472 "$_gen_file_list_needle_obj" "$_gen_file_list_replacement") 473 474 _gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "o" "gcda") 475 _gen_file_list_contents=$(replace "$_gen_file_list_contents" \ 476 "$_gen_file_list_needle_gcda" "$_gen_file_list_replacement") 477 478 _gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "gcda" "gcno") 479 _gen_file_list_contents=$(replace "$_gen_file_list_contents" \ 480 "$_gen_file_list_needle_gcno" "$_gen_file_list_replacement") 481 482 printf '%s\n' "$_gen_file_list_contents" 483} 484 485# Generates the proper test targets for each test to have its own target. This 486# allows `make test` to run in parallel. 487# 488# @param name Which calculator to generate tests for. 489# @param extra_math An integer that, if non-zero, activates extra math tests. 490# @param time_tests An integer that, if non-zero, tells the test suite to time 491# the execution of each test. 492gen_std_tests() { 493 494 _gen_std_tests_name="$1" 495 shift 496 497 _gen_std_tests_extra_math="$1" 498 shift 499 500 _gen_std_tests_time_tests="$1" 501 shift 502 503 _gen_std_tests_extra_required=$(cat "$scriptdir/tests/extra_required.txt") 504 505 for _gen_std_tests_t in $(cat "$scriptdir/tests/$_gen_std_tests_name/all.txt"); do 506 507 if [ "$_gen_std_tests_extra_math" -eq 0 ]; then 508 509 if [ -z "${_gen_std_tests_extra_required##*$_gen_std_tests_t*}" ]; then 510 printf 'test_%s_%s:\n\t@printf "Skipping %s %s\\n"\n\n' \ 511 "$_gen_std_tests_name" "$_gen_std_tests_t" "$_gen_std_tests_name" \ 512 "$_gen_std_tests_t" >> "Makefile" 513 continue 514 fi 515 516 fi 517 518 printf 'test_%s_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/test.sh %s %s %s %s %s\n\n' \ 519 "$_gen_std_tests_name" "$_gen_std_tests_t" "$builddir" "$_gen_std_tests_name" \ 520 "$_gen_std_tests_t" "$generate_tests" "$time_tests" \ 521 "$*" >> "Makefile" 522 523 done 524} 525 526# Generates a list of test targets that will be used as prerequisites for other 527# targets. 528# 529# @param name The name of the calculator to generate test targets for. 530gen_std_test_targets() { 531 532 _gen_std_test_targets_name="$1" 533 shift 534 535 _gen_std_test_targets_tests=$(cat "$scriptdir/tests/${_gen_std_test_targets_name}/all.txt") 536 537 for _gen_std_test_targets_t in $_gen_std_test_targets_tests; do 538 printf ' test_%s_%s' "$_gen_std_test_targets_name" "$_gen_std_test_targets_t" 539 done 540 541 printf '\n' 542} 543 544# Generates the proper test targets for each error test to have its own target. 545# This allows `make test_bc_errors` and `make test_dc_errors` to run in 546# parallel. 547# 548# @param name Which calculator to generate tests for. 549gen_err_tests() { 550 551 _gen_err_tests_name="$1" 552 shift 553 554 _gen_err_tests_fs=$(ls "$scriptdir/tests/$_gen_err_tests_name/errors/") 555 556 for _gen_err_tests_t in $_gen_err_tests_fs; do 557 558 printf 'test_%s_error_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh \$(TESTSDIR)/error.sh %s %s %s\n\n' \ 559 "$_gen_err_tests_name" "$_gen_err_tests_t" "$builddir" "$_gen_err_tests_name" \ 560 "$_gen_err_tests_t" "$*" >> "Makefile" 561 562 done 563 564} 565 566# Generates a list of error test targets that will be used as prerequisites for 567# other targets. 568# 569# @param name The name of the calculator to generate test targets for. 570gen_err_test_targets() { 571 572 _gen_err_test_targets_name="$1" 573 shift 574 575 _gen_err_test_targets_tests=$(ls "$scriptdir/tests/$_gen_err_test_targets_name/errors/") 576 577 for _gen_err_test_targets_t in $_gen_err_test_targets_tests; do 578 printf ' test_%s_error_%s' "$_gen_err_test_targets_name" "$_gen_err_test_targets_t" 579 done 580 581 printf '\n' 582} 583 584# Generates the proper script test targets for each script test to have its own 585# target. This allows `make test` to run in parallel. 586# 587# @param name Which calculator to generate tests for. 588# @param extra_math An integer that, if non-zero, activates extra math tests. 589# @param generate An integer that, if non-zero, activates generated tests. 590# @param time_tests An integer that, if non-zero, tells the test suite to time 591# the execution of each test. 592gen_script_tests() { 593 594 _gen_script_tests_name="$1" 595 shift 596 597 _gen_script_tests_extra_math="$1" 598 shift 599 600 _gen_script_tests_generate="$1" 601 shift 602 603 _gen_script_tests_time="$1" 604 shift 605 606 _gen_script_tests_tests=$(cat "$scriptdir/tests/$_gen_script_tests_name/scripts/all.txt") 607 608 for _gen_script_tests_f in $_gen_script_tests_tests; do 609 610 _gen_script_tests_b=$(basename "$_gen_script_tests_f" ".${_gen_script_tests_name}") 611 612 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' \ 613 "$_gen_script_tests_name" "$_gen_script_tests_b" "$builddir" "$_gen_script_tests_name" \ 614 "$_gen_script_tests_f" "$_gen_script_tests_extra_math" "$_gen_script_tests_generate" \ 615 "$_gen_script_tests_time" "$*" >> "Makefile" 616 done 617} 618 619set_default() { 620 621 _set_default_on="$1" 622 shift 623 624 _set_default_name="$1" 625 shift 626 627 # The reason that the variables that are being set do not have the same 628 # non-collision avoidance that the other variables do is that we *do* want 629 # the settings of these variables to leak out of the function. They adjust 630 # the settings outside of the function. 631 case "$_set_default_name" in 632 633 bc.banner) bc_default_banner="$_set_default_on" ;; 634 bc.sigint_reset) bc_default_sigint_reset="$_set_default_on" ;; 635 dc.sigint_reset) dc_default_sigint_reset="$_set_default_on" ;; 636 bc.tty_mode) bc_default_tty_mode="$_set_default_on" ;; 637 dc.tty_mode) dc_default_tty_mode="$_set_default_on" ;; 638 bc.prompt) bc_default_prompt="$_set_default_on" ;; 639 dc.prompt) dc_default_prompt="$_set_default_on" ;; 640 bc.expr_exit) bc_default_expr_exit="$_set_default_on";; 641 dc.expr_exit) dc_default_expr_exit="$_set_default_on";; 642 ?) usage "Invalid setting: $_set_default_name" ;; 643 644 esac 645} 646 647# Generates a list of script test targets that will be used as prerequisites for 648# other targets. 649# 650# @param name The name of the calculator to generate script test targets for. 651gen_script_test_targets() { 652 653 _gen_script_test_targets_name="$1" 654 shift 655 656 _gen_script_test_targets_tests=$(cat "$scriptdir/tests/$_gen_script_test_targets_name/scripts/all.txt") 657 658 for _gen_script_test_targets_f in $_gen_script_test_targets_tests; do 659 _gen_script_test_targets_b=$(basename "$_gen_script_test_targets_f" \ 660 ".$_gen_script_test_targets_name") 661 printf ' test_%s_script_%s' "$_gen_script_test_targets_name" \ 662 "$_gen_script_test_targets_b" 663 done 664 665 printf '\n' 666} 667 668# This is a list of defaults, but it is also the list of possible options for 669# users to change. 670# 671# The development options are: force (force options even if they fail), valgrind 672# (build in a way suitable for valgrind testing), memcheck (same as valgrind), 673# and fuzzing (build in a way suitable for fuzzing). 674bc_only=0 675dc_only=0 676coverage=0 677karatsuba_len=32 678debug=0 679hist=1 680editline=0 681readline=0 682extra_math=1 683optimization="" 684generate_tests=1 685install_manpages=1 686nls=1 687force=0 688strip_bin=1 689all_locales=0 690library=0 691fuzz=0 692time_tests=0 693vg=0 694memcheck=0 695clean=1 696 697# The empty strings are because they depend on TTY mode. If they are directly 698# set, though, they will be integers. We test for empty strings later. 699bc_default_banner=0 700bc_default_sigint_reset=1 701dc_default_sigint_reset=1 702bc_default_tty_mode=1 703dc_default_tty_mode=0 704bc_default_prompt="" 705dc_default_prompt="" 706bc_default_expr_exit=1 707dc_default_expr_exit=1 708 709# getopts is a POSIX utility, but it cannot handle long options. Thus, the 710# handling of long options is done by hand, and that's the reason that short and 711# long options cannot be mixed. 712while getopts "abBcdDeEfgGhHk:lMmNO:rS:s:tTvz-" opt; do 713 714 case "$opt" in 715 a) library=1 ;; 716 b) bc_only=1 ;; 717 B) dc_only=1 ;; 718 c) coverage=1 ;; 719 C) clean=0 ;; 720 d) dc_only=1 ;; 721 D) bc_only=1 ;; 722 e) editline=1 ;; 723 E) extra_math=0 ;; 724 f) force=1 ;; 725 g) debug=1 ;; 726 G) generate_tests=0 ;; 727 h) usage ;; 728 H) hist=0 ;; 729 k) karatsuba_len="$OPTARG" ;; 730 l) all_locales=1 ;; 731 m) memcheck=1 ;; 732 M) install_manpages=0 ;; 733 N) nls=0 ;; 734 O) optimization="$OPTARG" ;; 735 r) readline=1 ;; 736 S) set_default 0 "$OPTARG" ;; 737 s) set_default 1 "$OPTARG" ;; 738 t) time_tests=1 ;; 739 T) strip_bin=0 ;; 740 v) vg=1 ;; 741 z) fuzz=1 ;; 742 -) 743 arg="$1" 744 arg="${arg#--}" 745 LONG_OPTARG="${arg#*=}" 746 case $arg in 747 help) usage ;; 748 library) library=1 ;; 749 bc-only) bc_only=1 ;; 750 dc-only) dc_only=1 ;; 751 coverage) coverage=1 ;; 752 debug) debug=1 ;; 753 force) force=1 ;; 754 prefix=?*) PREFIX="$LONG_OPTARG" ;; 755 prefix) 756 if [ "$#" -lt 2 ]; then 757 usage "No argument given for '--$arg' option" 758 fi 759 PREFIX="$2" 760 shift ;; 761 bindir=?*) BINDIR="$LONG_OPTARG" ;; 762 bindir) 763 if [ "$#" -lt 2 ]; then 764 usage "No argument given for '--$arg' option" 765 fi 766 BINDIR="$2" 767 shift ;; 768 includedir=?*) INCLUDEDIR="$LONG_OPTARG" ;; 769 includedir) 770 if [ "$#" -lt 2 ]; then 771 usage "No argument given for '--$arg' option" 772 fi 773 INCLUDEDIR="$2" 774 shift ;; 775 libdir=?*) LIBDIR="$LONG_OPTARG" ;; 776 libdir) 777 if [ "$#" -lt 2 ]; then 778 usage "No argument given for '--$arg' option" 779 fi 780 LIBDIR="$2" 781 shift ;; 782 datarootdir=?*) DATAROOTDIR="$LONG_OPTARG" ;; 783 datarootdir) 784 if [ "$#" -lt 2 ]; then 785 usage "No argument given for '--$arg' option" 786 fi 787 DATAROOTDIR="$2" 788 shift ;; 789 datadir=?*) DATADIR="$LONG_OPTARG" ;; 790 datadir) 791 if [ "$#" -lt 2 ]; then 792 usage "No argument given for '--$arg' option" 793 fi 794 DATADIR="$2" 795 shift ;; 796 mandir=?*) MANDIR="$LONG_OPTARG" ;; 797 mandir) 798 if [ "$#" -lt 2 ]; then 799 usage "No argument given for '--$arg' option" 800 fi 801 MANDIR="$2" 802 shift ;; 803 man1dir=?*) MAN1DIR="$LONG_OPTARG" ;; 804 man1dir) 805 if [ "$#" -lt 2 ]; then 806 usage "No argument given for '--$arg' option" 807 fi 808 MAN1DIR="$2" 809 shift ;; 810 man3dir=?*) MAN3DIR="$LONG_OPTARG" ;; 811 man3dir) 812 if [ "$#" -lt 2 ]; then 813 usage "No argument given for '--$arg' option" 814 fi 815 MAN3DIR="$2" 816 shift ;; 817 localedir=?*) LOCALEDIR="$LONG_OPTARG" ;; 818 localedir) 819 if [ "$#" -lt 2 ]; then 820 usage "No argument given for '--$arg' option" 821 fi 822 LOCALEDIR="$2" 823 shift ;; 824 karatsuba-len=?*) karatsuba_len="$LONG_OPTARG" ;; 825 karatsuba-len) 826 if [ "$#" -lt 2 ]; then 827 usage "No argument given for '--$arg' option" 828 fi 829 karatsuba_len="$1" 830 shift ;; 831 opt=?*) optimization="$LONG_OPTARG" ;; 832 opt) 833 if [ "$#" -lt 2 ]; then 834 usage "No argument given for '--$arg' option" 835 fi 836 optimization="$1" 837 shift ;; 838 set-default-on=?*) set_default 1 "$LONG_OPTARG" ;; 839 set-default-on) 840 if [ "$#" -lt 2 ]; then 841 usage "No argument given for '--$arg' option" 842 fi 843 set_default 1 "$1" 844 shift ;; 845 set-default-off=?*) set_default 0 "$LONG_OPTARG" ;; 846 set-default-off) 847 if [ "$#" -lt 2 ]; then 848 usage "No argument given for '--$arg' option" 849 fi 850 set_default 0 "$1" 851 shift ;; 852 disable-bc) dc_only=1 ;; 853 disable-dc) bc_only=1 ;; 854 disable-clean) clean=0 ;; 855 disable-extra-math) extra_math=0 ;; 856 disable-generated-tests) generate_tests=0 ;; 857 disable-history) hist=0 ;; 858 disable-man-pages) install_manpages=0 ;; 859 disable-nls) nls=0 ;; 860 disable-strip) strip_bin=0 ;; 861 enable-editline) editline=1 ;; 862 enable-readline) readline=1 ;; 863 enable-test-timing) time_tests=1 ;; 864 enable-valgrind) vg=1 ;; 865 enable-fuzz-mode) fuzz=1 ;; 866 enable-memcheck) memcheck=1 ;; 867 install-all-locales) all_locales=1 ;; 868 help* | bc-only* | dc-only* | coverage* | debug*) 869 usage "No arg allowed for --$arg option" ;; 870 disable-bc* | disable-dc* | disable-clean*) 871 usage "No arg allowed for --$arg option" ;; 872 disable-extra-math*) 873 usage "No arg allowed for --$arg option" ;; 874 disable-generated-tests* | disable-history*) 875 usage "No arg allowed for --$arg option" ;; 876 disable-man-pages* | disable-nls* | disable-strip*) 877 usage "No arg allowed for --$arg option" ;; 878 enable-fuzz-mode* | enable-test-timing* | enable-valgrind*) 879 usage "No arg allowed for --$arg option" ;; 880 enable-memcheck* | install-all-locales*) 881 usage "No arg allowed for --$arg option" ;; 882 enable-editline* | enable-readline*) 883 usage "No arg allowed for --$arg option" ;; 884 '') break ;; # "--" terminates argument processing 885 * ) usage "Invalid option $LONG_OPTARG" ;; 886 esac 887 shift 888 OPTIND=1 ;; 889 ?) usage "Invalid option: $opt" ;; 890 esac 891 892done 893 894# Sometimes, developers don't want configure.sh to do a config clean. But 895# sometimes they do. 896if [ "$clean" -ne 0 ]; then 897 if [ -f ./Makefile ]; then 898 make clean_config > /dev/null 899 fi 900fi 901 902# It is an error to say that bc only should be built and likewise for dc. 903if [ "$bc_only" -eq 1 ] && [ "$dc_only" -eq 1 ]; then 904 usage "Can only specify one of -b(-D) or -d(-B)" 905fi 906 907# The library is mutually exclusive to the calculators, so it's an error to 908# give an option for either of them. 909if [ "$library" -ne 0 ]; then 910 if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then 911 usage "Must not specify -b(-D) or -d(-B) when building the library" 912 fi 913fi 914 915# KARATSUBA_LEN must be an integer and must be 16 or greater. 916case $karatsuba_len in 917 (*[!0-9]*|'') usage "KARATSUBA_LEN is not a number" ;; 918 (*) ;; 919esac 920 921if [ "$karatsuba_len" -lt 16 ]; then 922 usage "KARATSUBA_LEN is less than 16" 923fi 924 925set -e 926 927if [ -z "${LONG_BIT+set}" ]; then 928 LONG_BIT_DEFINE="" 929elif [ "$LONG_BIT" -lt 32 ]; then 930 usage "LONG_BIT is less than 32" 931else 932 LONG_BIT_DEFINE="-DBC_LONG_BIT=\$(BC_LONG_BIT)" 933fi 934 935if [ -z "$CC" ]; then 936 CC="c99" 937else 938 939 # I had users complain that, if they gave CFLAGS as part of CC, which 940 # autotools allows in its braindead way, the build would fail with an error. 941 # I don't like adjusting for autotools, but oh well. These lines puts the 942 # stuff after the first space into CFLAGS. 943 ccbase=$(basename "$CC") 944 suffix=" *" 945 prefix="* " 946 947 if [ "${ccbase%%$suffix}" != "$ccbase" ]; then 948 ccflags="${ccbase#$prefix}" 949 cc="${ccbase%%$suffix}" 950 ccdir=$(dirname "$CC") 951 if [ "$ccdir" = "." ] && [ "${CC#.}" = "$CC" ]; then 952 ccdir="" 953 else 954 ccdir="$ccdir/" 955 fi 956 CC="${ccdir}${cc}" 957 CFLAGS="$CFLAGS $ccflags" 958 fi 959fi 960 961if [ -z "$HOSTCC" ] && [ -z "$HOST_CC" ]; then 962 HOSTCC="$CC" 963elif [ -z "$HOSTCC" ]; then 964 HOSTCC="$HOST_CC" 965fi 966 967if [ "$HOSTCC" != "$CC" ]; then 968 969 # Like above, this splits HOSTCC and HOSTCFLAGS. 970 ccbase=$(basename "$HOSTCC") 971 suffix=" *" 972 prefix="* " 973 974 if [ "${ccbase%%$suffix}" != "$ccbase" ]; then 975 ccflags="${ccbase#$prefix}" 976 cc="${ccbase%%$suffix}" 977 ccdir=$(dirname "$HOSTCC") 978 if [ "$ccdir" = "." ] && [ "${HOSTCC#.}" = "$HOSTCC" ]; then 979 ccdir="" 980 else 981 ccdir="$ccdir/" 982 fi 983 HOSTCC="${ccdir}${cc}" 984 HOSTCFLAGS="$HOSTCFLAGS $ccflags" 985 fi 986fi 987 988if [ -z "${HOSTCFLAGS+set}" ] && [ -z "${HOST_CFLAGS+set}" ]; then 989 HOSTCFLAGS="$CFLAGS" 990elif [ -z "${HOSTCFLAGS+set}" ]; then 991 HOSTCFLAGS="$HOST_CFLAGS" 992fi 993 994# Store these for the cross compilation detection later. 995OLDCFLAGS="$CFLAGS" 996OLDHOSTCFLAGS="$HOSTCFLAGS" 997 998link="@printf 'No link necessary\\\\n'" 999main_exec="BC" 1000executable="BC_EXEC" 1001 1002tests="test_bc timeconst test_dc" 1003 1004bc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)" 1005bc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)" 1006dc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)" 1007dc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)" 1008 1009timeconst="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/bc/timeconst.sh \$(TESTSDIR)/bc/scripts/timeconst.bc \$(BC_EXEC)" 1010 1011# In order to have cleanup at exit, we need to be in 1012# debug mode, so don't run valgrind without that. 1013if [ "$vg" -ne 0 ]; then 1014 debug=1 1015 bc_test_exec='valgrind $(VALGRIND_ARGS) $(BC_EXEC)' 1016 dc_test_exec='valgrind $(VALGRIND_ARGS) $(DC_EXEC)' 1017else 1018 bc_test_exec='$(BC_EXEC)' 1019 dc_test_exec='$(DC_EXEC)' 1020fi 1021 1022test_bc_history_prereqs="test_bc_history_all" 1023test_dc_history_prereqs="test_dc_history_all" 1024 1025karatsuba="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'" 1026karatsuba_test="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'" 1027 1028bc_lib="\$(GEN_DIR)/lib.o" 1029bc_help="\$(GEN_DIR)/bc_help.o" 1030dc_help="\$(GEN_DIR)/dc_help.o" 1031 1032default_target_prereqs="\$(BIN) \$(OBJS)" 1033default_target_cmd="\$(CC) \$(CFLAGS) \$(OBJS) \$(LDFLAGS) -o \$(EXEC)" 1034default_target="\$(DC_EXEC)" 1035 1036second_target_prereqs="" 1037second_target_cmd="$default_target_cmd" 1038second_target="\$(BC_EXEC)" 1039 1040# This if/else if chain is for setting the defaults that change based on whether 1041# the library is being built, bc only, dc only, or both calculators. 1042if [ "$library" -ne 0 ]; then 1043 1044 extra_math=1 1045 nls=0 1046 hist=0 1047 bc=1 1048 dc=1 1049 1050 default_target_prereqs="\$(BIN) \$(OBJ)" 1051 default_target_cmd="ar -r -cu \$(LIBBC) \$(OBJ)" 1052 default_target="\$(LIBBC)" 1053 tests="test_library" 1054 test_bc_history_prereqs=" test_bc_history_skip" 1055 test_dc_history_prereqs=" test_dc_history_skip" 1056 1057 install_prereqs=" install_library" 1058 uninstall_prereqs=" uninstall_library" 1059 install_man_prereqs=" install_bcl_manpage" 1060 uninstall_man_prereqs=" uninstall_bcl_manpage" 1061 1062elif [ "$bc_only" -eq 1 ]; then 1063 1064 bc=1 1065 dc=0 1066 1067 dc_help="" 1068 1069 executables="bc" 1070 1071 dc_test="@printf 'No dc tests to run\\\\n'" 1072 dc_test_np="@printf 'No dc tests to run\\\\n'" 1073 test_dc_history_prereqs=" test_dc_history_skip" 1074 1075 install_prereqs=" install_execs" 1076 install_man_prereqs=" install_bc_manpage" 1077 uninstall_prereqs=" uninstall_bc" 1078 uninstall_man_prereqs=" uninstall_bc_manpage" 1079 1080 default_target="\$(BC_EXEC)" 1081 second_target="\$(DC_EXEC)" 1082 tests="test_bc timeconst" 1083 1084elif [ "$dc_only" -eq 1 ]; then 1085 1086 bc=0 1087 dc=1 1088 1089 bc_lib="" 1090 bc_help="" 1091 1092 executables="dc" 1093 1094 main_exec="DC" 1095 executable="DC_EXEC" 1096 1097 bc_test="@printf 'No bc tests to run\\\\n'" 1098 bc_test_np="@printf 'No bc tests to run\\\\n'" 1099 test_bc_history_prereqs=" test_bc_history_skip" 1100 1101 timeconst="@printf 'timeconst cannot be run because bc is not built\\\\n'" 1102 1103 install_prereqs=" install_execs" 1104 install_man_prereqs=" install_dc_manpage" 1105 uninstall_prereqs=" uninstall_dc" 1106 uninstall_man_prereqs=" uninstall_dc_manpage" 1107 1108 tests="test_dc" 1109 1110else 1111 1112 bc=1 1113 dc=1 1114 1115 executables="bc and dc" 1116 1117 karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)" 1118 karatsuba_test="@\$(KARATSUBA) 1 100 \$(BC_EXEC)" 1119 1120 if [ "$library" -eq 0 ]; then 1121 install_prereqs=" install_execs" 1122 install_man_prereqs=" install_bc_manpage install_dc_manpage" 1123 uninstall_prereqs=" uninstall_bc uninstall_dc" 1124 uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage" 1125 else 1126 install_prereqs=" install_library install_bcl_header" 1127 install_man_prereqs=" install_bcl_manpage" 1128 uninstall_prereqs=" uninstall_library uninstall_bcl_header" 1129 uninstall_man_prereqs=" uninstall_bcl_manpage" 1130 tests="test_library" 1131 fi 1132 1133 second_target_prereqs="$default_target_prereqs" 1134 default_target_prereqs="$second_target" 1135 default_target_cmd="\$(LINK) \$(BIN) \$(EXEC_PREFIX)\$(DC)" 1136 1137fi 1138 1139# We need specific stuff for fuzzing. 1140if [ "$fuzz" -ne 0 ]; then 1141 debug=1 1142 hist=0 1143 nls=0 1144 optimization="3" 1145fi 1146 1147# This sets some necessary things for debug mode. 1148if [ "$debug" -eq 1 ]; then 1149 1150 if [ -z "$CFLAGS" ] && [ -z "$optimization" ]; then 1151 CFLAGS="-O0" 1152 fi 1153 1154 CFLAGS="-g $CFLAGS" 1155 1156else 1157 1158 CPPFLAGS="-DNDEBUG $CPPFLAGS" 1159 1160 if [ "$strip_bin" -ne 0 ]; then 1161 LDFLAGS="-s $LDFLAGS" 1162 fi 1163fi 1164 1165# Set optimization CFLAGS. 1166if [ -n "$optimization" ]; then 1167 CFLAGS="-O$optimization $CFLAGS" 1168fi 1169 1170# Set test coverage defaults. 1171if [ "$coverage" -eq 1 ]; then 1172 1173 if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then 1174 usage "Can only specify -c without -b or -d" 1175 fi 1176 1177 CFLAGS="-fprofile-arcs -ftest-coverage -g -O0 $CFLAGS" 1178 CPPFLAGS="-DNDEBUG $CPPFLAGS" 1179 1180 COVERAGE_OUTPUT="@gcov -pabcdf \$(GCDA) \$(BC_GCDA) \$(DC_GCDA) \$(HISTORY_GCDA) \$(RAND_GCDA)" 1181 COVERAGE_OUTPUT="$COVERAGE_OUTPUT;\$(RM) -f \$(GEN)*.gc*" 1182 COVERAGE_OUTPUT="$COVERAGE_OUTPUT;gcovr --exclude-unreachable-branches --exclude-throw-branches --html-details --output index.html" 1183 COVERAGE_PREREQS=" test coverage_output" 1184 1185else 1186 COVERAGE_OUTPUT="@printf 'Coverage not generated\\\\n'" 1187 COVERAGE_PREREQS="" 1188fi 1189 1190 1191# Set some defaults. 1192if [ -z "${DESTDIR+set}" ]; then 1193 destdir="" 1194else 1195 destdir="DESTDIR = $DESTDIR" 1196fi 1197 1198if [ -z "${PREFIX+set}" ]; then 1199 PREFIX="/usr/local" 1200fi 1201 1202if [ -z "${BINDIR+set}" ]; then 1203 BINDIR="$PREFIX/bin" 1204fi 1205 1206if [ -z "${INCLUDEDIR+set}" ]; then 1207 INCLUDEDIR="$PREFIX/include" 1208fi 1209 1210if [ -z "${LIBDIR+set}" ]; then 1211 LIBDIR="$PREFIX/lib" 1212fi 1213 1214if [ -z "${PC_PATH+set}" ]; then 1215 1216 set +e 1217 1218 command -v pkg-config > /dev/null 1219 err=$? 1220 1221 set -e 1222 1223 if [ "$err" -eq 0 ]; then 1224 PC_PATH=$(pkg-config --variable=pc_path pkg-config) 1225 PC_PATH="${PC_PATH%%:*}" 1226 else 1227 PC_PATH="" 1228 fi 1229 1230fi 1231 1232# Set a default for the DATAROOTDIR. This is done if either manpages will be 1233# installed, or locales are enabled because that's probably where NLS_PATH 1234# points. 1235if [ "$install_manpages" -ne 0 ] || [ "$nls" -ne 0 ]; then 1236 if [ -z "${DATAROOTDIR+set}" ]; then 1237 DATAROOTDIR="$PREFIX/share" 1238 fi 1239fi 1240 1241# Set defaults for manpage environment variables. 1242if [ "$install_manpages" -ne 0 ]; then 1243 1244 if [ -z "${DATADIR+set}" ]; then 1245 DATADIR="$DATAROOTDIR" 1246 fi 1247 1248 if [ -z "${MANDIR+set}" ]; then 1249 MANDIR="$DATADIR/man" 1250 fi 1251 1252 if [ -z "${MAN1DIR+set}" ]; then 1253 MAN1DIR="$MANDIR/man1" 1254 fi 1255 1256 if [ -z "${MAN3DIR+set}" ]; then 1257 MAN3DIR="$MANDIR/man3" 1258 fi 1259 1260else 1261 install_man_prereqs="" 1262 uninstall_man_prereqs="" 1263fi 1264 1265# Here is where we test NLS (the locale system). This is done by trying to 1266# compile src/vm.c, which has the relevant code. If it fails, then it is 1267# disabled. 1268if [ "$nls" -ne 0 ]; then 1269 1270 set +e 1271 1272 printf 'Testing NLS...\n' 1273 1274 flags="-DBC_ENABLE_NLS=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc" 1275 flags="$flags -DBC_ENABLE_HISTORY=$hist -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0" 1276 flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/" 1277 flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" 1278 1279 "$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/vm.c" -o "./vm.o" > /dev/null 2>&1 1280 1281 err="$?" 1282 1283 rm -rf "./vm.o" 1284 1285 # If this errors, it is probably because of building on Windows, 1286 # and NLS is not supported on Windows, so disable it. 1287 if [ "$err" -ne 0 ]; then 1288 printf 'NLS does not work.\n' 1289 if [ $force -eq 0 ]; then 1290 printf 'Disabling NLS...\n\n' 1291 nls=0 1292 else 1293 printf 'Forcing NLS...\n\n' 1294 fi 1295 else 1296 printf 'NLS works.\n\n' 1297 1298 printf 'Testing gencat...\n' 1299 gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" > /dev/null 2>&1 1300 1301 err="$?" 1302 1303 rm -rf "./en_US.cat" 1304 1305 if [ "$err" -ne 0 ]; then 1306 printf 'gencat does not work.\n' 1307 if [ $force -eq 0 ]; then 1308 printf 'Disabling NLS...\n\n' 1309 nls=0 1310 else 1311 printf 'Forcing NLS...\n\n' 1312 fi 1313 else 1314 1315 printf 'gencat works.\n\n' 1316 1317 # It turns out that POSIX locales are really terrible, and running 1318 # gencat on one machine is not guaranteed to make those cat files 1319 # portable to another machine, so we had better warn the user here. 1320 if [ "$HOSTCC" != "$CC" ] || [ "$OLDHOSTCFLAGS" != "$OLDCFLAGS" ]; then 1321 printf 'Cross-compile detected.\n\n' 1322 printf 'WARNING: Catalog files generated with gencat may not be portable\n' 1323 printf ' across different architectures.\n\n' 1324 fi 1325 1326 if [ -z "$NLSPATH" ]; then 1327 NLSPATH="/usr/share/locale/%L/%N" 1328 fi 1329 1330 install_locales_prereqs=" install_locales" 1331 uninstall_locales_prereqs=" uninstall_locales" 1332 1333 fi 1334 1335 fi 1336 1337 set -e 1338 1339else 1340 install_locales_prereqs="" 1341 uninstall_locales_prereqs="" 1342 all_locales=0 1343fi 1344 1345if [ "$nls" -ne 0 ] && [ "$all_locales" -ne 0 ]; then 1346 install_locales="\$(LOCALE_INSTALL) -l \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)" 1347else 1348 install_locales="\$(LOCALE_INSTALL) \$(NLSPATH) \$(MAIN_EXEC) \$(DESTDIR)" 1349fi 1350 1351# Like the above tested locale support, this tests history. 1352if [ "$hist" -eq 1 ]; then 1353 1354 if [ "$editline" -ne 0 ] && [ "$readline" -ne 0 ]; then 1355 usage "Must only enable one of readline or editline" 1356 fi 1357 1358 set +e 1359 1360 printf 'Testing history...\n' 1361 1362 flags="-DBC_ENABLE_HISTORY=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc" 1363 flags="$flags -DBC_ENABLE_NLS=$nls -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0" 1364 flags="$flags -DBC_ENABLE_EDITLINE=$editline -DBC_ENABLE_READLINE=$readline" 1365 flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/" 1366 flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" 1367 1368 "$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/history.c" -o "./history.o" > /dev/null 2>&1 1369 1370 err="$?" 1371 1372 rm -rf "./history.o" 1373 1374 # If this errors, it is probably because of building on Windows, 1375 # and history is not supported on Windows, so disable it. 1376 if [ "$err" -ne 0 ]; then 1377 printf 'History does not work.\n' 1378 if [ $force -eq 0 ]; then 1379 printf 'Disabling history...\n\n' 1380 hist=0 1381 else 1382 printf 'Forcing history...\n\n' 1383 fi 1384 else 1385 printf 'History works.\n\n' 1386 fi 1387 1388 set -e 1389 1390fi 1391 1392# We have to disable the history tests if it is disabled or valgrind is on. Or 1393# if we are using editline or readline. 1394if [ "$hist" -eq 0 ] || [ "$vg" -ne 0 ]; then 1395 test_bc_history_prereqs=" test_bc_history_skip" 1396 test_dc_history_prereqs=" test_dc_history_skip" 1397 history_tests="@printf 'Skipping history tests...\\\\n'" 1398 CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0" 1399else 1400 1401 if [ "$editline" -eq 0 ] && [ "$readline" -eq 0 ]; then 1402 history_tests="@printf '\$(TEST_STARS)\\\\n\\\\nRunning history tests...\\\\n\\\\n'" 1403 history_tests="$history_tests \&\& \$(TESTSDIR)/history.sh bc -a \&\&" 1404 history_tests="$history_tests \$(TESTSDIR)/history.sh dc -a \&\& printf" 1405 history_tests="$history_tests '\\\\nAll history tests passed.\\\\n\\\\n\$(TEST_STARS)\\\\n'" 1406 else 1407 test_bc_history_prereqs=" test_bc_history_skip" 1408 test_dc_history_prereqs=" test_dc_history_skip" 1409 history_tests="@printf 'Skipping history tests...\\\\n'" 1410 fi 1411 1412 # We are also setting the CFLAGS and LDFLAGS here. 1413 if [ "$editline" -ne 0 ]; then 1414 LDFLAGS="$LDFLAGS -ledit" 1415 CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=1 -DBC_ENABLE_READLINE=0" 1416 elif [ "$readline" -ne 0 ]; then 1417 LDFLAGS="$LDFLAGS -lreadline" 1418 CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=1" 1419 else 1420 CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0" 1421 fi 1422 1423fi 1424 1425# Test FreeBSD. This is not in an if statement because regardless of whatever 1426# the user says, we need to know if we are on FreeBSD. If we are, we cannot set 1427# _POSIX_C_SOURCE and _XOPEN_SOURCE. The FreeBSD headers turn *off* stuff when 1428# that is done. 1429set +e 1430printf 'Testing for FreeBSD...\n' 1431 1432flags="-DBC_TEST_FREEBSD -DBC_ENABLE_AFL=0" 1433"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/include/status.h" > /dev/null 2>&1 1434 1435err="$?" 1436 1437if [ "$err" -ne 0 ]; then 1438 printf 'On FreeBSD. Not using _POSIX_C_SOURCE and _XOPEN_SOURCE.\n\n' 1439else 1440 printf 'Not on FreeBSD. Using _POSIX_C_SOURCE and _XOPEN_SOURCE.\n\n' 1441 CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" 1442fi 1443 1444# Test OpenBSD. This is not in an if statement because regardless of whatever 1445# the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE. 1446# No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC 1447# and Clang complain that that is only allowed for system headers. Sigh....So we 1448# have to check at configure time and set it on the compiler command-line. And 1449# we have to set it because we also set _POSIX_C_SOURCE, which OpenBSD headers 1450# detect, and when they detect it, they turn off _BSD_SOURCE unless it is 1451# specifically requested. 1452set +e 1453printf 'Testing for OpenBSD...\n' 1454 1455flags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0" 1456"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/include/status.h" > /dev/null 2>&1 1457 1458err="$?" 1459 1460if [ "$err" -ne 0 ]; then 1461 printf 'On OpenBSD. Using _BSD_SOURCE.\n\n' 1462 bsd="-D_BSD_SOURCE" 1463else 1464 printf 'Not on OpenBSD.\n\n' 1465 bsd="" 1466fi 1467 1468if [ "$library" -eq 1 ]; then 1469 bc_lib="" 1470fi 1471 1472if [ "$extra_math" -eq 1 ] && [ "$bc" -ne 0 ] && [ "$library" -eq 0 ]; then 1473 BC_LIB2_O="\$(GEN_DIR)/lib2.o" 1474else 1475 BC_LIB2_O="" 1476fi 1477 1478# These lines set the appropriate targets based on whether `gen/strgen.c` or 1479# `gen/strgen.sh` is used. 1480GEN="strgen" 1481GEN_EXEC_TARGET="\$(HOSTCC) \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)" 1482CLEAN_PREREQS=" clean_gen clean_coverage" 1483 1484if [ -z "${GEN_HOST+set}" ]; then 1485 GEN_HOST=1 1486else 1487 if [ "$GEN_HOST" -eq 0 ]; then 1488 GEN="strgen.sh" 1489 GEN_EXEC_TARGET="@printf 'Do not need to build gen/strgen.c\\\\n'" 1490 CLEAN_PREREQS=" clean_coverage" 1491 fi 1492fi 1493 1494manpage_args="" 1495unneeded="" 1496headers="\$(HEADERS)" 1497 1498# This series of if statements figure out what source files are *not* needed. 1499if [ "$extra_math" -eq 0 ]; then 1500 exclude_extra_math=1 1501 manpage_args="E" 1502 unneeded="$unneeded rand.c" 1503else 1504 exclude_extra_math=0 1505 headers="$headers \$(EXTRA_MATH_HEADERS)" 1506fi 1507 1508# All of these next if statements set the build type and mark certain source 1509# files as unneeded so that they won't have targets generated for them. 1510 1511if [ "$hist" -eq 0 ]; then 1512 manpage_args="${manpage_args}H" 1513 unneeded="$unneeded history.c" 1514else 1515 headers="$headers \$(HISTORY_HEADERS)" 1516fi 1517 1518if [ "$nls" -eq 0 ]; then 1519 manpage_args="${manpage_args}N" 1520fi 1521 1522if [ "$bc" -eq 0 ]; then 1523 unneeded="$unneeded bc.c bc_lex.c bc_parse.c" 1524else 1525 headers="$headers \$(BC_HEADERS)" 1526fi 1527 1528if [ "$dc" -eq 0 ]; then 1529 unneeded="$unneeded dc.c dc_lex.c dc_parse.c" 1530else 1531 headers="$headers \$(DC_HEADERS)" 1532fi 1533 1534# This convoluted mess does pull the version out. If you change the format of 1535# include/version.h, you may have to change this line. 1536version=$(cat "$scriptdir/include/version.h" | grep "VERSION " - | awk '{ print $3 }' -) 1537 1538if [ "$library" -ne 0 ]; then 1539 1540 unneeded="$unneeded args.c opt.c read.c file.c main.c" 1541 unneeded="$unneeded lang.c lex.c parse.c program.c" 1542 unneeded="$unneeded bc.c bc_lex.c bc_parse.c" 1543 unneeded="$unneeded dc.c dc_lex.c dc_parse.c" 1544 headers="$headers \$(LIBRARY_HEADERS)" 1545 1546 if [ "$PC_PATH" != "" ]; then 1547 1548 contents=$(cat "$scriptdir/bcl.pc.in") 1549 1550 contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR") 1551 contents=$(replace "$contents" "LIBDIR" "$LIBDIR") 1552 contents=$(replace "$contents" "VERSION" "$version") 1553 1554 printf '%s\n' "$contents" > "./bcl.pc" 1555 1556 pkg_config_install="\$(SAFE_INSTALL) \$(PC_INSTALL_ARGS) \"\$(BCL_PC)\" \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\"" 1557 pkg_config_uninstall="\$(RM) -f \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\"" 1558 1559 else 1560 1561 pkg_config_install="" 1562 pkg_config_uninstall="" 1563 1564 fi 1565 1566else 1567 1568 unneeded="$unneeded library.c" 1569 1570 PC_PATH="" 1571 pkg_config_install="" 1572 pkg_config_uninstall="" 1573 1574fi 1575 1576# library.c is not needed under normal circumstances. 1577if [ "$unneeded" = "" ]; then 1578 unneeded="library.c" 1579fi 1580 1581# This sets the appropriate manpage for a full build. 1582if [ "$manpage_args" = "" ]; then 1583 manpage_args="A" 1584fi 1585 1586if [ "$vg" -ne 0 ]; then 1587 memcheck=1 1588fi 1589 1590if [ "$bc_default_prompt" = "" ]; then 1591 bc_default_prompt="$bc_default_tty_mode" 1592fi 1593 1594if [ "$dc_default_prompt" = "" ]; then 1595 dc_default_prompt="$dc_default_tty_mode" 1596fi 1597 1598# Generate the test targets and prerequisites. 1599bc_tests=$(gen_std_test_targets bc) 1600bc_script_tests=$(gen_script_test_targets bc) 1601bc_err_tests=$(gen_err_test_targets bc) 1602dc_tests=$(gen_std_test_targets dc) 1603dc_script_tests=$(gen_script_test_targets dc) 1604dc_err_tests=$(gen_err_test_targets dc) 1605 1606# Print out the values; this is for debugging. 1607printf 'Version: %s\n' "$version" 1608 1609if [ "$bc" -ne 0 ]; then 1610 printf 'Building bc\n' 1611else 1612 printf 'Not building bc\n' 1613fi 1614if [ "$dc" -ne 0 ]; then 1615 printf 'Building dc\n' 1616else 1617 printf 'Not building dc\n' 1618fi 1619printf '\n' 1620printf 'BC_ENABLE_LIBRARY=%s\n\n' "$library" 1621printf 'BC_ENABLE_HISTORY=%s\n' "$hist" 1622printf 'BC_ENABLE_EXTRA_MATH=%s\n' "$extra_math" 1623printf 'BC_ENABLE_NLS=%s\n' "$nls" 1624printf 'BC_ENABLE_AFL=%s\n' "$fuzz" 1625printf '\n' 1626printf 'BC_NUM_KARATSUBA_LEN=%s\n' "$karatsuba_len" 1627printf '\n' 1628printf 'CC=%s\n' "$CC" 1629printf 'CFLAGS=%s\n' "$CFLAGS" 1630printf 'HOSTCC=%s\n' "$HOSTCC" 1631printf 'HOSTCFLAGS=%s\n' "$HOSTCFLAGS" 1632printf 'CPPFLAGS=%s\n' "$CPPFLAGS" 1633printf 'LDFLAGS=%s\n' "$LDFLAGS" 1634printf 'PREFIX=%s\n' "$PREFIX" 1635printf 'BINDIR=%s\n' "$BINDIR" 1636printf 'INCLUDEDIR=%s\n' "$INCLUDEDIR" 1637printf 'LIBDIR=%s\n' "$LIBDIR" 1638printf 'DATAROOTDIR=%s\n' "$DATAROOTDIR" 1639printf 'DATADIR=%s\n' "$DATADIR" 1640printf 'MANDIR=%s\n' "$MANDIR" 1641printf 'MAN1DIR=%s\n' "$MAN1DIR" 1642printf 'MAN3DIR=%s\n' "$MAN3DIR" 1643printf 'NLSPATH=%s\n' "$NLSPATH" 1644printf 'PC_PATH=%s\n' "$PC_PATH" 1645printf 'EXECSUFFIX=%s\n' "$EXECSUFFIX" 1646printf 'EXECPREFIX=%s\n' "$EXECPREFIX" 1647printf 'DESTDIR=%s\n' "$DESTDIR" 1648printf 'LONG_BIT=%s\n' "$LONG_BIT" 1649printf 'GEN_HOST=%s\n' "$GEN_HOST" 1650printf 'GEN_EMU=%s\n' "$GEN_EMU" 1651printf '\n' 1652printf 'Setting Defaults\n' 1653printf '================\n' 1654printf 'bc.banner=%s\n' "$bc_default_banner" 1655printf 'bc.sigint_reset=%s\n' "$bc_default_sigint_reset" 1656printf 'dc.sigint_reset=%s\n' "$dc_default_sigint_reset" 1657printf 'bc.tty_mode=%s\n' "$bc_default_tty_mode" 1658printf 'dc.tty_mode=%s\n' "$dc_default_tty_mode" 1659printf 'bc.prompt=%s\n' "$bc_default_prompt" 1660printf 'dc.prompt=%s\n' "$dc_default_prompt" 1661printf 'bc.expr_exit=%s\n' "$bc_default_expr_exit" 1662printf 'dc.expr_exit=%s\n' "$dc_default_expr_exit" 1663 1664# This is where the real work begins. This is the point at which the Makefile.in 1665# template is edited and output to the Makefile. 1666 1667contents=$(cat "$scriptdir/Makefile.in") 1668 1669needle="WARNING" 1670replacement='*** WARNING: Autogenerated from Makefile.in. DO NOT MODIFY ***' 1671 1672contents=$(replace "$contents" "$needle" "$replacement") 1673 1674# The contents are edited to have the list of files to build. 1675contents=$(gen_file_list "$contents" $unneeded) 1676 1677SRC_TARGETS="" 1678 1679# This line and loop generates the individual targets for source files. I used 1680# to just use an implicit target, but that was found to be inadequate when I 1681# added the library. 1682src_files=$(find_src_files $unneeded) 1683 1684for f in $src_files; do 1685 o=$(replace_ext "$f" "c" "o") 1686 o=$(basename "$o") 1687 SRC_TARGETS=$(printf '%s\n\nsrc/%s: src %s %s\n\t$(CC) $(CFLAGS) -o src/%s -c %s\n' \ 1688 "$SRC_TARGETS" "$o" "$headers" "$f" "$o" "$f") 1689done 1690 1691# Replace all the placeholders. 1692contents=$(replace "$contents" "ROOTDIR" "$scriptdir") 1693contents=$(replace "$contents" "BUILDDIR" "$builddir") 1694 1695contents=$(replace "$contents" "HEADERS" "$headers") 1696 1697contents=$(replace "$contents" "BC_ENABLED" "$bc") 1698contents=$(replace "$contents" "DC_ENABLED" "$dc") 1699 1700contents=$(replace "$contents" "BC_ALL_TESTS" "$bc_test") 1701contents=$(replace "$contents" "BC_ALL_TESTS_NP" "$bc_test_np") 1702contents=$(replace "$contents" "BC_TESTS" "$bc_tests") 1703contents=$(replace "$contents" "BC_SCRIPT_TESTS" "$bc_script_tests") 1704contents=$(replace "$contents" "BC_ERROR_TESTS" "$bc_err_tests") 1705contents=$(replace "$contents" "BC_TEST_EXEC" "$bc_test_exec") 1706contents=$(replace "$contents" "TIMECONST_ALL_TESTS" "$timeconst") 1707 1708contents=$(replace "$contents" "DC_ALL_TESTS" "$dc_test") 1709contents=$(replace "$contents" "DC_ALL_TESTS_NP" "$dc_test_np") 1710contents=$(replace "$contents" "DC_TESTS" "$dc_tests") 1711contents=$(replace "$contents" "DC_SCRIPT_TESTS" "$dc_script_tests") 1712contents=$(replace "$contents" "DC_ERROR_TESTS" "$dc_err_tests") 1713contents=$(replace "$contents" "DC_TEST_EXEC" "$dc_test_exec") 1714 1715contents=$(replace "$contents" "BUILD_TYPE" "$manpage_args") 1716contents=$(replace "$contents" "EXCLUDE_EXTRA_MATH" "$exclude_extra_math") 1717 1718contents=$(replace "$contents" "LIBRARY" "$library") 1719contents=$(replace "$contents" "HISTORY" "$hist") 1720contents=$(replace "$contents" "EXTRA_MATH" "$extra_math") 1721contents=$(replace "$contents" "NLS" "$nls") 1722contents=$(replace "$contents" "FUZZ" "$fuzz") 1723contents=$(replace "$contents" "MEMCHECK" "$memcheck") 1724 1725contents=$(replace "$contents" "BC_LIB_O" "$bc_lib") 1726contents=$(replace "$contents" "BC_HELP_O" "$bc_help") 1727contents=$(replace "$contents" "DC_HELP_O" "$dc_help") 1728contents=$(replace "$contents" "BC_LIB2_O" "$BC_LIB2_O") 1729contents=$(replace "$contents" "KARATSUBA_LEN" "$karatsuba_len") 1730 1731contents=$(replace "$contents" "NLSPATH" "$NLSPATH") 1732contents=$(replace "$contents" "DESTDIR" "$destdir") 1733contents=$(replace "$contents" "EXECSUFFIX" "$EXECSUFFIX") 1734contents=$(replace "$contents" "EXECPREFIX" "$EXECPREFIX") 1735contents=$(replace "$contents" "BINDIR" "$BINDIR") 1736contents=$(replace "$contents" "INCLUDEDIR" "$INCLUDEDIR") 1737contents=$(replace "$contents" "LIBDIR" "$LIBDIR") 1738contents=$(replace "$contents" "MAN1DIR" "$MAN1DIR") 1739contents=$(replace "$contents" "MAN3DIR" "$MAN3DIR") 1740contents=$(replace "$contents" "CFLAGS" "$CFLAGS") 1741contents=$(replace "$contents" "HOSTCFLAGS" "$HOSTCFLAGS") 1742contents=$(replace "$contents" "CPPFLAGS" "$CPPFLAGS") 1743contents=$(replace "$contents" "LDFLAGS" "$LDFLAGS") 1744contents=$(replace "$contents" "CC" "$CC") 1745contents=$(replace "$contents" "HOSTCC" "$HOSTCC") 1746contents=$(replace "$contents" "COVERAGE_OUTPUT" "$COVERAGE_OUTPUT") 1747contents=$(replace "$contents" "COVERAGE_PREREQS" "$COVERAGE_PREREQS") 1748contents=$(replace "$contents" "INSTALL_PREREQS" "$install_prereqs") 1749contents=$(replace "$contents" "INSTALL_MAN_PREREQS" "$install_man_prereqs") 1750contents=$(replace "$contents" "INSTALL_LOCALES" "$install_locales") 1751contents=$(replace "$contents" "INSTALL_LOCALES_PREREQS" "$install_locales_prereqs") 1752contents=$(replace "$contents" "UNINSTALL_MAN_PREREQS" "$uninstall_man_prereqs") 1753contents=$(replace "$contents" "UNINSTALL_PREREQS" "$uninstall_prereqs") 1754contents=$(replace "$contents" "UNINSTALL_LOCALES_PREREQS" "$uninstall_locales_prereqs") 1755 1756contents=$(replace "$contents" "PC_PATH" "$PC_PATH") 1757contents=$(replace "$contents" "PKG_CONFIG_INSTALL" "$pkg_config_install") 1758contents=$(replace "$contents" "PKG_CONFIG_UNINSTALL" "$pkg_config_uninstall") 1759 1760contents=$(replace "$contents" "DEFAULT_TARGET" "$default_target") 1761contents=$(replace "$contents" "DEFAULT_TARGET_PREREQS" "$default_target_prereqs") 1762contents=$(replace "$contents" "DEFAULT_TARGET_CMD" "$default_target_cmd") 1763contents=$(replace "$contents" "SECOND_TARGET" "$second_target") 1764contents=$(replace "$contents" "SECOND_TARGET_PREREQS" "$second_target_prereqs") 1765contents=$(replace "$contents" "SECOND_TARGET_CMD" "$second_target_cmd") 1766 1767contents=$(replace "$contents" "ALL_PREREQ" "$ALL_PREREQ") 1768contents=$(replace "$contents" "BC_EXEC_PREREQ" "$bc_exec_prereq") 1769contents=$(replace "$contents" "BC_EXEC_CMD" "$bc_exec_cmd") 1770contents=$(replace "$contents" "DC_EXEC_PREREQ" "$dc_exec_prereq") 1771contents=$(replace "$contents" "DC_EXEC_CMD" "$dc_exec_cmd") 1772 1773contents=$(replace "$contents" "EXECUTABLES" "$executables") 1774contents=$(replace "$contents" "MAIN_EXEC" "$main_exec") 1775contents=$(replace "$contents" "EXEC" "$executable") 1776contents=$(replace "$contents" "TESTS" "$tests") 1777 1778contents=$(replace "$contents" "BC_HISTORY_TEST_PREREQS" "$test_bc_history_prereqs") 1779contents=$(replace "$contents" "DC_HISTORY_TEST_PREREQS" "$test_dc_history_prereqs") 1780contents=$(replace "$contents" "HISTORY_TESTS" "$history_tests") 1781 1782contents=$(replace "$contents" "VG_BC_TEST" "$vg_bc_test") 1783contents=$(replace "$contents" "VG_DC_TEST" "$vg_dc_test") 1784 1785contents=$(replace "$contents" "TIMECONST" "$timeconst") 1786 1787contents=$(replace "$contents" "KARATSUBA" "$karatsuba") 1788contents=$(replace "$contents" "KARATSUBA_TEST" "$karatsuba_test") 1789 1790contents=$(replace "$contents" "LONG_BIT" "$LONG_BIT") 1791contents=$(replace "$contents" "LONG_BIT_DEFINE" "$LONG_BIT_DEFINE") 1792 1793contents=$(replace "$contents" "GEN" "$GEN") 1794contents=$(replace "$contents" "GEN_EXEC_TARGET" "$GEN_EXEC_TARGET") 1795contents=$(replace "$contents" "CLEAN_PREREQS" "$CLEAN_PREREQS") 1796contents=$(replace "$contents" "GEN_EMU" "$GEN_EMU") 1797 1798contents=$(replace "$contents" "BSD" "$bsd") 1799 1800contents=$(replace "$contents" "BC_DEFAULT_BANNER" "$bc_default_banner") 1801contents=$(replace "$contents" "BC_DEFAULT_SIGINT_RESET" "$bc_default_sigint_reset") 1802contents=$(replace "$contents" "DC_DEFAULT_SIGINT_RESET" "$dc_default_sigint_reset") 1803contents=$(replace "$contents" "BC_DEFAULT_TTY_MODE" "$bc_default_tty_mode") 1804contents=$(replace "$contents" "DC_DEFAULT_TTY_MODE" "$dc_default_tty_mode") 1805contents=$(replace "$contents" "BC_DEFAULT_PROMPT" "$bc_default_prompt") 1806contents=$(replace "$contents" "DC_DEFAULT_PROMPT" "$dc_default_prompt") 1807contents=$(replace "$contents" "BC_DEFAULT_EXPR_EXIT" "$bc_default_expr_exit") 1808contents=$(replace "$contents" "DC_DEFAULT_EXPR_EXIT" "$dc_default_expr_exit") 1809 1810# Do the first print to the Makefile. 1811printf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "Makefile" 1812 1813# Generate the individual test targets. 1814if [ "$bc" -ne 0 ]; then 1815 gen_std_tests bc "$extra_math" "$time_tests" $bc_test_exec 1816 gen_script_tests bc "$extra_math" "$generate_tests" "$time_tests" $bc_test_exec 1817 gen_err_tests bc $bc_test_exec 1818fi 1819 1820if [ "$dc" -ne 0 ]; then 1821 gen_std_tests dc "$extra_math" "$time_tests" $dc_test_exec 1822 gen_script_tests dc "$extra_math" "$generate_tests" "$time_tests" $dc_test_exec 1823 gen_err_tests dc $dc_test_exec 1824fi 1825 1826# Copy the correct manuals to the expected places. 1827mkdir -p manuals 1828cp -f "$scriptdir/manuals/bc/$manpage_args.1.md" manuals/bc.1.md 1829cp -f "$scriptdir/manuals/bc/$manpage_args.1" manuals/bc.1 1830cp -f "$scriptdir/manuals/dc/$manpage_args.1.md" manuals/dc.1.md 1831cp -f "$scriptdir/manuals/dc/$manpage_args.1" manuals/dc.1 1832 1833make clean > /dev/null 1834