1#############################################################################
2#
3# ViSP, open source Visual Servoing Platform software.
4# Copyright (C) 2005 - 2019 by Inria. All rights reserved.
5#
6# This software is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10# See the file LICENSE.txt at the root directory of this source
11# distribution for additional information about the GNU GPL.
12#
13# For using ViSP with software that can not be combined with the GNU
14# GPL, please contact Inria about acquiring a ViSP Professional
15# Edition License.
16#
17# See http://visp.inria.fr for more information.
18#
19# This software was developed at:
20# Inria Rennes - Bretagne Atlantique
21# Campus Universitaire de Beaulieu
22# 35042 Rennes Cedex
23# France
24#
25# If you have questions regarding the use of this file, please contact
26# Inria at visp@inria.fr
27#
28# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30#
31# Description:
32# CMake package config file for ViSP.
33#
34# ** File generated automatically, do not modify **
35#
36# This file will define the following CMake variables:
37#   - VISP_LIBS           : The list of all imported targets for VISP modules.
38#   - VISP_INCLUDE_DIRS   : ViSP and third-party include directories
39#   - VISP_LIBRARIES      : ViSP library to link against. Third-party libraries are
40#                           linked automatically thanks to cmake export file VISPModules.cmake
41#   - VISP_VERSION_STRING : Full ViSP version that is build, "@VISP_VERSION@"
42#   - VISP_VERSION_MAJOR  : Major version part of VISP_VERSION: "@VISP_VERSION_MAJOR@"
43#   - VISP_VERSION_MINOR  : Minor version part of VISP_VERSION: "@VISP_VERSION_MINOR@"
44#   - VISP_VERSION_PATCH  : Patch version part of VISP_VERSION: "@VISP_VERSION_PATCH@"
45#
46#  Advanced variables:
47#    - VISP_SHARED        : Use ViSP as shared library
48#    - VISP_CONFIG_PATH   : Path to this VISPConfig.cmake
49#    - VISP_USE_FILE      : File to include to use ViSP without specific cmake code
50#    - VISP_LIB_COMPONENTS: Present VISP modules list
51#
52# Typical usage in user project:
53#
54#   find_package(VISP REQUIRED)
55#   include_directories(${VISP_INCLUDE_DIRS})
56#   target_link_libraries(MY_TARGET_NAME ${VISP_LIBRARIES})
57#
58# It is also possible to build your project using VISP_USE_FILE.
59#
60#   find_package(VISP)
61#   if(VISP_FOUND)
62#     include(${VISP_USE_FILE})
63#   endif()
64#
65# Or you can search for specific ViSP modules:
66#
67#   find_package(VISP REQUIRED core io)
68#
69# If the module is found then VISP_<MODULE>_FOUND is set to TRUE.
70#
71# Authors:
72# Fabien Spindler
73#
74#############################################################################
75
76#if(VISP_FOUND)
77#  return()
78#endif()
79
80#set(VISP_FOUND TRUE)
81
82# Set the version numbers
83set(VISP_VERSION_STRING "@VISP_VERSION@")
84set(VISP_VERSION_MAJOR  "@VISP_VERSION_MAJOR@")
85set(VISP_VERSION_MINOR  "@VISP_VERSION_MINOR@")
86set(VISP_VERSION_PATCH  "@VISP_VERSION_PATCH@")
87
88set(VISP_LIB_COMPONENTS @VISP_MODULES_CONFIGCMAKE@)
89
90# Form list of modules (components) to find
91if(NOT VISP_FIND_COMPONENTS)
92  set(VISP_FIND_COMPONENTS ${VISP_LIB_COMPONENTS})
93endif()
94
95# expand short module names and see if requested components exist
96set(VISP_FIND_COMPONENTS_ "")
97foreach(__vpcomponent ${VISP_FIND_COMPONENTS})
98  if(NOT __vpcomponent MATCHES "^visp_")
99    set(__vpcomponent visp_${__vpcomponent})
100  endif()
101  list(FIND VISP_LIB_COMPONENTS ${__vpcomponent} __vpcomponentIdx)
102  if(__vpcomponentIdx LESS 0)
103    #requested component is not found...
104    if(VISP_FIND_REQUIRED)
105      message(FATAL_ERROR "${__vpcomponent} is required but was not found")
106    elseif(NOT VISP_FIND_QUIETLY)
107      message(WARNING "${__vpcomponent} is required but was not found")
108    endif()
109    #indicate that module is NOT found
110    string(TOUPPER "${__vpcomponent}" __vpcomponentUP)
111    set(${__vpcomponentUP}_FOUND "${__vpcomponentUP}_FOUND-NOTFOUND")
112  else()
113    list(APPEND VISP_FIND_COMPONENTS_ ${__vpcomponent})
114    # Not using list(APPEND) here, because VISP_LIBS may not exist yet.
115    # Also not clearing VISP_LIBS anywhere, so that multiple calls
116    # to find_package(VISP) with different component lists add up.
117    set(VISP_LIBS ${VISP_LIBS} "${__vpcomponent}")
118    #indicate that module is found
119    string(TOUPPER "${__vpcomponent}" __vpcomponentUP)
120    set(${__vpcomponentUP}_FOUND 1)
121  endif()
122endforeach()
123set(VISP_FIND_COMPONENTS ${VISP_FIND_COMPONENTS_})
124#message("VISP_FIND_COMPONENTS: ${VISP_FIND_COMPONENTS}")
125
126# Resolve dependencies
127foreach(__opttype OPT DBG)
128  set(VISP_LIBS_${__opttype} "${VISP_LIBS}")
129endforeach()
130
131# Some additional settings are required if ViSP is built as static libs
132set(VISP_SHARED @BUILD_SHARED_LIBS@)
133
134# Extract the directory where *this* file has been installed (determined at cmake run-time)
135set(VISP_CONFIG_PATH ${VISP_DIR} CACHE PATH "ViSPConfig.cmake path location" FORCE)
136mark_as_advanced(VISP_CONFIG_PATH)
137
138if(NOT WIN32)
139  # Since this file is installed in ./${VISP_INSTALL_LIBDIR}/cmake/visp
140  # the first "../../" are here to go to ${VISP_INSTALL_LIBDIR}, and then
141  # VISP_INSTALL_LIBDIR_TO_PARENT goes to the parent dir "."
142  set(VISP_INSTALL_PATH "${VISP_CONFIG_PATH}/../../@VISP_INSTALL_LIBDIR_TO_PARENT@")
143  # Get the absolute path with no ../.. relative marks, to eliminate implicit linker warnings
144  if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} VERSION_LESS 2.8)
145    get_filename_component(VISP_INSTALL_PATH "${VISP_INSTALL_PATH}" ABSOLUTE)
146  else()
147    get_filename_component(VISP_INSTALL_PATH "${VISP_INSTALL_PATH}" REALPATH)
148  endif()
149endif()
150
151# Tells the user project where to find ViSP headers
152set(VISP_INCLUDE_DIRS "@VISP_INCLUDE_DIRS_CONFIGCMAKE@")
153
154# Tells the user project ViSP library name
155set(VISP_LIBRARIES ${VISP_LIBS})
156
157# need to be improved
158if(POLICY CMP0024)
159  # Fix to prevent multiple includes
160  if(NOT TARGET visp_core)
161    cmake_policy(PUSH)
162    cmake_policy(SET CMP0024 NEW)
163    # Our library dependencies (contains definitions for IMPORTED targets)
164    include("${CMAKE_CURRENT_LIST_DIR}/VISPModules.cmake")
165    cmake_policy(POP)
166  endif()
167else()
168  # Fix for cmake 2.8.7 to prevent multiple includes
169  if(NOT TARGET visp_core)
170    # Our library dependencies (contains definitions for IMPORTED targets)
171    include("${CMAKE_CURRENT_LIST_DIR}/VISPModules.cmake")
172  endif()
173endif()
174
175# where to find the USE file to be used by user project
176set(VISP_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/VISPUse.cmake")
177
178if(BUILD_TEST_COVERAGE)
179  # Add build options for test coverage. Currently coverage is only supported
180  # on gcc compiler
181  # Because using -fprofile-arcs with shared lib can cause problems like:
182  # hidden symbol `__bb_init_func', we add this option only for static
183  # library build
184  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ftest-coverage -fprofile-arcs")
185endif()
186
187#----------------------------------------------------------------------
188# Remember VISP' third party libs configuration:
189#----------------------------------------------------------------------
190set(VISP_HAVE_AFMA4          "@VISP_HAVE_AFMA4@")
191set(VISP_HAVE_AFMA6          "@VISP_HAVE_AFMA6@")
192set(VISP_HAVE_APRILTAG       "@VISP_HAVE_APRILTAG@")
193set(VISP_HAVE_ARSDK          "@VISP_HAVE_ARSDK@")
194set(VISP_HAVE_ATIDAQ         "@VISP_HAVE_ATIDAQ@")
195set(VISP_HAVE_ATLAS          "@VISP_HAVE_ATLAS@")
196set(VISP_HAVE_BICLOPS        "@VISP_HAVE_BICLOPS@")
197set(VISP_HAVE_CLIPPER        "@VISP_HAVE_CLIPPER@")
198set(VISP_HAVE_CMU1394        "@VISP_HAVE_CMU1394@")
199set(VISP_HAVE_COIN3D         "@VISP_HAVE_COIN3D@")
200set(VISP_HAVE_COIN3D_AND_GUI "@VISP_HAVE_COIN3D_AND_GUI@")
201set(VISP_HAVE_COMEDI         "@VISP_HAVE_COMEDI@")
202set(VISP_HAVE_CPP11_COMPATIBILITY "@VISP_HAVE_CXX11@") # to keep compat with previous releases
203set(VISP_HAVE_CXX11          "@VISP_HAVE_CXX11@")
204set(VISP_CXX_STANDARD_98     "@VISP_CXX_STANDARD_98@")
205set(VISP_CXX_STANDARD_11     "@VISP_CXX_STANDARD_11@")
206set(VISP_CXX_STANDARD_14     "@VISP_CXX_STANDARD_14@")
207set(VISP_CXX_STANDARD_17     "@VISP_CXX_STANDARD_17@")
208set(VISP_CXX_STANDARD        "@VISP_CXX_STANDARD@")
209set(VISP_HAVE_D3D9           "@VISP_HAVE_D3D9@")
210set(VISP_HAVE_DC1394         "@VISP_HAVE_DC1394@")
211set(VISP_HAVE_DIRECTSHOW     "@VISP_HAVE_DIRECTSHOW@")
212set(VISP_HAVE_DISPLAY        "@VISP_HAVE_DISPLAY@")
213set(VISP_HAVE_DMTX           "@VISP_HAVE_DMTX@")
214set(VISP_HAVE_EIGEN3         "@VISP_HAVE_EIGEN3@")
215set(VISP_HAVE_FFMPEG         "@VISP_HAVE_FFMPEG@")
216set(VISP_HAVE_FLIR_PTU_SDK   "@VISP_HAVE_FLIR_PTU_SDK@")
217set(VISP_HAVE_FRANKA         "@VISP_HAVE_FRANKA@")
218set(VISP_HAVE_FLYCAPTURE     "@VISP_HAVE_FLYCAPTURE@")
219set(VISP_HAVE_FT_IIT_SDK     "@VISP_HAVE_FT_IIT_SDK@")
220set(VISP_HAVE_GDI            "@VISP_HAVE_GDI@")
221set(VISP_HAVE_GTK            "@VISP_HAVE_GTK@")
222set(VISP_HAVE_GSL            "@VISP_HAVE_GSL@")
223set(VISP_HAVE_JACOSDK        "@VISP_HAVE_JACOSDK@")
224set(VISP_HAVE_JPEG           "@VISP_HAVE_JPEG@")
225set(VISP_HAVE_LAPACK         "@VISP_HAVE_LAPACK@")
226set(VISP_HAVE_LAPACK_BUILT_IN "@VISP_HAVE_LAPACK_BUILT_IN@")
227set(VISP_HAVE_LIBFREENECT    "@VISP_HAVE_LIBFREENECT@")
228set(VISP_HAVE_LIBFREENECT_AND_DEPENDENCIES "@VISP_HAVE_LIBFREENECT_AND_DEPENDENCIES@")
229set(VISP_HAVE_LIBFREENECT_OLD "@VISP_HAVE_LIBFREENECT_OLD@")
230set(VISP_HAVE_LIBUSB_1       "@VISP_HAVE_LIBUSB_1@")
231set(VISP_HAVE_MKL            "@VISP_HAVE_MKL@")
232set(VISP_HAVE_NETLIB         "@VISP_HAVE_NETLIB@")
233set(VISP_HAVE_OGRE           "@VISP_HAVE_OGRE@")
234set(VISP_HAVE_OIS            "@VISP_HAVE_OIS@")
235set(VISP_HAVE_OPENBLAS       "@VISP_HAVE_OPENBLAS@")
236set(VISP_HAVE_OPENCV         "@VISP_HAVE_OPENCV@")
237set(VISP_HAVE_OPENCV_DNN     "@VISP_HAVE_OPENCV_DNN@")
238set(VISP_HAVE_OPENCV_NONFREE "@VISP_HAVE_OPENCV_NONFREE@")
239set(VISP_HAVE_OPENCV_OBJDETECT "@VISP_HAVE_OPENCV_OBJDETECT@")
240set(VISP_HAVE_OPENCV_VERSION "@VISP_HAVE_OPENCV_VERSION@")
241set(VISP_HAVE_OPENGL         "@VISP_HAVE_OPENGL@")
242set(VISP_HAVE_OPENMP         "@VISP_HAVE_OPENMP@")
243set(VISP_HAVE_PARPORT        "@VISP_HAVE_PARPORT@")
244set(VISP_HAVE_PCL            "@VISP_HAVE_PCL@")
245set(VISP_HAVE_PIONEER        "@VISP_HAVE_PIONEER@")
246set(VISP_HAVE_PNG            "@VISP_HAVE_PNG@")
247set(VISP_HAVE_PTHREAD        "@VISP_HAVE_PTHREAD@")
248set(VISP_HAVE_PTU46          "@VISP_HAVE_PTU46@")
249set(VISP_HAVE_PYLON          "@VISP_HAVE_PYLON@")
250set(VISP_HAVE_QBDEVICE       "@VISP_HAVE_QBDEVICE@")
251set(VISP_HAVE_QT             "@VISP_HAVE_QT@")
252set(VISP_HAVE_REALSENSE      "@VISP_HAVE_REALSENSE@")
253set(VISP_HAVE_REALSENSE2     "@VISP_HAVE_REALSENSE2@")
254set(VISP_HAVE_SOQT           "@VISP_HAVE_SOQT@")
255set(VISP_HAVE_SOWIN          "@VISP_HAVE_SOWIN@")
256set(VISP_HAVE_SOXT           "@VISP_HAVE_SOXT@")
257set(VISP_HAVE_TAKKTILE2      "@VISP_HAVE_TAKKTILE2@")
258set(VISP_HAVE_UEYE           "@VISP_HAVE_UEYE@")
259set(VISP_HAVE_V4L2           "@VISP_HAVE_V4L2@")
260set(VISP_HAVE_VIPER650       "@VISP_HAVE_VIPER650@")
261set(VISP_HAVE_VIPER850       "@VISP_HAVE_VIPER850@")
262set(VISP_HAVE_VIRTUOSE       "@VISP_HAVE_VIRTUOSE@")
263set(VISP_HAVE_X11            "@VISP_HAVE_X11@")
264set(VISP_HAVE_XML2           "@VISP_HAVE_XML2@")
265set(VISP_HAVE_YARP           "@VISP_HAVE_YARP@")
266set(VISP_HAVE_ZBAR           "@VISP_HAVE_ZBAR@")
267
268@VISP_CONTRIB_MODULES_CONFIGCMAKE@
269
270set(VISP_COMPILER_FAIL_REGEX
271    "command line option .* is valid for .* but not for C\\+\\+" # GNU
272    "command line option .* is valid for .* but not for C" # GNU
273    "unrecognized .*option"                     # GNU
274    "unknown .*option"                          # Clang
275    "ignoring unknown option"                   # MSVC
276    "warning D9002"                             # MSVC, any lang
277    "option .*not supported"                    # Intel
278    "[Uu]nknown option"                         # HP
279    "[Ww]arning: [Oo]ption"                     # SunPro
280    "command option .* is not recognized"       # XL
281    "not supported in this configuration; ignored"       # AIX
282    "File with unknown suffix passed to linker" # PGI
283    "WARNING: unknown flag:"                    # Open64
284  )
285
286#----------------------------------------------------------------------
287# Propagate c++ standard compiler option if enabled during ViSP build
288#----------------------------------------------------------------------
289if(${VISP_CXX_STANDARD} EQUAL ${VISP_CXX_STANDARD_11})
290  set(CMAKE_CXX_STANDARD 11)
291  set(CMAKE_CXX_STANDARD_REQUIRED FALSE)
292  set(CMAKE_CXX_EXTENSIONS OFF) # use -std=c++11 instead of -std=gnu++11
293  if(NOT CMAKE_CXX11_COMPILE_FEATURES)
294    set(CXX11_CXX_FLAGS @CXX11_CXX_FLAGS@)
295    if(CXX11_CXX_FLAGS)
296      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX11_CXX_FLAGS}")
297    endif()
298  endif()
299elseif(${VISP_CXX_STANDARD} EQUAL ${VISP_CXX_STANDARD_14})
300  set(CMAKE_CXX_STANDARD 14)
301  set(CMAKE_CXX_STANDARD_REQUIRED FALSE)
302  set(CMAKE_CXX_EXTENSIONS OFF) # use -std=c++14 instead of -std=gnu++14
303  if(NOT CMAKE_CXX14_COMPILE_FEATURES)
304    set(CXX14_CXX_FLAGS @CXX14_CXX_FLAGS@)
305    if(CXX14_CXX_FLAGS)
306      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX14_CXX_FLAGS}")
307    endif()
308  endif()
309elseif(${VISP_CXX_STANDARD} EQUAL ${VISP_CXX_STANDARD_17})
310  set(CMAKE_CXX_STANDARD 17)
311  set(CMAKE_CXX_STANDARD_REQUIRED FALSE)
312  set(CMAKE_CXX_EXTENSIONS OFF) # use -std=c++17 instead of -std=gnu++17
313  if(NOT CMAKE_CXX17_COMPILE_FEATURES)
314    set(CXX14_CXX_FLAGS @CXX14_CXX_FLAGS@)
315    if(CXX17_CXX_FLAGS)
316      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX17_CXX_FLAGS}")
317    endif()
318  endif()
319endif()
320
321#----------------------------------------------------------------------
322# Propagate openmp compiler option if enabled during ViSP build
323#----------------------------------------------------------------------
324if(VISP_HAVE_OPENMP)
325  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} @OpenMP_CXX_FLAGS@")
326endif()
327
328#----------------------------------------------------------------------
329# Propagate -fPIC option requested with Qt5 that requires position independent
330# code if Qt was built with -reduce-relocations.
331#----------------------------------------------------------------------
332if(UNIX)
333  if(CMAKE_COMPILER_IS_GNUCXX)
334    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") # Is needed for ANDROID too.
335  endif()
336endif()
337
338#----------------------------------------------------------------------
339# Some useful macro to be able to build the tutorials along side ViSP
340#----------------------------------------------------------------------
341# Create a target from the *.cpp file, link against ViSP libraries and add a dependency to ViSP library
342# tu ensure that the library is build before this target.
343macro(visp_add_target file_cpp)
344  if(POLICY CMP0020)
345    cmake_policy(PUSH)
346    cmake_policy(SET CMP0020 NEW) # For UsTK: Qt5
347  endif()
348  get_filename_component(target ${file_cpp} NAME_WE)
349  include_directories(${VISP_INCLUDE_DIRS})
350  add_executable(${target} ${file_cpp} ${ARGN})
351  target_link_libraries(${target} ${VISP_LIBRARIES})
352  if(POLICY CMP0020)
353    cmake_policy(POP) #cmake_policy(SET CMP0020 NEW) # For UsTK: Qt5
354  endif()
355endmacro()
356
357# Create a dependency to the target extracted from the *.cpp file and put the target in the solution dependency folder.
358macro(visp_add_dependency file_cpp dependency)
359  get_filename_component(target ${file_cpp} NAME_WE)
360  if(TARGET visp_${dependency})
361    add_dependencies(visp_${dependency} ${target})
362    if(ENABLE_SOLUTION_FOLDERS)
363      set_target_properties(${target} PROPERTIES FOLDER "${dependency}")
364    endif()
365  endif()
366endmacro()
367
368# Copy the data files to the same location than the target associated to the cpp files
369# Since CMake 3.0.0 policy CMP0026 was introduced to disallow location property on target.
370# If CMake 3.0.0 is used, we use $<TARGET_FILE_DIR:tgt> to get the target location
371if (CMAKE_VERSION VERSION_GREATER 2.8.12)
372  macro(visp_copy_data file_cpp file_data)
373    get_filename_component(target ${file_cpp} NAME_WE)
374    get_filename_component(target_location "${target_location}" PATH)
375    add_custom_command(
376      TARGET ${target}
377      POST_BUILD
378      COMMAND ${CMAKE_COMMAND} -E copy "${file_data}" "$<TARGET_FILE_DIR:${target}>"
379    )
380  endmacro()
381else()
382  macro(visp_copy_data file_cpp file_data)
383    get_filename_component(target ${file_cpp} NAME_WE)
384    get_target_property(target_location ${target} LOCATION)
385    get_filename_component(target_location "${target_location}" PATH)
386    add_custom_command(
387      TARGET ${target}
388      POST_BUILD
389      COMMAND ${CMAKE_COMMAND} -E copy "${file_data}" "${target_location}"
390    )
391  endmacro()
392endif()
393
394# Copy the data files to the same location than the target associated to the cpp files
395# Since CMake 3.0.0 policy CMP0026 was introduced to disallow location property on target.
396# If CMake 3.0.0 is used, we use $<TARGET_FILE_DIR:tgt> to get the target location
397if (CMAKE_VERSION VERSION_GREATER 2.8.12)
398  macro(visp_copy_dir file_cpp root_dir rel_dir)
399    get_filename_component(target ${file_cpp} NAME_WE)
400    get_filename_component(target_location "${target_location}" PATH)
401    add_custom_command(
402      TARGET ${target}
403      POST_BUILD
404      COMMAND ${CMAKE_COMMAND} -E copy_directory "${root_dir}/${rel_dir}" "$<TARGET_FILE_DIR:${target}>/${rel_dir}"
405    )
406  endmacro()
407else()
408  macro(visp_copy_data file_cpp root_dir rel_dir)
409    get_filename_component(target ${file_cpp} NAME_WE)
410    get_target_property(target_location ${target} LOCATION)
411    get_filename_component(target_location "${target_location}" PATH)
412    add_custom_command(
413      TARGET ${target}
414      POST_BUILD
415      COMMAND ${CMAKE_COMMAND} -E copy_directory "${root_dir}/${rel_dir}" "${target_location}/${rel_dir}"
416    )
417  endmacro()
418endif()
419
420# Check dependencies for examples
421macro(visp_check_dependencies)
422  set(VP_DEPENDENCIES_FOUND TRUE)
423  foreach(d ${ARGN})
424    if(NOT TARGET ${d})
425      #message(WARNING "ViSP: Can't resolve dependency: ${d}")
426      set(VP_DEPENDENCIES_FOUND FALSE)
427      break()
428    endif()
429  endforeach()
430endmacro()
431
432# add subdirectory if dependencies are found
433# visp_add_subdirectory(<subdir> REQUIRED_DEPS <deps>)
434macro(visp_add_subdirectory subdir)
435  set(__deps "")
436
437  foreach(arg ${ARGN})
438    if(arg STREQUAL "REQUIRED_DEPS")
439      set(__varname "__deps")
440    else()
441      list(APPEND ${__varname} ${arg})
442    endif()
443  endforeach()
444  unset(__varname)
445
446  if(__deps STREQUAL "")
447    set(VP_DEPENDENCIES_FOUND TRUE)
448  else()
449    visp_check_dependencies(${__deps})
450  endif()
451
452  if(VP_DEPENDENCIES_FOUND)
453    add_subdirectory(${subdir})
454  endif()
455endmacro()
456
457# add specific compile flag useful to turn warning coming from 3rdparty
458macro(visp_set_source_file_compile_flag file)
459#  if(DEFINED ACTIVATE_WARNING_3PARTY_MUTE)
460#    if(ACTIVATE_WARNING_3PARTY_MUTE)
461  set(__cxxflags "")
462  set(__lang "CXX")
463  if("${file}" MATCHES "\\.(c)$")
464    set(__lang "C")
465  elseif("${file}" MATCHES "\\.(cpp|cc|cxx)$")
466    set(__lang "CXX")
467  elseif("${file}" MATCHES "\\.(f|F)$")
468    set(__lang "Fortran")
469  endif()
470  # Since cxx11 option makes try_compile() result wrong, we remove all the CXX_FLAGS
471  # when we check if an option is available or not
472  #set(CXX_FLAGS_BACKUP ${CMAKE_CXX_FLAGS})
473  #set(CMAKE_CXX_FLAGS "")
474  foreach(cxxflag ${ARGN})
475    visp_check_flag_support(${__lang} ${cxxflag} __support_flag "")
476    if(${__support_flag})
477      set(__cxxflags "${__cxxflags} ${cxxflag}")
478    endif()
479  endforeach()
480  #set(CMAKE_CXX_FLAGS ${CXX_FLAGS_BACKUP})
481  #unset(CXX_FLAGS_BACKUP)
482  if(NOT ${__cxxflags} STREQUAL "")
483    if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${file}")
484      set_source_files_properties("${CMAKE_CURRENT_LIST_DIR}/${file}" PROPERTIES COMPILE_FLAGS "${__cxxflags}")
485    elseif(EXISTS ${file}) # for files that are in the build tree (like those produced by qt moc)
486      set_source_files_properties("${file}" PROPERTIES COMPILE_FLAGS "${__cxxflags}")
487    endif()
488  endif()
489#    endif()
490#  endif()
491endmacro()
492
493# check if a compiler flag is supported
494macro(visp_check_flag_support lang flag varname base_options)
495  if(CMAKE_BUILD_TYPE)
496    set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE})
497  endif()
498
499  if("_${lang}_" MATCHES "_CXX_")
500    set(_lang CXX)
501  elseif("_${lang}_" MATCHES "_C_")
502    set(_lang C)
503  elseif("_${lang}_" MATCHES "_Fortran_")
504    set(_lang Fortran)
505  else()
506    set(_lang ${lang})
507  endif()
508  string(TOUPPER "${flag}" ${varname})
509  string(REGEX REPLACE "^(/|-)" "HAVE_${_lang}_" ${varname} "${${varname}}")
510  string(REGEX REPLACE " -|-|=| |\\." "_" ${varname} "${${varname}}")
511  visp_check_compiler_flag("${_lang}" "${base_options} ${flag}" ${${varname}} ${ARGN})
512endmacro()
513
514# test if a compiler flag is supported
515macro(visp_check_compiler_flag LANG FLAG RESULT)
516  set(_fname "${ARGN}")
517  if(NOT DEFINED ${RESULT})
518    if(_fname)
519      # nothing
520    elseif("_${LANG}_" MATCHES "_CXX_")
521      set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx")
522      #if("${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
523        file(WRITE "${_fname}" "int main() { return 0; }\n")
524      #else()
525      #  file(WRITE "${_fname}" "#pragma\nint main() { return 0; }\n")
526      #endif()
527    elseif("_${LANG}_" MATCHES "_C_")
528      set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c")
529      #if("${CMAKE_C_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_C_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
530        file(WRITE "${_fname}" "int main(void) { return 0; }\n")
531      #else()
532      #  file(WRITE "${_fname}" "#pragma\nint main(void) { return 0; }\n")
533      #endif()
534    elseif("_${LANG}_" MATCHES "_OBJCXX_")
535      set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.mm")
536      #if("${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror " OR "${CMAKE_CXX_FLAGS} ${FLAG} " MATCHES "-Werror=unknown-pragmas ")
537        file(WRITE "${_fname}" "int main() { return 0; }\n")
538      #else()
539      #  file(WRITE "${_fname}" "#pragma\nint main() { return 0; }\n")
540      #endif()
541    elseif("_${LANG}_" MATCHES "_Fortran_")
542      set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.f")
543      file(WRITE "${_fname}" "      PROGRAM TEST\n      RETURN\n      END\n")
544    else()
545      unset(_fname)
546    endif()
547    if(_fname)
548      if(NOT "x${ARGN}" STREQUAL "x")
549        file(RELATIVE_PATH __msg "${CMAKE_SOURCE_DIR}" "${ARGN}")
550        set(__msg " (check file: ${__msg})")
551      else()
552        set(__msg "")
553      endif()
554      message(STATUS "Performing Test ${RESULT}${__msg}")
555      try_compile(${RESULT}
556        "${CMAKE_BINARY_DIR}"
557        "${_fname}"
558        CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}"   # CMP0056 do this on new CMake
559        COMPILE_DEFINITIONS "${FLAG}"
560        OUTPUT_VARIABLE OUTPUT)
561
562      if(${RESULT})
563        string(REPLACE ";" "," OUTPUT_LINES "${OUTPUT}")
564        string(REPLACE "\n" ";" OUTPUT_LINES "${OUTPUT_LINES}")
565        foreach(_regex ${VP_COMPILER_FAIL_REGEX})
566          if(NOT ${RESULT})
567            break()
568          endif()
569          foreach(_line ${OUTPUT_LINES})
570            if("${_line}" MATCHES "${_regex}")
571              file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
572                  "Build output check failed:\n"
573                  "    Regex: '${_regex}'\n"
574                  "    Output line: '${_line}'\n")
575              set(${RESULT} 0)
576              break()
577            endif()
578          endforeach()
579        endforeach()
580      endif()
581
582      if(${RESULT})
583        set(${RESULT} 1 CACHE INTERNAL "Test ${RESULT}")
584        message(STATUS "Performing Test ${RESULT} - Success")
585      else()
586        message(STATUS "Performing Test ${RESULT} - Failed")
587        set(${RESULT} "" CACHE INTERNAL "Test ${RESULT}")
588        file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
589            "Compilation failed:\n"
590            "    source file: '${_fname}'\n"
591            "    check option: '${FLAG}'\n"
592            "===== BUILD LOG =====\n"
593            "${OUTPUT}\n"
594            "===== END =====\n\n")
595      endif()
596    else()
597      set(${RESULT} 0)
598    endif()
599  endif()
600endmacro()
601