Warning, /frameworks/extra-cmake-modules/modules/ECMFindModuleHelpers.cmake is written in an unsupported language. File is not indexed.
0001 # SPDX-FileCopyrightText: 2014 Alex Merry <alex.merry@kde.org> 0002 # 0003 # SPDX-License-Identifier: BSD-3-Clause 0004 0005 #[=======================================================================[.rst: 0006 ECMFindModuleHelpers 0007 -------------------- 0008 0009 Helper macros for find modules: ``ecm_find_package_version_check()``, 0010 ``ecm_find_package_parse_components()`` and 0011 ``ecm_find_package_handle_library_components()``. 0012 0013 :: 0014 0015 ecm_find_package_version_check(<name>) 0016 0017 Prints warnings if the CMake version or the project's required CMake version 0018 is older than that required by extra-cmake-modules. 0019 0020 :: 0021 0022 ecm_find_package_parse_components(<name> 0023 RESULT_VAR <variable> 0024 KNOWN_COMPONENTS <component1> [<component2> [...]] 0025 [SKIP_DEPENDENCY_HANDLING]) 0026 0027 This macro will populate <variable> with a list of components found in 0028 <name>_FIND_COMPONENTS, after checking that all those components are in the 0029 list of ``KNOWN_COMPONENTS``; if there are any unknown components, it will print 0030 an error or warning (depending on the value of <name>_FIND_REQUIRED) and call 0031 ``return()``. 0032 0033 The order of components in <variable> is guaranteed to match the order they 0034 are listed in the ``KNOWN_COMPONENTS`` argument. 0035 0036 If ``SKIP_DEPENDENCY_HANDLING`` is not set, for each component the variable 0037 <name>_<component>_component_deps will be checked for dependent components. 0038 If <component> is listed in <name>_FIND_COMPONENTS, then all its (transitive) 0039 dependencies will also be added to <variable>. 0040 0041 :: 0042 0043 ecm_find_package_handle_library_components(<name> 0044 COMPONENTS <component> [<component> [...]] 0045 [SKIP_DEPENDENCY_HANDLING]) 0046 [SKIP_PKG_CONFIG]) 0047 0048 Creates an imported library target for each component. The operation of this 0049 macro depends on the presence of a number of CMake variables. 0050 0051 The <name>_<component>_lib variable should contain the name of this library, 0052 and <name>_<component>_header variable should contain the name of a header 0053 file associated with it (whatever relative path is normally passed to 0054 '#include'). <name>_<component>_header_subdir variable can be used to specify 0055 which subdirectory of the include path the headers will be found in. 0056 ``ecm_find_package_components()`` will then search for the library 0057 and include directory (creating appropriate cache variables) and create an 0058 imported library target named <name>::<component>. 0059 0060 Additional variables can be used to provide additional information: 0061 0062 If ``SKIP_PKG_CONFIG``, the <name>_<component>_pkg_config variable is set, and 0063 pkg-config is found, the pkg-config module given by 0064 <name>_<component>_pkg_config will be searched for and used to help locate the 0065 library and header file. It will also be used to set 0066 <name>_<component>_VERSION. 0067 0068 Note that if version information is found via pkg-config, 0069 <name>_<component>_FIND_VERSION can be set to require a particular version 0070 for each component. 0071 0072 If ``SKIP_DEPENDENCY_HANDLING`` is not set, the ``INTERFACE_LINK_LIBRARIES`` property 0073 of the imported target for <component> will be set to contain the imported 0074 targets for the components listed in <name>_<component>_component_deps. 0075 <component>_FOUND will also be set to ``FALSE`` if any of the components in 0076 <name>_<component>_component_deps are not found. This requires the components 0077 in <name>_<component>_component_deps to be listed before <component> in the 0078 ``COMPONENTS`` argument. 0079 0080 The following variables will be set: 0081 0082 ``<name>_TARGETS`` 0083 the imported targets 0084 ``<name>_LIBRARIES`` 0085 the found libraries 0086 ``<name>_INCLUDE_DIRS`` 0087 the combined required include directories for the components 0088 ``<name>_DEFINITIONS`` 0089 the "other" CFLAGS provided by pkg-config, if any 0090 ``<name>_VERSION`` 0091 the value of ``<name>_<component>_VERSION`` for the first component that 0092 has this variable set (note that components are searched for in the order 0093 they are passed to the macro), although if it is already set, it will not 0094 be altered 0095 0096 .. note:: 0097 These variables are never cleared, so if 0098 ``ecm_find_package_handle_library_components()`` is called multiple times with 0099 different components (typically because of multiple ``find_package()`` calls) then 0100 ``<name>_TARGETS``, for example, will contain all the targets found in any 0101 call (although no duplicates). 0102 0103 Since pre-1.0.0. 0104 #]=======================================================================] 0105 0106 macro(ecm_find_package_version_check module_name) 0107 if(CMAKE_VERSION VERSION_LESS 3.16.0) 0108 message(FATAL_ERROR "CMake 3.16.0 is required by Find${module_name}.cmake") 0109 endif() 0110 if(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 3.16.0) 0111 message(AUTHOR_WARNING "Your project should require at least CMake 3.16.0 to use Find${module_name}.cmake") 0112 endif() 0113 endmacro() 0114 0115 macro(ecm_find_package_parse_components module_name) 0116 set(ecm_fppc_options SKIP_DEPENDENCY_HANDLING) 0117 set(ecm_fppc_oneValueArgs RESULT_VAR) 0118 set(ecm_fppc_multiValueArgs KNOWN_COMPONENTS DEFAULT_COMPONENTS) 0119 cmake_parse_arguments(ECM_FPPC "${ecm_fppc_options}" "${ecm_fppc_oneValueArgs}" "${ecm_fppc_multiValueArgs}" ${ARGN}) 0120 0121 if(ECM_FPPC_UNPARSED_ARGUMENTS) 0122 message(FATAL_ERROR "Unexpected arguments to ecm_find_package_parse_components: ${ECM_FPPC_UNPARSED_ARGUMENTS}") 0123 endif() 0124 if(NOT ECM_FPPC_RESULT_VAR) 0125 message(FATAL_ERROR "Missing RESULT_VAR argument to ecm_find_package_parse_components") 0126 endif() 0127 if(NOT ECM_FPPC_KNOWN_COMPONENTS) 0128 message(FATAL_ERROR "Missing KNOWN_COMPONENTS argument to ecm_find_package_parse_components") 0129 endif() 0130 if(NOT ECM_FPPC_DEFAULT_COMPONENTS) 0131 set(ECM_FPPC_DEFAULT_COMPONENTS ${ECM_FPPC_KNOWN_COMPONENTS}) 0132 endif() 0133 0134 if(${module_name}_FIND_COMPONENTS) 0135 set(ecm_fppc_requestedComps ${${module_name}_FIND_COMPONENTS}) 0136 0137 if(NOT ECM_FPPC_SKIP_DEPENDENCY_HANDLING) 0138 # Make sure deps are included 0139 foreach(ecm_fppc_comp ${ecm_fppc_requestedComps}) 0140 foreach(ecm_fppc_dep_comp ${${module_name}_${ecm_fppc_comp}_component_deps}) 0141 list(FIND ecm_fppc_requestedComps "${ecm_fppc_dep_comp}" ecm_fppc_index) 0142 if("${ecm_fppc_index}" STREQUAL "-1") 0143 if(NOT ${module_name}_FIND_QUIETLY) 0144 message(STATUS "${module_name}: ${ecm_fppc_comp} requires ${${module_name}_${ecm_fppc_comp}_component_deps}") 0145 endif() 0146 list(APPEND ecm_fppc_requestedComps "${ecm_fppc_dep_comp}") 0147 endif() 0148 endforeach() 0149 endforeach() 0150 else() 0151 message(STATUS "Skipping dependency handling for ${module_name}") 0152 endif() 0153 list(REMOVE_DUPLICATES ecm_fppc_requestedComps) 0154 0155 # This makes sure components are listed in the same order as 0156 # KNOWN_COMPONENTS (potentially important for inter-dependencies) 0157 set(${ECM_FPPC_RESULT_VAR}) 0158 foreach(ecm_fppc_comp ${ECM_FPPC_KNOWN_COMPONENTS}) 0159 list(FIND ecm_fppc_requestedComps "${ecm_fppc_comp}" ecm_fppc_index) 0160 if(NOT "${ecm_fppc_index}" STREQUAL "-1") 0161 list(APPEND ${ECM_FPPC_RESULT_VAR} "${ecm_fppc_comp}") 0162 list(REMOVE_AT ecm_fppc_requestedComps ${ecm_fppc_index}) 0163 endif() 0164 endforeach() 0165 # if there are any left, they are unknown components 0166 if(ecm_fppc_requestedComps) 0167 set(ecm_fppc_msgType STATUS) 0168 if(${module_name}_FIND_REQUIRED) 0169 set(ecm_fppc_msgType FATAL_ERROR) 0170 endif() 0171 if(NOT ${module_name}_FIND_QUIETLY) 0172 message(${ecm_fppc_msgType} "${module_name}: requested unknown components ${ecm_fppc_requestedComps}") 0173 endif() 0174 return() 0175 endif() 0176 else() 0177 set(${ECM_FPPC_RESULT_VAR} ${ECM_FPPC_DEFAULT_COMPONENTS}) 0178 endif() 0179 endmacro() 0180 0181 macro(ecm_find_package_handle_library_components module_name) 0182 set(ecm_fpwc_options SKIP_PKG_CONFIG SKIP_DEPENDENCY_HANDLING) 0183 set(ecm_fpwc_oneValueArgs) 0184 set(ecm_fpwc_multiValueArgs COMPONENTS) 0185 cmake_parse_arguments(ECM_FPWC "${ecm_fpwc_options}" "${ecm_fpwc_oneValueArgs}" "${ecm_fpwc_multiValueArgs}" ${ARGN}) 0186 0187 if(ECM_FPWC_UNPARSED_ARGUMENTS) 0188 message(FATAL_ERROR "Unexpected arguments to ecm_find_package_handle_components: ${ECM_FPWC_UNPARSED_ARGUMENTS}") 0189 endif() 0190 if(NOT ECM_FPWC_COMPONENTS) 0191 message(FATAL_ERROR "Missing COMPONENTS argument to ecm_find_package_handle_components") 0192 endif() 0193 0194 include(FindPackageHandleStandardArgs) 0195 find_package(PkgConfig QUIET) 0196 foreach(ecm_fpwc_comp ${ECM_FPWC_COMPONENTS}) 0197 set(ecm_fpwc_dep_vars) 0198 set(ecm_fpwc_dep_targets) 0199 if(NOT SKIP_DEPENDENCY_HANDLING) 0200 foreach(ecm_fpwc_dep ${${module_name}_${ecm_fpwc_comp}_component_deps}) 0201 list(APPEND ecm_fpwc_dep_vars "${module_name}_${ecm_fpwc_dep}_FOUND") 0202 list(APPEND ecm_fpwc_dep_targets "${module_name}::${ecm_fpwc_dep}") 0203 endforeach() 0204 endif() 0205 0206 if(NOT ECM_FPWC_SKIP_PKG_CONFIG AND ${module_name}_${ecm_fpwc_comp}_pkg_config) 0207 pkg_check_modules(PKG_${module_name}_${ecm_fpwc_comp} QUIET 0208 ${${module_name}_${ecm_fpwc_comp}_pkg_config}) 0209 endif() 0210 0211 find_path(${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR 0212 NAMES ${${module_name}_${ecm_fpwc_comp}_header} 0213 HINTS ${PKG_${module_name}_${ecm_fpwc_comp}_INCLUDE_DIRS} 0214 PATH_SUFFIXES ${${module_name}_${ecm_fpwc_comp}_header_subdir} 0215 ) 0216 find_library(${module_name}_${ecm_fpwc_comp}_LIBRARY 0217 NAMES ${${module_name}_${ecm_fpwc_comp}_lib} 0218 HINTS ${PKG_${module_name}_${ecm_fpwc_comp}_LIBRARY_DIRS} 0219 ) 0220 0221 set(${module_name}_${ecm_fpwc_comp}_VERSION "${PKG_${module_name}_${ecm_fpwc_comp}_VERSION}") 0222 if(NOT ${module_name}_VERSION) 0223 set(${module_name}_VERSION ${${module_name}_${ecm_fpwc_comp}_VERSION}) 0224 endif() 0225 0226 set(FPHSA_NAME_MISMATCHED 1) 0227 find_package_handle_standard_args(${module_name}_${ecm_fpwc_comp} 0228 FOUND_VAR 0229 ${module_name}_${ecm_fpwc_comp}_FOUND 0230 REQUIRED_VARS 0231 ${module_name}_${ecm_fpwc_comp}_LIBRARY 0232 ${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR 0233 ${ecm_fpwc_dep_vars} 0234 VERSION_VAR 0235 ${module_name}_${ecm_fpwc_comp}_VERSION 0236 ) 0237 unset(FPHSA_NAME_MISMATCHED) 0238 0239 mark_as_advanced( 0240 ${module_name}_${ecm_fpwc_comp}_LIBRARY 0241 ${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR 0242 ) 0243 0244 if(${module_name}_${ecm_fpwc_comp}_FOUND) 0245 list(APPEND ${module_name}_LIBRARIES 0246 "${${module_name}_${ecm_fpwc_comp}_LIBRARY}") 0247 list(APPEND ${module_name}_INCLUDE_DIRS 0248 "${${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR}") 0249 set(${module_name}_DEFINITIONS 0250 ${${module_name}_DEFINITIONS} 0251 ${PKG_${module_name}_${ecm_fpwc_comp}_DEFINITIONS}) 0252 if(NOT TARGET ${module_name}::${ecm_fpwc_comp}) 0253 add_library(${module_name}::${ecm_fpwc_comp} UNKNOWN IMPORTED) 0254 set_target_properties(${module_name}::${ecm_fpwc_comp} PROPERTIES 0255 IMPORTED_LOCATION "${${module_name}_${ecm_fpwc_comp}_LIBRARY}" 0256 INTERFACE_COMPILE_OPTIONS "${PKG_${module_name}_${ecm_fpwc_comp}_DEFINITIONS}" 0257 INTERFACE_INCLUDE_DIRECTORIES "${${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR}" 0258 INTERFACE_LINK_LIBRARIES "${ecm_fpwc_dep_targets}" 0259 ) 0260 endif() 0261 list(APPEND ${module_name}_TARGETS 0262 "${module_name}::${ecm_fpwc_comp}") 0263 endif() 0264 endforeach() 0265 if(${module_name}_LIBRARIES) 0266 list(REMOVE_DUPLICATES ${module_name}_LIBRARIES) 0267 endif() 0268 if(${module_name}_INCLUDE_DIRS) 0269 list(REMOVE_DUPLICATES ${module_name}_INCLUDE_DIRS) 0270 endif() 0271 if(${module_name}_DEFINITIONS) 0272 list(REMOVE_DUPLICATES ${module_name}_DEFINITIONS) 0273 endif() 0274 if(${module_name}_TARGETS) 0275 list(REMOVE_DUPLICATES ${module_name}_TARGETS) 0276 endif() 0277 endmacro()