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(CMakePackageConfigHelpers) 0015 include(CheckCXXCompilerFlag) 0016 0017 # helper macros 0018 function(_okteta_target_name _varName _baseName) 0019 string(CONCAT _namespacePrefix ${ARGN}) 0020 set(${_varName} "${_namespacePrefix}${_baseName}" PARENT_SCOPE) 0021 endfunction() 0022 0023 0024 function(_okteta_setup_namespace) 0025 set(options 0026 ) 0027 set(oneValueArgs 0028 BASE_NAME 0029 NAMESPACEPREFIX_VAR 0030 VERSIONEDNAMESPACEPREFIX_VAR 0031 VERSIONEDNAMESPACE_VAR 0032 ) 0033 set(multiValueArgs 0034 NAMESPACE 0035 ABIVERSION 0036 ) 0037 cmake_parse_arguments(OKTETA_SETUP_NAMESPACE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0038 0039 string(CONCAT _namespacePrefix ${OKTETA_SETUP_NAMESPACE_NAMESPACE}) 0040 0041 if (OKTETA_SETUP_NAMESPACE_ABIVERSION) 0042 list(LENGTH OKTETA_SETUP_NAMESPACE_ABIVERSION _abiversionCount) 0043 list(LENGTH OKTETA_SETUP_NAMESPACE_NAMESPACE _namespaceCount) 0044 if (NOT _abiversionCount EQUAL _namespaceCount) 0045 message(FATAL_ERROR "ABIVERSION needs to have as many elements as NAMESPACE if used") 0046 endif() 0047 math(EXPR _namespaceLastIndex "${_namespaceCount} - 1") 0048 0049 set(_versioned_namespace) 0050 foreach(val RANGE ${_namespaceLastIndex}) 0051 list(GET OKTETA_SETUP_NAMESPACE_NAMESPACE ${val} _namespace) 0052 list(GET OKTETA_SETUP_NAMESPACE_ABIVERSION ${val} _abiversion) 0053 list(APPEND _versioned_namespace "${_namespace}${_abiversion}") 0054 endforeach() 0055 string(CONCAT _versionedNamespacePrefix ${_versioned_namespace}) 0056 else() 0057 set(_versioned_namespace ${OKTETA_SETUP_NAMESPACE_NAMESPACE}) 0058 set(_versionedNamespacePrefix "${_namespacePrefix}") 0059 endif() 0060 0061 if (OKTETA_SETUP_NAMESPACE_NAMESPACEPREFIX_VAR) 0062 set(${OKTETA_SETUP_NAMESPACE_NAMESPACEPREFIX_VAR} ${_namespacePrefix} PARENT_SCOPE) 0063 endif() 0064 if (OKTETA_SETUP_NAMESPACE_VERSIONEDNAMESPACEPREFIX_VAR) 0065 set(${OKTETA_SETUP_NAMESPACE_VERSIONEDNAMESPACEPREFIX_VAR} ${_versionedNamespacePrefix} PARENT_SCOPE) 0066 endif() 0067 if (OKTETA_SETUP_NAMESPACE_VERSIONEDNAMESPACE_VAR) 0068 set(${OKTETA_SETUP_NAMESPACE_VERSIONEDNAMESPACE_VAR} ${_versioned_namespace} PARENT_SCOPE) 0069 endif() 0070 endfunction() 0071 0072 function(_okteta_generate_version_code) 0073 set(options 0074 ) 0075 set(oneValueArgs 0076 CODE_VARIABLE 0077 PREFIX 0078 VERSION 0079 ) 0080 set(multiValueArgs 0081 ) 0082 cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0083 0084 # Omit any leading "0" in extraction, would otherwise yield an octal value string in C++ (08, 09) 0085 string(REGEX REPLACE "^0*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" _version_major "${ARGS_VERSION}") 0086 string(REGEX REPLACE "^[0-9]+\\.0*([0-9]+)\\.[0-9]+.*" "\\1" _version_minor "${ARGS_VERSION}") 0087 string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.0*([0-9]+).*" "\\1" _version_patch "${ARGS_VERSION}") 0088 math(EXPR _version_hexnumber "${_version_major}*65536 + ${_version_minor}*256 + ${_version_patch}" OUTPUT_FORMAT HEXADECIMAL) 0089 0090 set(_content 0091 "#define ${ARGS_PREFIX}_VERSION_STRING \"${ARGS_VERSION}\" 0092 #define ${ARGS_PREFIX}_VERSION_MAJOR ${_version_major} 0093 #define ${ARGS_PREFIX}_VERSION_MINOR ${_version_minor} 0094 #define ${ARGS_PREFIX}_VERSION_PATCH ${_version_patch} 0095 #define ${ARGS_PREFIX}_VERSION ${_version_hexnumber} 0096 " 0097 ) 0098 set(${ARGS_CODE_VARIABLE} "${_content}" PARENT_SCOPE) 0099 endfunction() 0100 0101 function(_okteta_generate_export_code) 0102 set(options 0103 ) 0104 set(oneValueArgs 0105 CODE_VARIABLE 0106 PREFIX 0107 TARGET_NAME 0108 ) 0109 set(multiValueArgs 0110 ) 0111 cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0112 0113 if(NOT WIN32) 0114 check_cxx_compiler_flag("-fvisibility=hidden" COMPILER_SUPPORTS_HIDDEN_VISIBILITY) 0115 endif() 0116 0117 set(_staticlib_macro_name "${ARGS_PREFIX}_STATICLIB") 0118 set(_export_macro_name "${ARGS_PREFIX}_EXPORT") 0119 set(_no_export_macro_name "${ARGS_PREFIX}_NO_EXPORT") 0120 set(_content 0121 "#ifdef ${_staticlib_macro_name} 0122 # define ${_export_macro_name} 0123 # define ${_no_export_macro_name} 0124 #else 0125 # ifndef ${_export_macro_name} 0126 " 0127 ) 0128 if(WIN32) 0129 get_target_property(_building_lib_flag ${ARGS_TARGET_NAME} DEFINE_SYMBOL) 0130 0131 if(NOT _building_lib_flag) 0132 # calculate cmake default preprocessor definition set when building a shared library 0133 set(_building_lib_flag ${ARGS_TARGET_NAME}_EXPORTS) 0134 string(MAKE_C_IDENTIFIER ${_building_lib_flag} _building_lib_flag) 0135 endif() 0136 0137 string(APPEND _content 0138 "# ifdef ${_building_lib_flag} 0139 // Library is built 0140 # define ${_export_macro_name} __declspec(dllexport) 0141 # else 0142 // Library is consumed 0143 # define ${_export_macro_name} __declspec(dllimport) 0144 # endif 0145 " 0146 ) 0147 else() 0148 if(COMPILER_SUPPORTS_HIDDEN_VISIBILITY) 0149 string(APPEND _content "# define ${_export_macro_name} __attribute__((visibility(\"default\")))\n") 0150 else() 0151 string(APPEND _content "# define ${_export_macro_name}\n") 0152 endif() 0153 endif() 0154 string(APPEND _content "# endif\n") 0155 0156 string(APPEND _content "# ifndef ${_no_export_macro_name}\n") 0157 if(WIN32) 0158 string(APPEND _content "# define ${_no_export_macro_name}\n") 0159 else() 0160 if(COMPILER_SUPPORTS_HIDDEN_VISIBILITY) 0161 string(APPEND _content "# define ${_no_export_macro_name} __attribute__((visibility(\"hidden\")))\n") 0162 else() 0163 string(APPEND _content "# define ${_no_export_macro_name}\n") 0164 endif() 0165 endif() 0166 string(APPEND _content 0167 "# endif 0168 #endif 0169 " 0170 ) 0171 0172 set(${ARGS_CODE_VARIABLE} "${_content}" PARENT_SCOPE) 0173 endfunction() 0174 0175 function(_okteta_generate_header_file) 0176 set(options 0177 ) 0178 set(oneValueArgs 0179 CODE 0180 INCLUDE_GUARD_NAME 0181 EXPORT_FILE_NAME 0182 ) 0183 set(multiValueArgs 0184 ) 0185 cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0186 0187 file(GENERATE OUTPUT ${ARGS_EXPORT_FILE_NAME} CONTENT 0188 "#ifndef ${ARGS_INCLUDE_GUARD_NAME} 0189 #define ${ARGS_INCLUDE_GUARD_NAME} 0190 0191 ${ARGS_CODE} 0192 #endif 0193 " 0194 ) 0195 endfunction() 0196 0197 # TODO: consider renaming to okteta_add_classes 0198 macro(okteta_add_sublibrary _baseName) 0199 set(options 0200 NO_VERSIONED_INCLUDEDIR 0201 REVERSE_NAMESPACE_INCLUDEDIR 0202 BUILD_INCLUDEDIR 0203 ) 0204 set(oneValueArgs 0205 SUBDIR 0206 LIBRARY 0207 ) 0208 set(multiValueArgs 0209 NAMESPACE 0210 PUBLIC 0211 PRIVATE 0212 KCFG 0213 UI 0214 QRC 0215 ) 0216 cmake_parse_arguments(OKTETA_ADD_SUBLIBRARY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0217 0218 _okteta_target_name(_targetName ${_baseName} ${OKTETA_ADD_SUBLIBRARY_NAMESPACE}) 0219 0220 string(CONCAT _namespaceConcat ${OKTETA_ADD_SUBLIBRARY_NAMESPACE}) 0221 string(TOLOWER "${_namespaceConcat}${_baseName}" _libname) 0222 if (OKTETA_ADD_SUBLIBRARY_LIBRARY) 0223 set(_library_target ${OKTETA_ADD_SUBLIBRARY_LIBRARY}) 0224 else() 0225 set(_library_target ${_targetName}) 0226 endif() 0227 if (OKTETA_ADD_SUBLIBRARY_SUBDIR) 0228 set(_relativePath "${OKTETA_ADD_SUBLIBRARY_SUBDIR}/") 0229 set(_egh_relative_param RELATIVE ${OKTETA_ADD_SUBLIBRARY_SUBDIR}) 0230 else() 0231 set(_relativePath) 0232 set(_egh_relative_param) 0233 endif() 0234 set(_srcs ) 0235 0236 foreach(_classname ${OKTETA_ADD_SUBLIBRARY_PUBLIC} ${OKTETA_ADD_SUBLIBRARY_PRIVATE}) 0237 string(TOLOWER "${_classname}" _lc_classname) 0238 0239 set(_source "${_relativePath}${_lc_classname}.cpp") 0240 set(_actualsource "${CMAKE_CURRENT_SOURCE_DIR}/${_source}") 0241 if (EXISTS ${_actualsource}) 0242 list(APPEND _srcs "${_source}") 0243 endif() 0244 0245 set(_source "${_relativePath}${_lc_classname}_p.cpp") 0246 set(_actualsource "${CMAKE_CURRENT_SOURCE_DIR}/${_source}") 0247 if (EXISTS ${_actualsource}) 0248 list(APPEND _srcs "${_source}") 0249 endif() 0250 endforeach() 0251 0252 foreach(_kcfg ${OKTETA_ADD_SUBLIBRARY_KCFG}) 0253 kconfig_add_kcfg_files(${_library_target} "${_relativePath}${_kcfg}") 0254 endforeach() 0255 0256 foreach(_ui ${OKTETA_ADD_SUBLIBRARY_UI}) 0257 ki18n_wrap_ui(${_library_target} "${_relativePath}${_ui}") 0258 endforeach() 0259 0260 foreach(_qrc ${OKTETA_ADD_SUBLIBRARY_QRC}) 0261 qt5_add_resources(_srcs "${_relativePath}${_qrc}") 0262 endforeach() 0263 0264 target_sources(${_library_target} PRIVATE ${_srcs}) 0265 if (OKTETA_ADD_SUBLIBRARY_PUBLIC) 0266 set(_cc_include_dir ${OKTETA_ADD_SUBLIBRARY_NAMESPACE}) 0267 if (OKTETA_ADD_SUBLIBRARY_REVERSE_NAMESPACE_INCLUDEDIR) 0268 list(REVERSE _cc_include_dir) 0269 endif() 0270 string(REPLACE ";" "/" _cc_include_dir "${_cc_include_dir}") 0271 0272 ecm_generate_headers(_cchdrs 0273 HEADER_NAMES 0274 ${OKTETA_ADD_SUBLIBRARY_PUBLIC} 0275 ${_egh_relative_param} 0276 HEADER_EXTENSION hpp 0277 PREFIX ${_cc_include_dir} 0278 REQUIRED_HEADERS _hdrs 0279 ) 0280 endif() 0281 0282 if (OKTETA_ADD_SUBLIBRARY_BUILD_INCLUDEDIR) 0283 target_include_directories( ${_library_target} 0284 PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${_relativePath}> 0285 ) 0286 endif() 0287 0288 # install 0289 get_property(_include_install_dir TARGET ${_targetName} PROPERTY OKTETA_INSTALL_INCLUDEDIR) 0290 if (_include_install_dir) 0291 get_property(_include_dir TARGET ${_targetName} PROPERTY OKTETA_INSTALL_NORMAL_HEADERS_SUBDIR) 0292 get_property(_cc_include_dir TARGET ${_targetName} PROPERTY OKTETA_INSTALL_CAMELCASE_HEADERS_SUBDIR) 0293 install( FILES ${_hdrs} 0294 DESTINATION "${_include_install_dir}/${_include_dir}" 0295 COMPONENT Devel 0296 ) 0297 install( FILES ${_cchdrs} 0298 DESTINATION "${_include_install_dir}/${_cc_include_dir}" 0299 COMPONENT Devel 0300 ) 0301 endif() 0302 endmacro() 0303 0304 0305 function(okteta_add_library _baseName) 0306 set(options 0307 NO_TARGET_NAMESPACE 0308 NO_VERSIONED_INCLUDEDIR 0309 NO_VERSIONED_PACKAGE_NAME 0310 NO_VERSIONED_EXPORTED_TARGET_NAME 0311 NO_PACKAGE_NAMESPACED_INCLUDEDIR 0312 REVERSE_NAMESPACE_LIB 0313 REVERSE_NAMESPACE_INCLUDEDIR 0314 LOWERCASE_LIB 0315 NAMELINK_SKIP 0316 ) 0317 set(oneValueArgs 0318 INTERNAL_BASENAME 0319 INCLUDEDIR_PACKAGE_NAMESPACE 0320 VERSION 0321 SOVERSION 0322 ) 0323 set(multiValueArgs 0324 NAMESPACE 0325 ABIVERSION 0326 PUBLIC 0327 PRIVATE 0328 ) 0329 cmake_parse_arguments(OKTETA_ADD_LIBRARY "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0330 0331 if (NOT OKTETA_ADD_LIBRARY_NO_VERSIONED_PACKAGE_NAME) 0332 set(_use_versioned_package_name TRUE) 0333 endif() 0334 if (NOT OKTETA_ADD_LIBRARY_INTERNAL_BASENAME) 0335 set(OKTETA_ADD_LIBRARY_INTERNAL_BASENAME ${_baseName}) 0336 endif() 0337 0338 _okteta_setup_namespace( 0339 NAMESPACEPREFIX_VAR _namespacePrefix 0340 VERSIONEDNAMESPACEPREFIX_VAR _versionedNamespacePrefix 0341 VERSIONEDNAMESPACE_VAR _versioned_namespace 0342 BASE_NAME ${_baseName} 0343 NAMESPACE ${OKTETA_ADD_LIBRARY_NAMESPACE} 0344 ABIVERSION ${OKTETA_ADD_LIBRARY_ABIVERSION} 0345 ) 0346 0347 set(_fullName "${_namespacePrefix}${_baseName}") 0348 set(_fullInternalName "${_namespacePrefix}${OKTETA_ADD_LIBRARY_INTERNAL_BASENAME}") 0349 set(_fullVersionedName "${_versionedNamespacePrefix}${_baseName}") 0350 0351 set(_targets_export_name "${_fullName}Targets") 0352 0353 set(_libraryName ${_versioned_namespace}) 0354 if (OKTETA_ADD_LIBRARY_REVERSE_NAMESPACE_LIB) 0355 list(REVERSE _libraryName) 0356 endif() 0357 string(CONCAT _libraryName ${_libraryName} ${_baseName}) 0358 if (OKTETA_ADD_LIBRARY_LOWERCASE_LIB) 0359 string(TOLOWER ${_libraryName} _libraryName) 0360 endif() 0361 0362 set(_targetName ${_fullName}) 0363 string(TOLOWER ${_fullInternalName} _lc_fullInternalName) 0364 if (OKTETA_ADD_LIBRARY_NO_VERSIONED_INCLUDEDIR) 0365 set(_cc_include_dir ${OKTETA_ADD_LIBRARY_NAMESPACE}) 0366 else() 0367 set(_cc_include_dir ${_versioned_namespace}) 0368 endif() 0369 if (OKTETA_ADD_LIBRARY_REVERSE_NAMESPACE_INCLUDEDIR) 0370 list(REVERSE _cc_include_dir) 0371 endif() 0372 string(REPLACE ";" "/" _cc_include_dir "${_cc_include_dir}") 0373 string(TOLOWER ${_cc_include_dir} _include_dir) 0374 0375 add_library(${_targetName} SHARED) 0376 0377 if (OKTETA_ADD_LIBRARY_NO_TARGET_NAMESPACE) 0378 if (OKTETA_ADD_LIBRARY_NO_VERSIONED_EXPORTED_TARGET_NAME) 0379 set(_export_name_args) 0380 else() 0381 add_library("${_fullVersionedName}" ALIAS ${_targetName}) 0382 set(_export_name_args EXPORT_NAME ${_fullVersionedName}) 0383 endif() 0384 else() 0385 if (OKTETA_ADD_LIBRARY_NO_VERSIONED_EXPORTED_TARGET_NAME) 0386 set(_target_namespacePrefix ${_namespacePrefix}) 0387 else() 0388 set(_target_namespacePrefix ${_versionedNamespacePrefix}) 0389 endif() 0390 add_library("${_target_namespacePrefix}::${_baseName}" ALIAS ${_targetName}) 0391 set(_export_name_args EXPORT_NAME ${_baseName}) 0392 endif() 0393 0394 # generate header file with export & version macros 0395 string(TOUPPER "${_fullInternalName}" _definitions_prefix) 0396 _okteta_generate_version_code( 0397 PREFIX ${_definitions_prefix} 0398 VERSION ${OKTETA_ADD_LIBRARY_VERSION} 0399 CODE_VARIABLE _version_code 0400 ) 0401 _okteta_generate_export_code( 0402 TARGET_NAME ${_targetName} 0403 PREFIX ${_definitions_prefix} 0404 CODE_VARIABLE _export_code 0405 ) 0406 0407 set(_exportHeaderFileName ${_lc_fullInternalName}_export.hpp) 0408 set(_exportHeaderFilePath ${CMAKE_CURRENT_BINARY_DIR}/${_exportHeaderFileName}) 0409 string(TOUPPER ${_exportHeaderFileName} _include_guard_name) 0410 string(MAKE_C_IDENTIFIER ${_include_guard_name} _include_guard_name) 0411 0412 _okteta_generate_header_file( 0413 CODE "${_version_code}\n${_export_code}" 0414 INCLUDE_GUARD_NAME ${_include_guard_name} 0415 EXPORT_FILE_NAME ${_exportHeaderFilePath} 0416 ) 0417 0418 # Local forwarding header 0419 set(_forwardexportHeaderFilePath ${CMAKE_CURRENT_BINARY_DIR}/${_include_dir}/${_exportHeaderFileName}) 0420 if (NOT EXISTS ${_forwardexportHeaderFilePath}) 0421 file(WRITE ${_forwardexportHeaderFilePath} "#include \"${_exportHeaderFilePath}\"\n") 0422 endif() 0423 0424 target_link_libraries(${_targetName} 0425 PUBLIC 0426 ${OKTETA_ADD_LIBRARY_PUBLIC} 0427 PRIVATE 0428 ${OKTETA_ADD_LIBRARY_PRIVATE} 0429 ) 0430 0431 target_include_directories(${_targetName} 0432 PUBLIC "$<BUILD_INTERFACE:${${_targetName}_BINARY_DIR};${CMAKE_CURRENT_BINARY_DIR}>" 0433 ) 0434 0435 set_target_properties(${_targetName} PROPERTIES 0436 ${_export_name_args} 0437 OUTPUT_NAME ${_libraryName} 0438 VERSION ${OKTETA_ADD_LIBRARY_VERSION} 0439 SOVERSION ${OKTETA_ADD_LIBRARY_SOVERSION} 0440 ) 0441 set_property(TARGET ${_targetName} PROPERTY OKTETA_FULLNAME ${_fullName}) 0442 set_property(TARGET ${_targetName} PROPERTY OKTETA_FULLVERSIONEDNAME ${_fullVersionedName}) 0443 set_property(TARGET ${_targetName} PROPERTY OKTETA_NO_TARGETNAMESPACE ${OKTETA_ADD_LIBRARY_NO_TARGET_NAMESPACE}) 0444 if (NOT OKTETA_ADD_LIBRARY_NO_TARGET_NAMESPACE) 0445 set_property(TARGET ${_targetName} PROPERTY OKTETA_TARGET_NAMESPACEPREFIX ${_target_namespacePrefix}) 0446 endif() 0447 set_property(TARGET ${_targetName} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME ${_use_versioned_package_name}) 0448 0449 set(_other_install_targets_args) 0450 if(OKTETA_ADD_LIBRARY_NAMELINK_SKIP) 0451 list(APPEND _other_install_targets_args LIBRARY NAMELINK_SKIP) 0452 endif() 0453 install( TARGETS ${_targetName} 0454 EXPORT ${_targets_export_name} 0455 ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} 0456 ${_other_install_targets_args} 0457 ) 0458 0459 # TODO: perhaps only do on first PUBLIC usage in okteta_add_sublibrary? 0460 if (OKTETA_ADD_LIBRARY_NO_PACKAGE_NAMESPACED_INCLUDEDIR) 0461 set(_include_install_dir "${KDE_INSTALL_INCLUDEDIR}") 0462 else() 0463 if (OKTETA_ADD_LIBRARY_INCLUDEDIR_PACKAGE_NAMESPACE) 0464 set(_include_dir_package_namespace "${OKTETA_ADD_LIBRARY_INCLUDEDIR_PACKAGE_NAMESPACE}") 0465 else() 0466 if (_use_versioned_package_name) 0467 set(_include_dir_package_namespace "${_fullVersionedName}") 0468 else() 0469 set(_include_dir_package_namespace "${_fullName}") 0470 endif() 0471 endif() 0472 set(_include_install_dir "${KDE_INSTALL_INCLUDEDIR}/${_include_dir_package_namespace}") 0473 endif() 0474 set_property(TARGET ${_targetName} PROPERTY OKTETA_INSTALL_INCLUDEDIR ${_include_install_dir}) 0475 set_property(TARGET ${_targetName} PROPERTY OKTETA_INSTALL_NORMAL_HEADERS_SUBDIR ${_include_dir}) 0476 set_property(TARGET ${_targetName} PROPERTY OKTETA_INSTALL_CAMELCASE_HEADERS_SUBDIR ${_cc_include_dir}) 0477 target_include_directories(${_targetName} 0478 INTERFACE "$<INSTALL_INTERFACE:${_include_install_dir}>" 0479 ) 0480 install( FILES ${_exportHeaderFilePath} 0481 DESTINATION "${_include_install_dir}/${_include_dir}" 0482 COMPONENT Devel 0483 ) 0484 endfunction() 0485 0486 0487 function(okteta_add_cmakeconfig _baseName) 0488 set(options 0489 ) 0490 set(oneValueArgs 0491 COMPATIBILITY 0492 ) 0493 set(multiValueArgs 0494 INCLUDES 0495 NAMESPACE 0496 DEPS 0497 VARS 0498 ) 0499 cmake_parse_arguments(OKTETA_ADD_CMAKECONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0500 0501 _okteta_target_name(_targetName ${_baseName} ${OKTETA_ADD_CMAKECONFIG_NAMESPACE}) 0502 0503 get_property(_fullName TARGET ${_targetName} PROPERTY OKTETA_FULLNAME) 0504 0505 get_property(_use_versioned_package_name TARGET ${_targetName} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME) 0506 if (_use_versioned_package_name) 0507 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLVERSIONEDNAME) 0508 else() 0509 set(_configName ${_fullName}) 0510 endif() 0511 0512 set(_configFileTemplatePath "${CMAKE_CURRENT_BINARY_DIR}/${_configName}Config.cmake.in") 0513 set(_configFileTemplate "@PACKAGE_INIT@\n\ninclude(CMakeFindDependencyMacro)\n\n") 0514 set(dep_package_name) 0515 foreach (dep ${OKTETA_ADD_CMAKECONFIG_DEPS}) 0516 if (dep_package_name) 0517 set (dep_package_version ${dep}) 0518 else() 0519 set(_dep_fullName) 0520 if (TARGET ${dep}) 0521 get_property(_dep_fullName TARGET ${dep} PROPERTY OKTETA_FULLNAME) 0522 endif() 0523 if (_dep_fullName) 0524 get_property(_use_versioned_package_name TARGET ${dep} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME) 0525 if (_use_versioned_package_name) 0526 get_property(dep_package_name TARGET ${dep} PROPERTY OKTETA_FULLVERSIONEDNAME) 0527 else() 0528 set(dep_package_name ${_dep_fullName}) 0529 endif() 0530 0531 get_property(dep_package_version TARGET ${dep} PROPERTY VERSION) 0532 else() 0533 set(dep_package_name ${dep}) 0534 set(dep_package_version) 0535 endif() 0536 endif() 0537 if (dep_package_version) 0538 string(APPEND _configFileTemplate "find_dependency(${dep_package_name} ${dep_package_version})\n") 0539 set(dep_package_name) 0540 endif() 0541 endforeach() 0542 if (dep_package_name) 0543 message(FATAL_ERROR "DEPS expected to have a version after ${dep_package_name}.") 0544 endif() 0545 string(APPEND _configFileTemplate "\ninclude(\"\${CMAKE_CURRENT_LIST_DIR}/${_configName}Targets.cmake\")\n") 0546 foreach (_include ${OKTETA_ADD_CMAKECONFIG_INCLUDES}) 0547 string(APPEND _configFileTemplate "include(\"\${CMAKE_CURRENT_LIST_DIR}/${_include}\")\n") 0548 endforeach() 0549 if (OKTETA_ADD_CMAKECONFIG_VARS) 0550 string(APPEND _configFileTemplate "\n") 0551 foreach (_var ${OKTETA_ADD_CMAKECONFIG_VARS}) 0552 string(APPEND _configFileTemplate "@${_var}@\n") 0553 endforeach() 0554 endif() 0555 file(WRITE ${_configFileTemplatePath} "${_configFileTemplate}") 0556 0557 set(_targets_export_name "${_fullName}Targets") 0558 0559 # create a Config.cmake and a ConfigVersion.cmake file and install them 0560 set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/${_configName}") 0561 0562 get_target_property(_version ${_targetName} VERSION) 0563 if (_version) 0564 set(_configVersionFilePath "${CMAKE_CURRENT_BINARY_DIR}/${_configName}ConfigVersion.cmake") 0565 if(NOT OKTETA_ADD_CMAKECONFIG_COMPATIBILITY) 0566 set(OKTETA_ADD_CMAKECONFIG_COMPATIBILITY AnyNewerVersion) 0567 endif() 0568 write_basic_package_version_file("${_configVersionFilePath}" 0569 VERSION ${_version} 0570 COMPATIBILITY ${OKTETA_ADD_CMAKECONFIG_COMPATIBILITY} 0571 ) 0572 else() 0573 set(_configVersionFilePath) 0574 endif() 0575 0576 set(_configFilePath "${CMAKE_CURRENT_BINARY_DIR}/${_configName}Config.cmake") 0577 configure_package_config_file( 0578 "${_configFileTemplatePath}" 0579 "${_configFilePath}" 0580 INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} 0581 ) 0582 0583 install( FILES 0584 "${_configFilePath}" 0585 "${_configVersionFilePath}" 0586 DESTINATION "${CMAKECONFIG_INSTALL_DIR}" 0587 COMPONENT Devel 0588 ) 0589 get_property(_no_target_namespace TARGET ${_targetName} PROPERTY OKTETA_NO_TARGETNAMESPACE) 0590 if(NOT _no_target_namespace) 0591 get_property(_namespacePrefix TARGET ${_targetName} PROPERTY OKTETA_TARGET_NAMESPACEPREFIX) 0592 set(_namespace_args NAMESPACE "${_namespacePrefix}::") 0593 endif() 0594 install(EXPORT ${_targets_export_name} 0595 FILE "${_configName}Targets.cmake" 0596 ${_namespace_args} 0597 DESTINATION "${CMAKECONFIG_INSTALL_DIR}" 0598 COMPONENT Devel 0599 ) 0600 endfunction() 0601 0602 0603 function(okteta_add_qmakeconfig _baseName) 0604 set(options 0605 ) 0606 set(oneValueArgs 0607 ) 0608 set(multiValueArgs 0609 NAMESPACE 0610 DEPS 0611 ) 0612 cmake_parse_arguments(OKTETA_ADD_QMAKECONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0613 0614 _okteta_target_name(_targetName ${_baseName} ${OKTETA_ADD_QMAKECONFIG_NAMESPACE}) 0615 0616 get_target_property(_libraryName ${_targetName} OUTPUT_NAME) 0617 get_property(_include_install_dir TARGET ${_targetName} PROPERTY OKTETA_INSTALL_INCLUDEDIR) 0618 get_property(_fullName TARGET ${_targetName} PROPERTY OKTETA_FULLNAME) 0619 get_property(_use_versioned_package_name TARGET ${_targetName} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME) 0620 if (_use_versioned_package_name) 0621 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLVERSIONEDNAME) 0622 else() 0623 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLNAME) 0624 endif() 0625 0626 string(REPLACE ";" " " _deps "${OKTETA_ADD_QMAKECONFIG_DEPS}") 0627 0628 get_target_property(_version ${_targetName} VERSION) 0629 0630 ecm_generate_pri_file( 0631 BASE_NAME ${_configName} 0632 LIB_NAME ${_libraryName} 0633 DEPS ${_deps} 0634 VERSION ${_version} 0635 FILENAME_VAR _pri_filename 0636 INCLUDE_INSTALL_DIR ${_include_install_dir} 0637 ) 0638 install(FILES ${_pri_filename} 0639 DESTINATION ${ECM_MKSPECS_INSTALL_DIR} 0640 COMPONENT Devel 0641 ) 0642 endfunction() 0643 0644 function(okteta_add_pkgconfig _baseName) 0645 set(options 0646 ) 0647 set(oneValueArgs 0648 DESCRIPTION 0649 ) 0650 set(multiValueArgs 0651 NAMESPACE 0652 DEPS 0653 ) 0654 cmake_parse_arguments(OKTETA_ADD_PKGCONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0655 0656 _okteta_target_name(_targetName ${_baseName} ${OKTETA_ADD_PKGCONFIG_NAMESPACE}) 0657 0658 get_target_property(_libraryName ${_targetName} OUTPUT_NAME) 0659 get_property(_include_install_dir TARGET ${_targetName} PROPERTY OKTETA_INSTALL_INCLUDEDIR) 0660 get_property(_use_versioned_package_name TARGET ${_targetName} PROPERTY OKTETA_USE_VERSIONED_PACKAGE_NAME) 0661 if (_use_versioned_package_name) 0662 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLVERSIONEDNAME) 0663 else() 0664 get_property(_configName TARGET ${_targetName} PROPERTY OKTETA_FULLNAME) 0665 endif() 0666 0667 string(REPLACE ";" " " _deps "${OKTETA_ADD_PKGCONFIG_DEPS}") 0668 0669 get_target_property(PROJECT_VERSION ${_targetName} VERSION) 0670 ecm_generate_pkgconfig_file( 0671 BASE_NAME ${_configName} 0672 LIB_NAME ${_libraryName} 0673 DEPS ${_deps} 0674 INCLUDE_INSTALL_DIR ${_include_install_dir} 0675 DESCRIPTION ${OKTETA_ADD_PKGCONFIG_DESCRIPTION} 0676 INSTALL 0677 ) 0678 endfunction()