From 26af3d55eb5af61bb13a75e4001a5c13a3d7ba94 Mon Sep 17 00:00:00 2001 From: Leon Lynch Date: Sat, 6 Jan 2024 11:31:16 +0100 Subject: [PATCH] Improve generation of CMake config files * Update CMake config COMPATIBILITY to match SOVERSION * Use kebab-case instead of camelCase for CMake config file naming. This matches the project naming better. * Generate find_dependency() commands based on library dependencies at build time. This intentionally ignores the command line tools' dependencies. * Let CMake config file require CXX because isocodes_lookup, mcc_lookup, and (when using Boost) iso8859 require it. --- CMakeLists.txt | 23 ++++++++++++++--------- cmake/emv-utils-config.cmake.in | 18 ++++++++++++++++++ cmake/emvUtilsConfig.cmake.in | 11 ----------- src/CMakeLists.txt | 20 +++++++++++++++++++- 4 files changed, 51 insertions(+), 21 deletions(-) create mode 100644 cmake/emv-utils-config.cmake.in delete mode 100644 cmake/emvUtilsConfig.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 18f94fe..e37eef3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2021, 2022, 2023 Leon Lynch +# Copyright (c) 2021-2024 Leon Lynch # # This file is licensed under the terms of the LGPL v2.1 license. # See LICENSE file. @@ -96,30 +96,35 @@ install(FILES # Generate and install basic CMake config files include(CMakePackageConfigHelpers) # Provides CMake config generator macros +# NOTE: src subdirectory provides EMV_UTILS_PACKAGE_DEPENDENCIES +foreach(pkg IN LISTS EMV_UTILS_PACKAGE_DEPENDENCIES) + # Build dependency string for use in CMake config file + string(APPEND EMV_UTILS_CONFIG_PACKAGE_DEPENDENCIES "find_dependency(${pkg})\n") +endforeach() set(EMV_UTILS_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} CACHE STRING "Installation location for emv-utils CMake config files") message(STATUS "Using CMake config install location \"${EMV_UTILS_INSTALL_CMAKEDIR}\"") -configure_package_config_file(cmake/emvUtilsConfig.cmake.in - "${CMAKE_CURRENT_BINARY_DIR}/cmake/emvUtilsConfig.cmake" +configure_package_config_file(cmake/emv-utils-config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/cmake/emv-utils-config.cmake" INSTALL_DESTINATION "${EMV_UTILS_INSTALL_CMAKEDIR}" ) write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/cmake/emvUtilsConfigVersion.cmake" - COMPATIBILITY AnyNewerVersion + "${CMAKE_CURRENT_BINARY_DIR}/cmake/emv-utils-config-version.cmake" + COMPATIBILITY SameMinorVersion ) install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/cmake/emvUtilsConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/cmake/emvUtilsConfigVersion.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/cmake/emv-utils-config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/cmake/emv-utils-config-version.cmake" DESTINATION "${EMV_UTILS_INSTALL_CMAKEDIR}" COMPONENT emv_development ) install(EXPORT emvUtilsTargets - FILE emvUtilsTargets.cmake + FILE emv-utils-config-targets.cmake DESTINATION "${EMV_UTILS_INSTALL_CMAKEDIR}" NAMESPACE emv:: COMPONENT emv_development ) export(EXPORT emvUtilsTargets - FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/emvUtilsTargets.cmake" + FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/emv-utils-config-targets.cmake" NAMESPACE emv:: ) diff --git a/cmake/emv-utils-config.cmake.in b/cmake/emv-utils-config.cmake.in new file mode 100644 index 0000000..1585ebf --- /dev/null +++ b/cmake/emv-utils-config.cmake.in @@ -0,0 +1,18 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) +if(NOT "CXX" IN_LIST languages) + # Various components of emv-utils, like isocodes_lookup and mcc_lookup, + # require CXX + message(FATAL_ERROR "emv-utils requires CXX") +endif() +@EMV_UTILS_CONFIG_PACKAGE_DEPENDENCIES@ + +check_required_components(emv-utils) + +include("${CMAKE_CURRENT_LIST_DIR}/emv-utils-config-targets.cmake") + +include(FindPackageHandleStandardArgs) +set(emv-utils_CONFIG ${CMAKE_CURRENT_LIST_FILE}) +find_package_handle_standard_args(emv-utils CONFIG_MODE) diff --git a/cmake/emvUtilsConfig.cmake.in b/cmake/emvUtilsConfig.cmake.in deleted file mode 100644 index d2938f5..0000000 --- a/cmake/emvUtilsConfig.cmake.in +++ /dev/null @@ -1,11 +0,0 @@ -@PACKAGE_INIT@ - -include(CMakeFindDependencyMacro) - -check_required_components(emv-utils) - -include("${CMAKE_CURRENT_LIST_DIR}/emvUtilsTargets.cmake") - -include(FindPackageHandleStandardArgs) -set(emv-utils_CONFIG ${CMAKE_CURRENT_LIST_FILE}) -find_package_handle_standard_args(emv-utils CONFIG_MODE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0346d7a..6634cbf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -65,6 +65,10 @@ else() # Try custom Findjson-c.cmake module find_package(json-c REQUIRED) endif() +# The EMV_UTILS_PACKAGE_DEPENDENCIES variable is set for the parent scope to +# facilitate the generation of CMake package configuration files. +list(APPEND EMV_UTILS_PACKAGE_DEPENDENCIES "json-c") +set(EMV_UTILS_PACKAGE_DEPENDENCIES ${EMV_UTILS_PACKAGE_DEPENDENCIES} PARENT_SCOPE) include(GNUInstallDirs) # Provides CMAKE_INSTALL_* variables and good defaults for install() @@ -196,12 +200,26 @@ if(ISO8859_IMPL STREQUAL "boost") message(STATUS "Using Boost.Locale for iso8859 implementation") target_sources(iso8859 PRIVATE iso8859_boost.cpp) target_link_libraries(iso8859 PRIVATE Boost::locale) + + # The EMV_UTILS_PACKAGE_DEPENDENCIES variable is set for the parent scope to + # facilitate the generation of CMake package configuration files. + list(APPEND EMV_UTILS_PACKAGE_DEPENDENCIES "Boost COMPONENTS locale") + set(EMV_UTILS_PACKAGE_DEPENDENCIES ${EMV_UTILS_PACKAGE_DEPENDENCIES} PARENT_SCOPE) endif() if(ISO8859_IMPL STREQUAL "iconv") find_package(Iconv REQUIRED) + message(STATUS "Using iconv for iso8859 implementation") target_sources(iso8859 PRIVATE iso8859_iconv.c) - target_link_libraries(iso8859 PRIVATE Iconv::Iconv) + if(Iconv_LIBRARIES) + target_link_libraries(iso8859 PRIVATE Iconv::Iconv) + + # The EMV_UTILS_PACKAGE_DEPENDENCIES variable is set for the parent + # scope to facilitate the generation of CMake package configuration + # files. + list(APPEND EMV_UTILS_PACKAGE_DEPENDENCIES "Iconv") + set(EMV_UTILS_PACKAGE_DEPENDENCIES ${EMV_UTILS_PACKAGE_DEPENDENCIES} PARENT_SCOPE) + endif() endif() if(ISO8859_IMPL STREQUAL "simple") message(STATUS "Using simple iso8859 implementation")