1 include(FindPackageMessage)
3 # Find a library component, set the variables and create an imported target.
4 # Variable names are compliant with cmake standards.
5 function(find_component LIB COMPONENT)
6 cmake_parse_arguments(ARG
9 "HINTS;INCLUDE_DIRS;INTERFACE_LINK_LIBRARIES;NAMES;PATHS;PATH_SUFFIXES"
13 # If the component is not requested, skip the search.
14 if(${LIB}_FIND_COMPONENTS AND NOT ${COMPONENT} IN_LIST ${LIB}_FIND_COMPONENTS)
18 find_library(${LIB}_${COMPONENT}_LIBRARY
22 PATH_SUFFIXES "lib" ${ARG_PATH_SUFFIXES}
24 mark_as_advanced(${LIB}_${COMPONENT}_LIBRARY)
26 if(${LIB}_${COMPONENT}_LIBRARY)
27 # On success, set the standard FOUND variable...
28 set(${LIB}_${COMPONENT}_FOUND TRUE PARENT_SCOPE)
30 # ... and append the library path to the LIBRARIES variable ...
31 list(APPEND ${LIB}_LIBRARIES
32 "${${LIB}_${COMPONENT}_LIBRARY}"
33 ${ARG_INTERFACE_LINK_LIBRARIES}
35 list(REMOVE_DUPLICATES ${LIB}_LIBRARIES)
36 set(${LIB}_LIBRARIES ${${LIB}_LIBRARIES} PARENT_SCOPE)
38 # ... and create an imported target for the component, if not already
40 if(NOT TARGET ${LIB}::${COMPONENT})
41 add_library(${LIB}::${COMPONENT} UNKNOWN IMPORTED)
42 set_target_properties(${LIB}::${COMPONENT} PROPERTIES
43 IMPORTED_LOCATION "${${LIB}_${COMPONENT}_LIBRARY}"
45 set_property(TARGET ${LIB}::${COMPONENT} PROPERTY
46 INTERFACE_INCLUDE_DIRECTORIES ${ARG_INCLUDE_DIRS}
48 set_property(TARGET ${LIB}::${COMPONENT} PROPERTY
49 INTERFACE_LINK_LIBRARIES ${ARG_INTERFACE_LINK_LIBRARIES}
53 find_package_message("${LIB}_${COMPONENT}"
54 "Found ${LIB} component ${COMPONENT}: ${${LIB}_${COMPONENT}_LIBRARY}"
55 "[${${LIB}_${COMPONENT}_LIBRARY}][${ARG_INCLUDE_DIRS}]"