mirror of
https://github.com/nlohmann/json.git
synced 2026-10-10 00:17:13 +00:00
The custom object key tests from #5328 instantiate a second basic_json specialization in unit-cbor.cpp and unit-msgpack.cpp. This pushed unit-msgpack.cpp.obj past 65535 sections in the clang (MinGW) jobs of the Windows workflow, and linking test-msgpack_cpp11 fails with "relocation truncated to fit: IMAGE_REL_AMD64_REL32 against `.rdata'". The GNU linker keeps the section an associative COMDAT section belongs to in 16 bits (x_associated in include/coff/internal.h), although big object files store 32 bits. In larger objects it therefore ties the jump tables of inline functions to the wrong function and discards them together with that function's duplicate. Move the four tests unchanged into unit-custom-object-key-type.cpp and document the limit in windows.yml. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
224 lines
9.0 KiB
YAML
224 lines
9.0 KiB
YAML
name: Windows
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- develop
|
|
- master
|
|
- release/*
|
|
pull_request:
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
mingw:
|
|
runs-on: windows-2022
|
|
strategy:
|
|
matrix:
|
|
architecture: [x64, x86]
|
|
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Set up MinGW
|
|
uses: egor-tensin/setup-mingw@41b837e47d7f85214629d255b9c4bc3fcbe9fd63 # v3.0
|
|
with:
|
|
platform: ${{ matrix.architecture }}
|
|
version: 12.2.0 # https://github.com/egor-tensin/setup-mingw/issues/14
|
|
- name: Run CMake
|
|
run: cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug -DJSON_BuildTests=On
|
|
- name: Build
|
|
run: cmake --build build --parallel 10
|
|
- name: Test
|
|
run: cd build ; ctest -j 10 -C Debug --output-on-failure
|
|
|
|
msvc:
|
|
strategy:
|
|
matrix:
|
|
build_type: [Debug, Release]
|
|
architecture: [Win32, x64]
|
|
std_version: [default, latest]
|
|
|
|
runs-on: windows-2022
|
|
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Set extra CXX_FLAGS for latest std_version
|
|
id: cxxflags
|
|
run: |
|
|
if [ "${{ matrix.std_version }}" = "latest" ]; then
|
|
echo "flags=/permissive- /std:c++latest /utf-8 /W4 /WX" >> $GITHUB_ENV
|
|
else
|
|
echo "flags=/W4 /WX" >> $GITHUB_ENV
|
|
fi
|
|
shell: bash
|
|
- name: Run CMake (Release)
|
|
run: cmake -S . -B build -G "Visual Studio 17 2022" -A ${{ matrix.architecture }} -DJSON_BuildTests=On -DCMAKE_CXX_FLAGS="$env:flags"
|
|
if: matrix.build_type == 'Release'
|
|
shell: pwsh
|
|
- name: Run CMake (Debug)
|
|
run: cmake -S . -B build -G "Visual Studio 17 2022" -A ${{ matrix.architecture }} -DJSON_BuildTests=On -DJSON_FastTests=ON -DCMAKE_CXX_FLAGS="$env:flags"
|
|
if: matrix.build_type == 'Debug'
|
|
shell: pwsh
|
|
- name: Build
|
|
run: cmake --build build --config ${{ matrix.build_type }} --parallel 10
|
|
- name: Test
|
|
run: cd build ; ctest -j 10 -C ${{ matrix.build_type }} --output-on-failure
|
|
|
|
# Visual Studio 2026 (v145 toolset) on the windows-2025 image. The "Visual Studio
|
|
# 18 2026" generator requires CMake 4.2+, so a recent CMake is fetched explicitly.
|
|
msvc-vs2026:
|
|
strategy:
|
|
matrix:
|
|
build_type: [Debug, Release]
|
|
architecture: [Win32, x64]
|
|
std_version: [default, latest]
|
|
|
|
runs-on: windows-2025
|
|
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Get latest CMake and ninja
|
|
uses: lukka/get-cmake@fffaaafeea488556c2c12dad60690008bc1caacb # v4.4.2
|
|
- name: Set extra CXX_FLAGS for latest std_version
|
|
# /wd5285 silences C5285 emitted by the bundled third-party doctest.h, which
|
|
# specializes std::tuple (newly diagnosed by the VS2026 v145 toolset)
|
|
run: |
|
|
if [ "${{ matrix.std_version }}" = "latest" ]; then
|
|
echo "flags=/permissive- /std:c++latest /utf-8 /W4 /WX /wd5285" >> $GITHUB_ENV
|
|
else
|
|
echo "flags=/W4 /WX /wd5285" >> $GITHUB_ENV
|
|
fi
|
|
shell: bash
|
|
- name: Run CMake (Release)
|
|
run: cmake -S . -B build -G "Visual Studio 18 2026" -A ${{ matrix.architecture }} -DJSON_BuildTests=On -DCMAKE_CXX_FLAGS="$env:flags"
|
|
if: matrix.build_type == 'Release'
|
|
shell: pwsh
|
|
- name: Run CMake (Debug)
|
|
run: cmake -S . -B build -G "Visual Studio 18 2026" -A ${{ matrix.architecture }} -DJSON_BuildTests=On -DJSON_FastTests=ON -DCMAKE_CXX_FLAGS="$env:flags"
|
|
if: matrix.build_type == 'Debug'
|
|
shell: pwsh
|
|
- name: Build
|
|
run: cmake --build build --config ${{ matrix.build_type }} --parallel 10
|
|
- name: Test
|
|
run: cd build ; ctest -j 10 -C ${{ matrix.build_type }} --output-on-failure
|
|
|
|
# Native ARM64 Windows runner with the MSVC ARM64 toolset. The windows-11-arm
|
|
# label is only available for public repositories.
|
|
msvc-arm64:
|
|
strategy:
|
|
matrix:
|
|
build_type: [Debug, Release]
|
|
|
|
runs-on: windows-11-arm
|
|
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Run CMake (Release)
|
|
run: cmake -S . -B build -G "Visual Studio 18 2026" -A ARM64 -DJSON_BuildTests=On -DCMAKE_CXX_FLAGS="/W4 /WX"
|
|
if: matrix.build_type == 'Release'
|
|
shell: pwsh
|
|
- name: Run CMake (Debug)
|
|
run: cmake -S . -B build -G "Visual Studio 18 2026" -A ARM64 -DJSON_BuildTests=On -DJSON_FastTests=ON -DCMAKE_CXX_FLAGS="/W4 /WX"
|
|
if: matrix.build_type == 'Debug'
|
|
shell: pwsh
|
|
- name: Build
|
|
run: cmake --build build --config ${{ matrix.build_type }} --parallel 10
|
|
- name: Test
|
|
run: cd build ; ctest -j 10 -C ${{ matrix.build_type }} --output-on-failure
|
|
|
|
clang:
|
|
runs-on: windows-2022
|
|
strategy:
|
|
matrix:
|
|
version: [11.0.1, 12.0.1, 13.0.1, 14.0.6, 15.0.7, 16.0.6, 18.1.8, 19.1.7, 20.1.8]
|
|
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Install Clang
|
|
run: curl -fsSL -o LLVM${{ matrix.version }}.exe https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ matrix.version }}/LLVM-${{ matrix.version }}-win64.exe ; 7z x LLVM${{ matrix.version }}.exe -y -o"C:/Program Files/LLVM"
|
|
- name: Set up MinGW
|
|
uses: egor-tensin/setup-mingw@41b837e47d7f85214629d255b9c4bc3fcbe9fd63 # v3.0
|
|
with:
|
|
platform: x64
|
|
version: 12.2.0 # https://github.com/egor-tensin/setup-mingw/issues/14
|
|
# CMAKE_CXX_FLAGS_DEBUG is overridden to drop the default -g: linking
|
|
# test-regression2_cpp20 intermittently fails with "relocation truncated
|
|
# to fit: IMAGE_REL_AMD64_SECREL against `.debug_line'" because the
|
|
# MinGW linker cannot relocate the debug sections this test produces.
|
|
# The tests are only built and run here, so the debug info is not used.
|
|
# Do not add -O1 here to shrink the objects further: it does make them
|
|
# link, but the binaries clang 11.0.1 and clang 18.1.8 then produce crash
|
|
# before doctest prints its first line - 39 of 102 tests on clang 18.
|
|
# Keep the objects small by splitting the test files instead.
|
|
# Objects with more than 65535 sections fail to link with "relocation
|
|
# truncated to fit: IMAGE_REL_AMD64_REL32 against `.rdata'": the MinGW
|
|
# linker stores the section an associative COMDAT section belongs to in
|
|
# 16 bits (x_associated in binutils' include/coff/internal.h), so it
|
|
# discards the jump tables of inline functions together with the wrong
|
|
# function. Each basic_json specialization a test file instantiates adds
|
|
# many sections, so test a second one in a file of its own.
|
|
- name: Run CMake
|
|
run: cmake -S . -B build ^
|
|
-DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang++.exe" ^
|
|
-DCMAKE_CXX_FLAGS="--target=x86_64-w64-mingw32 -stdlib=libstdc++ -pthread" ^
|
|
-DCMAKE_CXX_FLAGS_DEBUG="-g0" ^
|
|
-DCMAKE_EXE_LINKER_FLAGS="-lwinpthread" ^
|
|
-G"MinGW Makefiles" ^
|
|
-DCMAKE_BUILD_TYPE=Debug ^
|
|
-DJSON_BuildTests=On
|
|
- name: Build
|
|
run: cmake --build build --parallel 10
|
|
- name: Test
|
|
run: cd build ; ctest -j 10 -C Debug --output-on-failure
|
|
|
|
clang-cl-12:
|
|
runs-on: windows-2022
|
|
strategy:
|
|
matrix:
|
|
architecture: [Win32, x64]
|
|
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: Run CMake
|
|
run: cmake -S . -B build -G "Visual Studio 17 2022" -A ${{ matrix.architecture }} -T ClangCL -DJSON_BuildTests=On
|
|
- name: Build
|
|
run: cmake --build build --config Debug --parallel 10
|
|
- name: Test
|
|
run: cd build ; ctest -j 10 -C Debug --output-on-failure
|
|
|
|
ci_module_cpp20:
|
|
runs-on: windows-2022
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
# The module test uses `import std;`, which needs CMake's experimental
|
|
# import-std support. Its opt-in token is CMake-version-specific, so pin
|
|
# CMake to the version whose token is set in tests/module_cpp20/CMakeLists.txt.
|
|
- name: Get pinned CMake and ninja
|
|
uses: lukka/get-cmake@fffaaafeea488556c2c12dad60690008bc1caacb # v4.4.2
|
|
with:
|
|
cmakeVersion: 4.3.4
|
|
- name: Run CMake (Debug)
|
|
run: cmake -S . -B build -G "Visual Studio 17 2022" -DJSON_CI=ON -DCMAKE_CXX_FLAGS="/permissive- /std:c++latest /utf-8 /W4 /WX"
|
|
- name: Build
|
|
run: cmake --build build --config Debug --target ci_module_cpp20
|
|
|