From d5d68286cdd983f99f88b6141a3c34d3bf633d98 Mon Sep 17 00:00:00 2001 From: Felix Schwitzer Date: Fri, 1 Apr 2022 05:26:47 +0200 Subject: [PATCH] Fix CMake export files (#1077) After configuring the file `yaml-cpp-config.cmake.in`, the result ends up with empty variables. (see also the discussion in #774). Rework this file and the call to `configure_package_config_file` according the cmake documentation (https://cmake.org/cmake/help/v3.22/module/CMakePackageConfigHelpers.html?highlight=configure_package_config#command:configure_package_config_file) to overcome this issue and allow a simple `find_package` after install. As there was some discussion about the place where to install the `yaml-cpp-config.cmake` file, e.g. #1055, factor out the install location into an extra variable to make it easier changing this location in the future. Also untabify CMakeLists.txt in some places to align with the other code parts in this file. --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,10 +127,16 @@ set_target_properties(yaml-cpp PROPERTIES PROJECT_LABEL "yaml-cpp ${yaml-cpp-label-postfix}" DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}") +# FIXME(felix2012): A more common place for the cmake export would be +# `CMAKE_INSTALL_LIBDIR`, as e.g. done in ubuntu or in this project for GTest +set(CONFIG_EXPORT_DIR "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") +set(EXPORT_TARGETS yaml-cpp) configure_package_config_file( "${PROJECT_SOURCE_DIR}/yaml-cpp-config.cmake.in" "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" - INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") + INSTALL_DESTINATION "${CONFIG_EXPORT_DIR}" + PATH_VARS CMAKE_INSTALL_INCLUDEDIR CONFIG_EXPORT_DIR) +unset(EXPORT_TARGETS) write_basic_package_version_file( "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" @@ -139,30 +145,31 @@ write_basic_package_version_file( configure_file(yaml-cpp.pc.in yaml-cpp.pc @ONLY) if (YAML_CPP_INSTALL) - install(TARGETS yaml-cpp + install(TARGETS yaml-cpp EXPORT yaml-cpp-targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ + install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - FILES_MATCHING PATTERN "*.h") + FILES_MATCHING PATTERN "*.h") install(EXPORT yaml-cpp-targets - DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") - install(FILES - "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" - "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" - DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") + DESTINATION "${CONFIG_EXPORT_DIR}") + install(FILES + "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" + "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" + DESTINATION "${CONFIG_EXPORT_DIR}") install(FILES "${PROJECT_BINARY_DIR}/yaml-cpp.pc" DESTINATION ${CMAKE_INSTALL_DATADIR}/pkgconfig) endif() +unset(CONFIG_EXPORT_DIR) if(YAML_CPP_BUILD_TESTS) - add_subdirectory(test) + add_subdirectory(test) endif() if(YAML_CPP_BUILD_TOOLS) - add_subdirectory(util) + add_subdirectory(util) endif() if (YAML_CPP_CLANG_FORMAT_EXE) --- a/yaml-cpp-config.cmake.in +++ b/yaml-cpp-config.cmake.in @@ -3,12 +3,14 @@ # YAML_CPP_INCLUDE_DIR - include directory # YAML_CPP_LIBRARIES - libraries to link against -# Compute paths -get_filename_component(YAML_CPP_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -set(YAML_CPP_INCLUDE_DIR "@CONFIG_INCLUDE_DIRS@") +@PACKAGE_INIT@ + +set_and_check(YAML_CPP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") # Our library dependencies (contains definitions for IMPORTED targets) -include("${YAML_CPP_CMAKE_DIR}/yaml-cpp-targets.cmake") +include(@PACKAGE_CONFIG_EXPORT_DIR@/yaml-cpp-targets.cmake) # These are IMPORTED targets created by yaml-cpp-targets.cmake set(YAML_CPP_LIBRARIES "@EXPORT_TARGETS@") + +check_required_components(@EXPORT_TARGETS@)