File: FindFLANN.cmake

package info (click to toggle)
pcl 1.15.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 143,128 kB
  • sloc: cpp: 520,234; xml: 28,792; ansic: 8,212; python: 334; lisp: 93; sh: 49; makefile: 30
file content (221 lines) | stat: -rw-r--r-- 6,458 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#.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)
  set(FLANN_FOUND ON)
  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)

  if(TARGET flann::flann_cpp_s AND TARGET flann::flann_cpp)
    if(PCL_FLANN_REQUIRED_TYPE MATCHES "SHARED")
      set(FLANN_LIBRARY_TYPE SHARED)
    elseif(PCL_FLANN_REQUIRED_TYPE MATCHES "STATIC")
      set(FLANN_LIBRARY_TYPE STATIC)
    else()
      if(PCL_SHARED_LIBS)
        set(FLANN_LIBRARY_TYPE SHARED)
      else()
        set(FLANN_LIBRARY_TYPE STATIC)
      endif()
    endif()
  elseif(TARGET flann::flann_cpp_s)
    set(FLANN_LIBRARY_TYPE STATIC)
  else()
    set(FLANN_LIBRARY_TYPE SHARED)
  endif()

  if(CMAKE_VERSION VERSION_LESS 3.18.0)
    # Create interface library that effectively becomes an alias for the appropriate (static/dynamic) imported FLANN target
    add_library(FLANN::FLANN INTERFACE IMPORTED)

    if(FLANN_LIBRARY_TYPE MATCHES SHARED)
      set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES flann::flann_cpp)
    else()
      set_property(TARGET FLANN::FLANN APPEND PROPERTY INTERFACE_LINK_LIBRARIES flann::flann_cpp_s)
    endif()
  else()
    if(FLANN_LIBRARY_TYPE MATCHES SHARED)
      add_library(FLANN::FLANN ALIAS flann::flann_cpp)
    else()
      add_library(FLANN::FLANN ALIAS flann::flann_cpp_s)
    endif()
  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}
  PATHS
    $ENV{PROGRAMFILES}/Flann
    $ENV{PROGRAMW6432}/Flann
  PATH_SUFFIXES
    include
)

find_library(FLANN_LIBRARY_SHARED
  NAMES
    flann_cpp
  HINTS
    ${PC_FLANN_LIBRARY_DIRS}
  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}
  PATHS
    $ENV{PROGRAMFILES}/Flann
    $ENV{PROGRAMW6432}/Flann
  PATH_SUFFIXES
    lib
)

find_library(FLANN_LIBRARY_STATIC
  NAMES
    flann_cpp_s
  HINTS
    ${PC_FLANN_LIBRARY_DIRS}
  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}
  PATHS
    $ENV{PROGRAMFILES}/Flann
    $ENV{PROGRAMW6432}/Flann
  PATH_SUFFIXES
    lib
)

if(FLANN_LIBRARY_SHARED AND FLANN_LIBRARY_STATIC)
  if(PCL_FLANN_REQUIRED_TYPE MATCHES "SHARED")
    set(FLANN_LIBRARY_TYPE SHARED)
    set(FLANN_LIBRARY ${FLANN_LIBRARY_SHARED})
  elseif(PCL_FLANN_REQUIRED_TYPE MATCHES "STATIC")
    set(FLANN_LIBRARY_TYPE STATIC)
    set(FLANN_LIBRARY ${FLANN_LIBRARY_STATIC})
  else()
    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()
  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)
  message(STATUS "FLANN found (include: ${FLANN_INCLUDE_DIR}, lib: ${FLANN_LIBRARY})")
endif()