From 3fcbaf7ffff9a24d7b640deb8c8d89eb003931a8 Mon Sep 17 00:00:00 2001 From: Martchus Date: Fri, 16 Feb 2018 23:56:29 +0100 Subject: [PATCH] Split shared and static configuration --- CMakeLists.txt | 4 +++- cmake/modules/LibraryTarget.cmake | 25 ++++++++++++++++---- cmake/templates/Config.cmake.in | 34 ++++++++++----------------- cmake/templates/SharedConfig.cmake.in | 9 +++++++ cmake/templates/StaticConfig.cmake.in | 9 +++++++ 5 files changed, 53 insertions(+), 28 deletions(-) create mode 100644 cmake/templates/SharedConfig.cmake.in create mode 100644 cmake/templates/StaticConfig.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 81531b1..b71d349 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,6 +90,8 @@ set(CMAKE_MODULE_FILES set(CMAKE_TEMPLATE_FILES cmake/templates/bash-completion.sh.in cmake/templates/Config.cmake.in + cmake/templates/SharedConfig.cmake.in + cmake/templates/StaticConfig.cmake.in cmake/templates/config.h.in cmake/templates/desktop.in cmake/templates/doxygen.in @@ -129,7 +131,7 @@ set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}") set(META_APP_DESCRIPTION "Useful C++ classes and routines such as argument parser, IO and conversion utilities") set(META_VERSION_MAJOR 4) set(META_VERSION_MINOR 12) -set(META_VERSION_PATCH 1) +set(META_VERSION_PATCH 2) # find required 3rd party libraries include(3rdParty) diff --git a/cmake/modules/LibraryTarget.cmake b/cmake/modules/LibraryTarget.cmake index 6736f13..474aa72 100644 --- a/cmake/modules/LibraryTarget.cmake +++ b/cmake/modules/LibraryTarget.cmake @@ -23,12 +23,9 @@ else() set(META_HEADER_ONLY_LIB YES) endif() -# include for configure_package_config_file and write_basic_package_version_file +# includes for configure_package_config_file, write_basic_package_version_file and find_template_file include(CMakePackageConfigHelpers) - -# find template for CMake config file include(TemplateFinder) -find_template_file("Config.cmake" CPP_UTILITIES CONFIG_TEMPLATE_FILE) # determine library directory suffix set(LIB_SUFFIX "" CACHE STRING "specifies the general suffix for the library directory") @@ -74,7 +71,6 @@ if(NOT META_PRIVATE_STATIC_LIB_COMPILE_DEFINITIONS) endif() # add global library-specific header -include(TemplateFinder) find_template_file("global.h" CPP_UTILITIES GLOBAL_H_TEMPLATE_FILE) if("${META_PROJECT_NAME}" STREQUAL "c++utilities") set(GENERAL_GLOBAL_H_INCLUDE_PATH "\"./application/global.h\"") @@ -238,6 +234,7 @@ if(META_HEADER_ONLY_LIB) endif() # create the CMake package config file from template +find_template_file("Config.cmake" CPP_UTILITIES CONFIG_TEMPLATE_FILE) configure_package_config_file( "${CONFIG_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}Config.cmake" @@ -250,6 +247,24 @@ configure_package_config_file( BIN_INSTALL_DESTINATION LIB_INSTALL_DESTINATION ) +if(BUILD_SHARED_LIBS) + find_template_file("SharedConfig.cmake" CPP_UTILITIES SHARED_CONFIG_TEMPLATE_FILE) + configure_package_config_file( + "${SHARED_CONFIG_TEMPLATE_FILE}" + "${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}SharedConfig.cmake" + INSTALL_DESTINATION + "${CMAKE_CONFIG_INSTALL_DESTINATION}" + ) +endif() +if(BUILD_STATIC_LIBS) + find_template_file("StaticConfig.cmake" CPP_UTILITIES STATIC_CONFIG_TEMPLATE_FILE) + configure_package_config_file( + "${STATIC_CONFIG_TEMPLATE_FILE}" + "${CMAKE_CURRENT_BINARY_DIR}/${META_PROJECT_NAME}StaticConfig.cmake" + INSTALL_DESTINATION + "${CMAKE_CONFIG_INSTALL_DESTINATION}" + ) +endif() # write the CMake version config file write_basic_package_version_file( diff --git a/cmake/templates/Config.cmake.in b/cmake/templates/Config.cmake.in index 18daf0d..88fc115 100644 --- a/cmake/templates/Config.cmake.in +++ b/cmake/templates/Config.cmake.in @@ -30,27 +30,17 @@ set(@META_PROJECT_VARNAME_UPPER@_PUBLIC_KF_MODULES "@META_PUBLIC_KF_MODULES@") set(@META_PROJECT_VARNAME_UPPER@_HAS_QT_TRANSLATION_FILES @APP_SPECIFIC_QT_TRANSLATIONS_AVAILABLE@) set(@META_PROJECT_VARNAME_UPPER@_QT_RESOURCES @QT_RESOURCES@) -# define shared library config -if(@META_PROJECT_VARNAME_UPPER@_HAS_SHARED_LIB) - set(@META_PROJECT_VARNAME_UPPER@_SHARED_LIB "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@") - set(@META_PROJECT_VARNAME_UPPER@_SHARED_LIB_DEPENDS @META_PUBLIC_SHARED_LIB_DEPENDS@) - set(@META_PROJECT_VARNAME_UPPER@_SHARED_LIB_COMPILE_DEFINITIONS @META_PUBLIC_SHARED_LIB_COMPILE_DEFINITIONS@) - set(PC_PKG_SHARED_@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@ "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@") - if(NOT TARGET "${@META_PROJECT_VARNAME_UPPER@_SHARED_LIB}") - include("${CMAKE_CURRENT_LIST_DIR}/@META_PROJECT_NAME@SharedTargets.cmake") - endif() -endif() - -# define static library config -if(@META_PROJECT_VARNAME_UPPER@_HAS_STATIC_LIB) - set(@META_PROJECT_VARNAME_UPPER@_STATIC_LIB "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@_static") - set(@META_PROJECT_VARNAME_UPPER@_STATIC_LIB_DEPENDS @META_PUBLIC_STATIC_LIB_DEPENDS@ @META_PRIVATE_STATIC_LIB_DEPENDS@) - set(@META_PROJECT_VARNAME_UPPER@_STATIC_LIB_COMPILE_DEFINITIONS @META_PUBLIC_STATIC_LIB_COMPILE_DEFINITIONS@) - set(PC_PKG_STATIC_@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@_static "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@_static") - if(NOT TARGET "${@META_PROJECT_VARNAME_UPPER@_STATIC_LIB}") - include("${CMAKE_CURRENT_LIST_DIR}/@META_PROJECT_NAME@StaticTargets.cmake") - endif() -endif() +# include files for shared/static specific configuration +set(@META_PROJECT_VARNAME_UPPER@_HAS_SHARED_LIB NO) +set(@META_PROJECT_VARNAME_UPPER@_HAS_STATIC_LIB NO) +file(GLOB @META_PROJECT_VARNAME_UPPER@_SPECIFIC_CONFIG_FILES + LIST_DIRECTORIES OFF + "${CMAKE_CURRENT_LIST_DIR}/@META_PROJECT_NAME@?*Config.cmake" +) +foreach(SPECIFIC_CONFIG_FILE IN LISTS @META_PROJECT_VARNAME_UPPER@_SPECIFIC_CONFIG_FILES) + include("${SPECIFIC_CONFIG_FILE}") +endforeach() +unset(SPECIFIC_CONFIG_FILE) # set default target: prefer shared lib over static lib if(@META_PROJECT_VARNAME_UPPER@_HAS_SHARED_LIB) @@ -59,7 +49,7 @@ else() set(@META_PROJECT_VARNAME_UPPER@_LIB "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@_static") endif() -# define macro to ease use of library +# define macro to ease use of library in projects following conventions of c++utilities' build script macro(use_@META_PROJECT_VARNAME@) # make CMake modules of the project available list(APPEND CMAKE_MODULE_PATH ${@META_PROJECT_VARNAME_UPPER@_MODULE_DIRS}) diff --git a/cmake/templates/SharedConfig.cmake.in b/cmake/templates/SharedConfig.cmake.in new file mode 100644 index 0000000..641f1c2 --- /dev/null +++ b/cmake/templates/SharedConfig.cmake.in @@ -0,0 +1,9 @@ +# define shared library config +set(@META_PROJECT_VARNAME_UPPER@_HAS_SHARED_LIB YES) +set(@META_PROJECT_VARNAME_UPPER@_SHARED_LIB "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@") +set(@META_PROJECT_VARNAME_UPPER@_SHARED_LIB_DEPENDS @META_PUBLIC_SHARED_LIB_DEPENDS@) +set(@META_PROJECT_VARNAME_UPPER@_SHARED_LIB_COMPILE_DEFINITIONS @META_PUBLIC_SHARED_LIB_COMPILE_DEFINITIONS@) +set(PC_PKG_SHARED_@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@ "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@") +if(NOT TARGET "${@META_PROJECT_VARNAME_UPPER@_SHARED_LIB}") + include("${CMAKE_CURRENT_LIST_DIR}/@META_PROJECT_NAME@SharedTargets.cmake") +endif() diff --git a/cmake/templates/StaticConfig.cmake.in b/cmake/templates/StaticConfig.cmake.in new file mode 100644 index 0000000..a2469c3 --- /dev/null +++ b/cmake/templates/StaticConfig.cmake.in @@ -0,0 +1,9 @@ +# define static library config +set(@META_PROJECT_VARNAME_UPPER@_HAS_STATIC_LIB YES) +set(@META_PROJECT_VARNAME_UPPER@_STATIC_LIB "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@_static") +set(@META_PROJECT_VARNAME_UPPER@_STATIC_LIB_DEPENDS @META_PUBLIC_STATIC_LIB_DEPENDS@ @META_PRIVATE_STATIC_LIB_DEPENDS@) +set(@META_PROJECT_VARNAME_UPPER@_STATIC_LIB_COMPILE_DEFINITIONS @META_PUBLIC_STATIC_LIB_COMPILE_DEFINITIONS@) +set(PC_PKG_STATIC_@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@_static "@TARGET_PREFIX@@META_PROJECT_NAME@@TARGET_SUFFIX@_static") +if(NOT TARGET "${@META_PROJECT_VARNAME_UPPER@_STATIC_LIB}") + include("${CMAKE_CURRENT_LIST_DIR}/@META_PROJECT_NAME@StaticTargets.cmake") +endif()