|
25 | 25 | include(GNUInstallDirs) |
26 | 26 | include(CMakePackageConfigHelpers) |
27 | 27 |
|
| 28 | +# Helper macro that is used to forward option arguments in function calls |
| 29 | +# Taken from https://stackoverflow.com/a/75994425/5689371 |
| 30 | +macro(set_if OPTION CONDITION) |
| 31 | + if(${CONDITION}) |
| 32 | + set(${OPTION} "${OPTION}") |
| 33 | + else() |
| 34 | + set(${OPTION}) |
| 35 | + endif() |
| 36 | +endmacro() |
| 37 | + |
| 38 | +function(add_core) |
| 39 | + # The core library needs the core headers plus all the headers in the top include directory |
| 40 | + file(GLOB_RECURSE HDR_COMPONENT LIST_DIRECTORIES false ${PROJECT_SOURCE_DIR}/include/sqlpp23/core/*.h) |
| 41 | + file(GLOB HDR_COMMON LIST_DIRECTORIES false ${PROJECT_SOURCE_DIR}/include/sqlpp23/*.h) |
| 42 | + set(HEADERS ${HDR_COMPONENT} ${HDR_COMMON}) |
| 43 | + add_regular_and_module( |
| 44 | + CONFIG_SCRIPT Sqlpp23Config.cmake |
| 45 | + HEADERS ${HEADERS} |
| 46 | + MODULE_INTERFACE sqlpp23.core.cppm |
| 47 | + TARGET_NAME sqlpp23 |
| 48 | + TARGET_ALIAS sqlpp23::core |
| 49 | + TARGET_EXPORTED core |
| 50 | + ) |
| 51 | +endfunction() |
| 52 | + |
28 | 53 | function(add_component) |
29 | | - set(options) |
30 | | - set(oneValueArgs NAME) |
31 | | - set(multiValueArgs DEPENDENCIES) |
| 54 | + set(options NO_INSTALL) |
| 55 | + set(oneValueArgs HEADER_DIR MODULE_INTERFACE NAME PACKAGE) |
| 56 | + set(multiValueArgs DEFINES DEPENDENCIES) |
32 | 57 | cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) |
33 | 58 |
|
34 | | - add_library(sqlpp23_${ARG_NAME} INTERFACE) |
35 | | - add_library(sqlpp23::${ARG_NAME} ALIAS sqlpp23_${ARG_NAME}) |
36 | | - set_target_properties(sqlpp23_${ARG_NAME} PROPERTIES EXPORT_NAME ${ARG_NAME}) |
37 | | - target_link_libraries(sqlpp23_${ARG_NAME} INTERFACE sqlpp23 ${ARG_DEPENDENCIES}) |
| 59 | + file(GLOB_RECURSE HEADERS LIST_DIRECTORIES false ${PROJECT_SOURCE_DIR}/include/sqlpp23/${ARG_HEADER_DIR}/*.h) |
| 60 | + string(TOLOWER ${ARG_NAME} LC_NAME) |
| 61 | + set_if(NO_INSTALL ARG_NO_INSTALL) |
| 62 | + add_regular_and_module( |
| 63 | + CONFIG_SCRIPT Sqlpp23${ARG_NAME}Config.cmake |
| 64 | + DEFINES ${ARG_DEFINES} |
| 65 | + DEPENDENCIES sqlpp23::core ${ARG_DEPENDENCIES} |
| 66 | + HEADERS ${HEADERS} |
| 67 | + MODULE_INTERFACE ${ARG_MODULE_INTERFACE} |
| 68 | + PACKAGE ${ARG_PACKAGE} |
| 69 | + TARGET_NAME sqlpp23_${LC_NAME} |
| 70 | + TARGET_ALIAS sqlpp23::${LC_NAME} |
| 71 | + TARGET_EXPORTED ${LC_NAME} |
| 72 | + ${NO_INSTALL} |
| 73 | + ) |
38 | 74 | endfunction() |
39 | 75 |
|
40 | | -function(install_component) |
41 | | - set(options) |
42 | | - set(oneValueArgs NAME DIRECTORY) |
43 | | - set(multiValueArgs TARGETS) |
| 76 | +function(add_regular_and_module) |
| 77 | + set(options NO_INSTALL) |
| 78 | + set(oneValueArgs CONFIG_SCRIPT MODULE_INTERFACE PACKAGE TARGET_NAME TARGET_ALIAS TARGET_EXPORTED) |
| 79 | + set(multiValueArgs DEFINES DEPENDENCIES HEADERS) |
44 | 80 | cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) |
45 | 81 |
|
46 | | - install(FILES ${PROJECT_SOURCE_DIR}/cmake/configs/${ARG_NAME}Config.cmake |
47 | | - DESTINATION ${SQLPP23_INSTALL_CMAKEDIR} |
| 82 | + if(ARG_PACKAGE) |
| 83 | + if(DEPENDENCY_CHECK) |
| 84 | + find_package(${ARG_PACKAGE} REQUIRED) |
| 85 | + endif() |
| 86 | + if(NOT ARG_NO_INSTALL) |
| 87 | + # If the package needs a special find script, copy it to the destination scripts directory |
| 88 | + set(FIND_SCRIPT ${PROJECT_SOURCE_DIR}/cmake/modules/Find{ARG_PACKAGE}.cmake) |
| 89 | + if(EXISTS ${FIND_SCRIPT}) |
| 90 | + install(FILES ${FIND_SCRIPT} DESTINATION ${SQLPP23_INSTALL_CMAKEDIR}) |
| 91 | + endif() |
| 92 | + endif() |
| 93 | + endif() |
| 94 | + if(NOT ARG_NO_INSTALL) |
| 95 | + install( |
| 96 | + FILES ${PROJECT_SOURCE_DIR}/cmake/configs/${ARG_CONFIG_SCRIPT} |
| 97 | + DESTINATION ${SQLPP23_INSTALL_CMAKEDIR} |
| 98 | + ) |
| 99 | + endif() |
| 100 | + set_if(NO_INSTALL ARG_NO_INSTALL) |
| 101 | + add_common( |
| 102 | + DEFINES ${ARG_DEFINES} |
| 103 | + DEPENDENCIES ${ARG_DEPENDENCIES} |
| 104 | + HEADERS ${HEADERS} |
| 105 | + TARGET_NAME ${ARG_TARGET_NAME} |
| 106 | + TARGET_ALIAS ${ARG_TARGET_ALIAS} |
| 107 | + TARGET_EXPORTED ${ARG_TARGET_EXPORTED} |
| 108 | + ${NO_INSTALL} |
48 | 109 | ) |
| 110 | + if(BUILD_WITH_MODULES AND ARG_MODULE_INTERFACE) |
| 111 | + add_common( |
| 112 | + DEFINES ${ARG_DEFINES} |
| 113 | + DEPENDENCIES ${ARG_DEPENDENCIES} |
| 114 | + HEADERS ${HEADERS} |
| 115 | + MODULE_INTERFACE ${ARG_MODULE_INTERFACE} |
| 116 | + TARGET_NAME ${ARG_TARGET_NAME} |
| 117 | + TARGET_ALIAS ${ARG_TARGET_ALIAS} |
| 118 | + TARGET_EXPORTED ${ARG_TARGET_EXPORTED} |
| 119 | + ${NO_INSTALL} |
| 120 | + ) |
| 121 | + endif() |
| 122 | +endfunction() |
49 | 123 |
|
50 | | - install(TARGETS ${ARG_TARGETS} |
51 | | - EXPORT Sqlpp23Targets |
52 | | - INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} |
53 | | - ) |
| 124 | +function(add_common) |
| 125 | + set(options NO_INSTALL) |
| 126 | + set(oneValueArgs MODULE_INTERFACE TARGET_NAME TARGET_ALIAS TARGET_EXPORTED) |
| 127 | + set(multiValueArgs DEFINES DEPENDENCIES HEADERS) |
| 128 | + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) |
54 | 129 |
|
55 | | - install(EXPORT Sqlpp23Targets |
56 | | - DESTINATION ${SQLPP23_INSTALL_CMAKEDIR} |
57 | | - NAMESPACE sqlpp23:: |
58 | | - ) |
| 130 | + # Initialize helper variables based on target type (regular or module) |
| 131 | + if(ARG_MODULE_INTERFACE) |
| 132 | + set(TARGET_SUFFIX "_module") |
| 133 | + # FILE_SETs of type CXX_MODULES cannot have the INTERFACE scope (exept |
| 134 | + # on IMPORTED targets) and INTERFACE libraries only allow INTERFACE |
| 135 | + # scope on their properties. That's why we cannot use the INTERFACE |
| 136 | + # library type. For details see the discussion at |
| 137 | + # https://discourse.cmake.org/t/header-only-libraries-and-c-20-modules/10680/11 |
| 138 | + set(LIB_TYPE OBJECT) |
| 139 | + set(LIB_PROP_SCOPE PUBLIC) |
| 140 | + else() |
| 141 | + set(TARGET_SUFFIX "") |
| 142 | + set(LIB_TYPE INTERFACE) |
| 143 | + set(LIB_PROP_SCOPE INTERFACE) |
| 144 | + endif() |
| 145 | + set(TARGET_NAME ${ARG_TARGET_NAME}${TARGET_SUFFIX}) |
| 146 | + set(TARGET_ALIAS ${ARG_TARGET_ALIAS}${TARGET_SUFFIX}) |
| 147 | + set(TARGET_EXPORTED ${ARG_TARGET_EXPORTED}${TARGET_SUFFIX}) |
| 148 | + |
| 149 | + # Create the component targets |
| 150 | + add_library(${TARGET_NAME} ${LIB_TYPE}) |
| 151 | + add_library(${TARGET_ALIAS} ALIAS ${TARGET_NAME}) |
| 152 | + set_target_properties(${TARGET_NAME} PROPERTIES EXPORT_NAME ${TARGET_EXPORTED}) |
| 153 | + target_compile_features(${TARGET_NAME} ${LIB_PROP_SCOPE} cxx_std_23) |
| 154 | + if(ARG_DEFINES) |
| 155 | + target_compile_definitions(${TARGET_NAME} ${LIB_PROP_SCOPE} ${ARG_DEFINES}) |
| 156 | + endif() |
| 157 | + foreach(DEP ${ARG_DEPENDENCIES}) |
| 158 | + if(DEP MATCHES "^sqlpp23::") |
| 159 | + set(DEP ${DEP}${TARGET_SUFFIX}) |
| 160 | + endif() |
| 161 | + target_link_libraries(${TARGET_NAME} ${LIB_PROP_SCOPE} ${DEP}) |
| 162 | + endforeach() |
59 | 163 |
|
60 | | - install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/sqlpp23/${ARG_DIRECTORY} |
61 | | - DESTINATION include/sqlpp23 |
62 | | - FILES_MATCHING |
63 | | - PATTERN *.h |
| 164 | + # Add the component headers to the HEADERS file set. This also adds the base directory to the |
| 165 | + # target's build interface include directories. |
| 166 | + target_sources( |
| 167 | + ${TARGET_NAME} |
| 168 | + ${LIB_PROP_SCOPE} |
| 169 | + FILE_SET HEADERS |
| 170 | + BASE_DIRS ${PROJECT_SOURCE_DIR}/include |
| 171 | + FILES ${ARG_HEADERS} |
64 | 172 | ) |
| 173 | + if(ARG_MODULE_INTERFACE) |
| 174 | + # Add the component module interface file to the CXX_MODULES file set |
| 175 | + target_sources( |
| 176 | + ${TARGET_NAME} |
| 177 | + PUBLIC |
| 178 | + FILE_SET CXX_MODULES |
| 179 | + BASE_DIRS ${PROJECT_SOURCE_DIR}/modules |
| 180 | + FILES ${PROJECT_SOURCE_DIR}/modules/${ARG_MODULE_INTERFACE} |
| 181 | + ) |
| 182 | + endif() |
| 183 | + if(NOT ARG_NO_INSTALL) |
| 184 | + # Install the component output artifacts |
| 185 | + install( |
| 186 | + TARGETS ${TARGET_NAME} |
| 187 | + EXPORT Sqlpp23Targets |
| 188 | + FILE_SET HEADERS |
| 189 | + FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_PREFIX}/modules/sqlpp23 |
| 190 | + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} |
| 191 | + ) |
| 192 | + endif() |
65 | 193 | endfunction() |
0 commit comments