aboutsummaryrefslogblamecommitdiffstatshomepage
path: root/.github/workflows/boost_toolsets.yml
blob: 5e0ccb0e0988f0783eb2ef5dc4695aa722e9a403 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                                                
             
                                                       

                                                          
                                                                     


                               
                                                  

                                                  
                                             




                                                  
                                                  



                                                              
                                                                  












                                                                                                                      



                                                              







                                                              


                                                  


                                          

                                                             

































                                                                                                                                 









                                                                                       





                                                                     







                                                    









                                 
                         
                              

                                                              
                                                  
 
                           
                                         









                                                































































































                                                                                                              
name: Boost (toolsets)

on:
  push:
  pull_request:
  schedule:
    # Weekly, at 5:30 AM on Saturday (somewhat randomly chosen).
    - cron: '30 5 * * 6'
  workflow_dispatch:

jobs:
  build:
    strategy:
      matrix:
        boost-version: [1.58.0, 1.65.0, 1.72.0, 1.78.0]
        toolset: [auto, clang, clang-cl, gcc, mingw, msvc]
        cygwin: [0, 1]
        os: [ubuntu-latest, windows-2016, windows-2019, windows-2022]

        include:
          # Prettier run names.
          - {os: windows-2022, name: Windows 2022}
          - {os: windows-2019, name: Windows 2019}
          - {os: windows-2016, name: Windows 2016}
          - {os: ubuntu-latest, name: Ubuntu}
          - {cygwin: 1, name: Cygwin}
          # Target platform.
          - {boost-version: 1.58.0, platform: x64}
          - {boost-version: 1.65.0, platform: x86}
          - {boost-version: 1.72.0, platform: x64}
          - {boost-version: 1.78.0, platform: x86}
          # Configuration.
          - {boost-version: 1.58.0, configuration: Debug}
          - {boost-version: 1.65.0, configuration: MinSizeRel}
          - {boost-version: 1.72.0, configuration: Release}
          - {boost-version: 1.78.0, configuration: RelWithDebInfo}

          # Some Boost libraries commonly used by me.
          - libraries: filesystem program_options regex system test
          # On Windows, clang fails to build Boost.Test prior to version 1.61
          # with the following error:
          #
          #     .\boost/test/impl/execution_monitor.ipp:1134:20: error: cannot compile this 'this' captured by SEH yet
          #
          # This was fixed for 1.61 in this commit:
          # https://github.com/boostorg/test/commit/c94ef6982e2ebe77f9376579547c228f0d62e45f.
          # On Linux/Cygwin, everything should be fine though.
          - toolset: clang
            boost-version: 1.58.0
            os: windows-2022
            libraries: filesystem program_options regex system
          - toolset: clang
            boost-version: 1.58.0
            os: windows-2019
            libraries: filesystem program_options regex system
          - toolset: clang
            boost-version: 1.58.0
            os: windows-2016
            libraries: filesystem program_options regex system
        exclude:
          # Ubuntu: no MSVC/clang-cl/Cygwin.
          - {os: ubuntu-latest, toolset: msvc}
          - {os: ubuntu-latest, toolset: clang-cl}
          - {os: ubuntu-latest, cygwin: 1}
          # Cygwin: no MSVC/clang-cl.
          - {cygwin: 1, toolset: msvc}
          - {cygwin: 1, toolset: clang-cl}
          # Cygwin is the same on different Windows versions.
          - {os: windows-2019, cygwin: 1}
          - {os: windows-2016, cygwin: 1}
          # clang-cl is only supported by Boost.Build since 1.69 (see the
          # boost_clang_windows.yml workflow).
          - {toolset: clang-cl, boost-version: 1.58.0}
          - {toolset: clang-cl, boost-version: 1.65.0}

    runs-on: '${{ matrix.os }}'

    name: '${{ matrix.boost-version }} / ${{ matrix.toolset }} / ${{ matrix.name }}'

    # 1) I have no idea why, but GCC 10.2 fails to build Boost.Filesystem with
    #    the following errors:
    #
    #        libs\filesystem\src\path.cpp:36:11: fatal error: windows_file_codecvt.hpp: No such file or directory
    #           36 | # include "windows_file_codecvt.hpp"
    #              |           ^~~~~~~~~~~~~~~~~~~~~~~~~~
    #        compilation terminated.
    #        libs\filesystem\src\windows_file_codecvt.cpp:25:10: fatal error: windows_file_codecvt.hpp: No such file or directory
    #           25 | #include "windows_file_codecvt.hpp"
    #              |          ^~~~~~~~~~~~~~~~~~~~~~~~~~
    #        compilation terminated.
    #
    #    This seems to be a compiler bug, since the file is _definitely_ there,
    #    and Clang 8.0.1 builds it successfully.  This only applies to Boost
    #    versions up to and including 1.60.0 for some reason.  I can easily
    #    reproduce this locally.  TODO: remove when GCC on Cygwin is treated
    #    with a bugfix to this?
    #
    # 2) 32-bit Cygwin fucking sucks.  In many ways actually, but the real
    #    reason was the incomprehensible
    #
    #        undefined reference to `__chkstk_ms'
    #
    #    error when building with Clang.
    #
    # 3) VS 2022 isn't supported by older Boost versions.  It just doesn't
    #    work, the errors are numerous.
    #
    # 4) clang-cl on windows-2016 fails to build the latest Boost.  The error
    #    is
    #
    #        LINK : fatal error LNK1171: unable to load mspdbcore.dll (error code: 193)
    #
    #    No idea what's up with that.
    continue-on-error: ${{
            (matrix.cygwin == '1' && matrix.boost-version == '1.58.0'
                && (matrix.toolset == 'auto'
                    || matrix.toolset == 'gcc'
                    || matrix.toolset == 'mingw'))
            || (matrix.cygwin == '1' && matrix.platform == 'x86')
            || (matrix.os == 'windows-2022'
                && (matrix.toolset == 'auto'
                    || matrix.toolset == 'clang-cl'
                    || matrix.toolset == 'msvc')
                && matrix.boost-version < '1.78.0')
            || (matrix.os == 'windows-2016'
                && matrix.toolset == 'clang-cl'
                && matrix.boost-version == '1.78.0')
        }}

    defaults:
      run:
        shell: pwsh

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Cache Boost
        uses: actions/cache@v2
        with:
          path: '${{ runner.workspace }}/boost/boost_*.tar.gz'
          key: 'boost_${{ matrix.boost-version }}'

      - name: Clean up PATH
        uses: egor-tensin/cleanup-path@v2
        if: runner.os == 'Windows'

      - name: Set common variables
        uses: ./.github/actions/common-variables
        with:
          toolset: '${{ matrix.toolset }}'
          cygwin: '${{ matrix.cygwin }}'

      - name: Set up Python
        uses: actions/setup-python@v2
        if: '!env.CI_HOST_CYGWIN'

      - name: Install Cygwin
        uses: egor-tensin/setup-cygwin@v3
        with:
          platform: '${{ matrix.platform }}'
          packages: cmake make python3
          hardlinks: 1
        if: env.CI_HOST_CYGWIN

      - name: Install GCC
        uses: egor-tensin/setup-gcc@v1
        with:
          cygwin: '${{ matrix.cygwin }}'
          platform: '${{ matrix.platform }}'
          hardlinks: 1
        if: env.CI_HOST_CYGWIN || (env.CI_HOST_LINUX && (matrix.toolset == 'auto' || matrix.toolset == 'gcc'))

      - name: Install Clang
        uses: egor-tensin/setup-clang@v1
        with:
          cygwin: '${{ matrix.cygwin }}'
          platform: '${{ matrix.platform }}'
          hardlinks: 1
        if: matrix.toolset == 'clang' || matrix.toolset == 'clang-cl'

      - name: Install MinGW
        uses: egor-tensin/setup-mingw@v2
        with:
          cygwin: '${{ matrix.cygwin }}'
          platform: '${{ matrix.platform }}'
          hardlinks: 1
        # toolset == 'clang' needs some kind of make, e.g. mingw32-make:
        if: env.CI_MINGW || (matrix.toolset == 'clang' && env.CI_HOST_WINDOWS)

      - name: Set up software environment
        uses: ./.github/actions/software-environment
        with:
          toolset: '${{ matrix.toolset }}'
          platform: '${{ matrix.platform }}'

      - name: Set up Visual Studio
        uses: egor-tensin/vs-shell@v2
        with:
          arch: '${{ matrix.platform }}'
        if: matrix.toolset == 'clang-cl' && env.CI_HOST_WINDOWS

      - name: Download Boost
        uses: ./.github/actions/download-boost
        with:
          boost-version: '${{ matrix.boost-version }}'

      - name: Build Boost
        uses: ./.github/actions/build-boost
        with:
          toolset: '${{ matrix.toolset }}'
          libraries: '${{ matrix.libraries }}'
          platform: '${{ matrix.platform }}'
          configuration: '${{ matrix.configuration }}'
        continue-on-error: true

      - name: Check that Boost was bootstrapped
        uses: ./.github/actions/check-boost-bootstrapped

      - name: Check that Boost libraries were built
        uses: ./.github/actions/check-boost-libraries
        with:
          libraries: '${{ matrix.libraries }}'
          platform: '${{ matrix.platform }}'
          configuration: '${{ matrix.configuration }}'

      - name: Build examples/boost
        id: build_example
        uses: ./.github/actions/build-example
        with:
          src-dir: examples/boost
          boost-dir: '${{ env.BOOST_DIR }}'
          toolset: '${{ matrix.toolset }}'
          platform: '${{ matrix.platform }}'
          configuration: '${{ matrix.configuration }}'

      - name: Verify runtime library linkage
        uses: ./.github/actions/check-runtime-library
        with:
          path: '${{ steps.build_example.outputs.install-dir }}'

      - name: Verify architecture
        uses: ./.github/actions/check-arch
        with:
          path: '${{ steps.build_example.outputs.install-dir }}'
          expected: '${{ matrix.platform }}'

      - name: Run examples/boost
        uses: ./.github/actions/run-example-boost
        with:
          path: '${{ steps.build_example.outputs.install-dir }}'