Warning, /utilities/okteta/cmake/OktetaInternalMacros.cmake is written in an unsupported language. File is not indexed.
0001 # 0002 # Okteta Private Macros 0003 # 0004 # SPDX-FileCopyrightText: 2018, 2019 Friedrich W. H. Kossebau <kossebau@kde.org> 0005 # 0006 # SPDX-License-Identifier: BSD-3-Clause 0007 # 0008 0009 # ECM 0010 include(ECMGenerateHeaders) 0011 include(ECMGeneratePriFile) 0012 include(ECMGeneratePkgConfigFile) 0013 # CMake 0014 include(GenerateExportHeader) 0015 include(CMakePackageConfigHelpers) 0016 include(CMakeParseArguments) 0017 0018 0019 # helper macros 0020 function(_okteta_target_name _varName _baseName) 0021 string(CONCAT _namespacePrefix ${ARGN}) 0022 set(${_varName} "${_namespacePrefix}${_baseName}" PARENT_SCOPE) 0023 endfunction() 0024 0025 0026 function(_okteta_setup_namespace) 0027 set(options 0028 ) 0029 set(oneValueArgs 0030 BASE_NAME 0031 NAMESPACEPREFIX_VAR 0032 VERSIONEDNAMESPACEPREFIX_VAR 0033 VERSIONEDNAMESPACE_VAR 0034 ) 0035 set(multiValueArgs 0036 NAMESPACE 0037 ABIVERSION 0038 ) 0039 cmake_parse_arguments(OKTETA_SETUP_NAMESPACE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0040 0041 string(CONCAT _namespacePrefix ${OKTETA_SETUP_NAMESPACE_NAMESPACE}) 0042 0043 if (OKTETA_SETUP_NAMESPACE_ABIVERSION) 0044 list(LENGTH OKTETA_SETUP_NAMESPACE_ABIVERSION _abiversionCount) 0045 list(LENGTH OKTETA_SETUP_NAMESPACE_NAMESPACE _namespaceCount) 0046 if (NOT _abiversionCount EQUAL _namespaceCount) 0047 message(FATAL_ERROR "ABIVERSION needs to have as many elements as NAMESPACE if used") 0048 endif() 0049 math(EXPR _namespaceLastIndex "${_namespaceCount} - 1") 0050 0051 set(_versioned_namespace) 0052 foreach(val RANGE ${_namespaceLastIndex}) 0053 list(GET OKTETA_SETUP_NAMESPACE_NAMESPACE ${val} _namespace) 0054 list(GET OKTETA_SETUP_NAMESPACE_ABIVERSION ${val} _abiversion) 0055 list(APPEND _versioned_namespace "${_namespace}${_abiversion}") 0056 endforeach() 0057 string(CONCAT _versionedNamespacePrefix ${_versioned_namespace}) 0058 else() 0059 set(_versioned_namespace ${OKTETA_SETUP_NAMESPACE_NAMESPACE}) 0060 set(_versionedNamespacePrefix "${_namespacePrefix}") 0061 endif() 0062 0063 if (OKTETA_SETUP_NAMESPACE_NAMESPACEPREFIX_VAR) 0064 set(${OKTETA_SETUP_NAMESPACE_NAMESPACEPREFIX_VAR} ${_namespacePrefix} PARENT_SCOPE) 0065 endif() 0066 if (OKTETA_SETUP_NAMESPACE_VERSIONEDNAMESPACEPREFIX_VAR) 0067 set(${OKTETA_SETUP_NAMESPACE_VERSIONEDNAMESPACEPREFIX_VAR} ${_versionedNamespacePrefix} PARENT_SCOPE) 0068 endif() 0069 if (OKTETA_SETUP_NAMESPACE_VERSIONEDNAMESPACE_VAR) 0070 set(${OKTETA_SETUP_NAMESPACE_VERSIONEDNAMESPACE_VAR} ${_versioned_namespace} PARENT_SCOPE) 0071 endif() 0072 endfunction() 0073 0074 0075 macro(okteta_add_sublibrary _baseName) 0076 set(options 0077 NO_VERSIONED_INCLUDEDIR 0078 REVERSE_NAMESPACE_INCLUDEDIR 0079 ) 0080 set(oneValueArgs 0081 SUBDIR 0082 SOURCE_TAG 0083 ) 0084 set(multiValueArgs 0085 NAMESPACE 0086 PUBLIC 0087 PRIVATE 0088 KCFG 0089 UI 0090 ) 0091 cmake_parse_arguments(OKTETA_ADD_SUBLIBRARY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0092 0093 string(CONCAT _namespaceConcat ${OKTETA_ADD_SUBLIBRARY_NAMESPACE}) 0094 string(TOLOWER "${_namespaceConcat}${_baseName}" _libname) 0095 if (OKTETA_ADD_SUBLIBRARY_SOURCE_TAG) 0096 set(_sourceTag "_${OKTETA_ADD_SUBLIBRARY_SOURCE_TAG}") 0097 else() 0098 set(_sourceTag) 0099 endif() 0100 if (OKTETA_ADD_SUBLIBRARY_SUBDIR) 0101 set(_relativePath "${OKTETA_ADD_SUBLIBRARY_SUBDIR}/") 0102 set(_egh_relative_param RELATIVE ${OKTETA_ADD_SUBLIBRARY_SUBDIR}) 0103 string(REPLACE ".." "PARENTDIR" _subdir_id ${OKTETA_ADD_SUBLIBRARY_SUBDIR}) 0104 string(REPLACE "/" "_" _subdir_id ${_subdir_id}) 0105 set(_SRCS ${_libname}_${_subdir_id}${_sourceTag}_SRCS) 0106 set(_HDRS ${_libname}_${_subdir_id}_HDRS) 0107 set(_CCHDRS ${_libname}_${_subdir_id}_CCHDRS) 0108 else() 0109 set(_relativePath) 0110 set(_egh_relative_param) 0111 set(_SRCS ${_libname}${_sourceTag}_LIB_SRCS) 0112 set(_HDRS ${_libname}_LIB_HDRS) 0113 set(_CCHDRS ${_libname}_LIB_CCHDRS) 0114 endif() 0115 0116 foreach(_classname ${OKTETA_ADD_SUBLIBRARY_PUBLIC} ${OKTETA_ADD_SUBLIBRARY_PRIVATE}) 0117 string(TOLOWER "${_classname}" _lc_classname) 0118 0119 set(_source "${_relativePath}${_lc_classname}.cpp") 0120 set(_actualsource "${CMAKE_CURRENT_SOURCE_DIR}/${_source}") 0121 if (EXISTS ${_actualsource}) 0122 list(APPEND ${_SRCS} "${_source}") 0123 endif() 0124 0125 set(_source "${_relativePath}${_lc_classname}_p.cpp") 0126 set(_actualsource "${CMAKE_CURRENT_SOURCE_DIR}/${_source}") 0127 if (EXISTS ${_actualsource}) 0128 list(APPEND ${_SRCS} "${_source}") 0129 endif() 0130 endforeach() 0131 0132 foreach(_kcfg ${OKTETA_ADD_SUBLIBRARY_KCFG}) 0133 kconfig_add_kcfg_files(${_SRCS} "${_relativePath}${_kcfg}") 0134 endforeach() 0135 0136 foreach(_ui ${OKTETA_ADD_SUBLIBRARY_UI}) 0137 ki18n_wrap_ui(${_SRCS} "${_relativePath}${_ui}") 0138 endforeach() 0139 0140 if (OKTETA_ADD_SUBLIBRARY_PUBLIC) 0141 set(_cc_include_dir ${OKTETA_ADD_SUBLIBRARY_NAMESPACE}) 0142 if (OKTETA_ADD_SUBLIBRARY_REVERSE_NAMESPACE_INCLUDEDIR) 0143 list(REVERSE _cc_include_dir) 0144 endif() 0145 string(REPLACE ";" "/" _cc_include_dir "${_cc_include_dir}") 0146 0147 ecm_generate_headers(${_CCHDRS} 0148 HEADER_NAMES 0149 ${OKTETA_ADD_SUBLIBRARY_PUBLIC} 0150 ${_egh_relative_param} 0151 HEADER_EXTENSION hpp 0152 PREFIX ${_cc_include_dir} 0153 REQUIRED_HEADERS ${_HDRS} 0154 ) 0155 endif() 0156 0157 if (OKTETA_ADD_SUBLIBRARY_SUBDIR) 0158 list(APPEND ${_libname}${_sourceTag}_LIB_SRCS ${${_SRCS}}) 0159 list(APPEND ${_libname}_LIB_HDRS ${${_HDRS}}) 0160 list(APPEND ${_libname}_LIB_CCHDRS ${${_CCHDRS}}) 0161 endif() 0162 endmacro() 0163 0164 0165 function(okteta_add_library _baseName) 0166 set(options 0167 NO_TARGET_NAMESPACE 0168 NO_VERSIONED_INCLUDEDIR 0169 NO_VERSIONED_PACKAGE_NAME 0170 NO_PACKAGE_NAMESPACED_INCLUDEDIR 0171 REVERSE_NAMESPACE_LIB 0172 REVERSE_NAMESPACE_INCLUDEDIR 0173 LOWERCASE_LIB 0174 ) 0175 set(oneValueArgs 0176 INTERNAL_BASENAME 0177 INCLUDEDIR_PACKAGE_NAMESPACE 0178 VERSION 0179 SOVERSION 0180 ) 0181 set(multiValueArgs 0182 NAMESPACE 0183 ABIVERSION 0184 PUBLIC 0185 PRIVATE 0186 SOURCES 0187 HEADERS 0188 CCHEADERS 0189 ) 0190 cmake_parse_arguments(OKTETA_ADD_LIBRARY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0191 0192 if (NOT OKTETA_ADD_LIBRARY_NO_VERSIONED_PACKAGE_NAME) 0193 set(_use_versioned_package_name TRUE) 0194 endif() 0195 if (NOT OKTETA_ADD_LIBRARY_INTERNAL_BASENAME) 0196 set(OKTETA_ADD_LIBRARY_INTERNAL_BASENAME ${_baseName}) 0197 endif() 0198 0199 _okteta_setup_namespace( 0200 NAMESPACEPREFIX_VAR _namespacePrefix 0201 VERSIONEDNAMESPACEPREFIX_VAR _versionedNamespacePrefix 0202 VERSIONEDNAMESPACE_VAR _versioned_namespace 0203 BASE_NAME ${_baseName} 0204 NAMESPACE ${OKTETA_ADD_LIBRARY_NAMESPACE} 0205 ABIVERSION ${OKTETA_ADD_LIBRARY_ABIVERSION} 0206 ) 0207 0208 set(_fullName "${_namespacePrefix}${_baseName}") 0209 set(_fullInternalName "${_namespacePrefix}${OKTETA_ADD_LIBRARY_INTERNAL_BASENAME}") 0210 set(_fullVersionedName "${_versionedNamespacePrefix}${_baseName}") 0211 0212 set(_targets_export_name "${_fullName}Targets") 0213 0214 set(_libraryName ${_versioned_namespace}) 0215 if (OKTETA_ADD_LIBRARY_REVERSE_NAMESPACE_LIB) 0216 list(REVERSE _libraryName) 0217 endif() 0218 string(CONCAT _libraryName ${_libraryName} ${_baseName}) 0219 if (OKTETA_ADD_LIBRARY_LOWERCASE_LIB) 0220 string(TOLOWER ${_libraryName} _libraryName) 0221 endif() 0222 0223 set(_targetName ${_fullName}) 0224 string(TOLOWER ${_fullInternalName} _lc_fullInternalName) 0225 if (OKTETA_ADD_LIBRARY_NO_VERSIONED_INCLUDEDIR) 0226 set(_cc_include_dir ${OKTETA_ADD_LIBRARY_NAMESPACE}) 0227 else() 0228 set(_cc_include_dir ${_versioned_namespace}) 0229 endif() 0230 if (OKTETA_ADD_LIBRARY_REVERSE_NAMESPACE_INCLUDEDIR) 0231 list(REVERSE _cc_include_dir) 0232 endif() 0233 string(REPLACE ";" "/" _cc_include_dir "${_cc_include_dir}") 0234 string(TOLOWER ${_cc_include_dir} _include_dir) 0235 0236 add_library(${_targetName} SHARED ${OKTETA_ADD_LIBRARY_SOURCES} ) 0237 if (NOT OKTETA_ADD_LIBRARY_NO_TARGET_NAMESPACE) 0238 add_library("${_namespacePrefix}::${_baseName}" ALIAS ${_targetName}) 0239 set(_export_name_args EXPORT_NAME ${_baseName}) 0240 else() 0241 set(_export_name_args) 0242 endif() 0243 0244 set(_exportHeaderFileName ${_lc_fullInternalName}_export.hpp) 0245 set(_exportHeaderFilePath ${CMAKE_CURRENT_BINARY_DIR}/${_exportHeaderFileName}) 0246 generate_export_header(${_targetName} 0247 BASE_NAME ${_fullInternalName} 0248 EXPORT_FILE_NAME ${_exportHeaderFilePath} 0249 ) 0250 # Local forwarding header 0251 set(_forwardexportHeaderFilePath ${CMAKE_CURRENT_BINARY_DIR}/${_include_dir}/${_exportHeaderFileName}) 0252 if (NOT EXISTS ${_forwardexportHeaderFilePath}) 0253 file(WRITE ${_forwardexportHeaderFilePath} "#include \"${_exportHeaderFilePath}\"\n") 0254 endif() 0255 0256 target_link_libraries(${_targetName} 0257 PUBLIC 0258 ${OKTETA_ADD_LIBRARY_PUBLIC} 0259 PRIVATE 0260 ${OKTETA_ADD_LIBRARY_PRIVATE} 0261 ) 0262 0263 target_include_directories(${_targetName} 0264 PUBLIC "$<BUILD_INTERFACE:${${_targetName}_BINARY_DIR};${CMAKE_CURRENT_BINARY_DIR}>" 0265 ) 0266 0267 set_target_properties(${_targetName} PROPERTIES 0268 ${_export_name_args} 0269 OUTPUT_NAME ${_libraryName} 0270 VERSION ${OKTETA_ADD_LIBRARY_VERSION} 0271 SOVERSION ${OKTETA_ADD_LIBRARY_SOVERSION} 0272 ) 0273 set_property(TARGET ${_targetName} PROPERTY OKTETA_FULLNAME ${_fullName}) 0274 set_property(TARGET ${_targetName} PROPERTY OKTETA_FULLVERSIONEDNAME ${_fullVersionedName}) 0275 set_property(TARGET ${_targetName} PROPERTY OKTETA_NAMESPACEPREFIX ${_namespacePrefix}) 0276 set_property(TARGET ${_targetName} PROPERTY OKTETA_NO_TARGETNAMESPACE ${OKTETA_ADD_LIBRARY_NO_TARGET_NAMESPACE}) 0277 set_property(TARGET ${_targetName} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME ${_use_versioned_package_name}) 0278 0279 install( TARGETS ${_targetName} 0280 EXPORT ${_targets_export_name} 0281 ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} 0282 ) 0283 0284 if (OKTETA_ADD_LIBRARY_HEADERS OR OKTETA_ADD_LIBRARY_CCHEADERS) 0285 if (OKTETA_ADD_LIBRARY_NO_PACKAGE_NAMESPACED_INCLUDEDIR) 0286 set(_include_install_dir "${KDE_INSTALL_INCLUDEDIR}") 0287 else() 0288 if (OKTETA_ADD_LIBRARY_INCLUDEDIR_PACKAGE_NAMESPACE) 0289 set(_include_dir_package_namespace "${OKTETA_ADD_LIBRARY_INCLUDEDIR_PACKAGE_NAMESPACE}") 0290 else() 0291 if (_use_versioned_package_name) 0292 set(_include_dir_package_namespace "${_fullVersionedName}") 0293 else() 0294 set(_include_dir_package_namespace "${_fullName}") 0295 endif() 0296 endif() 0297 set(_include_install_dir "${KDE_INSTALL_INCLUDEDIR}/${_include_dir_package_namespace}") 0298 endif() 0299 set_property(TARGET ${_targetName} PROPERTY OKTETA_INSTALL_INCLUDEDIR ${_include_install_dir}) 0300 target_include_directories(${_targetName} 0301 INTERFACE "$<INSTALL_INTERFACE:${_include_install_dir}>" 0302 ) 0303 install( FILES ${OKTETA_ADD_LIBRARY_HEADERS} ${_exportHeaderFilePath} 0304 DESTINATION "${_include_install_dir}/${_include_dir}" 0305 COMPONENT Devel 0306 ) 0307 install( FILES ${OKTETA_ADD_LIBRARY_CCHEADERS} 0308 DESTINATION "${_include_install_dir}/${_cc_include_dir}" 0309 COMPONENT Devel 0310 ) 0311 endif() 0312 endfunction() 0313 0314 0315 function(okteta_add_cmakeconfig _baseName) 0316 set(options 0317 ) 0318 set(oneValueArgs 0319 ) 0320 set(multiValueArgs 0321 NAMESPACE 0322 ) 0323 cmake_parse_arguments(OKTETA_ADD_CMAKECONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0324 0325 _okteta_target_name(_targetName ${_baseName} ${OKTETA_ADD_CMAKECONFIG_NAMESPACE}) 0326 0327 get_property(_use_versioned_package_name TARGET ${_targetName} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME) 0328 if (_use_versioned_package_name) 0329 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLVERSIONEDNAME) 0330 else() 0331 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLNAME) 0332 endif() 0333 0334 set(_targets_export_name "${_configName}Targets") 0335 0336 # create a Config.cmake and a ConfigVersion.cmake file and install them 0337 set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/${_configName}") 0338 0339 get_target_property(_version ${_targetName} VERSION) 0340 if (_version) 0341 set(_configVersionFilePath "${CMAKE_CURRENT_BINARY_DIR}/${_configName}ConfigVersion.cmake") 0342 if(NOT OKTETA_ADD_CMAKECONFIG_COMPATIBILITY) 0343 set(OKTETA_ADD_CMAKECONFIG_COMPATIBILITY AnyNewerVersion) 0344 endif() 0345 write_basic_package_version_file("${_configVersionFilePath}" 0346 VERSION ${_version} 0347 COMPATIBILITY ${OKTETA_ADD_CMAKECONFIG_COMPATIBILITY} 0348 ) 0349 else() 0350 set(_configVersionFilePath) 0351 endif() 0352 0353 set(_configFileTemplatePath "${CMAKE_CURRENT_SOURCE_DIR}/${_configName}Config.cmake.in") 0354 set(_configFilePath "${CMAKE_CURRENT_BINARY_DIR}/${_configName}Config.cmake") 0355 configure_package_config_file( 0356 "${_configFileTemplatePath}" 0357 "${_configFilePath}" 0358 INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} 0359 ) 0360 0361 install( FILES 0362 "${_configFilePath}" 0363 "${_configVersionFilePath}" 0364 DESTINATION "${CMAKECONFIG_INSTALL_DIR}" 0365 COMPONENT Devel 0366 ) 0367 get_property(_no_target_namespace TARGET ${_targetName} PROPERTY OKTETA_NO_TARGETNAMESPACE) 0368 if(NOT _no_target_namespace) 0369 get_property(_namespacePrefix TARGET ${_targetName} PROPERTY OKTETA_NAMESPACEPREFIX) 0370 set(_namespace_args NAMESPACE "${_namespacePrefix}::") 0371 endif() 0372 install(EXPORT ${_targets_export_name} 0373 FILE "${_configName}Targets.cmake" 0374 ${_namespace_args} 0375 DESTINATION "${CMAKECONFIG_INSTALL_DIR}" 0376 COMPONENT Devel 0377 ) 0378 endfunction() 0379 0380 0381 function(okteta_add_qmakeconfig _baseName) 0382 set(options 0383 ) 0384 set(oneValueArgs 0385 ) 0386 set(multiValueArgs 0387 NAMESPACE 0388 DEPS 0389 ) 0390 cmake_parse_arguments(OKTETA_ADD_QMAKECONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0391 0392 _okteta_target_name(_targetName ${_baseName} ${OKTETA_ADD_QMAKECONFIG_NAMESPACE}) 0393 0394 get_target_property(_libraryName ${_targetName} OUTPUT_NAME) 0395 get_property(_include_install_dir TARGET ${_targetName} PROPERTY OKTETA_INSTALL_INCLUDEDIR) 0396 get_property(_fullName TARGET ${_targetName} PROPERTY OKTETA_FULLNAME) 0397 get_property(_use_versioned_package_name TARGET ${_targetName} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME) 0398 if (_use_versioned_package_name) 0399 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLVERSIONEDNAME) 0400 else() 0401 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLNAME) 0402 endif() 0403 0404 string(REPLACE ";" " " _deps "${OKTETA_ADD_QMAKECONFIG_DEPS}") 0405 # Older ecm_generate_pri_file only knows PROJECT_VERSION_STRING 0406 if(ECM_VERSION VERSION_LESS 5.83.0) 0407 get_target_property(PROJECT_VERSION_STRING ${_targetName} VERSION) 0408 set(_version_argument) 0409 else() 0410 get_target_property(_version ${_targetName} VERSION) 0411 set(_version_argument VERSION ${_version}) 0412 endif() 0413 0414 ecm_generate_pri_file( 0415 BASE_NAME ${_configName} 0416 LIB_NAME ${_libraryName} 0417 DEPS ${_deps} 0418 ${_version_argument} 0419 FILENAME_VAR _pri_filename 0420 INCLUDE_INSTALL_DIR ${_include_install_dir} 0421 ) 0422 install(FILES ${_pri_filename} 0423 DESTINATION ${ECM_MKSPECS_INSTALL_DIR} 0424 COMPONENT Devel 0425 ) 0426 endfunction() 0427 0428 function(okteta_add_pkgconfig _baseName) 0429 set(options 0430 ) 0431 set(oneValueArgs 0432 DESCRIPTION 0433 ) 0434 set(multiValueArgs 0435 NAMESPACE 0436 DEPS 0437 ) 0438 cmake_parse_arguments(OKTETA_ADD_PKGCONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0439 0440 _okteta_target_name(_targetName ${_baseName} ${OKTETA_ADD_PKGCONFIG_NAMESPACE}) 0441 0442 get_target_property(_libraryName ${_targetName} OUTPUT_NAME) 0443 get_property(_include_install_dir TARGET ${_targetName} PROPERTY OKTETA_INSTALL_INCLUDEDIR) 0444 get_property(_use_versioned_package_name TARGET ${_targetName} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME) 0445 if (_use_versioned_package_name) 0446 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLVERSIONEDNAME) 0447 else() 0448 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLNAME) 0449 endif() 0450 0451 string(REPLACE ";" " " _deps "${OKTETA_ADD_PKGCONFIG_DEPS}") 0452 0453 get_target_property(PROJECT_VERSION ${_targetName} VERSION) 0454 ecm_generate_pkgconfig_file( 0455 BASE_NAME ${_configName} 0456 LIB_NAME ${_libraryName} 0457 DEPS ${_deps} 0458 INCLUDE_INSTALL_DIR ${_include_install_dir} 0459 DESCRIPTION ${OKTETA_ADD_PKGCONFIG_DESCRIPTION} 0460 INSTALL 0461 ) 0462 endfunction()