diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53b4dc1..f14bca2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,20 @@ +# # Copyright 2020-2021 Peter Dimov # Copyright 2021 Andrey Semashev -# Copyright 2021 Alexander Grund -# Copyright 2022 James E. King III +# Copyright 2021-2024 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) +# +# This workflow uses the Boost.CI reusable workflow which builds a variety of +# configurations of your project, runs tests, and generates code coverage reports. +# +# To use it, copy this file into your repository as `.github/workflows/ci.yml` and +# customize it appropriately. +# --- -name: CI +name: Boost.CI on: pull_request: @@ -18,312 +26,25 @@ on: - feature/** - fix/** - pr/** - -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: 0 - CODECOV_NAME: Github Actions - SELF_CONTAINED_HEADER_TESTS: 0 + paths-ignore: + - LICENSE + - meta/** + - README.md jobs: - posix: - defaults: - run: - shell: bash - - strategy: - fail-fast: false - matrix: - include: - # Linux, gcc - - { compiler: gcc-4.8, cxxstd: '11', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: gcc-5, cxxstd: '11', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: gcc-6, cxxstd: '11,14,17', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: gcc-7, cxxstd: '11,14,17', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: gcc-8, cxxstd: '11,14,17,2a', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: gcc-9, cxxstd: '11,14,17,2a', container: 'ubuntu:20.04', os: ubuntu-latest } - - { compiler: gcc-10, cxxstd: '11,14,17,20', container: 'ubuntu:20.04', os: ubuntu-latest } - - { compiler: gcc-11, cxxstd: '11,14,17,20', container: 'ubuntu:22.04', os: ubuntu-latest, self-contained-header-tests: 1 } - # disabled: there are too many issues in serialization and not enough time to add suppressions - # - { name: GCC w/ sanitizers, sanitize: yes, - # compiler: gcc-11, cxxstd: '11,14,17,20', container: 'ubuntu:20.04', os: ubuntu-latest } - - { name: Collect coverage, coverage: yes, - compiler: gcc-10, cxxstd: '11', container: 'ubuntu:20.04', os: ubuntu-latest, install: 'g++-10-multilib', address-model: '32,64' } - - # Linux, clang - - { compiler: clang-3.9, cxxstd: '11,14', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: clang-4.0, cxxstd: '11,14', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: clang-5.0, cxxstd: '11,14,1z', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: clang-6.0, cxxstd: '11,14,17', container: 'ubuntu:18.04', os: ubuntu-latest } - - { compiler: clang-7, cxxstd: '11,14,17', container: 'ubuntu:18.04', os: ubuntu-latest } - # 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,14,17,2a', container: 'ubuntu:18.04', os: ubuntu-latest, install: 'clang-8 g++-7' } - - { compiler: clang-9, cxxstd: '11,14,17,2a', container: 'ubuntu:20.04', os: ubuntu-latest } - - { compiler: clang-10, cxxstd: '11,14,17,20', container: 'ubuntu:20.04', os: ubuntu-latest } - - { compiler: clang-11, cxxstd: '11,14,17,20', container: 'ubuntu:20.04', os: ubuntu-latest } - - { compiler: clang-12, cxxstd: '11,14,17,20', container: 'ubuntu:20.04', os: ubuntu-latest, self-contained-header-tests: 1 } - - # libc++ - - { compiler: clang-6.0, cxxstd: '11,14', container: 'ubuntu:18.04', os: ubuntu-latest, stdlib: libc++, install: 'clang-6.0 libc++-dev libc++abi-dev' } - - { compiler: clang-12, cxxstd: '11,14,17,20', container: 'ubuntu:20.04', os: ubuntu-latest, stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev', self-contained-header-tests: 1 } - # disabled: there are too many issues in serialization and not enough time to add suppressions - # - { name: Clang w/ sanitizers, sanitize: yes, - # compiler: clang-12, cxxstd: '11,14,17,20', container: 'ubuntu:20.04', os: ubuntu-latest, stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev' } - - # OSX, clang - # sanitize disabled: there are too many issues in serialization and not enough time to add suppressions - - { compiler: clang, cxxstd: '11,14,17,20', os: macos-latest } - - # 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-10, cxxstd: '17', container: 'ubuntu:20.04', os: ubuntu-latest, ccache: no } - - # multiarch (bigendian testing) - does not support coverage yet - # date_time has no endian compile-time branches - # - { name: Big-endian, multiarch: yes, - # compiler: clang, cxxstd: '17', container: 'ubuntu:20.04', os: ubuntu-latest, 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 container environment - if: matrix.container - run: | - apt-get update - apt-get -y install sudo python3 git g++ curl xz-utils - - - name: Install nodejs20glibc2.17 - if: ${{ startsWith( matrix.container, 'ubuntu:1' ) }} - run: | - curl -LO https://archives.boost.io/misc/node/node-v20.9.0-linux-x64-glibc-217.tar.xz - tar -xf node-v20.9.0-linux-x64-glibc-217.tar.xz --strip-components 1 -C /node20217 - ldd /__e/node20/bin/node - - - name: Setup environment - run: | - if [ -f "/etc/debian_version" ]; then - echo "DEBIAN_FRONTEND=noninteractive" >> $GITHUB_ENV - export DEBIAN_FRONTEND=noninteractive - fi - # multiple job types are not compatible with ccache, they use "ccache: no" in the matrix - if [[ "${{ matrix.ccache }}" == "no" ]]; then - echo "B2_USE_CCACHE=0" >> $GITHUB_ENV - fi - git config --global pack.threads 0 - - - uses: actions/checkout@v3 - 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@v3 - 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}}- - ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}} - - - name: Fetch Boost.CI - uses: actions/checkout@v3 - 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 - SOURCES+=(ppa:ubuntu-toolchain-r/test) - for key in "${SOURCE_KEYS[@]}"; do - for i in {1..$NET_RETRY_COUNT}; do - wget -O - "$key" | sudo apt-key add - && break || sleep 10 - done - done - for source in "${SOURCES[@]}"; do - for i in {1..$NET_RETRY_COUNT}; do - sudo add-apt-repository $source && break || sleep 10 - done - done - 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 multiarch - if: matrix.multiarch - run: | - sudo apt-get install --no-install-recommends -y binfmt-support qemu-user-static - sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - git clone https://github.com/jeking3/bdde.git - echo "$(pwd)/bdde/bin/linux" >> ${GITHUB_PATH} - echo "BDDE_DISTRO=${{ matrix.distro }}" >> ${GITHUB_ENV} - echo "BDDE_EDITION=${{ matrix.edition }}" >> ${GITHUB_ENV} - echo "BDDE_ARCH=${{ matrix.arch }}" >> ${GITHUB_ENV} - echo "B2_WRAPPER=bdde" >> ${GITHUB_ENV} - - - 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}} - 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 - env: - BOOST_DATE_TIME_TEST_WITHOUT_SELF_CONTAINED_HEADER_TESTS: ${{ !(matrix.self-contained-header-tests || env.SELF_CONTAINED_HEADER_TESTS) }} - - - name: Upload coverage - if: matrix.coverage - run: ci/codecov.sh "upload" - - - name: Run coverity - if: matrix.coverity && github.event_name == 'push' && (github.ref_name == 'develop' || github.ref_name == 'master') - run: ci/github/coverity.sh - env: - BOOST_DATE_TIME_TEST_WITHOUT_SELF_CONTAINED_HEADER_TESTS: ${{ !(matrix.self-contained-header-tests || env.SELF_CONTAINED_HEADER_TESTS) }} - 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.2, cxxstd: '14,17,20', addrmd: '32,64', os: windows-2019, self-contained-header-tests: 1 } - - { name: Collect coverage, coverage: yes, - toolset: msvc-14.3, cxxstd: '14,17,20', addrmd: '32,64', os: windows-2022 } - - { toolset: gcc, cxxstd: '11,14,17,2a', addrmd: '64', os: windows-2019 } - - runs-on: ${{matrix.os}} - - steps: - - uses: actions/checkout@v2 - - - name: Fetch Boost.CI - uses: actions/checkout@v2 - 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}} - BOOST_DATE_TIME_TEST_WITHOUT_SELF_CONTAINED_HEADER_TESTS: ${{ !(matrix.self-contained-header-tests || env.SELF_CONTAINED_HEADER_TESTS) }} - - - 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}} - BOOST_DATE_TIME_TEST_WITHOUT_SELF_CONTAINED_HEADER_TESTS: ${{ !(matrix.self-contained-header-tests || env.SELF_CONTAINED_HEADER_TESTS) }} - - - name: Upload coverage - if: matrix.coverage - uses: codecov/codecov-action@v2 - with: - files: __out/cobertura.xml - - CMake: - defaults: - run: - shell: bash - - strategy: - fail-fast: false - matrix: - include: - - { os: ubuntu-latest, build_shared: ON, build_type: Release, generator: 'Unix Makefiles' } - - { os: ubuntu-latest, build_shared: OFF, build_type: Debug, generator: 'Unix Makefiles' } - - { os: windows-2019, build_shared: ON, build_type: Release, 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@v2 - - - name: Fetch Boost.CI - uses: actions/checkout@v2 - 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 - 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 . --config ${{matrix.build_type}} + call-boost-ci: + name: Run Boost.CI + uses: boostorg/boost-ci/.github/workflows/reusable.yml@master + with: + # no endian branches + enable_multiarch: false + # serialization has issues, not enough time to add suppressions + enable_sanitizers: false + # these compilers fail + exclude_compiler: 'gcc-4.7,gcc-4.8,gcc-4.9,gcc-5,clang-3.5,clang-3.6,clang-3.7,clang-3.8' + # the tests take a while; this reduces the load a bit and there isn't any C++20 specific code + exclude_cxxstd: '98,03,0x,2a,20' + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + COVERITY_SCAN_NOTIFICATION_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }} + COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }} diff --git a/test/cmake_test/CMakeLists.txt b/test/cmake_test/CMakeLists.txt new file mode 100644 index 0000000..b0a97d0 --- /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_date_time REQUIRED) +else() + set(BOOST_INCLUDE_LIBRARIES date_time) + add_subdirectory(../../../.. deps/boost EXCLUDE_FROM_ALL) +endif() + +add_executable(main main.cpp) +target_link_libraries(main Boost::date_time) + +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..6675774 --- /dev/null +++ b/test/cmake_test/main.cpp @@ -0,0 +1,86 @@ +/* A simple example for using a custom_time_zone and a posix_time_zone. + */ + +#include "boost/date_time/local_time/local_time.hpp" +#include + +int +main() +{ + using namespace boost; + using namespace local_time; + using namespace gregorian; + using posix_time::time_duration; + + /***** custom_time_zone *****/ + + // create the dependent objects for a custom_time_zone + time_zone_names tzn("Eastern Standard Time", "EST", + "Eastern Daylight Time", "EDT"); + time_duration utc_offset(-5,0,0); + dst_adjustment_offsets adj_offsets(time_duration(1,0,0), + time_duration(2,0,0), + time_duration(2,0,0)); + // rules for this zone are: + // start on first Sunday of April at 2 am + // end on last Sunday of October at 2 am + // so we use a first_last_dst_rule + first_day_of_the_week_in_month start_rule(Sunday, Apr); + last_day_of_the_week_in_month end_rule(Sunday, Oct); + shared_ptr nyc_rules(new first_last_dst_rule(start_rule, + end_rule)); + // create more dependent objects for a non-dst custom_time_zone + time_zone_names tzn2("Mountain Standard Time", "MST", + "", ""); // no dst means empty dst strings + time_duration utc_offset2(-7,0,0); + dst_adjustment_offsets adj_offsets2(time_duration(0,0,0), + time_duration(0,0,0), + time_duration(0,0,0)); + // no dst means we need a null pointer to the rules + shared_ptr phx_rules; + + // create the custom_time_zones + time_zone_ptr nyc_1(new custom_time_zone(tzn, utc_offset, adj_offsets, nyc_rules)); + time_zone_ptr phx_1(new custom_time_zone(tzn2, utc_offset2, adj_offsets2, phx_rules)); + + /***** posix_time_zone *****/ + + // create posix_time_zones that are the duplicates of the + // custom_time_zones created above. See posix_time_zone documentation + // for details on full zone names. + std::string nyc_string, phx_string; + nyc_string = "EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00"; + // nyc_string = "EST-05EDT,M4.1.0,M10.5.0"; // shorter when defaults used + phx_string = "MST-07"; // no-dst + time_zone_ptr nyc_2(new posix_time_zone(nyc_string)); + time_zone_ptr phx_2(new posix_time_zone(phx_string)); + + + /***** show the sets are equal *****/ + + std::cout << "The first zone is in daylight savings from:\n " + << nyc_1->dst_local_start_time(2004) << " through " + << nyc_1->dst_local_end_time(2004) << std::endl; + + std::cout << "The second zone is in daylight savings from:\n " + << nyc_2->dst_local_start_time(2004) << " through " + << nyc_2->dst_local_end_time(2004) << std::endl; + + std::cout << "The third zone (no daylight savings):\n " + << phx_1->std_zone_abbrev() << " and " + << phx_1->base_utc_offset() << std::endl; + + std::cout << "The fourth zone (no daylight savings):\n " + << phx_2->std_zone_abbrev() << " and " + << phx_2->base_utc_offset() << std::endl; + + return 0; +} + +/* Copyright 2001-2005: CrystalClear Software, Inc + * http://www.crystalclearsoftware.com + * + * Subject to the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + */ +