diff options
Diffstat (limited to 'contrib/bc/scripts')
-rwxr-xr-x | contrib/bc/scripts/exec-install.sh | 2 | ||||
-rwxr-xr-x | contrib/bc/scripts/format.sh | 2 | ||||
-rwxr-xr-x | contrib/bc/scripts/functions.sh | 2 | ||||
-rwxr-xr-x | contrib/bc/scripts/karatsuba.py | 2 | ||||
-rwxr-xr-x | contrib/bc/scripts/link.sh | 2 | ||||
-rwxr-xr-x | contrib/bc/scripts/lint.sh | 2 | ||||
-rwxr-xr-x | contrib/bc/scripts/locale_install.sh | 2 | ||||
-rwxr-xr-x | contrib/bc/scripts/locale_uninstall.sh | 2 | ||||
-rw-r--r-- | contrib/bc/scripts/os.c | 2 | ||||
-rw-r--r-- | contrib/bc/scripts/release.pkg.yao | 1410 | ||||
-rw-r--r-- | contrib/bc/scripts/sqrt_frac_guess.bc | 2 | ||||
-rw-r--r-- | contrib/bc/scripts/sqrt_int_guess.bc | 2 | ||||
-rw-r--r-- | contrib/bc/scripts/sqrt_random.bc | 2 | ||||
-rwxr-xr-x | contrib/bc/scripts/sqrt_random.sh | 2 |
14 files changed, 1423 insertions, 13 deletions
diff --git a/contrib/bc/scripts/exec-install.sh b/contrib/bc/scripts/exec-install.sh index 581b6bd1ed24..835b7491ac66 100755 --- a/contrib/bc/scripts/exec-install.sh +++ b/contrib/bc/scripts/exec-install.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/format.sh b/contrib/bc/scripts/format.sh index f76aed378186..e8836c6ba1e0 100755 --- a/contrib/bc/scripts/format.sh +++ b/contrib/bc/scripts/format.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/functions.sh b/contrib/bc/scripts/functions.sh index 1599fea4847e..13ccbf8f3f31 100755 --- a/contrib/bc/scripts/functions.sh +++ b/contrib/bc/scripts/functions.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/karatsuba.py b/contrib/bc/scripts/karatsuba.py index 637887986ee8..c4e0720b3408 100755 --- a/contrib/bc/scripts/karatsuba.py +++ b/contrib/bc/scripts/karatsuba.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/link.sh b/contrib/bc/scripts/link.sh index 772de27a08c2..4562677d7b38 100755 --- a/contrib/bc/scripts/link.sh +++ b/contrib/bc/scripts/link.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/lint.sh b/contrib/bc/scripts/lint.sh index 14cdc5c3afc8..611560ced31a 100755 --- a/contrib/bc/scripts/lint.sh +++ b/contrib/bc/scripts/lint.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/locale_install.sh b/contrib/bc/scripts/locale_install.sh index e891bf57db81..cec69d7201f4 100755 --- a/contrib/bc/scripts/locale_install.sh +++ b/contrib/bc/scripts/locale_install.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/locale_uninstall.sh b/contrib/bc/scripts/locale_uninstall.sh index 1bf292b801e6..274b6bcf49f1 100755 --- a/contrib/bc/scripts/locale_uninstall.sh +++ b/contrib/bc/scripts/locale_uninstall.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/os.c b/contrib/bc/scripts/os.c index 212a61772ccf..89c5b1b95b3f 100644 --- a/contrib/bc/scripts/os.c +++ b/contrib/bc/scripts/os.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/release.pkg.yao b/contrib/bc/scripts/release.pkg.yao new file mode 100644 index 000000000000..525709c28164 --- /dev/null +++ b/contrib/bc/scripts/release.pkg.yao @@ -0,0 +1,1410 @@ +/** + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +PROG: str = path.realpath(sys.program); +REAL: str = path.realpath(PROG +~ ".."); + +SCRIPTDIR: str = path.dirname(PROG); + +WINDOWS: bool = (host.os == "Windows"); + +DEFOPT: str = if WINDOWS { "/D"; } else { "-D"; }; +C11OPT: str = if WINDOWS { "/std:c11"; } else { "-std=c11"; }; +C99OPT: str = if WINDOWS { "/std:c99"; } else { "-std=c99"; }; + +/** + * Turns a string array into a string by joining all strings together with + * spaces. + * @param arr The array to join. + * @return The joined array. + */ +fn strv2str(arr: []str) -> str +{ + ret: !str = ""; + + for item: arr + { + if ret == "" + { + ret! = item; + } + else + { + ret! = ret +~ " " +~ item; + } + } + + return ret; +} + +opts: Gaml = @(gaml){ + help: [ + "Runs the testing part of the release process.\n" + "\n" + "Usage: ", $PROG, " [-h|--help] [<options> \n" + ] + options: { + no64: { + help: "Turn off building and testing 64-bit builds." + long: @no-64 + type: @NONE + } + no128: { + help: "Turn off building and testing builds with 128-bit integers." + long: @no-128 + type: @NONE + } + C: { + help: "Turn off building under Clang." + short: @C + long: @no-clang + type: @NONE + } + C11: { + help: "Turn off building under C11." + long: @no-c11 + type: @NONE + } + G: { + help: "Turn off building under GCC." + short: @G + long: @no-gcc + type: @NONE + } + GEN: { + help: "Turn off running the gen script." + short: @G + long: @no-gen-script + type: @NONE + } + MAKE: { + help: "Turn off running the build with `configure.sh` and `make`." + long: @no-make + type: @NONE + } + RIG: { + help: "Turn off running the build with Rig." + long: @no-rig + type: @NONE + } + T: { + help: "Turn off running tests." + short: @T + long: @no-tests + type: @NONE + } + computed-goto: { + help: "Whether to test with computed goto or not." + long: @computed-goto + type: @NONE + } + e: { + help: "Whether to test with editline or not." + short: @e + long: @editline + type: @NONE + } + g: { + help: "Whether generate tests that are generated or not." + short: @g + long: @generate + type: @NONE + } + history: { + help: "Whether to test with history or not." + long: @history + type: @NONE + } + k: { + help: "Whether to run the Karatsuba tests or not." + short: @k + long: @karatsuba + type: @NONE + } + p: { + help: "Whether to run problematic tests or not." + short: @p + long: @problematic-tests + type: @NONE + } + r: { + help: "Whether to test with readline or not." + short: @r + long: @readline + type: @NONE + } + s: { + help: "Whether to run tests under sanitizers or not." + short: @s + long: @sanitizers + type: @NONE + } + settings: { + help: "Whether to test settings or not." + long: @settings + type: @NONE + } + v: { + help: "Whether to run under Valgrind or not." + short: @v + long: @valgrind + type: @NONE + } + } +}; + +// These are the booleans for the command-line flags. +no64: !bool = false; +no128: !bool = false; +clang: !bool = true; +c11: !bool = true; +gcc: !bool = true; +gen_host: !bool = true; +run_make: !bool = !WINDOWS; +run_rig: !bool = true; +tests: !bool = true; +computed_goto: !bool = false; +editline: !bool = false; +generated: !bool = false; +history: !bool = false; +karatsuba: !bool = false; +problematic: !bool = false; +readline: !bool = false; +sanitizers: !bool = false; +settings: !bool = false; +valgrind: !bool = false; + +defcc: str = if clang { "clang"; } else if gcc { "gcc"; } else { "c99"; }; +defbits: usize = if no64 { usize(32); } else { usize(64); }; + +cgoto_flags: []str = if !computed_goto { @[ "-DBC_NO_COMPUTED_GOTO" ]; }; + +// Set some strict warning flags. Clang's -Weverything can be way too strict, so +// we actually have to turn off some things. +CLANG_FLAGS: []str = @[ "-Weverything", "-Wno-padded", + "-Wno-unsafe-buffer-usage", + "-Wno-poison-system-directories", + "-Wno-switch-default", "-Wno-unknown-warning-option", + "-Wno-pre-c11-compat" ] +~ cgoto_flags; +GCC_FLAGS: []str = @[ "-Wno-clobbered" ] +~ cgoto_flags; + +CLANG_FLAGS_STR: str = strv2str(CLANG_FLAGS); + +GCC_FLAGS_STR: str = strv2str(GCC_FLAGS); + +// Common CFLAGS. +CFLAGS: []str = @[ "-Wall", "-Wextra", "-Werror", "-pedantic" ]; + +CFLAGS_STR: str = strv2str(CFLAGS); + +// Common debug and release flags. +DEBUG_CFLAGS: []str = CFLAGS +~ @[ "-fno-omit-frame-pointer" ]; +DEBUG_CFLAGS_STR: str = CFLAGS_STR +~ " -fno-omit-frame-pointer"; +RELEASE_CFLAGS: []str = CFLAGS +~ @[ "-DNDEBUG" ]; +RELEASE_CFLAGS_STR: str = CFLAGS_STR +~ " -DNDEBUG"; + +/** + * Print a header with a message. This is just to make it easy to track + * progress. + * @param msg The message to print in the header. + */ +fn header(msg: str) -> void +{ + io.eprint("\n*******************\n"); + io.eprint(msg); + io.eprint("\n*******************\n\n"); +} + +/** + * An easy way to call `make`. + * @param args The arguments to pass to `make`, if any. + */ +fn do_make(args: []str) -> void +{ + $ make -j64 %(args); +} + +/** + * An easy way to call Rig. + * @param args The arguments to pass to Rig, if any. + */ +fn do_rig(args: []str) -> void +{ + $ rig -j64 %(args); +} + +/** + * Runs `configure.sh`. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + * @param gen The setting for `GEN_HOST`. + * @param long_bit The number of bits in longs. + */ +fn configure( + cflags: str, + cc: str, + flags: str, + gen: bool, + long_bit: usize +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + extra_flags: str = + if !generated + { + if !problematic { "-GP"; } else { "-G"; } + } + else if !problematic + { + "-P"; + }; + + extra_cflags: str = + if cc == "clang" + { + // We need to quiet this warning from Clang because the configure.sh + // docs have this warning, so people should know. Also, I want this + // script to work. + CLANG_FLAGS_STR +~ (if !gen_host { " -Wno-overlength-strings"; }); + } + else if cc == "gcc" + { + // We need to quiet this warning from GCC because the configure.sh docs + // have this warning, so people should know. Also, I want this script to + // work. + GCC_FLAGS_STR +~ (if !gen_host { "-Wno-overlength-strings"; }); + }; + + all_flags: str = flags +~ " " +~ extra_flags; + all_cflags: str = cflags +~ " " +~ extra_cflags; + + hdr := "Running configure.sh " +~ all_flags +~ + "..." +~ + "\n CC=\"" +~ cc +~ "\"\n" +~ + "\n CFLAGS=\"" +~ all_cflags +~ "\"\n" +~ + "\n LONG_BIT=" +~ str(long_bit) +~ + "\n GEN_HOST=" +~ str(gen); + + // Print the header and do the job. + header(hdr); + + env.set env.str("CFLAGS", str(cflags +~ extra_cflags)), + env.str("CC", cc), env.str("GEN_HOST", str(gen)), + env.str("LONG_BIT", str(long_bit)) + { + $ @(path.join(REAL, "configure.sh")) $flags $extra_flags > /dev/null + !> /dev/null; + } +} + +/** + * Build with `make`. This function also captures and outputs any warnings if + * they exist because as far as I am concerned, warnings are not acceptable for + * release. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + * @param gen The setting for `GEN_HOST`. + * @param long_bit The number of bits in longs. + */ +fn build_make( + cflags: str, + cc: str, + flags: str, + gen: bool, + long_bit: usize +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + configure(cflags, cc, flags, gen, long_bit); + + hdr := "Building with `make`...\n CC=" +~ cc +~ + "\n CFLAGS=\"" +~ cflags +~ + "\n LONG_BIT=" +~ str(long_bit) +~ + "\n GEN_HOST=" +~ str(gen); + + header(hdr); + + res := $ make; + + if res.stderr.len != 0 + { + io.eprint(cc +~ "generated warning(s):\n\n"); + io.eprint(str(res.stderr)); + sys.exit(1); + } + + if res.exitcode != 0 + { + sys.exit(res.exitcode); + } +} + +/** + * Build with Rig. This function also captures and outputs any warnings if they + * exist because as far as I am concerned, warnings are not acceptable for + * release. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + * @param long_bit The number of bits in longs. + */ +fn build_rig( + cflags: []str, + cc: str, + flags: []str, + long_bit: usize +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + cflags_str: str = strv2str(cflags); + + hdr := "Building with Rig...\n CC=" +~ cc +~ + "\n CFLAGS=\"" +~ cflags_str +~ + "\n LONG_BIT=" +~ str(long_bit); + + header(hdr); + + res := $ rig; + + if res.stderr.len != 0 + { + io.eprint(cc +~ "generated warning(s):\n\n"); + io.eprint(str(res.stderr)); + sys.exit(1); + } + + if res.exitcode != 0 + { + sys.exit(res.exitcode); + } +} + +/** + * Run tests with `make`. + * @param args Any arguments to pass to `make`, if any. + */ +fn run_test_make(args: []str) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + header("Running `make` tests"); + + if args.len > 0 + { + do_make(args); + } + else + { + do_make(@[ "test" ]); + + if history + { + do_make(@[ "test_history" ]); + } + } +} + +/** + * Run tests with Rig. + * @param args Any arguments to pass to Rig, if any. + */ +fn run_test_rig(args: []str) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + header("Running Rig tests"); + + if args.len > 0 + { + do_rig(args); + } + else + { + do_rig(@[ "test" ]); + + if history + { + do_rig(@[ "test_history" ]); + } + } +} + +/** + * Builds and runs tests using `make` with both calculators, then bc only, then + * dc only. If `tests` is false, then it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + * @param gen The setting for `GEN_HOST`. + * @param long_bit The number of bits in longs. + */ +fn run_config_tests_make( + cflags: str, + cc: str, + flags: str, + gen: bool, + long_bit: usize, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + header_start: str = + if tests + { + "Running tests with configure flags and `make`"; + } + else + { + "Building with configure flags and `make`"; + }; + + header("\"" +~ header_start +~ "\" ...\n" +~ + " CC=" +~ cc +~ "\n" +~ + " CFLAGS=\"" +~ cflags +~ "\"\n" +~ + " LONG_BIT=" +~ str(long_bit) +~ "\n" +~ + " GEN_HOST=" +~ str(gen)); + + build_make(cflags, cc, flags, gen, long_bit); + + if tests + { + run_test_make(@[]); + } + + do_make(@[ "clean" ]); + + build_make(cflags, cc, flags +~ " -b", gen, long_bit); + + if tests + { + run_test_make(@[]); + } + + do_make(@[ "clean" ]); + + build_make(cflags, cc, flags +~ " -d", gen, long_bit); + + if tests + { + run_test_make(@[]); + } + + do_make(@[ "clean" ]); +} + +/** + * Builds and runs tests using Rig with both calculators, then bc only, then dc + * only. If `tests` is false, then it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + * @param long_bit The number of bits in longs. + */ +fn run_config_tests_rig( + cflags: []str, + cc: str, + flags: []str, + long_bit: usize, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + header_start: str = + if tests + { + "Running tests with Rig"; + } + else + { + "Building with Rig"; + }; + + header("\"" +~ header_start +~ "\" ...\n" +~ + " CC=" +~ cc +~ "\n" +~ + " CFLAGS=\"" +~ strv2str(cflags) +~ "\"\n" +~ + " flags=\"" +~ strv2str(flags) +~ "\"\n" +~ + " LONG_BIT=" +~ str(long_bit)); + + build_rig(cflags, cc, flags, long_bit); + + if tests + { + run_test_rig(@[]); + } + + do_rig(@[ "clean" ]); + + build_rig(cflags, cc, flags +~ @[ "-Dbuild_mode=bc" ], long_bit); + + if tests + { + run_test_rig(@[]); + } + + do_rig(@[ "clean" ]); + + build_rig(cflags, cc, flags +~ @[ "-Dbuild_mode=dc" ], long_bit); + + if tests + { + run_test_rig(@[]); + } + + do_rig(@[ "clean" ]); +} + +/** + * Builds and runs tests using `run_config_tests_make()` with both calculators, + * then bc only, then dc only. If `tests` is false, then it just does the + * builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + */ +fn run_config_series_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + if !no64 + { + if !no128 + { + run_config_tests_make(cflags, cc, flags, true, usize(64)); + } + + if gen_host + { + run_config_tests_make(cflags, cc, flags, false, usize(64)); + } + + run_config_tests_make(cflags +~ " " +~ DEFOPT +~ "BC_RAND_BUILTIN=0", + cc, flags, true, usize(64)); + + // Test Editline if history is not turned off. + if editline && !(flags contains "H") + { + run_config_tests_make(cflags +~ " " +~ DEFOPT +~ + "BC_RAND_BUILTIN=0", + cc, flags +~ " -e", true, usize(64)); + } + + // Test Readline if history is not turned off. + if readline && !(flags contains "H") + { + run_config_tests_make(cflags +~ " " +~ DEFOPT +~ + "BC_RAND_BUILTIN=0", + cc, flags +~ " -r", true, usize(64)); + } + } + + run_config_tests_make(cflags, cc, flags, true, usize(32)); + + if gen_host + { + run_config_tests_make(cflags, cc, flags, false, usize(32)); + } +} + +/** + * Builds and runs tests using `run_config_tests_rig()` with both calculators, + * then bc only, then dc only. If `tests` is false, then it just does the + * builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_config_series_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + if !no64 + { + if !no128 + { + run_config_tests_rig(cflags, cc, flags, usize(64)); + } + + run_config_tests_rig(cflags +~ @[ DEFOPT +~ "BC_RAND_BUILTIN=0" ], cc, + flags, usize(64)); + + // Test Editline if history is not turned off. + if editline && !(flags contains "-Dhistory=none") + { + run_config_tests_rig(cflags +~ @[ DEFOPT +~ "BC_RAND_BUILTIN=0" ], + cc, flags +~ @[ "-Dhistory=editline" ], + usize(64)); + } + + // Test Readline if history is not turned off. + if readline && !(flags contains "-Dhistory=none") + { + run_config_tests_rig(cflags +~ @[ DEFOPT +~ "BC_RAND_BUILTIN=0" ], + cc, flags +~ @[ "-Dhistory=readline" ], + usize(64)); + } + } + + run_config_tests_rig(cflags, cc, flags, usize(32)); +} + +/** + * Builds and runs tests with each setting combo running + * `run_config_series_make()`. If `tests` is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + */ +fn run_settings_series_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + if settings + { + settings_path: str = path.join(SCRIPTDIR, "release_settings_make.txt"); + settings_txt: str = io.read_file(settings_path); + lines: []str = settings_txt.split("\n"); + + for line: lines + { + run_config_series_make(cflags, cc, flags +~ " " +~ line); + } + } + else + { + run_config_series_make(cflags, cc, flags); + } +} + +/** + * Builds and runs tests with each setting combo running + * `run_config_series_rig()`. If `tests` is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_settings_series_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + if settings + { + settings_path: str = path.join(SCRIPTDIR, "release_settings_rig.txt"); + settings_txt: str = io.read_file(settings_path); + lines: []str = settings_txt.split("\n"); + + for line: lines + { + opts_list: []str = + for opt: line.split(" ") + { + DEFOPT +~ opt; + }; + + run_config_series_rig(cflags, cc, flags +~ opts_list); + } + } + else + { + run_config_series_rig(cflags, cc, flags); + } +} + +/** + * Builds and runs tests with each build type running + * `run_settings_series_make()`. If `tests` is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + */ +fn run_test_series_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + series_flags: []str = @[ "E", "H", "N", "EH", "EN", "HN", "EHN" ]; + + run_settings_series_make(cflags, cc, flags); + + for sflag: series_flags + { + run_settings_series_make(cflags, cc, flags +~ " -" +~ sflag); + } +} + +/** + * Builds and runs tests with each build type running + * `run_settings_series_rig()`. If `tests` is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_test_series_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + series_path: str = path.join(SCRIPTDIR, "release_flags_rig.txt"); + series_txt: str = io.read_file(series_path); + series_flags: []str = series_txt.split("\n"); + + run_settings_series_rig(cflags, cc, flags); + + for line: series_flags + { + opts_list: []str = + for opt: line.split(" ") + { + DEFOPT +~ opt; + }; + + run_settings_series_rig(cflags, cc, flags +~ opts_list); + } +} + +/** + * Builds and runs tests for `bcl` with `make`. If `tests` is false, it just + * does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + */ +fn run_lib_tests_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + build_make(cflags +~ " -a", cc, flags, true, usize(64)); + + if tests + { + run_test_make(@[ "test" ]); + } + + build_make(cflags +~ " -a", cc, flags, true, usize(32)); + + if tests + { + run_test_make(@[ "test" ]); + } +} + +/** + * Builds and runs tests for `bcl` with Rig. If `tests` is false, it just does + * the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_lib_tests_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + build_rig(cflags, cc, flags +~ @[ "-Dbuild_mode=library" ], usize(64)); + + if tests + { + run_test_rig(@[ "test" ]); + } + + build_rig(cflags, cc, flags +~ @[ "-Dbuild_mode=library" ], usize(32)); + + if tests + { + run_test_rig(@[ "test" ]); + } +} + +/** + * Builds and runs tests under C99, then C11, if requested, using + * `run_test_series_make()`. If run_tests is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_tests_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + run_test_series_make(cflags +~ " " +~ C99OPT, cc, flags); + + if c11 + { + run_test_series_make(cflags +~ " " +~ C11OPT, cc, flags); + } +} + +/** + * Builds and runs tests under C99, then C11, if requested, using + * `run_test_series_rig()`. If run_tests is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_tests_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + run_test_series_rig(cflags +~ @[ C99OPT ], cc, flags); + + if c11 + { + run_test_series_rig(cflags +~ @[ C11OPT ], cc, flags); + } +} + +/** + * Runs the Karatsuba tests with `make`. + */ +fn karatsuba_make() -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + header("Running Karatsuba tests"); + + do_make(@[ "karatsuba_test" ]); +} + +/** + * Runs the Karatsuba tests with Rig. + */ +fn karatsuba_rig() -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + header("Running Karatsuba tests"); + + build_rig(RELEASE_CFLAGS, defcc, @[ "-O3" ], usize(64)); + + do_rig(@[ "karatsuba_test" ]); +} + +/** + * Builds with `make` and runs under valgrind. It runs both, bc only, then dc + * only, then the library. + */ +fn vg_make() -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + header("Running Valgrind under `make`"); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", "gcc", "-O3 -gv", true, + defbits); + run_test_make(@[ "test" ]); + + do_make(@[ "clean_config" ]); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", "gcc", "-O3 -gvb", true, + defbits); + run_test_make(@[ "test" ]); + + do_make(@[ "clean_config" ]); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", "gcc", "-O3 -gvd", true, + defbits); + run_test_make(@[ "test" ]); + + do_make(@[ "clean_config" ]); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", "gcc", "-O3 -gva", true, + defbits); + run_test_make(@[ "test" ]); + + do_make(@[ "clean_config" ]); +} + +fn vg_rig() -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + header("Running Valgrind under Rig"); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], "gcc", @[ "-O3", "-gv" ], + defbits); + run_test_rig(@[ "test" ]); + + do_rig(@[ "clean_config" ]); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], "gcc", @[ "-O3", "-gvb" ], + defbits); + run_test_rig(@[ "test" ]); + + do_rig(@[ "clean_config" ]); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], "gcc", @[ "-O3", "-gvd" ], + defbits); + run_test_rig(@[ "test" ]); + + do_rig(@[ "clean_config" ]); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], "gcc", @[ "-O3", "-gva" ], + defbits); + run_test_rig(@[ "test" ]); + + do_rig(@[ "clean_config" ]); +} + +/** + * Builds the debug series with `make` and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn debug_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + if cc == "clang" && sanitizers + { + run_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=undefined", cc, "-mg"); + } + else + { + run_tests_make(DEBUG_CFLAGS_STR, cc, "-g"); + } +} + +/** + * Builds the release series with `make` and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn release_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + run_tests_make(RELEASE_CFLAGS_STR, cc, "-O3"); + run_lib_tests_make(RELEASE_CFLAGS_STR, cc, "-O3"); +} + +/** + * Builds the release debug series with `make` and runs the tests if `tests` + * allows. + * @param cc The C compiler. + */ +fn reldebug_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + if cc == "clang" && sanitizers + { + run_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=address", cc, "-mgO3"); + run_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=memory", cc, "-mgO3"); + } + else + { + run_tests_make(DEBUG_CFLAGS_STR, cc, "-gO3"); + } + + if cc == "clang" && sanitizers + { + run_lib_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=address", cc, + "-mgO3"); + run_lib_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=memory", cc, + "-mgO3"); + } + else + { + run_lib_tests_make(DEBUG_CFLAGS_STR, cc, "-gO3"); + } +} + +/** + * Builds the min size release with `make` and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn minsize_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + run_tests_make(RELEASE_CFLAGS_STR, cc, "-Os"); + run_lib_tests_make(RELEASE_CFLAGS_STR, cc, "-Os"); +} + +/** + * Builds all sets with `make`: debug, release, release debug, and min size, and + * runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn build_set_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + debug_make(cc); + release_make(cc); + reldebug_make(cc); + minsize_make(cc); + + if karatsuba + { + karatsuba_make(); + } + + if valgrind + { + vg_make(); + } +} + +/** + * Builds the debug series with Rig and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn debug_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + if cc == "clang" && sanitizers + { + run_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=undefined" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1" ]); + } + else + { + run_tests_rig(DEBUG_CFLAGS, cc, @[ "-Ddebug=1" ]); + } +} + +/** + * Builds the release series with Rig and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn release_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + run_tests_rig(RELEASE_CFLAGS, cc, @[ "-Doptimization=3" ]); + run_lib_tests_rig(RELEASE_CFLAGS, cc, @[ "-Doptimization=3" ]); +} + +/** + * Builds the release debug series with Rig and runs the tests if `tests` + * allows. + * @param cc The C compiler. + */ +fn reldebug_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + if cc == "clang" && sanitizers + { + run_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=address" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1", "-Doptimization=3" ]); + run_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=memory" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1", "-Doptimization=3" ]); + } + else + { + run_tests_rig(DEBUG_CFLAGS, cc, @[ "-gO3" ]); + } + + if cc == "clang" && sanitizers + { + run_lib_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=address" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1", "-Doptimization=3" ]); + run_lib_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=memory" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1", "-Doptimization=3" ]); + } + else + { + run_lib_tests_rig(DEBUG_CFLAGS, cc, + @[ "-Ddebug=1", "-Doptimization=3" ]); + } +} + +/** + * Builds the min size release with Rig and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn minsize_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + run_tests_rig(RELEASE_CFLAGS, cc, @[ "-Doptimization=s" ]); + run_lib_tests_rig(RELEASE_CFLAGS, cc, @[ "-Doptimization=s" ]); +} + +/** + * Builds all sets with Rig: debug, release, release debug, and min size, and + * runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn build_set_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + debug_rig(cc); + release_rig(cc); + reldebug_rig(cc); + minsize_rig(cc); + + if karatsuba + { + karatsuba_rig(); + } + + if valgrind + { + vg_rig(); + } +} + +/** + * Builds all sets with `make` under all compilers. + */ +fn build_sets_make() -> void +{ + header("Running math library under --standard with Rig"); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", defcc, "-g", true, + defbits); + + $ bin/bc -ls << @("quit\n"); + + do_rig(@[ "clean_tests" ]); + + if clang + { + build_set_make("clang"); + } + + if gcc + { + build_set_make("gcc"); + } +} + +/** + * Builds all sets with Rig under all compilers. + */ +fn build_sets_rig() -> void +{ + header("Running math library under --standard with Rig"); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], defcc, @[ "-Ddebug=1" ], + defbits); + + $ build/bc -ls << @("quit\n"); + + do_rig(@[ "clean_tests" ]); + + if clang + { + build_set_rig("clang"); + } + + if gcc + { + build_set_rig("gcc"); + } +} + +fn build_sets() -> void +{ + if !run_make + { + build_sets_rig(); + } + else if !run_rig + { + build_sets_make(); + } + else + { + parallel.map @[ "rig", "make" ]: + (builder: str) -> void + { + if builder == "rig" + { + build_sets_rig(); + } + else if builder == "make" + { + build_sets_make(); + } + else + { + sys.panic("Bad builder: " +~ builder +~ "\n"); + } + } + } + + io.eprint("\nTests successful.\n"); +} diff --git a/contrib/bc/scripts/sqrt_frac_guess.bc b/contrib/bc/scripts/sqrt_frac_guess.bc index acbcb368d2de..4591e95a216f 100644 --- a/contrib/bc/scripts/sqrt_frac_guess.bc +++ b/contrib/bc/scripts/sqrt_frac_guess.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/sqrt_int_guess.bc b/contrib/bc/scripts/sqrt_int_guess.bc index 925b7af7e103..9fabea874aeb 100644 --- a/contrib/bc/scripts/sqrt_int_guess.bc +++ b/contrib/bc/scripts/sqrt_int_guess.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/sqrt_random.bc b/contrib/bc/scripts/sqrt_random.bc index 1f58c2e30c5d..08eeddab07a3 100644 --- a/contrib/bc/scripts/sqrt_random.bc +++ b/contrib/bc/scripts/sqrt_random.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/contrib/bc/scripts/sqrt_random.sh b/contrib/bc/scripts/sqrt_random.sh index e107ef532f6e..0f7013da0e0e 100755 --- a/contrib/bc/scripts/sqrt_random.sh +++ b/contrib/bc/scripts/sqrt_random.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: |