mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-08 12:21:17 +00:00
CMake: Fixes for generated config (#1212)
* CMake: Add option to set the package install dir. * CMake: Fix generated config. - `YAML_CPP_SHARED_LIBS_BUILT` should not be set with a `PATH_VAR` as it would always evaluate to true. - `YAML_CPP_LIBRARIES` should used the exported target name including the namespace, but `check_required_components` shouldn't. - Use `CMAKE_CURRENT_LIST_DIR` to find the target file, instead of a `PATH_VAR`. Package managers such as vcpkg move CMake configs after installing. * CI: Test the generated CMake package. * CMake: Create add a deprecated yaml-cpp target. This target is meant to provide compatibility with versions prior to 0.8.0. * CMake: mark the yaml-cpp target as IMPORTED. --------- Co-authored-by: Jesse Beder <jbeder+github@gmail.com>
This commit is contained in:
61
.github/workflows/build.yml
vendored
61
.github/workflows/build.yml
vendored
@@ -6,6 +6,9 @@ on:
|
|||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
jobs:
|
jobs:
|
||||||
cmake-build:
|
cmake-build:
|
||||||
strategy:
|
strategy:
|
||||||
@@ -26,23 +29,59 @@ jobs:
|
|||||||
YAML_BUILD_SHARED_LIBS: ${{ matrix.build == 'shared' && 'ON' || 'OFF' }}
|
YAML_BUILD_SHARED_LIBS: ${{ matrix.build == 'shared' && 'ON' || 'OFF' }}
|
||||||
CMAKE_GENERATOR: >-
|
CMAKE_GENERATOR: >-
|
||||||
${{format(matrix.generator != 'Default Generator' && '-G "{0}"' || '', matrix.generator)}}
|
${{format(matrix.generator != 'Default Generator' && '-G "{0}"' || '', matrix.generator)}}
|
||||||
|
CMAKE_INSTALL_PREFIX: "${{ github.workspace }}/install-prefix"
|
||||||
|
CMAKE_BUILD_TYPE: Debug
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Get number of CPU cores
|
- name: Configure
|
||||||
uses: SimenB/github-actions-cpu-cores@v1
|
|
||||||
|
|
||||||
- name: Build Tests
|
|
||||||
shell: bash
|
|
||||||
run: |
|
run: |
|
||||||
cmake ${{ env.CMAKE_GENERATOR }} -S "${{ github.workspace }}" -B build -DCMAKE_CXX_STANDARD=${{ matrix.cxx_standard }} -DYAML_BUILD_SHARED_LIBS=${{ env.YAML_BUILD_SHARED_LIBS }} -DYAML_CPP_BUILD_TESTS=ON
|
cmake \
|
||||||
cd build && cmake --build . --parallel ${{ steps.cpu-cores.outputs.count }}
|
${{ env.CMAKE_GENERATOR }} \
|
||||||
|
-S "${{ github.workspace }}" \
|
||||||
|
-B build \
|
||||||
|
-D CMAKE_CXX_STANDARD=${{ matrix.cxx_standard }} \
|
||||||
|
-D CMAKE_INSTALL_PREFIX="${{ env.CMAKE_INSTALL_PREFIX }}" \
|
||||||
|
-D CMAKE_BUILD_TYPE=${{ env.CMAKE_BUILD_TYPE }} \
|
||||||
|
-D YAML_BUILD_SHARED_LIBS=${{ env.YAML_BUILD_SHARED_LIBS }} \
|
||||||
|
-D YAML_CPP_BUILD_TESTS=ON
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
cmake \
|
||||||
|
--build build \
|
||||||
|
--config ${{ env.CMAKE_BUILD_TYPE }} \
|
||||||
|
--verbose \
|
||||||
|
--parallel
|
||||||
|
|
||||||
- name: Run Tests
|
- name: Run Tests
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
cd build && ctest -C Debug --output-on-failure --verbose
|
ctest \
|
||||||
|
--test-dir build \
|
||||||
|
--build-config ${{ env.CMAKE_BUILD_TYPE }} \
|
||||||
|
--output-on-failure \
|
||||||
|
--verbose
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: cmake --install build --config ${{ env.CMAKE_BUILD_TYPE }}
|
||||||
|
|
||||||
|
- name: Configure CMake package test
|
||||||
|
run: |
|
||||||
|
cmake \
|
||||||
|
${{ env.CMAKE_GENERATOR }} \
|
||||||
|
-S "${{ github.workspace }}/test/cmake" \
|
||||||
|
-B consumer-build \
|
||||||
|
-D CMAKE_BUILD_TYPE=${{ env.CMAKE_BUILD_TYPE }} \
|
||||||
|
-D CMAKE_PREFIX_PATH="${{ env.CMAKE_INSTALL_PREFIX }}"
|
||||||
|
|
||||||
|
- name: Build CMake package test
|
||||||
|
run: |
|
||||||
|
cmake \
|
||||||
|
--build consumer-build \
|
||||||
|
--config ${{ env.CMAKE_BUILD_TYPE }} \
|
||||||
|
--verbose
|
||||||
|
|
||||||
bazel-build:
|
bazel-build:
|
||||||
strategy:
|
strategy:
|
||||||
@@ -50,16 +89,14 @@ jobs:
|
|||||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
shell: bash
|
|
||||||
run: |
|
run: |
|
||||||
cd "${{ github.workspace }}"
|
cd "${{ github.workspace }}"
|
||||||
bazel build :all
|
bazel build :all
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
shell: bash
|
|
||||||
run: |
|
run: |
|
||||||
cd "${{ github.workspace }}"
|
cd "${{ github.workspace }}"
|
||||||
bazel test test
|
bazel test test
|
||||||
|
@@ -34,7 +34,9 @@ cmake_dependent_option(YAML_CPP_BUILD_TESTS
|
|||||||
cmake_dependent_option(YAML_MSVC_SHARED_RT
|
cmake_dependent_option(YAML_MSVC_SHARED_RT
|
||||||
"MSVC: Build yaml-cpp with shared runtime libs (/MD)" ON
|
"MSVC: Build yaml-cpp with shared runtime libs (/MD)" ON
|
||||||
"CMAKE_SYSTEM_NAME MATCHES Windows" OFF)
|
"CMAKE_SYSTEM_NAME MATCHES Windows" OFF)
|
||||||
|
set(YAML_CPP_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/yaml-cpp"
|
||||||
|
CACHE STRING "Path to install the CMake package to")
|
||||||
|
|
||||||
if (YAML_CPP_FORMAT_SOURCE)
|
if (YAML_CPP_FORMAT_SOURCE)
|
||||||
find_program(YAML_CPP_CLANG_FORMAT_EXE NAMES clang-format)
|
find_program(YAML_CPP_CLANG_FORMAT_EXE NAMES clang-format)
|
||||||
endif()
|
endif()
|
||||||
@@ -146,13 +148,12 @@ set_target_properties(yaml-cpp PROPERTIES
|
|||||||
PROJECT_LABEL "yaml-cpp ${yaml-cpp-label-postfix}"
|
PROJECT_LABEL "yaml-cpp ${yaml-cpp-label-postfix}"
|
||||||
DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}")
|
DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}")
|
||||||
|
|
||||||
set(CONFIG_EXPORT_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/yaml-cpp")
|
set(EXPORT_TARGETS yaml-cpp::yaml-cpp)
|
||||||
set(EXPORT_TARGETS yaml-cpp)
|
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
"${PROJECT_SOURCE_DIR}/yaml-cpp-config.cmake.in"
|
"${PROJECT_SOURCE_DIR}/yaml-cpp-config.cmake.in"
|
||||||
"${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake"
|
"${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake"
|
||||||
INSTALL_DESTINATION "${CONFIG_EXPORT_DIR}"
|
INSTALL_DESTINATION "${YAML_CPP_INSTALL_CMAKEDIR}"
|
||||||
PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR CONFIG_EXPORT_DIR YAML_BUILD_SHARED_LIBS)
|
PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR)
|
||||||
unset(EXPORT_TARGETS)
|
unset(EXPORT_TARGETS)
|
||||||
|
|
||||||
write_basic_package_version_file(
|
write_basic_package_version_file(
|
||||||
@@ -172,15 +173,14 @@ if (YAML_CPP_INSTALL)
|
|||||||
FILES_MATCHING PATTERN "*.h")
|
FILES_MATCHING PATTERN "*.h")
|
||||||
install(EXPORT yaml-cpp-targets
|
install(EXPORT yaml-cpp-targets
|
||||||
NAMESPACE yaml-cpp::
|
NAMESPACE yaml-cpp::
|
||||||
DESTINATION "${CONFIG_EXPORT_DIR}")
|
DESTINATION "${YAML_CPP_INSTALL_CMAKEDIR}")
|
||||||
install(FILES
|
install(FILES
|
||||||
"${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake"
|
"${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake"
|
||||||
"${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake"
|
"${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake"
|
||||||
DESTINATION "${CONFIG_EXPORT_DIR}")
|
DESTINATION "${YAML_CPP_INSTALL_CMAKEDIR}")
|
||||||
install(FILES "${PROJECT_BINARY_DIR}/yaml-cpp.pc"
|
install(FILES "${PROJECT_BINARY_DIR}/yaml-cpp.pc"
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
endif()
|
endif()
|
||||||
unset(CONFIG_EXPORT_DIR)
|
|
||||||
|
|
||||||
if(YAML_CPP_BUILD_TESTS)
|
if(YAML_CPP_BUILD_TESTS)
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
|
19
test/cmake/CMakeLists.txt
Normal file
19
test/cmake/CMakeLists.txt
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
project(yaml-cpp-consumer LANGUAGES CXX)
|
||||||
|
|
||||||
|
find_package(yaml-cpp CONFIG REQUIRED)
|
||||||
|
get_target_property(LIBRARY_TYPE yaml-cpp::yaml-cpp TYPE)
|
||||||
|
|
||||||
|
if(LIBRARY_TYPE STREQUAL "SHARED_LIBRARY")
|
||||||
|
if(NOT YAML_CPP_SHARED_LIBS_BUILT)
|
||||||
|
message(FATAL_ERROR "Library type (${LIBRARY_TYPE}) contradicts config: ${YAML_CPP_SHARED_LIBS_BUILT}")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if(YAML_CPP_SHARED_LIBS_BUILT)
|
||||||
|
message(FATAL_ERROR "Library type (${LIBRARY_TYPE}) contradicts config: ${YAML_CPP_SHARED_LIBS_BUILT}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(main main.cpp)
|
||||||
|
set_target_properties(main PROPERTIES CXX_STANDARD 11)
|
||||||
|
target_link_libraries(main PRIVATE ${YAML_CPP_LIBRARIES})
|
3
test/cmake/main.cpp
Normal file
3
test/cmake/main.cpp
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#include "yaml-cpp/yaml.h"
|
||||||
|
|
||||||
|
int main(int, char**) { YAML::Parser foo{}; }
|
@@ -11,12 +11,20 @@ set_and_check(YAML_CPP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@")
|
|||||||
set_and_check(YAML_CPP_LIBRARY_DIR "@PACKAGE_CMAKE_INSTALL_LIBDIR@")
|
set_and_check(YAML_CPP_LIBRARY_DIR "@PACKAGE_CMAKE_INSTALL_LIBDIR@")
|
||||||
|
|
||||||
# Are we building shared libraries?
|
# Are we building shared libraries?
|
||||||
set(YAML_CPP_SHARED_LIBS_BUILT "@PACKAGE_YAML_BUILD_SHARED_LIBS@")
|
set(YAML_CPP_SHARED_LIBS_BUILT @YAML_BUILD_SHARED_LIBS@)
|
||||||
|
|
||||||
# Our library dependencies (contains definitions for IMPORTED targets)
|
# Our library dependencies (contains definitions for IMPORTED targets)
|
||||||
include(@PACKAGE_CONFIG_EXPORT_DIR@/yaml-cpp-targets.cmake)
|
include("${CMAKE_CURRENT_LIST_DIR}/yaml-cpp-targets.cmake")
|
||||||
|
|
||||||
# These are IMPORTED targets created by yaml-cpp-targets.cmake
|
# These are IMPORTED targets created by yaml-cpp-targets.cmake
|
||||||
set(YAML_CPP_LIBRARIES "@EXPORT_TARGETS@")
|
set(YAML_CPP_LIBRARIES "@EXPORT_TARGETS@")
|
||||||
|
|
||||||
check_required_components(@EXPORT_TARGETS@)
|
add_library(yaml-cpp INTERFACE IMPORTED)
|
||||||
|
target_link_libraries(yaml-cpp INTERFACE yaml-cpp::yaml-cpp)
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.17)
|
||||||
|
set_target_properties(yaml-cpp PROPERTIES
|
||||||
|
DEPRECATION "The target yaml-cpp is deprecated and will be removed in version 0.10.0. Use the yaml-cpp::yaml-cpp target instead."
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
check_required_components(yaml-cpp)
|
||||||
|
Reference in New Issue
Block a user