env: ### cirrus config CIRRUS_CLONE_DEPTH: 1 ### compiler options HOST: WRAPPER_CMD: # Specific warnings can be disabled with -Wno-error=foo. # -pedantic-errors is not equivalent to -Werror=pedantic and thus not implied by -Werror according to the GCC manual. WERROR_CFLAGS: -Werror -pedantic-errors MAKEFLAGS: -j4 BUILD: check ### secp256k1 config ECMULTWINDOW: auto ECMULTGENPRECISION: auto ASM: no WIDEMUL: auto WITH_VALGRIND: yes EXTRAFLAGS: ### secp256k1 modules EXPERIMENTAL: no ECDH: no RECOVERY: no SCHNORRSIG: no ELLSWIFT: no ### test options SECP256K1_TEST_ITERS: BENCH: yes SECP256K1_BENCH_ITERS: 2 CTIMETESTS: yes # Compile and run the tests EXAMPLES: yes # https://cirrus-ci.org/pricing/#compute-credits credits_snippet: &CREDITS # Don't use any credits for now. use_compute_credits: false cat_logs_snippet: &CAT_LOGS always: cat_tests_log_script: - cat tests.log || true cat_noverify_tests_log_script: - cat noverify_tests.log || true cat_exhaustive_tests_log_script: - cat exhaustive_tests.log || true cat_ctime_tests_log_script: - cat ctime_tests.log || true cat_bench_log_script: - cat bench.log || true cat_config_log_script: - cat config.log || true cat_test_env_script: - cat test_env.log || true cat_ci_env_script: - env linux_container_snippet: &LINUX_CONTAINER container: dockerfile: ci/linux-debian.Dockerfile # Reduce number of CPUs to be able to do more builds in parallel. cpu: 1 # Gives us more CPUs for free if they're available. greedy: true # More than enough for our scripts. memory: 2G task: name: "x86_64: Linux (Debian stable)" << : *LINUX_CONTAINER matrix: - env: {WIDEMUL: int64, RECOVERY: yes} - env: {WIDEMUL: int64, ECDH: yes, SCHNORRSIG: yes, ELLSWIFT: yes} - env: {WIDEMUL: int128} - env: {WIDEMUL: int128_struct, ELLSWIFT: yes} - env: {WIDEMUL: int128, RECOVERY: yes, SCHNORRSIG: yes, ELLSWIFT: yes} - env: {WIDEMUL: int128, ECDH: yes, SCHNORRSIG: yes} - env: {WIDEMUL: int128, ASM: x86_64 , ELLSWIFT: yes} - env: { RECOVERY: yes, SCHNORRSIG: yes} - env: {CTIMETESTS: no, RECOVERY: yes, ECDH: yes, SCHNORRSIG: yes, CPPFLAGS: -DVERIFY} - env: {BUILD: distcheck, WITH_VALGRIND: no, CTIMETESTS: no, BENCH: no} - env: {CPPFLAGS: -DDETERMINISTIC} - env: {CFLAGS: -O0, CTIMETESTS: no} - env: {CFLAGS: -O1, RECOVERY: yes, ECDH: yes, SCHNORRSIG: yes, ELLSWIFT: yes} - env: { ECMULTGENPRECISION: 2, ECMULTWINDOW: 2 } - env: { ECMULTGENPRECISION: 8, ECMULTWINDOW: 4 } matrix: - env: CC: gcc - env: CC: clang - env: CC: gcc-snapshot - env: CC: clang-snapshot test_script: - ./ci/cirrus.sh << : *CAT_LOGS task: name: "i686: Linux (Debian stable)" << : *LINUX_CONTAINER env: HOST: i686-linux-gnu ECDH: yes RECOVERY: yes SCHNORRSIG: yes matrix: - env: CC: i686-linux-gnu-gcc - env: CC: clang --target=i686-pc-linux-gnu -isystem /usr/i686-linux-gnu/include test_script: - ./ci/cirrus.sh << : *CAT_LOGS task: name: "arm64: macOS Ventura" macos_instance: image: ghcr.io/cirruslabs/macos-ventura-base:latest env: HOMEBREW_NO_AUTO_UPDATE: 1 HOMEBREW_NO_INSTALL_CLEANUP: 1 # Cirrus gives us a fixed number of 4 virtual CPUs. Not that we even have that many jobs at the moment... MAKEFLAGS: -j5 env: ASM: no WITH_VALGRIND: no CTIMETESTS: no CC: clang matrix: - env: {WIDEMUL: int64, RECOVERY: yes, ECDH: yes, SCHNORRSIG: yes, ELLSWIFT: yes} - env: {WIDEMUL: int64, RECOVERY: yes, ECDH: yes, SCHNORRSIG: yes, ELLSWIFT: yes, CC: gcc} - env: {WIDEMUL: int128_struct, ECMULTGENPRECISION: 2, ECMULTWINDOW: 4} - env: {WIDEMUL: int128, ECDH: yes, SCHNORRSIG: yes, ELLSWIFT: yes} - env: {WIDEMUL: int128, RECOVERY: yes, SCHNORRSIG: yes} - env: {WIDEMUL: int128, RECOVERY: yes, ECDH: yes, SCHNORRSIG: yes, ELLSWIFT: yes, CC: gcc} - env: {WIDEMUL: int128, RECOVERY: yes, ECDH: yes, SCHNORRSIG: yes, ELLSWIFT: yes, CPPFLAGS: -DVERIFY} - env: {BUILD: distcheck} brew_script: - brew install automake libtool gcc test_script: - ./ci/cirrus.sh << : *CAT_LOGS << : *CREDITS task: name: "s390x (big-endian): Linux (Debian stable, QEMU)" << : *LINUX_CONTAINER env: WRAPPER_CMD: qemu-s390x SECP256K1_TEST_ITERS: 16 HOST: s390x-linux-gnu WITH_VALGRIND: no ECDH: yes RECOVERY: yes SCHNORRSIG: yes ELLSWIFT: yes CTIMETESTS: no test_script: # https://sourceware.org/bugzilla/show_bug.cgi?id=27008 - rm /etc/ld.so.cache - ./ci/cirrus.sh << : *CAT_LOGS task: name: "ARM32: Linux (Debian stable, QEMU)" << : *LINUX_CONTAINER env: WRAPPER_CMD: qemu-arm SECP256K1_TEST_ITERS: 16 HOST: arm-linux-gnueabihf WITH_VALGRIND: no ECDH: yes RECOVERY: yes SCHNORRSIG: yes ELLSWIFT: yes CTIMETESTS: no matrix: - env: {} - env: {EXPERIMENTAL: yes, ASM: arm32} test_script: - ./ci/cirrus.sh << : *CAT_LOGS task: name: "ARM64: Linux (Debian stable, QEMU)" << : *LINUX_CONTAINER env: WRAPPER_CMD: qemu-aarch64 SECP256K1_TEST_ITERS: 16 HOST: aarch64-linux-gnu WITH_VALGRIND: no ECDH: yes RECOVERY: yes SCHNORRSIG: yes ELLSWIFT: yes CTIMETESTS: no test_script: - ./ci/cirrus.sh << : *CAT_LOGS task: name: "ppc64le: Linux (Debian stable, QEMU)" << : *LINUX_CONTAINER env: WRAPPER_CMD: qemu-ppc64le SECP256K1_TEST_ITERS: 16 HOST: powerpc64le-linux-gnu WITH_VALGRIND: no ECDH: yes RECOVERY: yes SCHNORRSIG: yes ELLSWIFT: yes CTIMETESTS: no test_script: - ./ci/cirrus.sh << : *CAT_LOGS task: << : *LINUX_CONTAINER env: WRAPPER_CMD: wine WITH_VALGRIND: no ECDH: yes RECOVERY: yes SCHNORRSIG: yes CTIMETESTS: no matrix: - name: "x86_64 (mingw32-w64): Windows (Debian stable, Wine)" env: HOST: x86_64-w64-mingw32 - name: "i686 (mingw32-w64): Windows (Debian stable, Wine)" env: HOST: i686-w64-mingw32 test_script: - ./ci/cirrus.sh << : *CAT_LOGS task: << : *LINUX_CONTAINER env: WRAPPER_CMD: wine WERROR_CFLAGS: -WX WITH_VALGRIND: no ECDH: yes RECOVERY: yes EXPERIMENTAL: yes SCHNORRSIG: yes ELLSWIFT: yes CTIMETESTS: no # Use a MinGW-w64 host to tell ./configure we're building for Windows. # This will detect some MinGW-w64 tools but then make will need only # the MSVC tools CC, AR and NM as specified below. HOST: x86_64-w64-mingw32 CC: /opt/msvc/bin/x64/cl AR: /opt/msvc/bin/x64/lib NM: /opt/msvc/bin/x64/dumpbin -symbols -headers # Set non-essential options that affect the CLI messages here. # (They depend on the user's taste, so we don't want to set them automatically in configure.ac.) CFLAGS: -nologo -diagnostics:caret LDFLAGS: -Xlinker -Xlinker -Xlinker -nologo matrix: - name: "x86_64 (MSVC): Windows (Debian stable, Wine)" - name: "x86_64 (MSVC): Windows (Debian stable, Wine, int128_struct)" env: WIDEMUL: int128_struct - name: "x86_64 (MSVC): Windows (Debian stable, Wine, int128_struct with __(u)mulh)" env: WIDEMUL: int128_struct CPPFLAGS: -DSECP256K1_MSVC_MULH_TEST_OVERRIDE - name: "i686 (MSVC): Windows (Debian stable, Wine)" env: HOST: i686-w64-mingw32 CC: /opt/msvc/bin/x86/cl AR: /opt/msvc/bin/x86/lib NM: /opt/msvc/bin/x86/dumpbin -symbols -headers test_script: - ./ci/cirrus.sh << : *CAT_LOGS # Sanitizers task: << : *LINUX_CONTAINER env: ECDH: yes RECOVERY: yes SCHNORRSIG: yes ELLSWIFT: yes CTIMETESTS: no matrix: - name: "Valgrind (memcheck)" container: cpu: 2 env: # The `--error-exitcode` is required to make the test fail if valgrind found errors, otherwise it'll return 0 (https://www.valgrind.org/docs/manual/manual-core.html) WRAPPER_CMD: "valgrind --error-exitcode=42" SECP256K1_TEST_ITERS: 2 - name: "UBSan, ASan, LSan" container: memory: 2G env: CFLAGS: "-fsanitize=undefined,address -g" UBSAN_OPTIONS: "print_stacktrace=1:halt_on_error=1" ASAN_OPTIONS: "strict_string_checks=1:detect_stack_use_after_return=1:detect_leaks=1" LSAN_OPTIONS: "use_unaligned=1" SECP256K1_TEST_ITERS: 32 # Try to cover many configurations with just a tiny matrix. matrix: - env: ASM: auto - env: ASM: no ECMULTGENPRECISION: 2 ECMULTWINDOW: 2 matrix: - env: CC: clang - env: HOST: i686-linux-gnu CC: i686-linux-gnu-gcc test_script: - ./ci/cirrus.sh << : *CAT_LOGS # Memory sanitizers task: << : *LINUX_CONTAINER name: "MSan" env: ECDH: yes RECOVERY: yes SCHNORRSIG: yes CTIMETESTS: yes CC: clang SECP256K1_TEST_ITERS: 32 ASM: no WITH_VALGRIND: no container: memory: 2G matrix: - env: CFLAGS: "-fsanitize=memory -g" - env: ECMULTGENPRECISION: 2 ECMULTWINDOW: 2 CFLAGS: "-fsanitize=memory -g -O3" test_script: - ./ci/cirrus.sh << : *CAT_LOGS task: name: "C++ -fpermissive (entire project)" << : *LINUX_CONTAINER env: CC: g++ CFLAGS: -fpermissive -g CPPFLAGS: -DSECP256K1_CPLUSPLUS_TEST_OVERRIDE WERROR_CFLAGS: ECDH: yes RECOVERY: yes SCHNORRSIG: yes ELLSWIFT: yes test_script: - ./ci/cirrus.sh << : *CAT_LOGS task: name: "C++ (public headers)" << : *LINUX_CONTAINER test_script: - g++ -Werror include/*.h - clang -Werror -x c++-header include/*.h - /opt/msvc/bin/x64/cl.exe -c -WX -TP include/*.h task: name: "sage prover" << : *LINUX_CONTAINER test_script: - cd sage - sage prove_group_implementations.sage task: name: "x86_64: Windows (VS 2022)" windows_container: image: cirrusci/windowsservercore:visualstudio2022 cpu: 4 memory: 3840MB env: PATH: '%CIRRUS_WORKING_DIR%\build\src\RelWithDebInfo;%PATH%' x64_NATIVE_TOOLS: '"C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"' # Ignore MSBuild warning MSB8029. # See: https://learn.microsoft.com/en-us/visualstudio/msbuild/errors/msb8029?view=vs-2022 IgnoreWarnIntDirInTempDetected: 'true' matrix: - env: BUILD_SHARED_LIBS: ON - env: BUILD_SHARED_LIBS: OFF git_show_script: # Print commit to allow reproducing the job outside of CI. - git show --no-patch configure_script: - '%x64_NATIVE_TOOLS%' - cmake -E env CFLAGS="/WX" cmake -A x64 -B build -DSECP256K1_ENABLE_MODULE_RECOVERY=ON -DSECP256K1_BUILD_EXAMPLES=ON -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% build_script: - '%x64_NATIVE_TOOLS%' - cmake --build build --config RelWithDebInfo -- -property:UseMultiToolTask=true;CL_MPcount=5 check_script: - '%x64_NATIVE_TOOLS%' - ctest -C RelWithDebInfo --test-dir build -j 5 - build\src\RelWithDebInfo\bench_ecmult.exe - build\src\RelWithDebInfo\bench_internal.exe - build\src\RelWithDebInfo\bench.exe