mirror of
https://github.com/nlohmann/json.git
synced 2026-08-21 16:43:17 +00:00
Linking test-regression2 fails with "relocation truncated to fit: IMAGE_REL_AMD64_REL32 against `.rdata'" once its object grows past what the MinGW linker copes with, and the copy constructor's helpers push it over: the object grows by 6.3%, from 4,654,128 to 4,944,920 bytes at -O0, and develop links at the smaller of the two. Building the tests optimized shrinks the object enough to 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 - so the objects have to become smaller rather than denser. Moving the test cases that follow "regression tests 2" into a file of their own brings that object to 4,687,888 bytes, which is 0.7% above the size that links today rather than 6.3%. Both files still build for C++11, C++17 and C++20, and run the same 9 test cases and 135 assertions as before, now spread over two binaries. New regression tests belong in unit-regression3.cpp from here on, which is what CONTRIBUTING.md now says. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
213 lines
8.5 KiB
YAML
213 lines
8.5 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
|
|
- 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
|
|
- name: Run CMake (Release)
|
|
run: cmake -S . -B build -G "Visual Studio 17 2022" -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 17 2022" -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.
|
|
- 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 --exclude-regex "test-unicode" --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 --exclude-regex "test-unicode" --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
|
|
|