222 lines
6.5 KiB
CMake
222 lines
6.5 KiB
CMake
#.rst:
|
|
# FindFLANN
|
|
# --------
|
|
#
|
|
# Try to find FLANN library and headers. This module supports both old released versions
|
|
# of FLANN ≤ 1.9.1 and newer development versions that ship with a modern config file.
|
|
#
|
|
# IMPORTED Targets
|
|
# ^^^^^^^^^^^^^^^^
|
|
#
|
|
# This module defines the :prop_tgt:`IMPORTED` targets:
|
|
#
|
|
# ``FLANN::FLANN``
|
|
# Defined if the system has FLANN.
|
|
#
|
|
# Result Variables
|
|
# ^^^^^^^^^^^^^^^^
|
|
#
|
|
# This module sets the following variables:
|
|
#
|
|
# ::
|
|
#
|
|
# FLANN_FOUND True in case FLANN is found, otherwise false
|
|
# FLANN_ROOT Path to the root of found FLANN installation
|
|
#
|
|
# Example usage
|
|
# ^^^^^^^^^^^^^
|
|
#
|
|
# ::
|
|
#
|
|
# find_package(FLANN REQUIRED)
|
|
#
|
|
# add_executable(foo foo.cc)
|
|
# target_link_libraries(foo FLANN::FLANN)
|
|
#
|
|
|
|
# Early return if FLANN target is already defined. This makes it safe to run
|
|
# this script multiple times.
|
|
if(TARGET FLANN::FLANN)
|
|
return()
|
|
endif()
|
|
|
|
# First try to locate FLANN using modern config
|
|
find_package(flann NO_MODULE ${FLANN_FIND_VERSION} QUIET)
|
|
|
|
if(flann_FOUND)
|
|
unset(flann_FOUND)
|
|
set(FLANN_FOUND ON)
|
|
|
|
# Create interface library that effectively becomes an alias for the appropriate (static/dynamic) imported FLANN target
|
|
add_library(FLANN::FLANN INTERFACE IMPORTED)
|
|
|
|
if(TARGET flann::flann_cpp_s AND TARGET flann::flann_cpp)
|
|
if(PCL_FLANN_REQUIRED_TYPE MATCHES "DONTCARE")
|
|
if(PCL_SHARED_LIBS)
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES flann::flann_cpp)
|
|
set(FLANN_LIBRARY_TYPE SHARED)
|
|
else()
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES flann::flann_cpp_s)
|
|
set(FLANN_LIBRARY_TYPE STATIC)
|
|
endif()
|
|
elseif(PCL_FLANN_REQUIRED_TYPE MATCHES "SHARED")
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES flann::flann_cpp)
|
|
set(FLANN_LIBRARY_TYPE SHARED)
|
|
else()
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES flann::flann_cpp_s)
|
|
set(FLANN_LIBRARY_TYPE STATIC)
|
|
endif()
|
|
elseif(TARGET flann::flann_cpp_s)
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES flann::flann_cpp_s)
|
|
set(FLANN_LIBRARY_TYPE STATIC)
|
|
else()
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES flann::flann_cpp)
|
|
set(FLANN_LIBRARY_TYPE SHARED)
|
|
endif()
|
|
|
|
# Determine FLANN installation root based on the path to the processed Config file
|
|
get_filename_component(_config_dir "${flann_CONFIG}" DIRECTORY)
|
|
get_filename_component(FLANN_ROOT "${_config_dir}/../../.." ABSOLUTE)
|
|
unset(_config_dir)
|
|
message(STATUS "Found flann version ${flann_VERSION}")
|
|
return()
|
|
endif()
|
|
|
|
# Second try to locate FLANN using pkgconfig
|
|
find_package(PkgConfig QUIET)
|
|
if(FLANN_FIND_VERSION)
|
|
pkg_check_modules(PC_FLANN flann>=${FLANN_FIND_VERSION})
|
|
else()
|
|
pkg_check_modules(PC_FLANN flann)
|
|
endif()
|
|
|
|
find_path(FLANN_INCLUDE_DIR
|
|
NAMES
|
|
flann/flann.hpp
|
|
HINTS
|
|
${PC_FLANN_INCLUDE_DIRS}
|
|
${FLANN_ROOT}
|
|
$ENV{FLANN_ROOT}
|
|
PATHS
|
|
$ENV{PROGRAMFILES}/Flann
|
|
$ENV{PROGRAMW6432}/Flann
|
|
PATH_SUFFIXES
|
|
include
|
|
)
|
|
|
|
find_library(FLANN_LIBRARY_SHARED
|
|
NAMES
|
|
flann_cpp
|
|
HINTS
|
|
${PC_FLANN_LIBRARY_DIRS}
|
|
${FLANN_ROOT}
|
|
$ENV{FLANN_ROOT}
|
|
PATHS
|
|
$ENV{PROGRAMFILES}/Flann
|
|
$ENV{PROGRAMW6432}/Flann
|
|
PATH_SUFFIXES
|
|
lib
|
|
)
|
|
|
|
find_library(FLANN_LIBRARY_DEBUG_SHARED
|
|
NAMES
|
|
flann_cpp-gd flann_cppd
|
|
HINTS
|
|
${PC_FLANN_LIBRARY_DIRS}
|
|
${FLANN_ROOT}
|
|
$ENV{FLANN_ROOT}
|
|
PATHS
|
|
$ENV{PROGRAMFILES}/Flann
|
|
$ENV{PROGRAMW6432}/Flann
|
|
PATH_SUFFIXES
|
|
lib
|
|
)
|
|
|
|
find_library(FLANN_LIBRARY_STATIC
|
|
NAMES
|
|
flann_cpp_s
|
|
HINTS
|
|
${PC_FLANN_LIBRARY_DIRS}
|
|
${FLANN_ROOT}
|
|
$ENV{FLANN_ROOT}
|
|
PATHS
|
|
$ENV{PROGRAMFILES}/Flann
|
|
$ENV{PROGRAMW6432}/Flann
|
|
PATH_SUFFIXES
|
|
lib
|
|
)
|
|
|
|
find_library(FLANN_LIBRARY_DEBUG_STATIC
|
|
NAMES
|
|
flann_cpp_s-gd flann_cpp_sd
|
|
HINTS
|
|
${PC_FLANN_LIBRARY_DIRS}
|
|
${FLANN_ROOT}
|
|
$ENV{FLANN_ROOT}
|
|
PATHS
|
|
$ENV{PROGRAMFILES}/Flann
|
|
$ENV{PROGRAMW6432}/Flann
|
|
PATH_SUFFIXES
|
|
lib
|
|
)
|
|
|
|
if(FLANN_LIBRARY_SHARED AND FLANN_LIBRARY_STATIC)
|
|
if(PCL_FLANN_REQUIRED_TYPE MATCHES "DONTCARE")
|
|
if(PCL_SHARED_LIBS)
|
|
set(FLANN_LIBRARY_TYPE SHARED)
|
|
set(FLANN_LIBRARY ${FLANN_LIBRARY_SHARED})
|
|
else()
|
|
set(FLANN_LIBRARY_TYPE STATIC)
|
|
set(FLANN_LIBRARY ${FLANN_LIBRARY_STATIC})
|
|
endif()
|
|
elseif(PCL_FLANN_REQUIRED_TYPE MATCHES "SHARED")
|
|
set(FLANN_LIBRARY_TYPE SHARED)
|
|
set(FLANN_LIBRARY ${FLANN_LIBRARY_SHARED})
|
|
else()
|
|
set(FLANN_LIBRARY_TYPE STATIC)
|
|
set(FLANN_LIBRARY ${FLANN_LIBRARY_STATIC})
|
|
endif()
|
|
elseif(FLANN_LIBRARY_STATIC)
|
|
set(FLANN_LIBRARY_TYPE STATIC)
|
|
set(FLANN_LIBRARY ${FLANN_LIBRARY_STATIC})
|
|
elseif(FLANN_LIBRARY_SHARED)
|
|
set(FLANN_LIBRARY_TYPE SHARED)
|
|
set(FLANN_LIBRARY ${FLANN_LIBRARY_SHARED})
|
|
endif()
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(
|
|
FLANN DEFAULT_MSG
|
|
FLANN_LIBRARY FLANN_INCLUDE_DIR
|
|
)
|
|
|
|
if(FLANN_FOUND)
|
|
add_library(FLANN::FLANN ${FLANN_LIBRARY_TYPE} IMPORTED)
|
|
set_target_properties(FLANN::FLANN PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FLANN_INCLUDE_DIR}")
|
|
set_target_properties(FLANN::FLANN PROPERTIES INTERFACE_COMPILE_DEFINITIONS "${PC_FLANN_CFLAGS_OTHER}")
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY IMPORTED_CONFIGURATIONS "RELEASE")
|
|
set_target_properties(FLANN::FLANN PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX")
|
|
if(WIN32 AND (NOT FLANN_LIBRARY_TYPE MATCHES "STATIC"))
|
|
set_target_properties(FLANN::FLANN PROPERTIES IMPORTED_IMPLIB_RELEASE "${FLANN_LIBRARY}")
|
|
else()
|
|
set_target_properties(FLANN::FLANN PROPERTIES IMPORTED_LOCATION_RELEASE "${FLANN_LIBRARY}")
|
|
endif()
|
|
if(FLANN_LIBRARY_DEBUG)
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY IMPORTED_CONFIGURATIONS "DEBUG")
|
|
set_target_properties(FLANN::FLANN PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX")
|
|
if(WIN32 AND (NOT FLANN_LIBRARY_TYPE MATCHES "STATIC"))
|
|
set_target_properties(FLANN::FLANN PROPERTIES IMPORTED_IMPLIB_DEBUG "${FLANN_LIBRARY_DEBUG}")
|
|
else()
|
|
set_target_properties(FLANN::FLANN PROPERTIES IMPORTED_LOCATION_DEBUG "${FLANN_LIBRARY_DEBUG}")
|
|
endif()
|
|
endif()
|
|
# Pkgconfig may specify additional link libraries besides from FLANN itself
|
|
# in PC_FLANN_LIBRARIES, add them to the target link interface.
|
|
foreach(_library ${PC_FLANN_LIBRARIES})
|
|
if(NOT _library MATCHES "flann")
|
|
set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${_library}")
|
|
endif()
|
|
endforeach()
|
|
get_filename_component(FLANN_ROOT "${FLANN_INCLUDE_DIR}" PATH)
|
|
endif()
|