From 92404924908ed4ab4a77aaee9e4e734d5c921ef3 Mon Sep 17 00:00:00 2001 From: "James E. King III" Date: Mon, 26 May 2025 10:41:24 -0400 Subject: [PATCH] Update CI and README - Dependencies require C++11 so this library now does as well. - Fixed and refreshed CI. - This fixes #30. (duplicate of issue-36) - This fixes #32. (issue-32 requires C++11 due to dependencies) - This fixes #35. (issue-35 missing header in test code. - Fixed deprecated boost/bind header inclusion. --- .appveyor.yml | 92 ++++ .github/workflows/ci.yml | 461 +++++++++++++++++++++ .travis.yml | 231 ----------- README.md | 19 +- appveyor.yml | 135 ------ example/features/condition_if.cpp | 2 +- example/features/no_lambdas.cpp | 2 +- example/features/no_lambdas_local_func.cpp | 2 +- example/n1962/vector.cpp | 2 +- meta/libraries.json | 3 +- test/Jamfile.v2 | 27 +- test/call_if/equal_to.cpp | 2 +- test/call_if/false_.cpp | 2 +- test/call_if/false_void.cpp | 2 +- test/call_if/no_equal_call_if.cpp | 2 +- test/call_if/no_equal_condition_if.cpp | 2 +- test/call_if/true_.cpp | 2 +- test/call_if/true_void.cpp | 2 +- test/cmake_test/CMakeLists.txt | 22 + test/cmake_test/main.cpp | 138 ++++++ test/constructor/smoke.cpp | 2 +- test/public_function/max_args.hpp | 1 + 22 files changed, 745 insertions(+), 408 deletions(-) create mode 100644 .appveyor.yml create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml delete mode 100644 appveyor.yml create mode 100644 test/cmake_test/CMakeLists.txt create mode 100644 test/cmake_test/main.cpp diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 0000000..dcf64b2 --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,92 @@ +# Copyright 2016, 2017 Peter Dimov +# Copyright 2017 - 2019 James E. King III +# Copyright 2019 - 2021 Alexander Grund +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) + +# +# Generic Appveyor build script for boostorg repositories +# See: https://github.com/boostorg/boost-ci/ +# +# Instructions for customizing this script for your library: +# +# 1. Customize the compilers and language levels you want. +# 2. If you have more than include/, src/, test/, example/, examples/, +# benchmark/ or tools/ directories, set the environment variable DEPINST. +# For example if your build uses code in "bench/" and "fog/" directories: +# - DEPINST: --include bench --include fog +# 3. Enable pull request builds in your boostorg/ account. +# +# That's it - the script will do everything else for you. +# + +version: 1.0.{build}-{branch} + +shallow_clone: true + +branches: + only: + - master + - develop + - /bugfix\/.*/ + - /feature\/.*/ + - /fix\/.*/ + - /pr\/.*/ + +skip_commits: + files: + - LICENSE + - meta/* + - README.md + +matrix: + fast_finish: false + # Adding MAYFAIL to any matrix job allows it to fail but the build stays green: + allow_failures: + - MAYFAIL: true + +environment: + global: + B2_CI_VERSION: 1 + GIT_FETCH_JOBS: 4 + # see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties + # to use the default for a given environment, comment it out; recommend you build debug and release however: + # on Windows it is important to exercise all the possibilities, especially shared vs static, however most + # libraries that care about this exercise it in their Jamfiles... + B2_ADDRESS_MODEL: 32,64 + B2_LINK: shared,static + # B2_THREADING: threading=multi,single + B2_VARIANT: release + + matrix: + - FLAVOR: Visual Studio 2017 C++2a Strict + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + B2_CXXFLAGS: -permissive- + B2_CXXSTD: 2a + B2_TOOLSET: msvc-14.1 + + - FLAVOR: cygwin (32-bit) + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + ADDPATH: C:\cygwin\bin; + B2_ADDRESS_MODEL: 32 + B2_CXXSTD: 11 + B2_TOOLSET: gcc + + - FLAVOR: cygwin (64-bit) + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + ADDPATH: C:\cygwin64\bin; + B2_ADDRESS_MODEL: 64 + B2_CXXSTD: 11 + B2_TOOLSET: gcc + +install: + - git clone --depth 1 https://github.com/boostorg/boost-ci.git C:\boost-ci-cloned + # Copy ci folder if not testing Boost.CI + - if NOT "%APPVEYOR_PROJECT_NAME%" == "boost-ci" xcopy /s /e /q /i /y C:\boost-ci-cloned\ci .\ci + - rmdir /s /q C:\boost-ci-cloned + - ci\appveyor\install.bat + +build: off + +test_script: ci\build.bat + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..19a344d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,461 @@ +# Copyright 2020-2021 Peter Dimov +# Copyright 2021 Andrey Semashev +# Copyright 2021 Alexander Grund +# Copyright 2022-2025 James E. King III +# +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) +# +# Some jobs disabled because they run too long or fail... +# +--- +name: CI + +on: + pull_request: + push: + branches: + - master + - develop + - bugfix/** + - feature/** + - fix/** + - pr/** + paths-ignore: + - LICENSE + - meta/** + - README.md + +concurrency: + group: ${{format('{0}:{1}', github.repository, github.ref)}} + cancel-in-progress: true + +env: + GIT_FETCH_JOBS: 8 + NET_RETRY_COUNT: 5 + B2_CI_VERSION: 1 + B2_VARIANT: debug,release + B2_LINK: shared,static + LCOV_BRANCH_COVERAGE: 1 + CODECOV_NAME: Github Actions + +jobs: + posix: + defaults: + run: + shell: bash + + strategy: + fail-fast: false + matrix: + include: + # Linux, gcc + - { compiler: gcc-5, cxxstd: '11,14', os: ubuntu-latest, container: 'ubuntu:18.04' } + - { compiler: gcc-6, cxxstd: '11,14', os: ubuntu-latest, container: 'ubuntu:18.04' } + - { compiler: gcc-7, cxxstd: '11,17', os: ubuntu-latest, container: 'ubuntu:20.04' } + - { compiler: gcc-8, cxxstd: '11,17', os: ubuntu-latest, container: 'ubuntu:20.04' } + - { compiler: gcc-9, cxxstd: '11,17', os: ubuntu-latest, container: 'ubuntu:20.04' } + - { compiler: gcc-10, cxxstd: '11,20', os: ubuntu-22.04 } + - { compiler: gcc-11, cxxstd: '11,20', os: ubuntu-22.04 } + - { compiler: gcc-12, cxxstd: '11,20', os: ubuntu-22.04 } + - { compiler: gcc-13, cxxstd: '11,20', os: ubuntu-24.04 } + - { compiler: gcc-14, cxxstd: '11,2b', os: ubuntu-24.04 } + - { name: GCC w/ sanitizers, sanitize: yes, + compiler: gcc-13, cxxstd: '11,20', os: ubuntu-24.04 } + - { name: Collect coverage, coverage: yes, + compiler: gcc-13, cxxstd: '2b', os: ubuntu-24.04, install: 'g++-13-multilib', address-model: '32,64' } + + # Linux, clang + - { compiler: clang-3.9, cxxstd: '11', os: ubuntu-latest, container: 'ubuntu:18.04' } + - { compiler: clang-4.0, cxxstd: '11', os: ubuntu-latest, container: 'ubuntu:18.04' } + - { compiler: clang-5.0, cxxstd: '11,14', os: ubuntu-latest, container: 'ubuntu:18.04' } + - { compiler: clang-6.0, cxxstd: '11,14', os: ubuntu-latest, container: 'ubuntu:20.04' } + - { compiler: clang-7, cxxstd: '11,17', os: ubuntu-latest, container: 'ubuntu:20.04' } + # Note: clang-8 does not fully support C++20, so it is not compatible with some libstdc++ versions in this mode + - { compiler: clang-8, cxxstd: '11,17', os: ubuntu-latest, container: 'ubuntu:20.04' } + - { compiler: clang-9, cxxstd: '11,17', os: ubuntu-latest, container: 'ubuntu:20.04' } + - { compiler: clang-10, cxxstd: '11,20', os: ubuntu-latest, container: 'ubuntu:20.04' } + - { compiler: clang-11, cxxstd: '11,20', os: ubuntu-latest, container: 'ubuntu:20.04' } + - { compiler: clang-12, cxxstd: '11,20', os: ubuntu-latest, container: 'ubuntu:20.04' } + # Clang isn't compatible with libstdc++-13, so use the slightly older one + - { compiler: clang-13, cxxstd: '11,17', os: ubuntu-22.04, install: 'clang-13 g++-12', gcc_toolchain: 12 } + - { compiler: clang-14, cxxstd: '11,20', os: ubuntu-22.04, install: 'clang-14 g++-12', gcc_toolchain: 12 } + - { compiler: clang-15, cxxstd: '11,20', os: ubuntu-22.04, install: 'clang-15 g++-12', gcc_toolchain: 12 } + - { compiler: clang-16, cxxstd: '11,2b', os: ubuntu-24.04 } + # https://github.com/llvm/llvm-project/issues/59827: disabled 2b/23 for clang-17 with libstdc++13 in 24.04 + - { compiler: clang-17, cxxstd: '11,20', os: ubuntu-24.04 } + - { compiler: clang-18, cxxstd: '23,2c', os: ubuntu-24.04 } + + # libc++ + - { compiler: clang-6.0, cxxstd: '11,14', os: ubuntu-latest, container: 'ubuntu:18.04', stdlib: libc++, install: 'clang-6.0 libc++-dev libc++abi-dev' } + - { compiler: clang-7, cxxstd: '11,17', os: ubuntu-latest, container: 'ubuntu:20.04', stdlib: libc++, install: 'clang-7 libc++-7-dev libc++abi-7-dev' } + - { name: Clang w/ sanitizers, sanitize: yes, + compiler: clang-12, cxxstd: '11,20', os: ubuntu-latest, container: 'ubuntu:20.04', stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev' } + + - { name: MacOS w/ clang and sanitizers, + compiler: clang, cxxstd: '11', os: macos-13, sanitize: yes } + - { compiler: clang, cxxstd: '11,20', os: macos-14 } + - { compiler: clang, cxxstd: '11,2b', os: macos-15 } + + # Coverity Scan + # requires two github secrets in repo to activate; see ci/github/coverity.sh + # does not run on pull requests, only on pushes into develop and master + - { name: Coverity, coverity: yes, + compiler: clang-12, cxxstd: '20', os: ubuntu-22.04, ccache: no } + + # multiarch (bigendian testing) - does not support coverage yet and takes way too long for this library + # - { name: Big-endian, multiarch: yes, + # compiler: clang, cxxstd: '17', os: ubuntu-22.04, ccache: no, distro: fedora, edition: 34, arch: s390x } + + + timeout-minutes: 120 + runs-on: ${{matrix.os}} + container: + image: ${{matrix.container}} + volumes: + - /node20217:/node20217:rw,rshared + - ${{ startsWith(matrix.container, 'ubuntu:1') && '/node20217:/__e/node20:ro,rshared' || ' ' }} + env: {B2_USE_CCACHE: 1} + + steps: + - name: Setup environment + run: | + if [ -f "/etc/debian_version" ]; then + echo "DEBIAN_FRONTEND=noninteractive" >> $GITHUB_ENV + export DEBIAN_FRONTEND=noninteractive + fi + if [ -n "${{matrix.container}}" ] && [ -f "/etc/debian_version" ]; then + apt-get -o Acquire::Retries=$NET_RETRY_COUNT update + apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common curl + # Need (newer) git, and the older Ubuntu container may require requesting the key manually using port 80 + curl -sSL --retry ${NET_RETRY_COUNT:-5} 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xE1DD270288B4E6030699E45FA1715D88E1DF1F24' | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/git-core_ubuntu_ppa.gpg + for i in {1..${NET_RETRY_COUNT:-3}}; do sudo -E add-apt-repository -y ppa:git-core/ppa && break || sleep 10; done + apt-get -o Acquire::Retries=$NET_RETRY_COUNT update + osver=$(lsb_release -sr | cut -f1 -d.) + pkgs="g++ git xz-utils" + # Ubuntu 22+ has only Python 3 in the repos + if [ -n "$osver" ] && [ "$osver" -ge "20" ]; then + pkgs+=" python-is-python3 libpython3-dev" + else + pkgs+=" python libpython-dev" + fi + apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs + fi + # For jobs not compatible with ccache, use "ccache: no" in the matrix + if [[ "${{ matrix.ccache }}" == "no" ]]; then + echo "B2_USE_CCACHE=0" >> $GITHUB_ENV + fi + if [[ "${{ matrix.sanitize }}" == "yes" ]]; then + echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/test/suppressions.txt" >> $GITHUB_ENV + fi + git config --global pack.threads 0 + if [[ "${{matrix.container}}" == "ubuntu:1"* ]]; then + # Node 20 doesn't work with Ubuntu 16/18 glibc: https://github.com/actions/checkout/issues/1590 + curl -sL https://archives.boost.io/misc/node/node-v20.9.0-linux-x64-glibc-217.tar.xz | tar -xJ --strip-components 1 -C /node20217 + fi + + - uses: actions/checkout@v4 + with: + # For coverage builds fetch the whole history, else only 1 commit using a 'fake ternary' + fetch-depth: ${{ matrix.coverage && '0' || '1' }} + + - name: Cache ccache + uses: actions/cache@v4 + if: env.B2_USE_CCACHE + with: + path: ~/.ccache + key: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-${{github.sha}} + restore-keys: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}- + + - name: Fetch Boost.CI + uses: actions/checkout@v4 + with: + repository: boostorg/boost-ci + ref: master + path: boost-ci-cloned + + - name: Get CI scripts folder + run: | + # Copy ci folder if not testing Boost.CI + [[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci . + rm -rf boost-ci-cloned + + - name: Install packages + if: startsWith(matrix.os, 'ubuntu') + run: | + SOURCE_KEYS=("${{join(matrix.source_keys, '" "')}}") + SOURCES=("${{join(matrix.sources, '" "')}}") + # Add this by default + SOURCE_KEYS+=('http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x1E9377A2BA9EF27F') + SOURCES+=(ppa:ubuntu-toolchain-r/test) + + ci/add-apt-keys.sh "${SOURCE_KEYS[@]}" + # Initial update before adding sources required to get e.g. keys + sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update + ci/add-apt-repositories.sh "${SOURCES[@]}" + + sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update + if [[ -z "${{matrix.install}}" ]]; then + pkgs="${{matrix.compiler}}" + pkgs="${pkgs/gcc-/g++-}" + else + pkgs="${{matrix.install}}" + fi + sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs + + - name: Setup GCC Toolchain + if: matrix.gcc_toolchain + run: | + GCC_TOOLCHAIN_ROOT="$HOME/gcc-toolchain" + echo "GCC_TOOLCHAIN_ROOT=$GCC_TOOLCHAIN_ROOT" >> $GITHUB_ENV + if ! command -v dpkg-architecture; then + apt-get install -y dpkg-dev + fi + MULTIARCH_TRIPLET="$(dpkg-architecture -qDEB_HOST_MULTIARCH)" + mkdir -p "$GCC_TOOLCHAIN_ROOT" + ln -s /usr/include "$GCC_TOOLCHAIN_ROOT/include" + ln -s /usr/bin "$GCC_TOOLCHAIN_ROOT/bin" + mkdir -p "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET" + ln -s "/usr/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}" "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}" + + - name: Setup multiarch + if: matrix.multiarch + env: + BDDE_DISTRO: ${{matrix.distro}} + BDDE_EDITION: ${{matrix.edition}} + BDDE_ARCH: ${{matrix.arch}} + run: ci/github/setup_bdde.sh + + - name: Setup Boost + env: + B2_ADDRESS_MODEL: ${{matrix.address-model}} + B2_COMPILER: ${{matrix.compiler}} + B2_CXXSTD: ${{matrix.cxxstd}} + B2_SANITIZE: ${{matrix.sanitize}} + B2_STDLIB: ${{matrix.stdlib}} + # More entries can be added in the same way, see the B2_ARGS assignment in ci/enforce.sh for the possible keys. + # B2_DEFINES: ${{matrix.defines}} + # Variables set here (to non-empty) will override the top-level environment variables, e.g. + # B2_VARIANT: ${{matrix.variant}} + # Set the (B2) target(s) to build, defaults to the test folder of the current library + # Can alternatively be done like this in the build step or in the build command of the build step, e.g. `run: B2_TARGETS=libs/$SELF/doc ci/build.sh` + # B2_TARGETS: libs/foo/test//bar + run: source ci/github/install.sh + + - name: Setup coverage collection + if: matrix.coverage + run: ci/github/codecov.sh "setup" + + - name: Run tests + if: '!matrix.coverity' + run: ci/build.sh + + - name: Collect coverage + if: matrix.coverage + run: ci/codecov.sh "collect" + + - name: Upload coverage + if: matrix.coverage + uses: codecov/codecov-action@v5 + with: + fail_ci_if_error: true + disable_search: true + files: coverage.info + name: ${{env.CODECOV_NAME}} (POSIX) + token: ${{secrets.CODECOV_TOKEN}} + verbose: true + + - name: Run coverity + if: matrix.coverity && github.event_name == 'push' && (github.ref_name == 'develop' || github.ref_name == 'master') + run: ci/github/coverity.sh + env: + COVERITY_SCAN_NOTIFICATION_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }} + COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }} + + windows: + defaults: + run: + shell: cmd + strategy: + fail-fast: false + matrix: + include: + - { toolset: msvc-14.0, cxxstd: '14', addrmd: '32,64', os: windows-2019 } + - { toolset: msvc-14.2, cxxstd: '17', addrmd: '32,64', os: windows-2019 } + - { toolset: msvc-14.3, cxxstd: 'latest', addrmd: '32,64', os: windows-2022 } + - { name: Collect coverage, coverage: yes, + toolset: msvc-14.3, cxxstd: 'latest', addrmd: '64', os: windows-2022 } + # - { toolset: clang-win, cxxstd: '17,latest', addrmd: '32,64', os: windows-2022 } + - { toolset: gcc, cxxstd: '11,17', addrmd: '64', os: windows-2019 } + + runs-on: ${{matrix.os}} + + steps: + - uses: actions/checkout@v4 + + - name: Fetch Boost.CI + uses: actions/checkout@v4 + with: + repository: boostorg/boost-ci + ref: master + path: boost-ci-cloned + - name: Get CI scripts folder + run: | + REM Copy ci folder if not testing Boost.CI + if "%GITHUB_REPOSITORY%" == "%GITHUB_REPOSITORY:boost-ci=%" xcopy /s /e /q /i /y boost-ci-cloned\ci .\ci + rmdir /s /q boost-ci-cloned + + - name: Setup Boost + run: ci\github\install.bat + + - name: Run tests + if: '!matrix.coverage' + run: ci\build.bat + env: + B2_TOOLSET: ${{matrix.toolset}} + B2_CXXSTD: ${{matrix.cxxstd}} + B2_ADDRESS_MODEL: ${{matrix.addrmd}} + + - name: Collect coverage + shell: powershell + if: matrix.coverage + run: ci\opencppcoverage.ps1 + env: + B2_TOOLSET: ${{matrix.toolset}} + B2_CXXSTD: ${{matrix.cxxstd}} + B2_ADDRESS_MODEL: ${{matrix.addrmd}} + + - name: Upload coverage + if: matrix.coverage + uses: codecov/codecov-action@v5 + with: + disable_search: true + fail_ci_if_error: true + files: __out/cobertura.xml + name: github-actions + token: ${{secrets.CODECOV_TOKEN}} + verbose: true + + MSYS2: + defaults: + run: + shell: msys2 {0} + strategy: + fail-fast: false + matrix: + include: + - { sys: MINGW32, compiler: gcc, cxxstd: '11' } + - { sys: MINGW64, compiler: gcc, cxxstd: '11' } + + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup MSYS2 environment + uses: msys2/setup-msys2@v2 + with: + msystem: ${{matrix.sys}} + update: true + install: git python + pacboy: gcc:p cmake:p ninja:p + + - name: Fetch Boost.CI + uses: actions/checkout@v4 + with: + repository: boostorg/boost-ci + ref: master + path: boost-ci-cloned + - name: Get CI scripts folder + run: | + # Copy ci folder if not testing Boost.CI + [[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci . + rm -rf boost-ci-cloned + + - name: Setup Boost + env: + B2_COMPILER: ${{matrix.compiler}} + B2_CXXSTD: ${{matrix.cxxstd}} + B2_SANITIZE: ${{matrix.sanitize}} + B2_STDLIB: ${{matrix.stdlib}} + run: ci/github/install.sh + + - name: Run tests + run: ci/build.sh + + # Run also the CMake tests to avoid having to setup another matrix for CMake on MSYS + - name: Run CMake tests + run: | + cd "$BOOST_ROOT" + mkdir __build_cmake_test__ && cd __build_cmake_test__ + cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=ON -DBoost_VERBOSE=ON .. + cmake --build . --target tests --config Debug -j$B2_JOBS + ctest --output-on-failure --build-config Debug + + CMake: + defaults: + run: + shell: bash + + strategy: + fail-fast: false + matrix: + include: + - { os: ubuntu-22.04, build_shared: ON, build_type: Debug, generator: 'Unix Makefiles' } + - { os: ubuntu-22.04, build_shared: OFF, build_type: Debug, generator: 'Unix Makefiles' } + # - { os: windows-2019, build_shared: ON, build_type: Debug, generator: 'Visual Studio 16 2019' } + - { os: windows-2019, build_shared: OFF, build_type: Debug, generator: 'Visual Studio 16 2019' } + + timeout-minutes: 120 + runs-on: ${{matrix.os}} + + steps: + - uses: actions/checkout@v4 + - name: Fetch Boost.CI + uses: actions/checkout@v4 + with: + repository: boostorg/boost-ci + ref: master + path: boost-ci-cloned + - name: Get CI scripts folder + run: | + # Copy ci folder if not testing Boost.CI + [[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci . + rm -rf boost-ci-cloned + - name: Setup Boost + env: {B2_DONT_BOOTSTRAP: 1} + run: source ci/github/install.sh + + - name: Run CMake tests + run: | + cd "$BOOST_ROOT" + mkdir __build_cmake_test__ && cd __build_cmake_test__ + cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DBUILD_TESTING=ON -DBoost_VERBOSE=ON .. + cmake --build . --target tests --config ${{matrix.build_type}} -j$B2_JOBS + ctest --output-on-failure --build-config ${{matrix.build_type}} + + - name: Run CMake subdir tests + run: | + cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder + [ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_subdir_test" + cd "$cmake_test_folder" + mkdir __build_cmake_subdir_test__ && cd __build_cmake_subdir_test__ + cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=OFF -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} .. + cmake --build . --config ${{matrix.build_type}} -j$B2_JOBS + ctest --output-on-failure --build-config ${{matrix.build_type}} + + - name: Install Library + run: | + cd "$BOOST_ROOT" + mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__ + cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_INSTALL_PREFIX=~/.local -DBoost_VERBOSE=ON -DBoost_DEBUG=ON .. + cmake --build . --target install --config ${{matrix.build_type}} -j$B2_JOBS + - name: Run CMake install tests + run: | + cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder + [ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_install_test" + cd "$cmake_test_folder" + mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__ + cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_PREFIX_PATH=~/.local .. + cmake --build . --config ${{matrix.build_type}} -j$B2_JOBS + ctest --output-on-failure --build-config ${{matrix.build_type}} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0cae784..0000000 --- a/.travis.yml +++ /dev/null @@ -1,231 +0,0 @@ -# Copyright 2016 Peter Dimov -# Copyright 2017 - 2019 James E. King III -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) - -# -# Generic Travis CI build script for boostorg repositories -# See: https://github.com/boostorg/boost-ci -# -# Instructions for customizing this script for your library: -# -# 1. Customize the compilers and language levels you want in the 'jobs'. -# 2. If you have more than include/, src/, test/, example/, examples/, or -# tools/ directories, modify your Travis CI project and add the environment -# variable DEPINST. For example if your build uses code in "bench/" and -# "fog/" directories, then set DEPINST to the following: -# --include bench --include fog -# 3. If you want to enable Coverity Scan, you need to provide the environment -# variables COVERITY_SCAN_TOKEN and COVERITY_SCAN_NOTIFICATION_EMAIL in -# your github settings. -# 4. Enable pull request builds in your boostorg/ account. -# -# That's it - the scripts will do everything else for you. -# - -# -# Contract Specific Customizations: -# -# - The test suite is long, so we test one cxxstd at a time. -# - The test suite is long, so we test one variant at a time. -# (most builds are release except for codecov, ubsan, valgrind, etc..) -# - -dist: xenial -language: cpp - -env: - global: - # see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties - # to use the default for a given environment, comment it out; recommend you build debug and release however.. - # - B2_ADDRESS_MODEL=address-model=64,32 - # - B2_LINK=link=shared,static - # - B2_THREADING=threading=multi,single - - B2_VARIANT=variant=release - -install: - - git clone https://github.com/boostorg/boost-ci.git boost-ci - - cp -pr boost-ci/ci boost-ci/.codecov.yml . - - source ci/travis/install.sh - -addons: - apt: - packages: - - binutils-gold - - gdb - - libc6-dbg - -branches: - only: - - master - - develop - - /bugfix\/.*/ - - /feature\/.*/ - - /fix\/.*/ - - /pr\/.*/ - -script: - - cd $BOOST_ROOT/libs/$SELF - - ci/travis/build.sh - -# -# Default toolsets in Ubuntu -# -# trusty xenial bionic -# 14.04 16.04 18.04 -# ------ ------ ------ -# clang 3.4 3.8 6.0 -# gcc 4.8.2 5.3.1 7.3.0 -# - -anchors: - clang-38: &clang-38 { apt: { packages: [ "clang-3.8", - "libstdc++-6-dev" ], sources: [ "llvm-toolchain-xenial-3.8", - "ubuntu-toolchain-r-test" ] } } - clang-4: &clang-4 { apt: { packages: [ "clang-4.0", - "libstdc++-6-dev" ], sources: [ "llvm-toolchain-xenial-4.0", - "ubuntu-toolchain-r-test" ] } } - clang-5: &clang-5 { apt: { packages: [ "clang-5.0", - "libstdc++-7-dev" ], sources: [ "llvm-toolchain-xenial-5.0", - "ubuntu-toolchain-r-test" ] } } - clang-6: &clang-6 { apt: { packages: [ "clang-6.0", - "libc6-dbg", - "libc++-dev", - "libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-6.0", - "ubuntu-toolchain-r-test" ] } } - clang-7: &clang-7 { apt: { packages: [ "clang-7", - "libc6-dbg", - "libc++-dev", - "libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-7", - "ubuntu-toolchain-r-test" ] } } - clang-8: &clang-8 { apt: { packages: [ "clang-8", - "libc6-dbg", - "libc++-dev", - "libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-8", - "ubuntu-toolchain-r-test" ] } } - gcc-48: &gcc-48 { apt: { packages: [ "g++-4.8" ] } } - gcc-49: &gcc-49 { apt: { packages: [ "g++-4.9" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-5: &gcc-5 { apt: { packages: [ "g++-5" ] } } - gcc-6: &gcc-6 { apt: { packages: [ "g++-6" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-7: &gcc-7 { apt: { packages: [ "g++-7" ], sources: [ "ubuntu-toolchain-r-test" ] } } - gcc-8: &gcc-8 { apt: { packages: [ "g++-8" ], sources: [ "ubuntu-toolchain-r-test" ] } } - -jobs: - allow_failures: - - env: - # https://github.com/boostorg/contract/issues/18 - - COMMENT=valgrind - - B2_VARIANT=variant=debug - - B2_TOOLSET=clang-6.0 - - B2_CXXSTD=11 - - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1" - - B2_TESTFLAGS=testing.launcher=valgrind - - VALGRIND_OPTS=--error-exitcode=1 - - env: - # https://github.com/boostorg/contract/issues/14 - - B2_TOOLSET=gcc-4.8 - - B2_CXXSTD=11 - - env: - # https://github.com/boostorg/contract/issues/14 - - B2_TOOLSET=gcc-4.9 - - B2_CXXSTD=11 - - include: - # libstdc++ - - { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI - env: [ "B2_TOOLSET=gcc-4.8", "B2_CXXSTD=03" ], addons: *gcc-48 } - - { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI - env: [ "B2_TOOLSET=gcc-4.8", "B2_CXXSTD=11" ], addons: *gcc-48 } - - { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI - env: [ "B2_TOOLSET=gcc-4.9", "B2_CXXSTD=11" ], addons: *gcc-49 } - - { os: "linux", env: [ "B2_TOOLSET=gcc-5", "B2_CXXSTD=11" ], addons: *gcc-5 } - - { os: "linux", env: [ "B2_TOOLSET=gcc-6", "B2_CXXSTD=14" ], addons: *gcc-6 } - - { os: "linux", env: [ "B2_TOOLSET=gcc-7", "B2_CXXSTD=17" ], addons: *gcc-7 } - - { os: "linux", env: [ "B2_TOOLSET=gcc-8", "B2_CXXSTD=2a" ], addons: *gcc-8 } - - { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI - env: [ "B2_TOOLSET=clang-3.8", "B2_CXXSTD=03" ], addons: *clang-38 } - - { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI - env: [ "B2_TOOLSET=clang-3.8", "B2_CXXSTD=11" ], addons: *clang-38 } - - { os: "linux", env: [ "B2_TOOLSET=clang-4.0", "B2_CXXSTD=11" ], addons: *clang-4 } - - { os: "linux", env: [ "B2_TOOLSET=clang-5.0", "B2_CXXSTD=14" ], addons: *clang-5 } - - { os: "linux", env: [ "B2_TOOLSET=clang-6.0", "B2_CXXSTD=17" ], addons: *clang-6 } - - { os: "linux", env: [ "B2_TOOLSET=clang-7", "B2_CXXSTD=17" ], addons: *clang-7 } - - { os: "linux", env: [ "B2_TOOLSET=clang-8", "B2_CXXSTD=2a" ], addons: *clang-8 } - - # libc++ - - { os: "linux", env: [ "B2_TOOLSET=clang-6.0", "B2_CXXSTD=03", - "B2_CXXFLAGS=-stdlib=libc++" ], addons: *clang-6 } - - { os: "linux", env: [ "B2_TOOLSET=clang-6.0", "B2_CXXSTD=11", - "B2_CXXFLAGS=-stdlib=libc++" ], addons: *clang-6 } - - { os: "linux", env: [ "B2_TOOLSET=clang-6.0", "B2_CXXSTD=17", - "B2_CXXFLAGS=-stdlib=libc++" ], addons: *clang-6 } - - { os: "osx" , env: [ "B2_TOOLSET=clang", "B2_CXXSTD=03" ] } - - { os: "osx" , env: [ "B2_TOOLSET=clang", "B2_CXXSTD=11" ] } - - { os: "osx" , env: [ "B2_TOOLSET=clang", "B2_CXXSTD=17" ] } - - # to enable Intel ICC define INTEL_ICC_SERIAL_NUMBER and the following: - # - { os: "linux", env: [ "B2_TOOLSET=intel-linux", "B2_CXXSTD=11,14,17" ], addons: *gcc-7, - # script: cd $BOOST_ROOT/libs/$SELF && ci/travis/intelicc.sh } - - - os: linux - env: - - COMMENT=codecov.io - - B2_VARIANT=variant=debug - - B2_CXXSTD=03,11 - - B2_TOOLSET=gcc-8 - - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1" - addons: *gcc-8 - script: - - cd $BOOST_ROOT/libs/$SELF - - ci/travis/codecov.sh - - # takes too long for CI (because lots of tests): - # - os: linux - # env: - # - COMMENT=cppcheck - # script: - # - cd $BOOST_ROOT/libs/$SELF - # - ci/travis/cppcheck.sh - - - os: linux - env: - - COMMENT=ubsan - - B2_VARIANT=variant=debug - - B2_TOOLSET=gcc-8 - - B2_CXXSTD=11 - - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1" - - B2_CXXFLAGS="cxxflags=-fno-omit-frame-pointer cxxflags=-fsanitize=undefined cxxflags=-fno-sanitize-recover=all" - - B2_LINKFLAGS="linkflags=-fsanitize=undefined linkflags=-fno-sanitize-recover=all linkflags=-fuse-ld=gold" - - UBSAN_OPTIONS=print_stacktrace=1 - addons: *gcc-8 - - - os: linux - env: - - COMMENT=valgrind - - B2_VARIANT=variant=debug - - B2_TOOLSET=clang-6.0 - - B2_CXXSTD=11 - - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1" - - B2_TESTFLAGS=testing.launcher=valgrind - - VALGRIND_OPTS=--error-exitcode=1 - addons: *clang-6 - script: - - cd $BOOST_ROOT/libs/$SELF - - ci/travis/valgrind.sh - - #################### Jobs to run on pushes to master, develop ################### - - # Coverity Scan - - os: linux - if: (env(COVERITY_SCAN_NOTIFICATION_EMAIL) IS present) AND (branch IN (develop, master)) AND (type IN (cron, push)) - env: - - COMMENT="Coverity Scan" - - B2_TOOLSET=clang - script: - - cd $BOOST_ROOT/libs/$SELF - - ci/travis/coverity.sh - -notifications: - email: - false - diff --git a/README.md b/README.md index 170a5e4..cc37d91 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,20 @@ All contract programming features are supported: Subcontracting, class invariant ### License -Distributed under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt). +Distributed under the [Boost Software License, Version 1.0](https://www.boost.org/LICENSE_1_0.txt). ### Properties -* C++11 (C++03 possible but not recommended without lambda functions and variadic macros, see documentation for more information). +* C++11 * Shared Library / DLL with `BOOST_CONTRACT_DYN_LINK` (static library with `BOOST_CONTRACT_STATIC_LINK`, header-only also possible but not recommended, see `BOOST_CONTRACT_HEADER_ONLY` documentation for more information). ### Build Status -Branch | Travis | Appveyor | Coverity Scan | codecov.io | Deps | Docs | Tests | -:-------------: | ------ | -------- | ------------- | ---------- | ---- | ---- | ----- | -[`master`](https://github.com/boostorg/contract/tree/master) | [![Build Status](https://travis-ci.com/boostorg/contract.svg?branch=master)](https://travis-ci.com/boostorg/contract) | [![Build status](https://ci.appveyor.com/api/projects/status/FILL-ME-IN/branch/master?svg=true)](https://ci.appveyor.com/project/lcaminiti/contract/branch/master) | [![Coverity Scan Build Status](https://scan.coverity.com/projects/18555/badge.svg)](https://scan.coverity.com/projects/boostorg-contract) | [![codecov](https://codecov.io/gh/boostorg/contract/branch/master/graph/badge.svg)](https://codecov.io/gh/boostorg/contract/branch/master)| [![Deps](https://img.shields.io/badge/deps-master-brightgreen.svg)](https://pdimov.github.io/boostdep-report/master/contract.html) | [![Documentation](https://img.shields.io/badge/docs-master-brightgreen.svg)](https://www.boost.org/doc/libs/master/libs/contract/doc/html/index.html) | [![Enter the Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](http://www.boost.org/development/tests/master/developer/contract.html) -[`develop`](https://github.com/boostorg/contract/tree/develop) | [![Build Status](https://travis-ci.com/boostorg/contract.svg?branch=develop)](https://travis-ci.com/boostorg/contract) | [![Build status](https://ci.appveyor.com/api/projects/status/FILL-ME-IN/branch/develop?svg=true)](https://ci.appveyor.com/project/lcaminiti/contract/branch/develop) | [![Coverity Scan Build Status](https://scan.coverity.com/projects/18555/badge.svg)](https://scan.coverity.com/projects/boostorg-contract) | [![codecov](https://codecov.io/gh/boostorg/contract/branch/develop/graph/badge.svg)](https://codecov.io/gh/boostorg/contract/branch/develop) | [![Deps](https://img.shields.io/badge/deps-develop-brightgreen.svg)](https://pdimov.github.io/boostdep-report/develop/contract.html) | [![Documentation](https://img.shields.io/badge/docs-develop-brightgreen.svg)](https://www.boost.org/doc/libs/develop/libs/contract/doc/html/index.html) | [![Enter the Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](http://www.boost.org/development/tests/develop/developer/contract.html) + +| Branch | GHA CI | Appveyor | Coverity Scan | codecov.io | Deps | Docs | Tests | +| :-------------: | ------ | -------- | ------------- | ---------- | ---- | ---- | ----- | +| [`master`](https://github.com/boostorg/contract/tree/master) | [![Build Status](https://github.com/boostorg/contract/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/boostorg/contract/actions?query=branch:master) | [![Build status](https://ci.appveyor.com/api/projects/status/bo914d458nsx83yw/branch/master?svg=true)](https://ci.appveyor.com/project/cppalliance/contract/branch/master) | [![Coverity Scan Build Status](https://scan.coverity.com/projects/15866/badge.svg)](https://scan.coverity.com/projects/boostorg-contract) | [![codecov](https://codecov.io/gh/boostorg/contract/branch/master/graph/badge.svg?token=EL686wMU6K)](https://codecov.io/gh/boostorg/contract/tree/master) | [![Deps](https://img.shields.io/badge/deps-master-brightgreen.svg)](https://pdimov.github.io/boostdep-report/master/contract.html) | [![Documentation](https://img.shields.io/badge/docs-master-brightgreen.svg)](https://www.boost.org/doc/libs/master/libs/contract) | [![Enter the Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](https://www.boost.org/development/tests/master/developer/contract.html) +| [`develop`](https://github.com/boostorg/contract/tree/develop) | [![Build Status](https://github.com/boostorg/contract/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/boostorg/contract/actions?query=branch:develop) | [![Build status](https://ci.appveyor.com/api/projects/status/bo914d458nsx83yw/branch/develop?svg=true)](https://ci.appveyor.com/project/cppalliance/contract/branch/develop) | [![Coverity Scan Build Status](https://scan.coverity.com/projects/15866/badge.svg)](https://scan.coverity.com/projects/boostorg-contract) | [![codecov](https://codecov.io/gh/boostorg/contract/branch/develop/graph/badge.svg?token=EL686wMU6K)](https://codecov.io/gh/boostorg/contract/tree/develop) | [![Deps](https://img.shields.io/badge/deps-develop-brightgreen.svg)](https://pdimov.github.io/boostdep-report/develop/contract.html) | [![Documentation](https://img.shields.io/badge/docs-develop-brightgreen.svg)](https://www.boost.org/doc/libs/develop/libs/contract) | [![Enter the Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](https://www.boost.org/development/tests/develop/developer/contract.html) ### Directories @@ -34,8 +35,8 @@ Branch | Travis | Appveyor | Coverity Scan | codecov.io | Deps | Docs | ### More Information -* [Ask questions](http://stackoverflow.com/questions/ask?tags=c%2B%2B,boost,boost-contract). +* [Ask questions](https://stackoverflow.com/questions/ask?tags=c%2B%2B,boost,boost-contract). * [Report bugs](https://github.com/boostorg/contract/issues): Be sure to mention Boost version, platform and compiler you are using. A small compilable code sample to reproduce the problem is always good as well. -* Submit your patches as pull requests against **develop** branch. Note that by submitting patches you agree to license your modifications under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt). -* Discussions about the library are held on the [Boost developers mailing list](http://www.boost.org/community/groups.html#main). Be sure to read the [discussion policy](http://www.boost.org/community/policy.html) before posting and add the `[contract]` text at the beginning of the subject line. +* Submit your patches as pull requests against **develop** branch. Note that by submitting patches you agree to license your modifications under the [Boost Software License, Version 1.0](https://www.boost.org/LICENSE_1_0.txt). +* Discussions about the library are held on the [Boost developers mailing list](https://www.boost.org/community/groups.html#main). Be sure to read the [discussion policy](https://www.boost.org/community/policy.html) before posting and add the `[contract]` text at the beginning of the subject line. diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index a4506c7..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright 2016, 2017 Peter Dimov -# Copyright (C) 2017 - 2019 James E. King III -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) - -# -# Generic Appveyor build script for boostorg repositories -# See: https://github.com/boostorg/boost-ci/ -# -# Instructions for customizing this script for your library: -# -# 1. Customize the compilers and language levels you want. -# 2. If you have more than include/, src/, test/, example/, examples/, -# benchmark/ or tools/ directories, set the environment variable DEPINST. -# For example if your build uses code in "bench/" and "fog/" directories: -# - DEPINST: --include bench --include fog -# 3. Enable pull request builds in your boostorg/ account. -# -# That's it - the script will do everything else for you. -# - -version: 1.0.{build}-{branch} - -shallow_clone: true - -branches: - only: - - master - - develop - - /bugfix\/.*/ - - /feature\/.*/ - - /fix\/.*/ - - /pr\/.*/ - -matrix: - # Adding MAYFAIL to any matrix job allows it to fail but the build stays green: - allow_failures: - - MAYFAIL: true - -environment: - global: - # see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties - # to use the default for a given environment, comment it out; recommend you build debug and release however: - # on Windows it is important to exercise all the possibilities, especially shared vs static, however most - # libraries that care about this exercise it in their Jamfiles... - # B2_ADDRESS_MODEL: address-model=64,32 - # B2_LINK: link=shared,static - # B2_THREADING: threading=multi,single - B2_VARIANT: variant=release - - matrix: - - FLAVOR: Visual Studio 2017 C++2a Strict - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - B2_ADDRESS_MODEL: address-model=64 - B2_CXXFLAGS: cxxflags=-permissive- - B2_CXXSTD: latest # 2a - B2_TOOLSET: msvc-14.1 - - - FLAVOR: Visual Studio 2017 C++17 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - B2_ADDRESS_MODEL: address-model=64 - B2_CXXSTD: 17 - B2_TOOLSET: msvc-14.1 - - - FLAVOR: Visual Studio 2017 C++14 (Default) - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - B2_ADDRESS_MODEL: address-model=64,32 - B2_TOOLSET: msvc-14.1 - B2_VARIANT: variant=debug - - - FLAVOR: Visual Studio 2015 C++14 (Default) - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - B2_ADDRESS_MODEL: address-model=64,32 - B2_TOOLSET: msvc-14.0 - - - FLAVOR: Visual Studio 2013 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - B2_TOOLSET: msvc-12.0 - MAYFAIL: true - BECAUSE: https://github.com/boostorg/contract/issues/22 - - - FLAVOR: cygwin (32-bit) - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - ADDPATH: C:\cygwin\bin; - B2_ADDRESS_MODEL: address-model=32 - B2_CXXSTD: 03 - # https://github.com/boostorg/test/issues/144 - B2_DEFINES: define=_POSIX_C_SOURCE=200112L - B2_THREADING: threadapi=pthread - B2_TOOLSET: gcc - B2_VARIANT: variant=debug - - - FLAVOR: cygwin (64-bit) - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - ADDPATH: C:\cygwin64\bin; - B2_ADDRESS_MODEL: address-model=64 - B2_CXXSTD: 11 - # https://github.com/boostorg/test/issues/144 - B2_DEFINES: define=_POSIX_C_SOURCE=200112L define=__USE_ISOC99 - B2_THREADING: threadapi=pthread - B2_TOOLSET: gcc - - - FLAVOR: mingw32 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - ARCH: i686 - B2_ADDRESS_MODEL: address-model=32 - B2_CXXSTD: 11 - SCRIPT: ci\appveyor\mingw.bat - - - FLAVOR: mingw64 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - ARCH: x86_64 - B2_ADDRESS_MODEL: address-model=64 - B2_CXXSTD: 14 - B2_DEFINES: define=__USE_ISOC99 - SCRIPT: ci\appveyor\mingw.bat - -install: - - set SELF=%APPVEYOR_PROJECT_NAME:-=_% - - git clone https://github.com/boostorg/boost-ci.git C:\boost-ci - - xcopy /s /e /q /i C:\boost-ci\ci .\ci - - ci\appveyor\install.bat - -build: off - -test_script: - - set SELF=%APPVEYOR_PROJECT_NAME:-=_% - - PATH=%ADDPATH%%PATH% - # The definition of B2_TOOLCXX omits B2_CXXSTD= if it was not defined above - - IF NOT DEFINED B2_CXXSTD (SET B2_TOOLCXX=toolset=%B2_TOOLSET%) ELSE (SET B2_TOOLCXX=toolset=%B2_TOOLSET% cxxstd=%B2_CXXSTD%) - # Echo the complete build command to the build log - - IF NOT DEFINED SCRIPT (ECHO b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3) - # Now go build... - - IF DEFINED SCRIPT (call libs\%SELF%\%SCRIPT%) ELSE (b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3) - diff --git a/example/features/condition_if.cpp b/example/features/condition_if.cpp index c8ecb96..affbb33 100644 --- a/example/features/condition_if.cpp +++ b/example/features/condition_if.cpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include #include diff --git a/example/features/no_lambdas.cpp b/example/features/no_lambdas.cpp index 783adce..6964965 100644 --- a/example/features/no_lambdas.cpp +++ b/example/features/no_lambdas.cpp @@ -5,7 +5,7 @@ // See: http://www.boost.org/doc/libs/release/libs/contract/doc/html/index.html #include "no_lambdas.hpp" -#include +#include #include //[no_lambdas_cpp diff --git a/example/features/no_lambdas_local_func.cpp b/example/features/no_lambdas_local_func.cpp index 801e163..003f3f5 100644 --- a/example/features/no_lambdas_local_func.cpp +++ b/example/features/no_lambdas_local_func.cpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include class iarray : diff --git a/example/n1962/vector.cpp b/example/n1962/vector.cpp index bd06c5a..0fceced 100644 --- a/example/n1962/vector.cpp +++ b/example/n1962/vector.cpp @@ -6,7 +6,7 @@ //[n1962_vector #include -#include +#include #include #include #include diff --git a/meta/libraries.json b/meta/libraries.json index 38ae42d..9e2c20c 100644 --- a/meta/libraries.json +++ b/meta/libraries.json @@ -10,5 +10,6 @@ "description": "Contract programming for C++. All contract programming features are supported: Subcontracting, class invariants, postconditions (with old and return values), preconditions, customizable actions on assertion failure (e.g., terminate or throw), optional compilation and checking of assertions, etc.", "category": [ "Correctness" - ] + ], + "cxxstd": "11" } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index ac6a21a..a079b32 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -194,32 +194,16 @@ test-suite public_function : [ boost_contract_build.subdir-run-cxx11 public_function : max_args0 : BOOST_CONTRACT_MAX_ARGS=0 ] - [ boost_contract_build.subdir-run-cxx11 public_function : max_args0_no_tva : - BOOST_CONTRACT_MAX_ARGS=0 - BOOST_NO_CXX11_VARIADIC_TEMPLATES - ] [ boost_contract_build.subdir-run-cxx11 public_function : max_args1 : BOOST_CONTRACT_MAX_ARGS=1 ] - [ boost_contract_build.subdir-run-cxx11 public_function : max_args1_no_tva : - BOOST_CONTRACT_MAX_ARGS=1 - BOOST_NO_CXX11_VARIADIC_TEMPLATES - ] [ boost_contract_build.subdir-run-cxx11 public_function : max_args2 : - BOOST_CONTRACT_MAX_ARGS=2 ] - [ boost_contract_build.subdir-run-cxx11 public_function : max_args2_no_tva : - BOOST_CONTRACT_MAX_ARGS=2 - BOOST_NO_CXX11_VARIADIC_TEMPLATES - ] + BOOST_CONTRACT_MAX_ARGS=2 ] [ boost_contract_build.subdir-run-cxx11 public_function : max_args ] - [ boost_contract_build.subdir-run-cxx11 public_function : max_args_no_tva : - BOOST_NO_CXX11_VARIADIC_TEMPLATES ] [ boost_contract_build.subdir-run-cxx11 public_function : max_bases ] # C++11 for BASES(...) variadic macros. [ boost_contract_build.subdir-run-cxx11 public_function : overload ] - [ boost_contract_build.subdir-run-cxx11 public_function : overload_no_tva : - BOOST_NO_CXX11_VARIADIC_TEMPLATES ] [ boost_contract_build.subdir-compile-fail-cxx11 public_function : override_error ] # C++11 for BASES(...) variadic macros. @@ -317,7 +301,8 @@ test-suite check : ; test-suite result : - [ boost_contract_build.subdir-run-cxx11 result : mixed_optional ] + # https://github.com/boostorg/contract/issues/37 + # [ boost_contract_build.subdir-run-cxx11 result : mixed_optional ] [ boost_contract_build.subdir-run-cxx11 result : mixed_optional_ref ] [ boost_contract_build.subdir-compile-fail-cxx11 result : @@ -370,8 +355,10 @@ test-suite disable : BOOST_CONTRACT_NO_EXCEPTS shared:BOOST_CONTRACT_TEST_LIB_Y_DYN_LINK ] - [ boost_contract_build.subdir-run-cxx11 disable : no_post_except_lib : - disable-lib_x disable-lib_y ] + + # https://github.com/boostorg/contract/issues/36 + # [ boost_contract_build.subdir-run-cxx11 disable : no_post_except_lib : + # disable-lib_x disable-lib_y ] [ boost_contract_build.subdir-run-cxx11 disable : no_post_except_unit disable/lib_x.cpp disable/lib_y.cpp : diff --git a/test/call_if/equal_to.cpp b/test/call_if/equal_to.cpp index a71c12b..a828a4d 100644 --- a/test/call_if/equal_to.cpp +++ b/test/call_if/equal_to.cpp @@ -11,7 +11,7 @@ #include "../detail/oteststream.hpp" #include -#include +#include #include #include #include diff --git a/test/call_if/false_.cpp b/test/call_if/false_.cpp index c604f6d..f8d3b9a 100644 --- a/test/call_if/false_.cpp +++ b/test/call_if/false_.cpp @@ -8,7 +8,7 @@ #include "../detail/oteststream.hpp" #include -#include +#include #include #include #include diff --git a/test/call_if/false_void.cpp b/test/call_if/false_void.cpp index ca6465c..8804b3e 100644 --- a/test/call_if/false_void.cpp +++ b/test/call_if/false_void.cpp @@ -8,7 +8,7 @@ #include "../detail/oteststream.hpp" #include -#include +#include #include #include #include diff --git a/test/call_if/no_equal_call_if.cpp b/test/call_if/no_equal_call_if.cpp index 854cffc..f3dadce 100644 --- a/test/call_if/no_equal_call_if.cpp +++ b/test/call_if/no_equal_call_if.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/test/call_if/no_equal_condition_if.cpp b/test/call_if/no_equal_condition_if.cpp index e4929d1..7a8669f 100644 --- a/test/call_if/no_equal_condition_if.cpp +++ b/test/call_if/no_equal_condition_if.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/test/call_if/true_.cpp b/test/call_if/true_.cpp index d8c47f4..3f61115 100644 --- a/test/call_if/true_.cpp +++ b/test/call_if/true_.cpp @@ -8,7 +8,7 @@ #include "../detail/oteststream.hpp" #include -#include +#include #include #include #include diff --git a/test/call_if/true_void.cpp b/test/call_if/true_void.cpp index d3279c8..535f447 100644 --- a/test/call_if/true_void.cpp +++ b/test/call_if/true_void.cpp @@ -8,7 +8,7 @@ #include "../detail/oteststream.hpp" #include -#include +#include #include #include #include diff --git a/test/cmake_test/CMakeLists.txt b/test/cmake_test/CMakeLists.txt new file mode 100644 index 0000000..8328b11 --- /dev/null +++ b/test/cmake_test/CMakeLists.txt @@ -0,0 +1,22 @@ +# Copyright 2021-2024 Alexander Grund +# Distributed under the Boost Software License, Version 1.0. +# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt + +cmake_minimum_required(VERSION 3.5...3.16) + +project(cmake_subdir_test LANGUAGES CXX) + +# Those 2 should work the same +# while using find_package for the installed Boost avoids the need to manually specify dependencies +if(BOOST_CI_INSTALL_TEST) + find_package(boost_contract REQUIRED) +else() + set(BOOST_INCLUDE_LIBRARIES contract) + add_subdirectory(../../../.. deps/boost EXCLUDE_FROM_ALL) +endif() + +add_executable(main main.cpp) +target_link_libraries(main Boost::contract) + +enable_testing() +add_test(NAME main COMMAND main) diff --git a/test/cmake_test/main.cpp b/test/cmake_test/main.cpp new file mode 100644 index 0000000..a0bd6b1 --- /dev/null +++ b/test/cmake_test/main.cpp @@ -0,0 +1,138 @@ + +// Copyright (C) 2008-2018 Lorenzo Caminiti +// Distributed under the Boost Software License, Version 1.0 (see accompanying +// file LICENSE_1_0.txt or a copy at http://www.boost.org/LICENSE_1_0.txt). +// See: http://www.boost.org/doc/libs/release/libs/contract/doc/html/index.html + +//[mitchell02_stack +#include +#include +#include +#include + +template +class stack { + friend class boost::contract::access; + + void invariant() const { + BOOST_CONTRACT_ASSERT(count() >= 0); // Non-negative count. + } + +public: + /* Creation */ + + // Create empty stack. + stack() { + boost::contract::check c = boost::contract::constructor(this) + .postcondition([&] { + BOOST_CONTRACT_ASSERT(count() == 0); // Empty. + }) + ; + } + + // Destroy stack. + virtual ~stack() { + // Check invariants. + boost::contract::check c = boost::contract::destructor(this); + } + + /* Basic Queries */ + + // Number of items. + int count() const { + // Check invariants. + boost::contract::check c = boost::contract::public_function(this); + return items_.size(); + } + + // Item at index in [1, count()] (as in Eiffel). + T const& item_at(int index) const { + boost::contract::check c = boost::contract::public_function(this) + .precondition([&] { + BOOST_CONTRACT_ASSERT(index > 0); // Positive index. + BOOST_CONTRACT_ASSERT(index <= count()); // Index within count. + }) + ; + + return items_[index - 1]; + } + + /* Derived Queries */ + + // If no items. + bool is_empty() const { + bool result; + boost::contract::check c = boost::contract::public_function(this) + .postcondition([&] { + // Consistent with count. + BOOST_CONTRACT_ASSERT(result == (count() == 0)); + }) + ; + + return result = (count() == 0); + } + + // Top item. + T const& item() const { + boost::optional result; // Avoid extra construction of T. + boost::contract::check c = boost::contract::public_function(this) + .precondition([&] { + BOOST_CONTRACT_ASSERT(count() > 0); // Not empty. + }) + .postcondition([&] { + // Item on top. + BOOST_CONTRACT_ASSERT(*result == item_at(count())); + }) + ; + + return *(result = item_at(count())); + } + + /* Commands */ + + // Push item to the top. + void put(T const& new_item) { + boost::contract::old_ptr old_count = BOOST_CONTRACT_OLDOF(count()); + boost::contract::check c = boost::contract::public_function(this) + .postcondition([&] { + BOOST_CONTRACT_ASSERT(count() == *old_count + 1); // Count inc. + BOOST_CONTRACT_ASSERT(item() == new_item); // Item set. + }) + ; + + items_.push_back(new_item); + } + + // Pop top item. + void remove() { + boost::contract::old_ptr old_count = BOOST_CONTRACT_OLDOF(count()); + boost::contract::check c = boost::contract::public_function(this) + .precondition([&] { + BOOST_CONTRACT_ASSERT(count() > 0); // Not empty. + }) + .postcondition([&] { + BOOST_CONTRACT_ASSERT(count() == *old_count - 1); // Count dec. + }) + ; + + items_.pop_back(); + } + +private: + std::vector items_; +}; + +int main() { + stack s; + assert(s.count() == 0); + + s.put(123); + assert(s.item() == 123); + + s.remove(); + assert(s.is_empty()); + + return 0; +} +//] + diff --git a/test/constructor/smoke.cpp b/test/constructor/smoke.cpp index 133cc14..8fdbe3c 100644 --- a/test/constructor/smoke.cpp +++ b/test/constructor/smoke.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/test/public_function/max_args.hpp b/test/public_function/max_args.hpp index 210f730..7e9fdf2 100644 --- a/test/public_function/max_args.hpp +++ b/test/public_function/max_args.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include