From 04725b80965cbe552291b60d3dcd5a02ac1f7b3a Mon Sep 17 00:00:00 2001 From: Gareth Sylvester-Bradley Date: Mon, 20 Jul 2026 17:24:03 +0100 Subject: [PATCH 1/4] Test Visual Studio 2026 and update dependencies Move the primary Windows matrix to VS 2026 while retaining VS 2022 coverage, and update CMake and Conan dependencies to current supported releases. Force Boost and nlohmann_json across the Conan graph for outdated recipe pins, prefer BoostConfig for CMake 4.x, replace lukka/run-cmake with plain cmake, and bump remaining Actions toward Node 24. Signed-off-by: Gareth Sylvester-Bradley --- .github/workflows/build-test.yml | 96 ++++++++++++--------- .github/workflows/src/build-setup.yml | 19 ++-- .github/workflows/src/build-test.yml | 24 ++++-- .github/workflows/src/build.yml | 16 ++-- .github/workflows/src/install-test.yml | 24 +++--- .github/workflows/src/install.yml | 9 +- .github/workflows/src/save-results.yml | 4 +- Development/cmake/NmosCppDependencies.cmake | 8 +- Development/conanfile.py | 24 ++++++ Development/conanfile.txt | 20 ----- Documents/Dependencies.md | 12 +-- README.md | 7 +- 12 files changed, 150 insertions(+), 113 deletions(-) create mode 100644 Development/conanfile.py delete mode 100644 Development/conanfile.txt diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 9558f6861..1a99772f0 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-22.04, ubuntu-24.04, windows-2022] + os: [ubuntu-22.04, ubuntu-24.04, windows-2025] install_mdns: [false, true] use_conan: [true] force_cpprest_asio: [false, true] @@ -25,10 +25,10 @@ jobs: enable_authorization: [false, true] exclude: # install_mdns is only meaningful on Linux - - os: windows-2022 + - os: windows-2025 install_mdns: true # for now, unicast DNS-SD tests are only implemented on Linux - - os: windows-2022 + - os: windows-2025 dns_sd_mode: unicast - os: ubuntu-22.04 enable_authorization: false @@ -45,12 +45,20 @@ jobs: install_mdns: true - os: ubuntu-24.04 dns_sd_mode: unicast - # don't force ASIO for ubuntu platforms + # don't force ASIO for ubuntu platforms - os: ubuntu-24.04 force_cpprest_asio: true - + include: + # keep one VS 2022 job while validating VS 2026 on windows-2025 + - os: windows-2022 + install_mdns: false + use_conan: true + force_cpprest_asio: false + dns_sd_mode: multicast + enable_authorization: true + steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: set environment variables shell: bash @@ -101,13 +109,8 @@ jobs: run: | pip install conan~=2.20 - - name: 'ubuntu-14.04: install cmake' - if: matrix.os == 'ubuntu-14.04' - uses: lukka/get-cmake@v3.24.2 - - name: install cmake - if: matrix.os != 'ubuntu-14.04' - uses: lukka/get-cmake@v3.28.3 + uses: lukka/get-cmake@v4.4.0 - name: setup bash path working-directory: ${{ env.GITHUB_WORKSPACE }} @@ -122,7 +125,7 @@ jobs: run: | # set compiler to cl.exe to avoid building with gcc. echo "CMAKE_COMPILER_ARGS=-DCMAKE_C_COMPILER=cl.exe -DCMAKE_CXX_COMPILER=cl.exe" >> $env:GITHUB_ENV - # disable unused network interface (may not exist on windows-2022 runners) + # disable unused network interface (may not exist on Windows runners) $nat = Get-NetAdapter -Name 'vEthernet (nat)' -ErrorAction SilentlyContinue if ($nat) { netsh interface set interface name="vEthernet (nat)" admin=DISABLED @@ -283,6 +286,16 @@ jobs: run: | echo "CONAN_INSTALL_EXTRA_ARGS=--options\;cpprestsdk/*:http_client_impl=asio\;--options\;cpprestsdk/*:http_listener_impl=asio" >> $GITHUB_ENV + # windows-2025 uses VS 2026 (MSVC 195). Conan Center prebuilts are built for + # MSVC 193/194; pin 194 so conan install downloads packages instead of building + # from source. Command-line -s overrides cmake-conan's auto-cmake profile (which + # would otherwise report 195). See actions/runner-images#14017. + - name: pin conan msvc 194 (windows-2025) + if: matrix.os == 'windows-2025' && matrix.use_conan == true + shell: bash + run: | + echo "CONAN_INSTALL_EXTRA_ARGS=${CONAN_INSTALL_EXTRA_ARGS:+$CONAN_INSTALL_EXTRA_ARGS\;}-s\;compiler.version=194" >> $GITHUB_ENV + - name: enable conan if: matrix.use_conan == true shell: bash @@ -298,12 +311,16 @@ jobs: uses: ilammy/msvc-dev-cmd@v1 - name: build - uses: lukka/run-cmake@v3.4 - with: - cmakeListsOrSettingsJson: CMakeListsTxtAdvanced - cmakeListsTxtPath: '${{ env.GITHUB_WORKSPACE }}/Development/CMakeLists.txt' - buildDirectory: '${{ env.RUNNER_WORKSPACE }}/build/' - cmakeAppendedArgs: '-GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${{ env.RUNNER_WORKSPACE }}/install" ${{ env.CMAKE_COMPILER_ARGS }} ${{ env.CMAKE_EXTRA_ARGS }}' + shell: bash + run: | + cmake -S "${{ env.GITHUB_WORKSPACE }}/Development" \ + -B "${{ env.RUNNER_WORKSPACE }}/build" \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="${{ env.RUNNER_WORKSPACE }}/install" \ + ${{ env.CMAKE_COMPILER_ARGS }} \ + ${{ env.CMAKE_EXTRA_ARGS }} + cmake --build "${{ env.RUNNER_WORKSPACE }}/build" - name: dump conan lockfile if: matrix.use_conan == true @@ -323,12 +340,9 @@ jobs: ctest --output-on-failure ${{ env.CTEST_EXPECTED_FAILURES }} - name: install - uses: lukka/run-cmake@v3.4 - with: - cmakeListsOrSettingsJson: CMakeListsTxtAdvanced - cmakeListsTxtPath: '${{ env.GITHUB_WORKSPACE }}/Development/CMakeLists.txt' - buildDirectory: '${{ env.RUNNER_WORKSPACE }}/build/' - buildWithCMakeArgs: '--target install' + shell: bash + run: | + cmake --build "${{ env.RUNNER_WORKSPACE }}/build" --target install - name: set install test environment variable shell: bash @@ -338,18 +352,18 @@ jobs: - name: install test if: runner.os != 'macOS' - uses: lukka/run-cmake@v3.4 - with: - cmakeListsOrSettingsJson: CMakeListsTxtAdvanced - cmakeListsTxtPath: '${{ env.GITHUB_WORKSPACE }}/Sandbox/my-nmos-node/CMakeLists.txt' - buildDirectory: '${{ env.RUNNER_WORKSPACE }}/build-my-nmos-node/' - cmakeAppendedArgs: '-GNinja - -DCMAKE_BUILD_TYPE=Release - -DCMAKE_FIND_PACKAGE_PREFER_CONFIG="1" - -DCMAKE_MODULE_PATH="${{ env.CMAKE_WORKSPACE }}/build/conan" - -DCMAKE_PREFIX_PATH="${{ env.CMAKE_WORKSPACE }}/install" - -DCMAKE_INSTALL_PREFIX="${{ env.CMAKE_WORKSPACE }}/build/conan" - ${{ env.CMAKE_COMPILER_ARGS }}' + shell: bash + run: | + cmake -S "${{ env.GITHUB_WORKSPACE }}/Sandbox/my-nmos-node" \ + -B "${{ env.RUNNER_WORKSPACE }}/build-my-nmos-node" \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=1 \ + -DCMAKE_MODULE_PATH="${{ env.CMAKE_WORKSPACE }}/build/conan" \ + -DCMAKE_PREFIX_PATH="${{ env.CMAKE_WORKSPACE }}/install" \ + -DCMAKE_INSTALL_PREFIX="${{ env.CMAKE_WORKSPACE }}/build/conan" \ + ${{ env.CMAKE_COMPILER_ARGS }} + cmake --build "${{ env.RUNNER_WORKSPACE }}/build-my-nmos-node" - name: install test log if: runner.os != 'macOS' @@ -574,12 +588,12 @@ jobs: export SHEET=https://docs.google.com/spreadsheets/d/${{ env.SECRET_RESULTS_SHEET_ID }} python nmos-testing/utilities/run-test-suites/gsheetsImport/resultsImporter.py --credentials ${{ env.GDRIVE_CREDENTIALS }} --sheet "$SHEET" --insert --json nmos-testing/results/${{ env.GITHUB_COMMIT }}-*.json || echo "upload failed" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: ${{ env.BUILD_NAME }}_badges path: ${{ runner.workspace }}/nmos-testing/badges - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: ${{ env.BUILD_NAME }}_results path: ${{ runner.workspace }}/nmos-testing/results @@ -590,7 +604,7 @@ jobs: needs: [build_and_test] runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: set environment variables shell: bash @@ -600,7 +614,7 @@ jobs: echo "GITHUB_WORKSPACE=${{ github.workspace }}" >> $GITHUB_ENV echo "RUNNER_WORKSPACE=${{ runner.workspace }}" >> $GITHUB_ENV - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v7 with: path: ${{ runner.workspace }}/artifacts diff --git a/.github/workflows/src/build-setup.yml b/.github/workflows/src/build-setup.yml index 34d27a658..ff14054a8 100644 --- a/.github/workflows/src/build-setup.yml +++ b/.github/workflows/src/build-setup.yml @@ -3,13 +3,8 @@ run: | pip install conan~=2.20 -- name: 'ubuntu-14.04: install cmake' - if: matrix.os == 'ubuntu-14.04' - uses: lukka/get-cmake@v3.24.2 - - name: install cmake - if: matrix.os != 'ubuntu-14.04' - uses: lukka/get-cmake@v3.28.3 + uses: lukka/get-cmake@v4.4.0 - name: setup bash path working-directory: ${{ env.GITHUB_WORKSPACE }} @@ -24,7 +19,7 @@ run: | # set compiler to cl.exe to avoid building with gcc. echo "CMAKE_COMPILER_ARGS=-DCMAKE_C_COMPILER=cl.exe -DCMAKE_CXX_COMPILER=cl.exe" >> $env:GITHUB_ENV - # disable unused network interface (may not exist on windows-2022 runners) + # disable unused network interface (may not exist on Windows runners) $nat = Get-NetAdapter -Name 'vEthernet (nat)' -ErrorAction SilentlyContinue if ($nat) { netsh interface set interface name="vEthernet (nat)" admin=DISABLED @@ -185,6 +180,16 @@ run: | echo "CONAN_INSTALL_EXTRA_ARGS=--options\;cpprestsdk/*:http_client_impl=asio\;--options\;cpprestsdk/*:http_listener_impl=asio" >> $GITHUB_ENV +# windows-2025 uses VS 2026 (MSVC 195). Conan Center prebuilts are built for +# MSVC 193/194; pin 194 so conan install downloads packages instead of building +# from source. Command-line -s overrides cmake-conan's auto-cmake profile (which +# would otherwise report 195). See actions/runner-images#14017. +- name: pin conan msvc 194 (windows-2025) + if: matrix.os == 'windows-2025' && matrix.use_conan == true + shell: bash + run: | + echo "CONAN_INSTALL_EXTRA_ARGS=${CONAN_INSTALL_EXTRA_ARGS:+$CONAN_INSTALL_EXTRA_ARGS\;}-s\;compiler.version=194" >> $GITHUB_ENV + - name: enable conan if: matrix.use_conan == true shell: bash diff --git a/.github/workflows/src/build-test.yml b/.github/workflows/src/build-test.yml index f919cce32..9e1c08bfb 100644 --- a/.github/workflows/src/build-test.yml +++ b/.github/workflows/src/build-test.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-22.04, ubuntu-24.04, windows-2022] + os: [ubuntu-22.04, ubuntu-24.04, windows-2025] install_mdns: [false, true] use_conan: [true] force_cpprest_asio: [false, true] @@ -25,10 +25,10 @@ jobs: enable_authorization: [false, true] exclude: # install_mdns is only meaningful on Linux - - os: windows-2022 + - os: windows-2025 install_mdns: true # for now, unicast DNS-SD tests are only implemented on Linux - - os: windows-2022 + - os: windows-2025 dns_sd_mode: unicast - os: ubuntu-22.04 enable_authorization: false @@ -45,12 +45,20 @@ jobs: install_mdns: true - os: ubuntu-24.04 dns_sd_mode: unicast - # don't force ASIO for ubuntu platforms + # don't force ASIO for ubuntu platforms - os: ubuntu-24.04 force_cpprest_asio: true - + include: + # keep one VS 2022 job while validating VS 2026 on windows-2025 + - os: windows-2022 + install_mdns: false + use_conan: true + force_cpprest_asio: false + dns_sd_mode: multicast + enable_authorization: true + steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: set environment variables shell: bash @@ -93,7 +101,7 @@ jobs: needs: [build_and_test] runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: set environment variables shell: bash @@ -103,7 +111,7 @@ jobs: echo "GITHUB_WORKSPACE=${{ github.workspace }}" >> $GITHUB_ENV echo "RUNNER_WORKSPACE=${{ runner.workspace }}" >> $GITHUB_ENV - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v7 with: path: ${{ runner.workspace }}/artifacts diff --git a/.github/workflows/src/build.yml b/.github/workflows/src/build.yml index 80b669d62..b6d0365fa 100644 --- a/.github/workflows/src/build.yml +++ b/.github/workflows/src/build.yml @@ -3,12 +3,16 @@ uses: ilammy/msvc-dev-cmd@v1 - name: build - uses: lukka/run-cmake@v3.4 - with: - cmakeListsOrSettingsJson: CMakeListsTxtAdvanced - cmakeListsTxtPath: '${{ env.GITHUB_WORKSPACE }}/Development/CMakeLists.txt' - buildDirectory: '${{ env.RUNNER_WORKSPACE }}/build/' - cmakeAppendedArgs: '-GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${{ env.RUNNER_WORKSPACE }}/install" ${{ env.CMAKE_COMPILER_ARGS }} ${{ env.CMAKE_EXTRA_ARGS }}' + shell: bash + run: | + cmake -S "${{ env.GITHUB_WORKSPACE }}/Development" \ + -B "${{ env.RUNNER_WORKSPACE }}/build" \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="${{ env.RUNNER_WORKSPACE }}/install" \ + ${{ env.CMAKE_COMPILER_ARGS }} \ + ${{ env.CMAKE_EXTRA_ARGS }} + cmake --build "${{ env.RUNNER_WORKSPACE }}/build" - name: dump conan lockfile if: matrix.use_conan == true diff --git a/.github/workflows/src/install-test.yml b/.github/workflows/src/install-test.yml index 95926816b..8c4f8ed63 100644 --- a/.github/workflows/src/install-test.yml +++ b/.github/workflows/src/install-test.yml @@ -6,18 +6,18 @@ - name: install test if: runner.os != 'macOS' - uses: lukka/run-cmake@v3.4 - with: - cmakeListsOrSettingsJson: CMakeListsTxtAdvanced - cmakeListsTxtPath: '${{ env.GITHUB_WORKSPACE }}/Sandbox/my-nmos-node/CMakeLists.txt' - buildDirectory: '${{ env.RUNNER_WORKSPACE }}/build-my-nmos-node/' - cmakeAppendedArgs: '-GNinja - -DCMAKE_BUILD_TYPE=Release - -DCMAKE_FIND_PACKAGE_PREFER_CONFIG="1" - -DCMAKE_MODULE_PATH="${{ env.CMAKE_WORKSPACE }}/build/conan" - -DCMAKE_PREFIX_PATH="${{ env.CMAKE_WORKSPACE }}/install" - -DCMAKE_INSTALL_PREFIX="${{ env.CMAKE_WORKSPACE }}/build/conan" - ${{ env.CMAKE_COMPILER_ARGS }}' + shell: bash + run: | + cmake -S "${{ env.GITHUB_WORKSPACE }}/Sandbox/my-nmos-node" \ + -B "${{ env.RUNNER_WORKSPACE }}/build-my-nmos-node" \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=1 \ + -DCMAKE_MODULE_PATH="${{ env.CMAKE_WORKSPACE }}/build/conan" \ + -DCMAKE_PREFIX_PATH="${{ env.CMAKE_WORKSPACE }}/install" \ + -DCMAKE_INSTALL_PREFIX="${{ env.CMAKE_WORKSPACE }}/build/conan" \ + ${{ env.CMAKE_COMPILER_ARGS }} + cmake --build "${{ env.RUNNER_WORKSPACE }}/build-my-nmos-node" - name: install test log if: runner.os != 'macOS' diff --git a/.github/workflows/src/install.yml b/.github/workflows/src/install.yml index 35cda17b4..13843df32 100644 --- a/.github/workflows/src/install.yml +++ b/.github/workflows/src/install.yml @@ -1,7 +1,4 @@ - name: install - uses: lukka/run-cmake@v3.4 - with: - cmakeListsOrSettingsJson: CMakeListsTxtAdvanced - cmakeListsTxtPath: '${{ env.GITHUB_WORKSPACE }}/Development/CMakeLists.txt' - buildDirectory: '${{ env.RUNNER_WORKSPACE }}/build/' - buildWithCMakeArgs: '--target install' + shell: bash + run: | + cmake --build "${{ env.RUNNER_WORKSPACE }}/build" --target install diff --git a/.github/workflows/src/save-results.yml b/.github/workflows/src/save-results.yml index c4991df13..c44911488 100644 --- a/.github/workflows/src/save-results.yml +++ b/.github/workflows/src/save-results.yml @@ -6,12 +6,12 @@ export SHEET=https://docs.google.com/spreadsheets/d/${{ env.SECRET_RESULTS_SHEET_ID }} python nmos-testing/utilities/run-test-suites/gsheetsImport/resultsImporter.py --credentials ${{ env.GDRIVE_CREDENTIALS }} --sheet "$SHEET" --insert --json nmos-testing/results/${{ env.GITHUB_COMMIT }}-*.json || echo "upload failed" -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: ${{ env.BUILD_NAME }}_badges path: ${{ runner.workspace }}/nmos-testing/badges -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: ${{ env.BUILD_NAME }}_results path: ${{ runner.workspace }}/nmos-testing/results diff --git a/Development/cmake/NmosCppDependencies.cmake b/Development/cmake/NmosCppDependencies.cmake index 5479a481a..d4c2c3cfd 100644 --- a/Development/cmake/NmosCppDependencies.cmake +++ b/Development/cmake/NmosCppDependencies.cmake @@ -1,7 +1,7 @@ # Boost set(BOOST_VERSION_MIN "1.54.0") -set(BOOST_VERSION_CUR "1.83.0") +set(BOOST_VERSION_CUR "1.91.0") # note: 1.57.0 doesn't work due to https://svn.boost.org/trac10/ticket/10754 # note: some components are only required for one platform or other # so find_package(Boost) is called after adding those components @@ -16,8 +16,10 @@ endif() # since std::shared_mutex is not available until C++17 # see bst/shared_mutex.h list(APPEND FIND_BOOST_COMPONENTS thread) -find_package(Boost ${BOOST_VERSION_MIN} REQUIRED COMPONENTS ${FIND_BOOST_COMPONENTS}) -# cope with historical versions of FindBoost.cmake +# Prefer BoostConfig.cmake (CMake 3.30+ / CMP0167). Legacy FindBoost is removed +# there; Config mode is what Conan CMakeDeps and modern Boost installs provide. +find_package(Boost ${BOOST_VERSION_MIN} CONFIG REQUIRED COMPONENTS ${FIND_BOOST_COMPONENTS}) +# cope with historical versions of FindBoost.cmake / BoostConfig.cmake if(DEFINED Boost_VERSION_STRING) set(Boost_VERSION_COMPONENTS "${Boost_VERSION_STRING}") elseif(DEFINED Boost_VERSION_MAJOR) diff --git a/Development/conanfile.py b/Development/conanfile.py new file mode 100644 index 000000000..91b534122 --- /dev/null +++ b/Development/conanfile.py @@ -0,0 +1,24 @@ +from conan import ConanFile + + +class NmosCppConan(ConanFile): + settings = "os", "arch", "compiler", "build_type" + generators = "CMakeDeps" + # Conan Center recipes still pin older transitive deps (cpprestsdk → boost/1.83.0, + # json-schema-validator → nlohmann_json/3.11.3). Force the versions we want for the + # whole graph. without_cobalt avoids packaging failures when Boost is built from + # source with OpenSSL present (conan-center-index#30414). + default_options = { + "boost/*:shared": False, + "boost/*:without_cobalt": True, + } + + def requirements(self): + self.requires("boost/1.91.0", force=True) + self.requires("cpprestsdk/2.10.19") + self.requires("websocketpp/0.8.2") + self.requires("openssl/3.5.7") + self.requires("json-schema-validator/2.4.0") + self.requires("nlohmann_json/3.12.0", force=True) + self.requires("zlib/1.3.2") + self.requires("jwt-cpp/0.7.2") diff --git a/Development/conanfile.txt b/Development/conanfile.txt deleted file mode 100644 index cf66b3ee6..000000000 --- a/Development/conanfile.txt +++ /dev/null @@ -1,20 +0,0 @@ -[requires] -boost/1.83.0 -cpprestsdk/2.10.19 -websocketpp/0.8.2 -openssl/3.5.2 -json-schema-validator/2.3.0 -nlohmann_json/3.11.3 -zlib/1.3.1 -jwt-cpp/0.7.1 - -[imports] -bin, *.dll -> ./bin -lib, *.so* -> ./lib -lib, *.dylib* -> ./lib - -[options] -boost/*:shared=False - -[generators] -CMakeDeps diff --git a/Documents/Dependencies.md b/Documents/Dependencies.md index 52d8f2778..377b93ce0 100644 --- a/Documents/Dependencies.md +++ b/Documents/Dependencies.md @@ -34,7 +34,8 @@ Specific instructions for [cross-compiling for Raspberry Pi](Raspberry-Pi.md) ar 1. Download and install a recent [CMake stable release](https://cmake.org/download/#latest) for your platform Notes: - - Currently, CMake 3.24 or higher is required in order to use the Conan package manager; version 4.1.0 (latest release at the time) has been tested + - Currently, CMake 3.24 or higher is required in order to use the Conan package manager; version 4.4.0 has been tested + (CMake 4.2 or higher is required for the Visual Studio 18 2026 generator, but is not a hard project requirement) - Pre-built binary distributions are available for many platforms - On Linux distributions, e.g. Ubuntu 14.04 LTS (long-term support), the pre-built binary version available via ``apt-get`` may be too out-of-date Fetch, build and install a suitable version: @@ -74,9 +75,10 @@ If using Conan, this section can be skipped. 1. Download a [recent release](http://www.boost.org/users/download/) Notes: - - Several Boost releases have been tested, including Version 1.83.0 (latest release at the time) and Version 1.54.0 + - Several Boost releases have been tested, including Version 1.91.0 (latest release at the time) and Version 1.54.0 - On Linux distributions, a Boost libraries package may already be installed, e.g. Ubuntu 14.04 LTS has Version 1.54.0 -2. Expand the archive so that, for example, the boost\_1\_83\_0 directory is at the same level as the nmos-cpp directory + (Ubuntu 14.04 is no longer exercised in CI) +2. Expand the archive so that, for example, the boost\_1\_91\_0 directory is at the same level as the nmos-cpp directory 3. Build and stage (or install) the following Boost libraries for your platform/toolset: - atomic - chrono @@ -230,13 +232,13 @@ If using Conan, this section can be skipped. The C++ REST SDK depends on [OpenSSL](https://www.openssl.org/) (to implement secure HTTP and/or secure WebSockets). The nmos-cpp codebase also uses OpenSSL directly to implement the specific requirements of [AMWA BCP-003-01 Secure Communication in NMOS Systems](https://specs.amwa.tv/bcp-003-01/) and [AMWA BCP-003-02 Authorization in NMOS Systems](https://specs.amwa.tv/bcp-003-02/). -OpenSSL version 3 is recommended, and version 3.5.2 (latest release at the time) has been tested. +OpenSSL version 3 is recommended, and version 3.5.7 (latest 3.5 LTS release at the time) has been tested. It is currently also possible to use OpenSSL v1.1.1, although [this OpenSSL release is now end of life](https://www.openssl.org/blog/blog/2023/09/11/eol-111/index.html). 1. Download and install a recent release Notes: - On Windows, an installer can be downloaded from [Shining Light Productions - Win32 OpenSSL](https://slproweb.com/products/Win32OpenSSL.html) - The Win64 OpenSSL v3.5.2 installer (latest release at the time) has been tested + The Win64 OpenSSL v3.5.7 installer (latest 3.5 LTS release at the time) has been tested - On Linux distributions, an OpenSSL package may already be available For example, Ubuntu 22.04 LTS includes OpenSSL v3.0.2 diff --git a/README.md b/README.md index a09ba47ee..cf8093cab 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,10 @@ The following configurations, defined by the [build-test](.github/workflows/src/ | Linux | Ubuntu 22.04 (GCC 11.2.0) | Avahi | Secure Communications
IS-10 Authorization
Multicast DNS-SD | | Linux | Ubuntu 22.04 (GCC 11.2.0) | Avahi | Secure Communications
IS-10 Authorization
Unicast DNS-SD | | Linux | Ubuntu 22.04 (GCC 11.2.0) | mDNSResponder | Secure Communications
IS-10 Authorization
Multicast DNS-SD | -| Windows | Server 2022 (VS 2022) | Bonjour (mDNSResponder), ASIO | Secure Communications
Multicast DNS-SD | -| Windows | Server 2022 (VS 2022) | Bonjour (mDNSResponder), ASIO | Secure Communications
IS-10 Authorization
Multicast DNS-SD | -| Windows | Server 2022 (VS 2022) | Bonjour (mDNSResponder), WinHTTP | Secure Communications
Multicast DNS-SD | +| Windows | Server 2025 (VS 2026) | Bonjour (mDNSResponder), ASIO | Secure Communications
Multicast DNS-SD | +| Windows | Server 2025 (VS 2026) | Bonjour (mDNSResponder), ASIO | Secure Communications
IS-10 Authorization
Multicast DNS-SD | +| Windows | Server 2025 (VS 2026) | Bonjour (mDNSResponder), WinHTTP | Secure Communications
Multicast DNS-SD | +| Windows | Server 2025 (VS 2026) | Bonjour (mDNSResponder), WinHTTP | Secure Communications
IS-10 Authorization
Multicast DNS-SD | | Windows | Server 2022 (VS 2022) | Bonjour (mDNSResponder), WinHTTP | Secure Communications
IS-10 Authorization
Multicast DNS-SD | The [AMWA NMOS API Testing Tool](https://github.com/AMWA-TV/nmos-testing) is automatically run against the APIs of the **nmos-cpp-node** and **nmos-cpp-registry** applications. From 758cf247a25a47656f930792732c917cadffb6f1 Mon Sep 17 00:00:00 2001 From: Gareth Sylvester-Bradley Date: Mon, 20 Jul 2026 19:59:45 +0100 Subject: [PATCH 2/4] Cap Boost at 1.86.0 for WebSocket++ / Asio compatibility Boost 1.87 removed deprecated Asio APIs still required by unpatched websocketpp 0.8.2 and by nmos-cpp's own Asio usage, so Conan builds of cpprestsdk against 1.91 fail. Signed-off-by: Gareth Sylvester-Bradley --- Development/cmake/NmosCppDependencies.cmake | 2 +- Development/conanfile.py | 8 +++++--- Documents/Dependencies.md | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Development/cmake/NmosCppDependencies.cmake b/Development/cmake/NmosCppDependencies.cmake index d4c2c3cfd..b95f0e2d8 100644 --- a/Development/cmake/NmosCppDependencies.cmake +++ b/Development/cmake/NmosCppDependencies.cmake @@ -1,7 +1,7 @@ # Boost set(BOOST_VERSION_MIN "1.54.0") -set(BOOST_VERSION_CUR "1.91.0") +set(BOOST_VERSION_CUR "1.86.0") # note: 1.57.0 doesn't work due to https://svn.boost.org/trac10/ticket/10754 # note: some components are only required for one platform or other # so find_package(Boost) is called after adding those components diff --git a/Development/conanfile.py b/Development/conanfile.py index 91b534122..b5bd02f85 100644 --- a/Development/conanfile.py +++ b/Development/conanfile.py @@ -6,15 +6,17 @@ class NmosCppConan(ConanFile): generators = "CMakeDeps" # Conan Center recipes still pin older transitive deps (cpprestsdk → boost/1.83.0, # json-schema-validator → nlohmann_json/3.11.3). Force the versions we want for the - # whole graph. without_cobalt avoids packaging failures when Boost is built from - # source with OpenSSL present (conan-center-index#30414). + # whole graph. Cap Boost at 1.86.0: 1.87 removed deprecated Asio APIs that unpatched + # websocketpp 0.8.2 (and our own Asio usage) still need. without_cobalt avoids + # packaging failures when Boost is built from source with OpenSSL present + # (conan-center-index#30414). default_options = { "boost/*:shared": False, "boost/*:without_cobalt": True, } def requirements(self): - self.requires("boost/1.91.0", force=True) + self.requires("boost/1.86.0", force=True) self.requires("cpprestsdk/2.10.19") self.requires("websocketpp/0.8.2") self.requires("openssl/3.5.7") diff --git a/Documents/Dependencies.md b/Documents/Dependencies.md index 377b93ce0..6643af26b 100644 --- a/Documents/Dependencies.md +++ b/Documents/Dependencies.md @@ -75,10 +75,12 @@ If using Conan, this section can be skipped. 1. Download a [recent release](http://www.boost.org/users/download/) Notes: - - Several Boost releases have been tested, including Version 1.91.0 (latest release at the time) and Version 1.54.0 + - Several Boost releases have been tested, including Version 1.86.0 and Version 1.54.0 + - Boost 1.87+ is not yet supported: it removes deprecated Asio APIs still required by + WebSocket++ 0.8.2 (and some nmos-cpp Asio usage) - On Linux distributions, a Boost libraries package may already be installed, e.g. Ubuntu 14.04 LTS has Version 1.54.0 (Ubuntu 14.04 is no longer exercised in CI) -2. Expand the archive so that, for example, the boost\_1\_91\_0 directory is at the same level as the nmos-cpp directory +2. Expand the archive so that, for example, the boost\_1\_86\_0 directory is at the same level as the nmos-cpp directory 3. Build and stage (or install) the following Boost libraries for your platform/toolset: - atomic - chrono From b1939966eb5157d8091660dab398f197278271ad Mon Sep 17 00:00:00 2001 From: Gareth Sylvester-Bradley Date: Mon, 20 Jul 2026 20:12:40 +0100 Subject: [PATCH 3/4] Tell Conan to use VS 18 when building under the MSVC 194 pin compiler.version=194 maps to Visual Studio 17, which is absent on windows-2025; set tools.microsoft.msbuild:vs_version=18 so source builds (e.g. json-schema-validator) use the installed VS 2026. Signed-off-by: Gareth Sylvester-Bradley --- .github/workflows/build-test.yml | 6 ++++-- .github/workflows/src/build-setup.yml | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 1a99772f0..801486c75 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -289,12 +289,14 @@ jobs: # windows-2025 uses VS 2026 (MSVC 195). Conan Center prebuilts are built for # MSVC 193/194; pin 194 so conan install downloads packages instead of building # from source. Command-line -s overrides cmake-conan's auto-cmake profile (which - # would otherwise report 195). See actions/runner-images#14017. + # would otherwise report 195). vs_version=18 is required when a package still + # builds from source: Conan maps compiler.version=194 → VS 17, which is not + # installed on this image. See actions/runner-images#14017. - name: pin conan msvc 194 (windows-2025) if: matrix.os == 'windows-2025' && matrix.use_conan == true shell: bash run: | - echo "CONAN_INSTALL_EXTRA_ARGS=${CONAN_INSTALL_EXTRA_ARGS:+$CONAN_INSTALL_EXTRA_ARGS\;}-s\;compiler.version=194" >> $GITHUB_ENV + echo "CONAN_INSTALL_EXTRA_ARGS=${CONAN_INSTALL_EXTRA_ARGS:+$CONAN_INSTALL_EXTRA_ARGS\;}-s\;compiler.version=194\;-c\;tools.microsoft.msbuild:vs_version=18" >> $GITHUB_ENV - name: enable conan if: matrix.use_conan == true diff --git a/.github/workflows/src/build-setup.yml b/.github/workflows/src/build-setup.yml index ff14054a8..61f63d02e 100644 --- a/.github/workflows/src/build-setup.yml +++ b/.github/workflows/src/build-setup.yml @@ -183,12 +183,14 @@ # windows-2025 uses VS 2026 (MSVC 195). Conan Center prebuilts are built for # MSVC 193/194; pin 194 so conan install downloads packages instead of building # from source. Command-line -s overrides cmake-conan's auto-cmake profile (which -# would otherwise report 195). See actions/runner-images#14017. +# would otherwise report 195). vs_version=18 is required when a package still +# builds from source: Conan maps compiler.version=194 → VS 17, which is not +# installed on this image. See actions/runner-images#14017. - name: pin conan msvc 194 (windows-2025) if: matrix.os == 'windows-2025' && matrix.use_conan == true shell: bash run: | - echo "CONAN_INSTALL_EXTRA_ARGS=${CONAN_INSTALL_EXTRA_ARGS:+$CONAN_INSTALL_EXTRA_ARGS\;}-s\;compiler.version=194" >> $GITHUB_ENV + echo "CONAN_INSTALL_EXTRA_ARGS=${CONAN_INSTALL_EXTRA_ARGS:+$CONAN_INSTALL_EXTRA_ARGS\;}-s\;compiler.version=194\;-c\;tools.microsoft.msbuild:vs_version=18" >> $GITHUB_ENV - name: enable conan if: matrix.use_conan == true From 63897a3b1bbbd8470dac90fc1d7e0e56da5800d4 Mon Sep 17 00:00:00 2001 From: Gareth Sylvester-Bradley Date: Tue, 21 Jul 2026 06:32:44 +0100 Subject: [PATCH 4/4] Support C++11 and C++17 filesystem builds on VS 2026 Use Boost.Filesystem when VS 2026 builds below C++17, while retaining std::filesystem for C++17 and adding a targeted CI job for that path. Signed-off-by: Gareth Sylvester-Bradley --- .github/workflows/build-test.yml | 23 ++++++++++++++++----- .github/workflows/src/build-test.yml | 23 ++++++++++++++++----- Development/bst/filesystem.h | 22 +++++++++----------- Development/cmake/NmosCppDependencies.cmake | 3 +++ 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 801486c75..fb6178299 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -12,7 +12,7 @@ env: SECRET_RESULTS_SHEET_ID: ${{ secrets.RESULTS_SHEET_ID }} jobs: build_and_test: - name: '${{ matrix.os }}: build and test (install mdns: ${{ matrix.install_mdns }}, use conan: ${{ matrix.use_conan }}, force cpprest asio: ${{ matrix.force_cpprest_asio }}, dns-sd mode: ${{ matrix.dns_sd_mode}}, enable_authorization: ${{ matrix.enable_authorization }})' + name: "${{ matrix.os }}: build and test (C++ standard: ${{ matrix.cxx_standard || 'minimum' }}, install mdns: ${{ matrix.install_mdns }}, use conan: ${{ matrix.use_conan }}, force cpprest asio: ${{ matrix.force_cpprest_asio }}, dns-sd mode: ${{ matrix.dns_sd_mode}}, enable_authorization: ${{ matrix.enable_authorization }})" runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -49,6 +49,14 @@ jobs: - os: ubuntu-24.04 force_cpprest_asio: true include: + # exercise std::filesystem on VS 2026; regular windows-2025 jobs use the minimum standard + - os: windows-2025 + install_mdns: false + use_conan: true + force_cpprest_asio: false + dns_sd_mode: multicast + enable_authorization: true + cxx_standard: 17 # keep one VS 2022 job while validating VS 2026 on windows-2025 - os: windows-2022 install_mdns: false @@ -69,16 +77,21 @@ jobs: authorization_mode=noauth fi + if [[ -n "${{ matrix.cxx_standard }}" ]]; then + cxx_standard_suffix="_cxx${{ matrix.cxx_standard }}" + echo "CMAKE_EXTRA_ARGS=${{ env.CMAKE_EXTRA_ARGS }} -DCMAKE_CXX_STANDARD=${{ matrix.cxx_standard }}" >> $GITHUB_ENV + fi + if [[ "${{ runner.os }}" == "Linux" ]]; then if [[ "${{ matrix.install_mdns }}" == "true" ]]; then - echo "BUILD_NAME=${{ matrix.os }}_mdns_${{ matrix.dns_sd_mode }}_$authorization_mode" >> $GITHUB_ENV + echo "BUILD_NAME=${{ matrix.os }}_mdns_${{ matrix.dns_sd_mode }}_$authorization_mode$cxx_standard_suffix" >> $GITHUB_ENV else - echo "BUILD_NAME=${{ matrix.os }}_avahi_${{ matrix.dns_sd_mode }}_$authorization_mode" >> $GITHUB_ENV + echo "BUILD_NAME=${{ matrix.os }}_avahi_${{ matrix.dns_sd_mode }}_$authorization_mode$cxx_standard_suffix" >> $GITHUB_ENV fi elif [[ "${{ matrix.force_cpprest_asio }}" == "true" ]]; then - echo "BUILD_NAME=${{ matrix.os }}_asio_$authorization_mode" >> $GITHUB_ENV + echo "BUILD_NAME=${{ matrix.os }}_asio_$authorization_mode$cxx_standard_suffix" >> $GITHUB_ENV else - echo "BUILD_NAME=${{ matrix.os }}_$authorization_mode" >> $GITHUB_ENV + echo "BUILD_NAME=${{ matrix.os }}_$authorization_mode$cxx_standard_suffix" >> $GITHUB_ENV fi GITHUB_COMMIT=`echo "${{ github.sha }}" | cut -c1-7` echo "GITHUB_COMMIT=$GITHUB_COMMIT" >> $GITHUB_ENV diff --git a/.github/workflows/src/build-test.yml b/.github/workflows/src/build-test.yml index 9e1c08bfb..88560aa24 100644 --- a/.github/workflows/src/build-test.yml +++ b/.github/workflows/src/build-test.yml @@ -12,7 +12,7 @@ env: SECRET_RESULTS_SHEET_ID: ${{ secrets.RESULTS_SHEET_ID }} jobs: build_and_test: - name: '${{ matrix.os }}: build and test (install mdns: ${{ matrix.install_mdns }}, use conan: ${{ matrix.use_conan }}, force cpprest asio: ${{ matrix.force_cpprest_asio }}, dns-sd mode: ${{ matrix.dns_sd_mode}}, enable_authorization: ${{ matrix.enable_authorization }})' + name: "${{ matrix.os }}: build and test (C++ standard: ${{ matrix.cxx_standard || 'minimum' }}, install mdns: ${{ matrix.install_mdns }}, use conan: ${{ matrix.use_conan }}, force cpprest asio: ${{ matrix.force_cpprest_asio }}, dns-sd mode: ${{ matrix.dns_sd_mode}}, enable_authorization: ${{ matrix.enable_authorization }})" runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -49,6 +49,14 @@ jobs: - os: ubuntu-24.04 force_cpprest_asio: true include: + # exercise std::filesystem on VS 2026; regular windows-2025 jobs use the minimum standard + - os: windows-2025 + install_mdns: false + use_conan: true + force_cpprest_asio: false + dns_sd_mode: multicast + enable_authorization: true + cxx_standard: 17 # keep one VS 2022 job while validating VS 2026 on windows-2025 - os: windows-2022 install_mdns: false @@ -69,16 +77,21 @@ jobs: authorization_mode=noauth fi + if [[ -n "${{ matrix.cxx_standard }}" ]]; then + cxx_standard_suffix="_cxx${{ matrix.cxx_standard }}" + echo "CMAKE_EXTRA_ARGS=${{ env.CMAKE_EXTRA_ARGS }} -DCMAKE_CXX_STANDARD=${{ matrix.cxx_standard }}" >> $GITHUB_ENV + fi + if [[ "${{ runner.os }}" == "Linux" ]]; then if [[ "${{ matrix.install_mdns }}" == "true" ]]; then - echo "BUILD_NAME=${{ matrix.os }}_mdns_${{ matrix.dns_sd_mode }}_$authorization_mode" >> $GITHUB_ENV + echo "BUILD_NAME=${{ matrix.os }}_mdns_${{ matrix.dns_sd_mode }}_$authorization_mode$cxx_standard_suffix" >> $GITHUB_ENV else - echo "BUILD_NAME=${{ matrix.os }}_avahi_${{ matrix.dns_sd_mode }}_$authorization_mode" >> $GITHUB_ENV + echo "BUILD_NAME=${{ matrix.os }}_avahi_${{ matrix.dns_sd_mode }}_$authorization_mode$cxx_standard_suffix" >> $GITHUB_ENV fi elif [[ "${{ matrix.force_cpprest_asio }}" == "true" ]]; then - echo "BUILD_NAME=${{ matrix.os }}_asio_$authorization_mode" >> $GITHUB_ENV + echo "BUILD_NAME=${{ matrix.os }}_asio_$authorization_mode$cxx_standard_suffix" >> $GITHUB_ENV else - echo "BUILD_NAME=${{ matrix.os }}_$authorization_mode" >> $GITHUB_ENV + echo "BUILD_NAME=${{ matrix.os }}_$authorization_mode$cxx_standard_suffix" >> $GITHUB_ENV fi GITHUB_COMMIT=`echo "${{ github.sha }}" | cut -c1-7` echo "GITHUB_COMMIT=$GITHUB_COMMIT" >> $GITHUB_ENV diff --git a/Development/bst/filesystem.h b/Development/bst/filesystem.h index e5bcb7d94..fbdd803b7 100644 --- a/Development/bst/filesystem.h +++ b/Development/bst/filesystem.h @@ -15,24 +15,22 @@ #elif defined(_MSC_VER) -#if _MSC_VER >= 1951 -// From VS2026, or more precisely, MSVC Build Tools v14.51, is finally removed -// See https://learn.microsoft.com/en-us/visualstudio/releases/2026/release-notes -// and https://github.com/microsoft/STL/pull/5765 -#define BST_FILESYSTEM_STD -#elif _MSC_VER >= 1910 // From VS2017, /std:c++17 switch is introduced, but this is only indicated in __cplusplus if /Zc:__cplusplus is also specified -#if __cplusplus >= 201703L +// so use _MSVC_LANG instead +#if defined(_MSVC_LANG) && _MSVC_LANG >= 201703L +// C++17 #define BST_FILESYSTEM_STD -#else +#elif _MSC_VER >= 1951 +// From VS2026 / MSVC Build Tools v14.51, is removed +// See https://learn.microsoft.com/en-us/visualstudio/releases/2026/release-notes +// and https://github.com/microsoft/STL/pull/5765 +#define BST_FILESYSTEM_BOOST +#elif _MSC_VER >= 1900 +// VS2015 #define BST_FILESYSTEM_STD_EXPERIMENTAL #if _MSC_VER >= 1920 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #endif -#endif -#elif _MSC_VER >= 1900 -// VS2015 -#define BST_FILESYSTEM_STD_EXPERIMENTAL #else // Earlier #define BST_FILESYSTEM_MICROSOFT_TR2 diff --git a/Development/cmake/NmosCppDependencies.cmake b/Development/cmake/NmosCppDependencies.cmake index b95f0e2d8..6580f395d 100644 --- a/Development/cmake/NmosCppDependencies.cmake +++ b/Development/cmake/NmosCppDependencies.cmake @@ -12,6 +12,9 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Darwi # add filesystem (for bst/filesystem.h, used by nmos/filesystem_route.cpp) list(APPEND FIND_BOOST_COMPONENTS filesystem) endif() +elseif(MSVC AND MSVC_VERSION GREATER_EQUAL 1951 AND (NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 17)) + # MSVC 14.51 removed , so C++11/14 builds use Boost.Filesystem + list(APPEND FIND_BOOST_COMPONENTS filesystem) endif() # since std::shared_mutex is not available until C++17 # see bst/shared_mutex.h