diff --git a/.github/workflows/linux-conan.yaml b/.github/workflows/linux-conan.yaml new file mode 100644 index 00000000..9bcc1b84 --- /dev/null +++ b/.github/workflows/linux-conan.yaml @@ -0,0 +1,25 @@ +name: linux + +on: [ push, pull_request ] + +jobs: + linux: + name: "${{ github.job }} (Conan)" + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + - name: Install dependencies + run: | + sudo apt update + sudo apt install -y ninja-build pipx + - name: Install Conan + run: | + pipx install conan + conan profile detect + - name: Make sure the library compiles with Conan + run: conan build . --build=missing -s compiler.cppstd=gnu20 -o *:with_capnproto=True -o *:with_cbor=True -o *:with_flatbuffers=True -o *:with_msgpack=True -o *:with_toml=True -o *:with_ubjson=True -o *:with_xml=True -o *:with_yaml=True + diff --git a/.github/workflows/linux.yaml b/.github/workflows/linux.yaml index c3200d9c..83df6c4a 100644 --- a/.github/workflows/linux.yaml +++ b/.github/workflows/linux.yaml @@ -10,36 +10,41 @@ jobs: strategy: fail-fast: false matrix: - include: - - compiler: llvm + format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "FLEXBUFFERS", "MSGPACK", "XML", "TOML", "UBJSON", "YAML", "benchmarks"] + compiler: [llvm, gcc] + compiler-version: [11, 12, 13, 14, 16, 17, 18] + cxx: [20, 23] + exclude: + - compiler: gcc compiler-version: 16 - cxx: 20 - - compiler: llvm + - compiler: gcc compiler-version: 17 - cxx: 20 - - compiler: llvm + - compiler: gcc compiler-version: 18 - cxx: 20 - - compiler: gcc + - compiler: llvm compiler-version: 11 - additional-dep: "g++-11" - cxx: 20 - - compiler: gcc + - compiler: llvm compiler-version: 12 - cxx: 20 - - compiler: gcc + - compiler: llvm compiler-version: 13 - cxx: 20 - - compiler: gcc + - compiler: llvm compiler-version: 14 - cxx: 20 - compiler: gcc - compiler-version: 13 + compiler-version: 11 cxx: 23 - compiler: gcc - compiler-version: 14 + compiler-version: 12 cxx: 23 - name: "${{ github.job }} (C++${{ matrix.cxx }}-${{ matrix.compiler }}-${{ matrix.compiler-version }})" + - compiler: gcc + compiler-version: 13 + cxx: 23 + - compiler: llvm + compiler-version: 16 + cxx: 23 + - compiler: llvm + compiler-version: 17 + cxx: 23 + name: "${{ github.job }} (${{ matrix.format }}-C++${{ matrix.cxx }}-${{ matrix.compiler }}-${{ matrix.compiler-version }})" runs-on: ubuntu-24.04 steps: - name: Checkout @@ -53,24 +58,16 @@ jobs: script: | core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - name: Setup ccache - uses: hendrikmuhs/ccache-action@v1 - with: - key: "${{ github.job }}-${{ matrix.compiler }}-${{ matrix.compiler-version }}" - max-size: "2G" - name: Run vcpkg uses: lukka/run-vcpkg@v11 - name: Install dependencies run: | sudo apt update - sudo apt install -y ninja-build ${{ matrix.additional-dep }} - - name: Install Conan - run: | - sudo apt install -y pipx - pipx install conan - conan profile detect - - name: Make sure the library compiles with Conan - run: conan build . --build=missing -s compiler.cppstd=gnu20 -o *:with_capnproto=True -o *:with_cbor=True -o *:with_flatbuffers=True -o *:with_msgpack=True -o *:with_toml=True -o *:with_ubjson=True -o *:with_xml=True -o *:with_yaml=True + if [[ "${{ matrix.compiler-version }}" == 11 ]]; then + sudo apt install -y ninja-build g++-11 + else + sudo apt install -y ninja-build + fi - name: Compile run: | if [[ "${{ matrix.compiler }}" == "llvm" ]]; then @@ -80,15 +77,21 @@ jobs: export CC=gcc-${{ matrix.compiler-version }} export CXX=g++-${{ matrix.compiler-version }} fi - sudo ln -s $(which ccache) /usr/local/bin/$CC - sudo ln -s $(which ccache) /usr/local/bin/$CXX $CXX --version - cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_BSON=ON -DREFLECTCPP_CAPNPROTO=ON -DREFLECTCPP_CBOR=ON -DREFLECTCPP_FLEXBUFFERS=ON -DREFLECTCPP_MSGPACK=ON -DREFLECTCPP_TOML=ON -DREFLECTCPP_XML=ON -DREFLECTCPP_YAML=ON -DCMAKE_BUILD_TYPE=Release - cmake --build build + if [[ "${{ matrix.format }}" == "JSON" ]]; then + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release + elif [[ "${{ matrix.format }}" == "benchmarks" ]]; then + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_ALL_FORMATS=ON -DCMAKE_BUILD_TYPE=Release + else + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_JSON=OFF -DREFLECTCPP_${{ matrix.format }}=ON -DCMAKE_BUILD_TYPE=Release + fi + cmake --build build -j4 - name: Run tests + if: matrix.format != 'benchmarks' run: | ctest --test-dir build --output-on-failure - - name: Run benchmarks + - name: Run benchmarks + if: matrix.format == 'benchmarks' run: | echo '# Benchmarks' >> $GITHUB_STEP_SUMMARY echo '## Benchmarks across different formats' >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index 6fc732ba..60f3f0aa 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -11,6 +11,8 @@ jobs: fail-fast: false matrix: os: ["macos-latest", "macos-13"] + format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "FLEXBUFFERS", "MSGPACK", "XML", "TOML", "UBJSON", "YAML", "benchmarks"] + name: "${{ matrix.os }} (${{ matrix.format }})" runs-on: ${{ matrix.os }} steps: - name: Checkout @@ -24,19 +26,8 @@ jobs: script: | core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - name: Setup ccache - uses: hendrikmuhs/ccache-action@v1 - with: - key: "${{ github.job }}-${{ matrix.os }}" - max-size: "2G" - create-symlink: true - name: Run vcpkg uses: lukka/run-vcpkg@v11 - - name: Install Conan - run: | - brew install pipx - pipx install conan - conan profile detect - name: Install ninja run: brew install ninja if: matrix.os == 'macos-latest' @@ -50,12 +41,20 @@ jobs: export CMAKE_GENERATOR=Ninja fi $CXX --version - cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_BSON=ON -DREFLECTCPP_CAPNPROTO=ON -DREFLECTCPP_CBOR=ON -DREFLECTCPP_FLEXBUFFERS=ON -DREFLECTCPP_MSGPACK=ON -DREFLECTCPP_TOML=ON -DREFLECTCPP_XML=ON -DREFLECTCPP_YAML=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ + if [[ "${{ matrix.format }}" == "JSON" ]]; then + cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ + elif [[ "${{ matrix.format }}" == "benchmarks" ]]; then + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_ALL_FORMATS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ + else + cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_JSON=OFF -DREFLECTCPP_${{ matrix.format }}=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ + fi cmake --build build -j 4 - name: Run tests + if: matrix.format != 'benchmarks' run: | ctest --test-dir build --output-on-failure - - name: Run benchmarks + - name: Run benchmarks + if: matrix.format == 'benchmarks' run: | echo '# Benchmarks' >> $GITHUB_STEP_SUMMARY echo '## Benchmarks across different formats' >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/windows.yaml b/.github/workflows/windows.yaml index bc4e2306..1727de4e 100644 --- a/.github/workflows/windows.yaml +++ b/.github/workflows/windows.yaml @@ -7,6 +7,11 @@ env: jobs: windows-msvc: + strategy: + fail-fast: false + matrix: + format: ["JSON", "CAPNPROTO", "CBOR", "FLEXBUFFERS", "MSGPACK", "XML", "TOML", "UBJSON", "YAML", "benchmarks"] + name: "windows-msvc (${{ matrix.format }})" runs-on: windows-latest steps: - name: Checkout @@ -22,29 +27,41 @@ jobs: core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - uses: ilammy/msvc-dev-cmd@v1 - uses: lukka/run-vcpkg@v11 - - name: Compile + - name: Compile benchmarks + if: matrix.format == 'benchmarks' run: | - cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_BSON=ON -DREFLECTCPP_CAPNPROTO=ON -DREFLECTCPP_CBOR=ON -DREFLECTCPP_FLEXBUFFERS=ON -DREFLECTCPP_MSGPACK=ON -DREFLECTCPP_XML=ON -DREFLECTCPP_TOML=ON -DREFLECTCPP_YAML=ON -DCMAKE_BUILD_TYPE=Release + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_ALL_FORMATS=ON -DCMAKE_BUILD_TYPE=Release + cmake --build build --config Release -j4 + - name: Compile tests (JSON) + if: matrix.format == 'JSON' + run: | + cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release + cmake --build build --config Release -j4 + - name: Compile tests (Other formats) + if: matrix.format != 'JSON' && matrix.format != 'benchmarks' + run: | + cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_JSON=OFF -DREFLECTCPP_${{ matrix.format }}=ON -DCMAKE_BUILD_TYPE=Release cmake --build build --config Release -j4 - name: Run tests run: | ctest --test-dir build --output-on-failure - - name: Run benchmarks + - name: Run benchmarks + if: matrix.format == 'benchmarks' run: | - echo '# Benchmarks' >> $env:GITHUB_STEP_SUMMARY - echo '## Benchmarks across different formats' >> $env:GITHUB_STEP_SUMMARY - echo '```' >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\all\Release\reflect-cpp-all-format-benchmarks.exe --benchmark_filter=canada_read >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\all\Release\reflect-cpp-all-format-benchmarks.exe --benchmark_filter=canada_write >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\all\Release\reflect-cpp-all-format-benchmarks.exe --benchmark_filter=licenses_read >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\all\Release\reflect-cpp-all-format-benchmarks.exe --benchmark_filter=licenses_write >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\all\Release\reflect-cpp-all-format-benchmarks.exe --benchmark_filter=person_read >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\all\Release\reflect-cpp-all-format-benchmarks.exe --benchmark_filter=person_write >> $env:GITHUB_STEP_SUMMARY - echo '```' >> $env:GITHUB_STEP_SUMMARY - echo '## Benchmarks for JSON' >> $env:GITHUB_STEP_SUMMARY - echo '```' >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\json\Release\reflect-cpp-json-benchmarks.exe --benchmark_filter=person_read >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\json\Release\reflect-cpp-json-benchmarks.exe --benchmark_filter=canada >> $env:GITHUB_STEP_SUMMARY - .\build\benchmarks\json\Release\reflect-cpp-json-benchmarks.exe --benchmark_filter=licenses >> $env:GITHUB_STEP_SUMMARY - echo '```' >> $env:GITHUB_STEP_SUMMARY + echo '# Benchmarks' >> $GITHUB_STEP_SUMMARY + echo '## Benchmarks across different formats' >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/all/reflect-cpp-all-format-benchmarks --benchmark_filter=canada_read >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/all/reflect-cpp-all-format-benchmarks --benchmark_filter=canada_write >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/all/reflect-cpp-all-format-benchmarks --benchmark_filter=licenses_read >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/all/reflect-cpp-all-format-benchmarks --benchmark_filter=licenses_write >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/all/reflect-cpp-all-format-benchmarks --benchmark_filter=person_read >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/all/reflect-cpp-all-format-benchmarks --benchmark_filter=person_write >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + echo '## Benchmarks for JSON' >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/json/reflect-cpp-json-benchmarks --benchmark_filter=person_read >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/json/reflect-cpp-json-benchmarks --benchmark_filter=canada >> $GITHUB_STEP_SUMMARY + ./build/benchmarks/json/reflect-cpp-json-benchmarks --benchmark_filter=licenses >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ade4cc6..7d092f8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,17 +3,18 @@ cmake_minimum_required(VERSION 3.23) option(REFLECTCPP_BUILD_SHARED "Build shared library" ${BUILD_SHARED_LIBS}) option(REFLECTCPP_INSTALL "Install reflect cpp" OFF) +option(REFLECTCPP_ALL_FORMATS "Enable all supported formats" OFF) option(REFLECTCPP_JSON "Enable JSON support" ON) # enabled by default -option(REFLECTCPP_AVRO "Enable AVRO support" OFF) -option(REFLECTCPP_BSON "Enable BSON support" OFF) -option(REFLECTCPP_CAPNPROTO "Enable Cap’n Proto support" OFF) -option(REFLECTCPP_CBOR "Enable CBOR support" OFF) -option(REFLECTCPP_FLEXBUFFERS "Enable flexbuffers support" OFF) -option(REFLECTCPP_MSGPACK "Enable msgpack support" OFF) -option(REFLECTCPP_XML "Enable XML support" OFF) -option(REFLECTCPP_TOML "Enable TOML support" OFF) -option(REFLECTCPP_UBJSON "Enable UBJSON support" OFF) -option(REFLECTCPP_YAML "Enable YAML support" OFF) +option(REFLECTCPP_AVRO "Enable AVRO support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_BSON "Enable BSON support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_CAPNPROTO "Enable Cap’n Proto support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_CBOR "Enable CBOR support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_FLEXBUFFERS "Enable flexbuffers support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_MSGPACK "Enable msgpack support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_XML "Enable XML support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_TOML "Enable TOML support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_UBJSON "Enable UBJSON support" ${REFLECTCPP_ALL_FORMATS}) +option(REFLECTCPP_YAML "Enable YAML support" ${REFLECTCPP_ALL_FORMATS}) option(REFLECTCPP_BUILD_BENCHMARKS "Build benchmarks" OFF) option(REFLECTCPP_BUILD_TESTS "Build tests" OFF) @@ -59,6 +60,12 @@ if (REFLECTCPP_BUILD_TESTS OR REFLECTCPP_BUILD_BENCHMARKS OR set(REFLECTCPP_USE_VCPKG_DEFAULT ON) endif() +if(REFLECTCPP_JSON OR REFLECTCPP_AVRO OR REFLECTCPP_CBOR OR REFLECTCPP_UBJSON) + set(_REFLECTCPP_NEEDS_JSON_IMPL ON) +else() + set(_REFLECTCPP_NEEDS_JSON_IMPL OFF) +endif() + option(REFLECTCPP_USE_VCPKG "Use VCPKG to download and build dependencies" ${REFLECTCPP_USE_VCPKG_DEFAULT}) if (REFLECTCPP_USE_VCPKG) @@ -94,7 +101,7 @@ if (REFLECTCPP_USE_VCPKG) list(APPEND VCPKG_MANIFEST_FEATURES "flexbuffers") endif() - if (REFLECTCPP_JSON AND NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES) + if (_REFLECTCPP_NEEDS_JSON_IMPL AND NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES) list(APPEND VCPKG_MANIFEST_FEATURES "json") endif() @@ -162,7 +169,7 @@ else () target_link_libraries(reflectcpp PUBLIC ctre::ctre) endif () -if (REFLECTCPP_JSON) +if (_REFLECTCPP_NEEDS_JSON_IMPL) list(APPEND REFLECT_CPP_SOURCES src/reflectcpp_json.cpp ) diff --git a/benchmarks/all/CMakeLists.txt b/benchmarks/all/CMakeLists.txt index b79a06f6..cbed3067 100644 --- a/benchmarks/all/CMakeLists.txt +++ b/benchmarks/all/CMakeLists.txt @@ -6,7 +6,7 @@ add_executable( reflect-cpp-all-format-benchmarks ${SOURCES} ) -target_precompile_headers(reflect-cpp-all-format-benchmarks PRIVATE [["rfl.hpp"]] ) +target_precompile_headers(reflect-cpp-all-format-benchmarks PRIVATE [["rfl.hpp"]] ) target_include_directories(reflect-cpp-all-format-benchmarks SYSTEM PRIVATE "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include") target_include_directories(reflect-cpp-all-format-benchmarks SYSTEM PRIVATE "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/tinycbor") diff --git a/benchmarks/json/CMakeLists.txt b/benchmarks/json/CMakeLists.txt index bf4d8ba0..60dd74dd 100644 --- a/benchmarks/json/CMakeLists.txt +++ b/benchmarks/json/CMakeLists.txt @@ -6,7 +6,7 @@ add_executable( reflect-cpp-json-benchmarks ${SOURCES} ) -target_precompile_headers(reflect-cpp-json-benchmarks PRIVATE [["rfl.hpp"]] ) +target_precompile_headers(reflect-cpp-json-benchmarks PRIVATE [["rfl.hpp"]] ) target_include_directories(reflect-cpp-json-benchmarks SYSTEM PRIVATE "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include") diff --git a/reflectcpp-config.cmake.in b/reflectcpp-config.cmake.in index f000148a..c38da966 100644 --- a/reflectcpp-config.cmake.in +++ b/reflectcpp-config.cmake.in @@ -18,8 +18,11 @@ endif() include(${CMAKE_CURRENT_LIST_DIR}/reflectcpp-exports.cmake) -if (REFLECTCPP_JSON AND NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES) +if (NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES) find_dependency(ctre) +endif() + +if ((REFLECTCPP_JSON OR REFLECTCPP_AVRO OR REFLECTCPP_CBOR OR REFLECTCPP_UBJSON) AND NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES) find_dependency(yyjson) endif()