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()