From d559a31649cc2310f58bc8afb93ec1eb661c29fd Mon Sep 17 00:00:00 2001 From: Lars Glud Date: Thu, 8 Feb 2024 05:45:33 +0100 Subject: [PATCH 1/5] Change to proper cmake export files --- CMakeLists.txt | 2 + PCLConfig.cmake.in | 331 +----------------- PCLConfigVersion.cmake.in | 13 - cmake/pcl_find_cuda.cmake | 2 + cmake/pcl_pclconfig.cmake | 16 +- cmake/pcl_targets.cmake | 28 +- io/CMakeLists.txt | 32 +- io/include/pcl/io/ply_io.h | 2 +- io_ply/CMakeLists.txt | 30 ++ .../include/pcl/io_ply}/byte_order.h | 0 .../include/pcl/io_ply}/io_operators.h | 0 .../ply => io_ply/include/pcl/io_ply}/ply.h | 2 +- .../include/pcl/io_ply}/ply_parser.h | 4 +- {io/src/ply => io_ply/src}/ply_parser.cpp | 2 +- octree/CMakeLists.txt | 3 + recognition/CMakeLists.txt | 7 + tools/ply2obj.cpp | 2 +- tools/ply2ply.cpp | 2 +- tools/ply2raw.cpp | 2 +- 19 files changed, 115 insertions(+), 365 deletions(-) delete mode 100644 PCLConfigVersion.cmake.in create mode 100644 io_ply/CMakeLists.txt rename {io/include/pcl/io/ply => io_ply/include/pcl/io_ply}/byte_order.h (100%) rename {io/include/pcl/io/ply => io_ply/include/pcl/io_ply}/io_operators.h (100%) rename {io/include/pcl/io/ply => io_ply/include/pcl/io_ply}/ply.h (99%) rename {io/include/pcl/io/ply => io_ply/include/pcl/io_ply}/ply_parser.h (99%) rename {io/src/ply => io_ply/src}/ply_parser.cpp (99%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 01ea783abd5..3df772ae8b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -257,6 +257,7 @@ if(WIN32) set(PCL_POINTCLOUDS_DIR "${PCL_RESOURCES_DIR}/pointclouds") endif() +#Set up output directory for builds set(PCL_OUTPUT_LIB_DIR "${PCL_BINARY_DIR}/${LIB_INSTALL_DIR}") set(PCL_OUTPUT_BIN_DIR "${PCL_BINARY_DIR}/${BIN_INSTALL_DIR}") file(MAKE_DIRECTORY "${PCL_OUTPUT_LIB_DIR}") @@ -285,6 +286,7 @@ if(CMAKE_GENERATOR_IS_IDE) else() set(UNINSTALL_TARGET_NAME uninstall) endif() + configure_file("${PCL_SOURCE_DIR}/cmake/uninstall_target.cmake.in" "${PCL_BINARY_DIR}/uninstall_target.cmake" IMMEDIATE @ONLY) add_custom_target(${UNINSTALL_TARGET_NAME} "${CMAKE_COMMAND}" -P diff --git a/PCLConfig.cmake.in b/PCLConfig.cmake.in index 54ba7f16cc9..519bb8d4a97 100644 --- a/PCLConfig.cmake.in +++ b/PCLConfig.cmake.in @@ -25,10 +25,14 @@ # www.pointclouds.org #------------------------------------------------------------------------------------ - -# Set default policy behavior similar to minimum requirement version +include(CMakeFindDependencyMacro) cmake_policy(VERSION 3.16.3) +set(PCL_VERSION @CMAKE_PROJECT_VERSION@) + +@PACKAGE_INIT@ + +set_and_check(PCL_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") if(POLICY CMP0144) cmake_policy(SET CMP0144 NEW) endif() @@ -57,44 +61,6 @@ macro(pcl_message) endif() endmacro() -# Remove duplicate libraries -macro(pcl_remove_duplicate_libraries _unfiltered_libraries _filtered_libraries) - set(${_filtered_libraries}) - set(_debug_libraries) - set(_optimized_libraries) - set(_other_libraries) - set(_waiting_for_debug 0) - set(_waiting_for_optimized 0) - set(_library_position -1) - foreach(library ${${_unfiltered_libraries}}) - if("${library}" STREQUAL "debug") - set(_waiting_for_debug 1) - elseif("${library}" STREQUAL "optimized") - set(_waiting_for_optimized 1) - elseif(_waiting_for_debug) - list(FIND _debug_libraries "${library}" library_position) - if(library_position EQUAL -1) - list(APPEND ${_filtered_libraries} debug ${library}) - list(APPEND _debug_libraries ${library}) - endif() - set(_waiting_for_debug 0) - elseif(_waiting_for_optimized) - list(FIND _optimized_libraries "${library}" library_position) - if(library_position EQUAL -1) - list(APPEND ${_filtered_libraries} optimized ${library}) - list(APPEND _optimized_libraries ${library}) - endif() - set(_waiting_for_optimized 0) - else() - list(FIND _other_libraries "${library}" library_position) - if(library_position EQUAL -1) - list(APPEND ${_filtered_libraries} ${library}) - list(APPEND _other_libraries ${library}) - endif() - endif() - endforeach() -endmacro() - ### ---[ 3rd party libraries macro(find_boost) if(PCL_ALL_IN_ONE_INSTALLER) @@ -102,7 +68,7 @@ macro(find_boost) elseif(NOT BOOST_INCLUDEDIR) set(BOOST_INCLUDEDIR "@Boost_INCLUDE_DIR@") endif() - + find_package(Boost 1.71.0 ${QUIET_} COMPONENTS @PCLCONFIG_AVAILABLE_BOOST_MODULES@ CONFIG) set(BOOST_FOUND ${Boost_FOUND}) @@ -324,6 +290,7 @@ function(find_external_library _component _lib _is_optional) string(TOUPPER "${_component}" COMPONENT) string(TOUPPER "${_lib}" LIB) string(REGEX REPLACE "[.-]" "_" LIB "${LIB}") + if(${LIB}_FOUND) list(APPEND PCL_${COMPONENT}_INCLUDE_DIRS ${${LIB}_INCLUDE_DIRS}) set(PCL_${COMPONENT}_INCLUDE_DIRS ${PCL_${COMPONENT}_INCLUDE_DIRS} PARENT_SCOPE) @@ -333,22 +300,6 @@ function(find_external_library _component _lib _is_optional) set(ISVTK9ORGREATER TRUE) endif() endif() - - if(${LIB}_USE_FILE AND NOT ISVTK9ORGREATER ) - include(${${LIB}_USE_FILE}) - else() - list(APPEND PCL_${COMPONENT}_LIBRARY_DIRS "${${LIB}_LIBRARY_DIRS}") - set(PCL_${COMPONENT}_LIBRARY_DIRS ${PCL_${COMPONENT}_LIBRARY_DIRS} PARENT_SCOPE) - endif() - if(${LIB}_LIBRARIES) - list(APPEND PCL_${COMPONENT}_LINK_LIBRARIES "${${LIB}_LIBRARIES}") - set(PCL_${COMPONENT}_LINK_LIBRARIES ${PCL_${COMPONENT}_LINK_LIBRARIES} PARENT_SCOPE) - set(PCL_${LIB}_LIBRARIES ${${LIB}_LIBRARIES} PARENT_SCOPE) # Later appended to PCL_LIBRARIES - endif() - if(${LIB}_DEFINITIONS AND NOT ${LIB} STREQUAL "VTK") - list(APPEND PCL_${COMPONENT}_DEFINITIONS ${${LIB}_DEFINITIONS}) - set(PCL_${COMPONENT}_DEFINITIONS ${PCL_${COMPONENT}_DEFINITIONS} PARENT_SCOPE) - endif() else() if("${_is_optional}" STREQUAL "OPTIONAL") list(APPEND PCL_${COMPONENT}_DEFINITIONS "-DDISABLE_${LIB}") @@ -366,9 +317,6 @@ function(find_external_library _component _lib _is_optional) endif() endfunction() -macro(pcl_check_external_dependency _component) -endmacro() - #flatten dependencies recursivity is great \o/ macro(compute_dependencies TO_FIND_COMPONENTS) foreach(component ${${TO_FIND_COMPONENTS}}) @@ -397,65 +345,8 @@ macro(compute_dependencies TO_FIND_COMPONENTS) endforeach() endmacro() -### ---[ Find PCL - -if(PCL_FIND_QUIETLY) - set(QUIET_ QUIET) -else() - set(QUIET_) -endif() - -find_package(PkgConfig QUIET) - -file(TO_CMAKE_PATH "${PCL_DIR}" PCL_DIR) -if(WIN32 AND NOT MINGW) -# PCLConfig.cmake is installed to PCL_ROOT/cmake - get_filename_component(PCL_ROOT "${PCL_DIR}" PATH) - if(EXISTS "${PCL_ROOT}/3rdParty") - set(PCL_ALL_IN_ONE_INSTALLER ON) - endif() -else() -# PCLConfig.cmake is installed to PCL_ROOT/share/pcl-x.y - get_filename_component(PCL_ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE) -endif() - -# check whether PCLConfig.cmake is found into a PCL installation or in a build tree -if(EXISTS "${PCL_ROOT}/include/pcl-${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR}/pcl/pcl_config.h") - # Found a PCL installation - # pcl_message("Found a PCL installation") - set(PCL_CONF_INCLUDE_DIR "${PCL_ROOT}/include/pcl-${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR}") - set(PCL_LIBRARY_DIRS "${PCL_ROOT}/@LIB_INSTALL_DIR@") -elseif(EXISTS "${PCL_ROOT}/include/pcl/pcl_config.h") - # Found a non-standard (likely ANDROID) PCL installation - # pcl_message("Found a PCL installation") - set(PCL_CONF_INCLUDE_DIR "${PCL_ROOT}/include") - set(PCL_LIBRARY_DIRS "${PCL_ROOT}/lib") -elseif(EXISTS "${PCL_DIR}/include/pcl/pcl_config.h") - # Found PCLConfig.cmake in a build tree of PCL - # pcl_message("PCL found into a build tree.") - set(PCL_CONF_INCLUDE_DIR "${PCL_DIR}/include") # for pcl_config.h - set(PCL_LIBRARY_DIRS "${PCL_DIR}/@LIB_INSTALL_DIR@") -else() - pcl_report_not_found("PCL can not be found on this machine") -endif() - -set(PCL_INCLUDE_DIRS "${PCL_CONF_INCLUDE_DIR}") - -#set a suffix for debug libraries -set(PCL_DEBUG_SUFFIX "@CMAKE_DEBUG_POSTFIX@") -set(PCL_RELEASE_SUFFIX "@CMAKE_RELEASE_POSTFIX@") set(PCL_RELWITHDEBINFO_SUFFIX "@CMAKE_RELWITHDEBINFO_POSTFIX@") set(PCL_MINSIZEREL_SUFFIX "@CMAKE_MINSIZEREL_POSTFIX@") - -set(PCL_SHARED_LIBS "@PCL_SHARED_LIBS@") - -#set SSE flags used compiling PCL -list(APPEND PCL_DEFINITIONS @PCLCONFIG_SSE_DEFINITIONS@) -list(APPEND PCL_COMPILE_OPTIONS @PCLCONFIG_SSE_COMPILE_OPTIONS@) - -#set AVX flags used compiling PCL -list(APPEND PCL_COMPILE_OPTIONS @PCLCONFIG_AVX_COMPILE_OPTIONS@) - set(pcl_all_components @PCLCONFIG_AVAILABLE_COMPONENTS@) # insert "io_ply" before "io" list(FIND pcl_all_components "io" pcl_pos_io) @@ -479,10 +370,6 @@ set(pcl_io_ply_ext_dep boost) # VTK components required by PCL set(PCL_VTK_COMPONENTS "@PCL_VTK_COMPONENTS@") -set(pcl_header_only_components 2d cuda_common geometry gpu_tracking modeler in_hand_scanner point_cloud_editor cloud_composer) - -include(FindPackageHandleStandardArgs) - #check if user provided a list of components #if no components at all or full list is given set PCL_FIND_ALL if(PCL_FIND_COMPONENTS) @@ -500,21 +387,6 @@ endif() compute_dependencies(PCL_TO_FIND_COMPONENTS) -# We do not need to find components that have been found already, e.g. during previous invocation -# of find_package(PCL). Filter them out. -foreach(component ${PCL_TO_FIND_COMPONENTS}) - string(TOUPPER "${component}" COMPONENT) - if(NOT PCL_${COMPONENT}_FOUND) - list(APPEND _PCL_TO_FIND_COMPONENTS ${component}) - endif() -endforeach() -set(PCL_TO_FIND_COMPONENTS ${_PCL_TO_FIND_COMPONENTS}) -unset(_PCL_TO_FIND_COMPONENTS) - -if(NOT PCL_TO_FIND_COMPONENTS) - return() -endif() - # compute external dependencies per component foreach(component ${PCL_TO_FIND_COMPONENTS}) foreach(opt ${pcl_${component}_opt_dep}) @@ -525,187 +397,10 @@ foreach(component ${PCL_TO_FIND_COMPONENTS}) endforeach() endforeach() +set(PCL_LIBRARIES) foreach(component ${PCL_TO_FIND_COMPONENTS}) - set(pcl_component pcl_${component}) - string(TOUPPER "${component}" COMPONENT) - - pcl_message(STATUS "looking for PCL_${COMPONENT}") - - string(REGEX REPLACE "^cuda_(.*)$" "\\1" cuda_component "${component}") - string(REGEX REPLACE "^gpu_(.*)$" "\\1" gpu_component "${component}") - string(REGEX REPLACE "^io_(.*)$" "\\1" io_component "${component}") - - find_path(PCL_${COMPONENT}_INCLUDE_DIR - NAMES pcl/${component} - pcl/apps/${component} - pcl/cuda/${cuda_component} pcl/cuda/${component} - pcl/gpu/${gpu_component} pcl/gpu/${component} - pcl/io/${io_component} - HINTS ${PCL_INCLUDE_DIRS} - PATH_SUFFIXES - ${component}/include - apps/${component}/include - cuda/${cuda_component}/include - gpu/${gpu_component}/include - io/${io_component}/include - DOC "path to ${component} headers" - NO_DEFAULT_PATH) - mark_as_advanced(PCL_${COMPONENT}_INCLUDE_DIR) - - if(PCL_${COMPONENT}_INCLUDE_DIR) - list(APPEND PCL_${COMPONENT}_INCLUDE_DIRS "${PCL_${COMPONENT}_INCLUDE_DIR}") - else() - #pcl_message("No include directory found for pcl_${component}.") - endif() - - set(FPHSA_NAME_MISMATCHED 1) # Suppress warnings, see https://cmake.org/cmake/help/v3.17/module/FindPackageHandleStandardArgs.html - # Skip find_library for header only modules - list(FIND pcl_header_only_components ${component} _is_header_only) - if(_is_header_only EQUAL -1) - find_library(PCL_${COMPONENT}_LIBRARY - NAMES ${pcl_component}${PCL_RELEASE_SUFFIX} ${pcl_component}${PCL_RELWITHDEBINFO_SUFFIX} ${pcl_component}${PCL_MINSIZEREL_SUFFIX} - HINTS ${PCL_LIBRARY_DIRS} - DOC "path to ${pcl_component} library" - NO_DEFAULT_PATH) - get_filename_component(${component}_library_path - ${PCL_${COMPONENT}_LIBRARY} - PATH) - mark_as_advanced(PCL_${COMPONENT}_LIBRARY) - - find_library(PCL_${COMPONENT}_LIBRARY_DEBUG ${pcl_component}${PCL_DEBUG_SUFFIX} - HINTS ${PCL_LIBRARY_DIRS} - DOC "path to ${pcl_component} library debug" - NO_DEFAULT_PATH) - mark_as_advanced(PCL_${COMPONENT}_LIBRARY_DEBUG) - - if(PCL_${COMPONENT}_LIBRARY_DEBUG) - get_filename_component(${component}_library_path_debug - ${PCL_${COMPONENT}_LIBRARY_DEBUG} - PATH) - endif() - - # Restrict this to Windows users - if(NOT PCL_${COMPONENT}_LIBRARY AND WIN32) - # might be debug only - set(PCL_${COMPONENT}_LIBRARY ${PCL_${COMPONENT}_LIBRARY_DEBUG}) - endif() - - find_package_handle_standard_args(PCL_${COMPONENT} DEFAULT_MSG - PCL_${COMPONENT}_LIBRARY PCL_${COMPONENT}_INCLUDE_DIR) - else() - find_package_handle_standard_args(PCL_${COMPONENT} DEFAULT_MSG - PCL_${COMPONENT}_INCLUDE_DIR) - endif() - unset(FPHSA_NAME_MISMATCHED) - - if(PCL_${COMPONENT}_FOUND) - if(NOT "${PCL_${COMPONENT}_INCLUDE_DIRS}" STREQUAL "") - set(_filtered "") - foreach(_inc ${PCL_${COMPONENT}_INCLUDE_DIRS}) - if(EXISTS ${_inc}) - list(APPEND _filtered "${_inc}") - endif() - endforeach() - list(REMOVE_DUPLICATES _filtered) - set(PCL_${COMPONENT}_INCLUDE_DIRS ${_filtered}) - list(APPEND PCL_INCLUDE_DIRS ${_filtered}) - endif() - mark_as_advanced(PCL_${COMPONENT}_INCLUDE_DIRS) - if(_is_header_only EQUAL -1) - list(APPEND PCL_DEFINITIONS ${PCL_${COMPONENT}_DEFINITIONS}) - list(APPEND PCL_LIBRARY_DIRS ${component_library_path}) - if(PCL_${COMPONENT}_LIBRARY_DEBUG) - list(APPEND PCL_LIBRARY_DIRS ${component_library_path_debug}) - endif() - list(APPEND PCL_COMPONENTS ${pcl_component}) - mark_as_advanced(PCL_${COMPONENT}_LIBRARY PCL_${COMPONENT}_LIBRARY_DEBUG) - endif() - # Append internal dependencies - foreach(int_dep ${pcl_${component}_int_dep}) - string(TOUPPER "${int_dep}" INT_DEP) - if(PCL_${INT_DEP}_FOUND) - list(APPEND PCL_${COMPONENT}_INCLUDE_DIRS ${PCL_${INT_DEP}_INCLUDE_DIRS}) - if(PCL_${INT_DEP}_LIBRARIES) - list(APPEND PCL_${COMPONENT}_LINK_LIBRARIES "${PCL_${INT_DEP}_LIBRARIES}") - endif() - endif() - endforeach() - if(_is_header_only EQUAL -1) - add_library(${pcl_component} @PCL_LIB_TYPE@ IMPORTED) - if(PCL_${COMPONENT}_LIBRARY_DEBUG) - set_target_properties(${pcl_component} - PROPERTIES - IMPORTED_CONFIGURATIONS "RELEASE;DEBUG" - IMPORTED_LOCATION_RELEASE "${PCL_${COMPONENT}_LIBRARY}" - IMPORTED_LOCATION_DEBUG "${PCL_${COMPONENT}_LIBRARY_DEBUG}" - IMPORTED_IMPLIB_RELEASE "${PCL_${COMPONENT}_LIBRARY}" - IMPORTED_IMPLIB_DEBUG "${PCL_${COMPONENT}_LIBRARY_DEBUG}" - ) - else() - set_target_properties(${pcl_component} - PROPERTIES - IMPORTED_LOCATION "${PCL_${COMPONENT}_LIBRARY}" - IMPORTED_IMPLIB "${PCL_${COMPONENT}_LIBRARY}" - ) - endif() - else() # header-only - add_library(${pcl_component} INTERFACE IMPORTED) - endif() - - foreach(def ${PCL_DEFINITIONS}) - string(REPLACE " " ";" def2 ${def}) - string(REGEX REPLACE "^-D" "" def3 "${def2}") - list(APPEND definitions ${def3}) - endforeach() - if(CMAKE_VERSION VERSION_LESS 3.11) - set_target_properties(${pcl_component} - PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "${definitions}" - INTERFACE_COMPILE_OPTIONS "$<$:${PCL_COMPILE_OPTIONS}>" - INTERFACE_COMPILE_FEATURES "@PCL_CXX_COMPILE_FEATURES@" - INTERFACE_INCLUDE_DIRECTORIES "${PCL_${COMPONENT}_INCLUDE_DIRS};${PCL_CONF_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "${PCL_${COMPONENT}_LINK_LIBRARIES}" - ) - else() - set_target_properties(${pcl_component} - PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "${definitions}" - INTERFACE_COMPILE_OPTIONS "$<$:${PCL_COMPILE_OPTIONS}>" - INTERFACE_COMPILE_FEATURES "@PCL_CXX_COMPILE_FEATURES@" - INTERFACE_INCLUDE_DIRECTORIES "${PCL_${COMPONENT}_INCLUDE_DIRS};${PCL_CONF_INCLUDE_DIR}" - ) - # If possible, we use target_link_libraries to avoid problems with link-type keywords, - # see https://github.com/PointCloudLibrary/pcl/issues/2989 - # target_link_libraries on imported libraries is supported only since CMake 3.11 - target_link_libraries(${pcl_component} INTERFACE ${PCL_${COMPONENT}_LINK_LIBRARIES}) - endif() - set(PCL_${COMPONENT}_LIBRARIES ${pcl_component}) - endif() + # Add the targets file + include("${CMAKE_CURRENT_LIST_DIR}/pcl_${component}.cmake") + check_required_components(${component}) + list(APPEND PCL_LIBRARIES "pcl::pcl_${component}") endforeach() - -if(NOT "${PCL_INCLUDE_DIRS}" STREQUAL "") - list(REMOVE_DUPLICATES PCL_INCLUDE_DIRS) -endif() - -if(NOT "${PCL_LIBRARY_DIRS}" STREQUAL "") - list(REMOVE_DUPLICATES PCL_LIBRARY_DIRS) -endif() - -if(NOT "${PCL_DEFINITIONS}" STREQUAL "") - list(REMOVE_DUPLICATES PCL_DEFINITIONS) -endif() - -pcl_remove_duplicate_libraries(PCL_COMPONENTS PCL_LIBRARIES) - -# Add 3rd party libraries, as user code might include our .HPP implementations -list(APPEND PCL_LIBRARIES ${PCL_BOOST_LIBRARIES} ${PCL_OPENNI_LIBRARIES} ${PCL_OPENNI2_LIBRARIES} ${PCL_ENSENSO_LIBRARIES} ${PCL_davidSDK_LIBRARIES} ${PCL_DSSDK_LIBRARIES} ${PCL_RSSDK_LIBRARIES} ${PCL_RSSDK2_LIBRARIES} ${PCL_VTK_LIBRARIES}) -if (TARGET FLANN::FLANN) - list(APPEND PCL_LIBRARIES FLANN::FLANN) -endif() - -if(TARGET QHULL::QHULL) - list(APPEND PCL_LIBRARIES QHULL::QHULL) -endif() - -find_package_handle_standard_args(PCL DEFAULT_MSG PCL_LIBRARIES PCL_INCLUDE_DIRS) -mark_as_advanced(PCL_LIBRARIES PCL_INCLUDE_DIRS PCL_LIBRARY_DIRS) diff --git a/PCLConfigVersion.cmake.in b/PCLConfigVersion.cmake.in deleted file mode 100644 index e889ed57570..00000000000 --- a/PCLConfigVersion.cmake.in +++ /dev/null @@ -1,13 +0,0 @@ -# Check whether the requested PACKAGE_FIND_VERSION is compatible - -set(PACKAGE_VERSION @PCL_VERSION@) - -# Check whether the requested PACKAGE_FIND_VERSION is compatible -if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_COMPATIBLE FALSE) -else() - set(PACKAGE_VERSION_COMPATIBLE TRUE) - if("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_EXACT TRUE) - endif() -endif() diff --git a/cmake/pcl_find_cuda.cmake b/cmake/pcl_find_cuda.cmake index 03d0a40fc13..f249cce52f5 100644 --- a/cmake/pcl_find_cuda.cmake +++ b/cmake/pcl_find_cuda.cmake @@ -60,6 +60,7 @@ if(CUDA_FOUND) cmake_policy(SET CMP0104 NEW) set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH_BIN}) message(STATUS "CMAKE_CUDA_ARCHITECTURES: ${CMAKE_CUDA_ARCHITECTURES}") + PCL_ADD_LIBRARY(pcl_cuda COMPONENT ekstern_cuda) else() # Generate SASS set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH_BIN}) @@ -67,6 +68,7 @@ if(CUDA_FOUND) list(GET CUDA_ARCH_BIN -1 ver) set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -gencode arch=compute_${ver},code=compute_${ver}") message(STATUS "CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS}") + PCL_ADD_LIBRARY(pcl_cuda COMPONENT ekstern_cuda) endif () else() message(STATUS "CUDA was not found.") diff --git a/cmake/pcl_pclconfig.cmake b/cmake/pcl_pclconfig.cmake index f9941b14355..212e549926d 100644 --- a/cmake/pcl_pclconfig.cmake +++ b/cmake/pcl_pclconfig.cmake @@ -93,10 +93,18 @@ if(Boost_SERIALIZATION_FOUND) string(APPEND PCLCONFIG_AVAILABLE_BOOST_MODULES " serialization") endif() -configure_file("${PCL_SOURCE_DIR}/PCLConfig.cmake.in" - "${PCL_BINARY_DIR}/PCLConfig.cmake" @ONLY) -configure_file("${PCL_SOURCE_DIR}/PCLConfigVersion.cmake.in" - "${PCL_BINARY_DIR}/PCLConfigVersion.cmake" @ONLY) +include(CMakePackageConfigHelpers) + +configure_package_config_file(PCLConfig.cmake.in + ${PCL_BINARY_DIR}/PCLConfig.cmake + INSTALL_DESTINATION cmake + PATH_VARS INCLUDE_INSTALL_DIR) + +write_basic_package_version_file( + ${PCL_BINARY_DIR}/PCLConfigVersion.cmake + COMPATIBILITY AnyNewerVersion + ) + install(FILES "${PCL_BINARY_DIR}/PCLConfig.cmake" "${PCL_BINARY_DIR}/PCLConfigVersion.cmake" diff --git a/cmake/pcl_targets.cmake b/cmake/pcl_targets.cmake index be9da33cbc2..89afec33a75 100644 --- a/cmake/pcl_targets.cmake +++ b/cmake/pcl_targets.cmake @@ -198,15 +198,16 @@ function(PCL_ADD_LIBRARY _name) ) else() add_library(${_name} ${PCL_LIB_TYPE} ${ARGS_SOURCES}) - PCL_ADD_VERSION_INFO(${_name}) + target_compile_features(${_name} PUBLIC ${PCL_CXX_COMPILE_FEATURES}) - + target_include_directories(${_name} PUBLIC $ $ ) target_link_libraries(${_name} Threads::Threads) + if(TARGET OpenMP::OpenMP_CXX) target_link_libraries(${_name} OpenMP::OpenMP_CXX) endif() @@ -222,7 +223,11 @@ function(PCL_ADD_LIBRARY _name) if(MSVC) target_link_libraries(${_name} delayimp.lib) # because delay load is enabled for openmp.dll endif() + endif() + + PCL_ADD_VERSION_INFO(${_name}) + if(ARGS_SOURCES OR CMAKE_VERSION VERSION_GREATER_EQUAL 3.19) set_target_properties(${_name} PROPERTIES VERSION ${PCL_VERSION} SOVERSION ${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR} @@ -231,11 +236,21 @@ function(PCL_ADD_LIBRARY _name) set_target_properties(${_name} PROPERTIES FOLDER "Libraries") endif() + set_target_properties(${_name} PROPERTIES FOLDER "Libraries") + endif() install(TARGETS ${_name} + EXPORT ${_name}Targets RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} LIBRARY DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT}) + install( + EXPORT ${_name}Targets + NAMESPACE pcl:: + FILE ${_name}.cmake + DESTINATION ${PCLCONFIG_INSTALL_DIR} + ) + # Copy PDB if available if(MSVC AND ${PCL_LIB_TYPE} EQUAL "SHARED") install(FILES $ DESTINATION ${BIN_INSTALL_DIR} OPTIONAL) @@ -296,9 +311,17 @@ function(PCL_CUDA_ADD_LIBRARY _name) endif() install(TARGETS ${_name} + EXPORT ${_name}Targets RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} LIBRARY DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT}) + + install( + EXPORT ${_name}Targets + NAMESPACE pcl:: + FILE ${_name}.cmake + DESTINATION ${LIB_INSTALL_DIR}/cmake + ) endfunction() ############################################################################### @@ -926,7 +949,6 @@ macro(PCL_ADD_GRABBER_DEPENDENCY _name _description) message(STATUS "${_description}: not building because ${_name} not found") else() set(HAVE_${_name_capitalized} TRUE) - include_directories(SYSTEM "${${_name_capitalized}_INCLUDE_DIRS}") endif() endif() endmacro() diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index 68c106704d5..f1b2b7b15dd 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -1,13 +1,13 @@ set(SUBSYS_NAME io) set(SUBSYS_DESC "Point cloud IO library") -set(SUBSYS_DEPS common octree) +set(SUBSYS_DEPS common io_ply octree) set(SUBSYS_EXT_DEPS boost eigen3) PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON) if(WIN32) PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk rssdk rssdk2 pcap png vtk OpenMP EXT_DEPS ${SUBSYS_EXT_DEPS}) else() - PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk pcap png vtk libusb OpenMP EXT_DEPS ${SUBSYS_EXT_DEPS}) + PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS openni openni2 ensenso davidSDK dssdk rssdk rssdk2 pcap png vtk OpenMP libusb EXT_DEPS ${SUBSYS_EXT_DEPS}) endif() PCL_ADD_DOC("${SUBSYS_NAME}") @@ -195,22 +195,6 @@ if(VTK_FOUND AND NOT ANDROID) set(VTK_DEFINES -DPCL_BUILT_WITH_VTK) endif() -set(PLY_SOURCES src/ply/ply_parser.cpp) -set(PLY_INCLUDES - "include/pcl/${SUBSYS_NAME}/ply/byte_order.h" - "include/pcl/${SUBSYS_NAME}/ply/io_operators.h" - "include/pcl/${SUBSYS_NAME}/ply/ply.h" - "include/pcl/${SUBSYS_NAME}/ply/ply_parser.h" -) - -PCL_ADD_LIBRARY(pcl_io_ply COMPONENT ${SUBSYS_NAME} SOURCES ${PLY_SOURCES} ${PLY_INCLUDES}) -if(MINGW) - # libws2_32 isn't added by default for MinGW - target_link_libraries(pcl_io_ply ws2_32) -endif() -PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/ply" ${PLY_INCLUDES}) -target_link_libraries(pcl_io_ply pcl_common Boost::boost) - PCL_MAKE_PKGCONFIG(pcl_io_ply COMPONENT ${SUBSYS_NAME} DESC "${SUBSYS_DESC}, PLY" PCL_DEPS common) set(srcs @@ -338,7 +322,8 @@ add_definitions(${VTK_DEFINES}) PCL_ADD_LIBRARY(${LIB_NAME} COMPONENT ${SUBSYS_NAME} SOURCES ${srcs} ${incs} ${compression_incs} ${impl_incs} ${OPENNI_INCLUDES} ${OPENNI2_INCLUDES}) -target_link_libraries("${LIB_NAME}" Boost::boost Boost::iostreams pcl_common pcl_io_ply pcl_octree) +target_link_libraries("${LIB_NAME}" Boost::boost Boost::iostreams pcl_common pcl_io_ply) + if(TARGET Boost::filesystem) target_link_libraries("${LIB_NAME}" Boost::filesystem) endif() @@ -378,10 +363,12 @@ if(LIBUSB_FOUND) endif() if(WITH_OPENNI2) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${OPENNI2_INCLUDE_DIRS}) target_link_libraries(${LIB_NAME} ${OPENNI2_LIBRARIES}) endif() if(WITH_OPENNI) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${OPENNI_INCLUDE_DIRS}) target_link_libraries("${LIB_NAME}" ${OPENNI_LIBRARIES}) if(VTK_FOUND AND (NOT ${VTK_VERSION} VERSION_LESS 9.0)) target_link_libraries("${LIB_NAME}" VTK::FiltersCore VTK::FiltersGeneral) @@ -389,6 +376,7 @@ if(WITH_OPENNI) endif() if(WITH_FZAPI) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${FZAPI_INCLUDE_DIRS}) target_link_libraries("${LIB_NAME}" ${FZAPI_LIBS}) if(WIN32) target_link_libraries("${LIB_NAME}" Version.lib) @@ -396,26 +384,32 @@ if(WITH_FZAPI) endif() if(WITH_ENSENSO) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${ENSENSO_INCLUDE_DIRS}) target_link_libraries(${LIB_NAME} ${ENSENSO_LIBRARIES}) endif() if(WITH_DAVIDSDK) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${DAVIDSDK_INCLUDE_DIRS}) target_link_libraries(${LIB_NAME} ${DAVIDSDK_LIBRARIES}) endif() if(WITH_DSSDK) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${DSSDK_INCLUDE_DIRS}) target_link_libraries(${LIB_NAME} ${DSSDK_LIBRARIES}) endif() if(WITH_RSSDK) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${RSSDK_INCLUDE_DIRS}) target_link_libraries(${LIB_NAME} ${RSSDK_LIBRARIES}) endif() if(WITH_RSSDK2) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${RSSDK2_INCLUDE_DIRS}) target_link_libraries(${LIB_NAME} ${RSSDK2_LIBRARIES}) endif() if(PCAP_FOUND) + target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${PCAP_INCLUDE_DIRS}) target_link_libraries("${LIB_NAME}" ${PCAP_LIBRARIES}) endif() diff --git a/io/include/pcl/io/ply_io.h b/io/include/pcl/io/ply_io.h index dbad3424a3a..0e802f17768 100644 --- a/io/include/pcl/io/ply_io.h +++ b/io/include/pcl/io/ply_io.h @@ -43,7 +43,7 @@ #include #include // for copyPointCloud #include -#include +#include #include #include diff --git a/io_ply/CMakeLists.txt b/io_ply/CMakeLists.txt new file mode 100644 index 00000000000..2e66c2ff535 --- /dev/null +++ b/io_ply/CMakeLists.txt @@ -0,0 +1,30 @@ +#Helper library +set(SUBSYS_NAME io_ply) +set(SUBSYS_DESC "Point cloud IO ply library") +set(SUBSYS_DEPS common) +set(SUBSYS_EXT_DEPS boost eigen3) + +set(PLY_SOURCES src/ply_parser.cpp) +set(PLY_INCLUDES + "include/pcl/io_ply/byte_order.h" + "include/pcl/io_ply/io_operators.h" + "include/pcl/io_ply/ply.h" + "include/pcl/io_ply/ply_parser.h" +) + +PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON) +PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS ${EXT_DEPS}) + +if(NOT build) + return() +endif() + +set(LIB_NAME "pcl_${SUBSYS_NAME}") +PCL_ADD_LIBRARY(${LIB_NAME} COMPONENT ${SUBSYS_NAME} SOURCES ${PLY_SOURCES} ${PLY_INCLUDES}) +if(MINGW) + # libws2_32 isn't added by default for MinGW + target_link_libraries(${LIB_NAME} ws2_32) +endif() +PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}/ply" ${PLY_INCLUDES}) + +target_link_libraries(${LIB_NAME} pcl_common Boost::boost) diff --git a/io/include/pcl/io/ply/byte_order.h b/io_ply/include/pcl/io_ply/byte_order.h similarity index 100% rename from io/include/pcl/io/ply/byte_order.h rename to io_ply/include/pcl/io_ply/byte_order.h diff --git a/io/include/pcl/io/ply/io_operators.h b/io_ply/include/pcl/io_ply/io_operators.h similarity index 100% rename from io/include/pcl/io/ply/io_operators.h rename to io_ply/include/pcl/io_ply/io_operators.h diff --git a/io/include/pcl/io/ply/ply.h b/io_ply/include/pcl/io_ply/ply.h similarity index 99% rename from io/include/pcl/io/ply/ply.h rename to io_ply/include/pcl/io_ply/ply.h index f658ed69a88..cfaf88523de 100644 --- a/io/include/pcl/io/ply/ply.h +++ b/io_ply/include/pcl/io_ply/ply.h @@ -40,7 +40,7 @@ #pragma once -#include +#include #include // for int8_t, int16_t, ... /** \file ply.h contains standard typedefs and generic type traits diff --git a/io/include/pcl/io/ply/ply_parser.h b/io_ply/include/pcl/io_ply/ply_parser.h similarity index 99% rename from io/include/pcl/io/ply/ply_parser.h rename to io_ply/include/pcl/io_ply/ply_parser.h index 244f3719506..560f0414afe 100644 --- a/io/include/pcl/io/ply/ply_parser.h +++ b/io_ply/include/pcl/io_ply/ply_parser.h @@ -40,8 +40,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/io/src/ply/ply_parser.cpp b/io_ply/src/ply_parser.cpp similarity index 99% rename from io/src/ply/ply_parser.cpp rename to io_ply/src/ply_parser.cpp index 7e79d2d6162..ebdd60a5d90 100644 --- a/io/src/ply/ply_parser.cpp +++ b/io_ply/src/ply_parser.cpp @@ -38,7 +38,7 @@ * */ -#include +#include #include // for find_if #include // for ifstream diff --git a/octree/CMakeLists.txt b/octree/CMakeLists.txt index 43e07b9a53f..71a6302b63f 100644 --- a/octree/CMakeLists.txt +++ b/octree/CMakeLists.txt @@ -47,8 +47,11 @@ set(impl_incs ) set(LIB_NAME "pcl_${SUBSYS_NAME}") + PCL_ADD_LIBRARY(${LIB_NAME} COMPONENT ${SUBSYS_NAME} SOURCES ${srcs} ${incs} ${impl_incs}) + target_link_libraries("${LIB_NAME}" pcl_common) + PCL_MAKE_PKGCONFIG(${LIB_NAME} COMPONENT ${SUBSYS_NAME} DESC ${SUBSYS_DESC} PCL_DEPS ${SUBSYS_DEPS}) # Install include files diff --git a/recognition/CMakeLists.txt b/recognition/CMakeLists.txt index 0e1e7c011bd..329c482027e 100644 --- a/recognition/CMakeLists.txt +++ b/recognition/CMakeLists.txt @@ -133,8 +133,15 @@ set(metslib_incs ) set(LIB_NAME "pcl_${SUBSYS_NAME}") + PCL_ADD_LIBRARY(${LIB_NAME} COMPONENT ${SUBSYS_NAME} SOURCES ${srcs} ${incs} ${impl_incs} ${face_detection_incs} ${ransac_based_incs} ${ransac_based_impl_incs} ${hv_incs} ${hv_impl_incs} ${cg_incs} ${cg_impl_incs} ${metslib_incs}) + target_link_libraries("${LIB_NAME}" pcl_common pcl_kdtree pcl_octree pcl_search pcl_features pcl_registration pcl_sample_consensus pcl_filters pcl_ml pcl_io) + target_include_directories(${LIB_NAME} PUBLIC + $ + $ + ) + PCL_MAKE_PKGCONFIG(${LIB_NAME} COMPONENT ${SUBSYS_NAME} DESC ${SUBSYS_DESC} PCL_DEPS ${SUBSYS_DEPS}) # Install include files PCL_ADD_INCLUDES("${SUBSYS_NAME}" "${SUBSYS_NAME}" ${incs}) diff --git a/tools/ply2obj.cpp b/tools/ply2obj.cpp index df1e4094651..9cc7d9026e3 100644 --- a/tools/ply2obj.cpp +++ b/tools/ply2obj.cpp @@ -38,7 +38,7 @@ * */ -#include +#include #include #include diff --git a/tools/ply2ply.cpp b/tools/ply2ply.cpp index e749f4b2c69..c54bce1e993 100644 --- a/tools/ply2ply.cpp +++ b/tools/ply2ply.cpp @@ -37,7 +37,7 @@ * */ -#include +#include #include #include diff --git a/tools/ply2raw.cpp b/tools/ply2raw.cpp index 1fd1f833ab9..edf60b545b0 100644 --- a/tools/ply2raw.cpp +++ b/tools/ply2raw.cpp @@ -37,7 +37,7 @@ * */ -#include +#include #include #include From 0d3bf2c634e7b8bf6ed0f3336d9407093802af35 Mon Sep 17 00:00:00 2001 From: Lars Glud Date: Sun, 5 Oct 2025 11:49:27 +0200 Subject: [PATCH 2/5] Rename dependency variables to what is actually used in find_package calls. add AVX compile options to libraries. Add alias naming with namespace prefix. Add export of PCLTargets. --- CMakeLists.txt | 19 +- PCLConfig.cmake.in | 415 ++--------------------------------- cmake/pcl_targets.cmake | 64 +++--- common/CMakeLists.txt | 2 +- io/CMakeLists.txt | 4 +- kdtree/CMakeLists.txt | 2 +- search/CMakeLists.txt | 2 +- simulation/CMakeLists.txt | 2 +- surface/CMakeLists.txt | 2 +- visualization/CMakeLists.txt | 2 +- 10 files changed, 73 insertions(+), 441 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3df772ae8b7..6920f26ac5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,6 +95,11 @@ include("${PCL_SOURCE_DIR}/cmake/pcl_verbosity.cmake") include("${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake") include("${PCL_SOURCE_DIR}/cmake/pcl_options.cmake") include("${PCL_SOURCE_DIR}/cmake/clang-format.cmake") +include("${PCL_SOURCE_DIR}/cmake/pcl_utils.cmake") +DISSECT_VERSION() +GET_OS_INFO() +SET_INSTALL_DIRS() + if(${PCL_ENABLE_CCACHE}) include (UseCompilerCache) @@ -247,11 +252,6 @@ if(CMAKE_COMPILER_IS_CLANG) set(CLANG_LIBRARIES "stdc++") endif() -include("${PCL_SOURCE_DIR}/cmake/pcl_utils.cmake") -DISSECT_VERSION() -GET_OS_INFO() -SET_INSTALL_DIRS() - if(WIN32) set(PCL_RESOURCES_DIR "${PCL_SOURCE_DIR}/resources") set(PCL_POINTCLOUDS_DIR "${PCL_RESOURCES_DIR}/pointclouds") @@ -487,7 +487,7 @@ unset(CMAKE_REQUIRED_LIBRARIES) ### --[ Set variables for pcl_config.h if (BUILD_visualization) - set(PCL_VISUALIZATION_AVAILABLE TRUE) + set(visualization_AVAILABLE TRUE) endif() ### ---[ Create the config.h file @@ -506,6 +506,13 @@ foreach(subdir ${PCL_MODULES_DIRS}) add_subdirectory("${PCL_SOURCE_DIR}/${subdir}") endforeach() + +install( + EXPORT PCLTargets + NAMESPACE PCL:: + DESTINATION cmake +) + ### ---[ Documentation add_subdirectory(doc) diff --git a/PCLConfig.cmake.in b/PCLConfig.cmake.in index 519bb8d4a97..49871ae1198 100644 --- a/PCLConfig.cmake.in +++ b/PCLConfig.cmake.in @@ -1,406 +1,39 @@ -# ------------------------------------------------------------------------------------ -# Helper to use PCL from outside project -# -# Search for PCL: -# Request all PCL modules: -# find_package(PCL CONFIG REQUIRED) -# Or request only specific PCL modules: -# find_package(PCL CONFIG REQUIRED COMPONENTS xxx yyy) -# -# Link to PCL: -# Link to all found PCL modules: -# target_link_libraries(my_fabulous_target ${PCL_LIBRARIES}) -# Or link only to specific modules: -# target_link_libraries(my_fabulous_target pcl_xxx pcl_yyy) -# -# Where xxx and yyy are module names from the following list: -# @PCLCONFIG_AVAILABLE_COMPONENTS_LIST@ -# -# Some additional variables are set by PCLConfig.cmake, which are not needed when -# using the (modern) linking approach described above: -# PCL_INCLUDE_DIRS is filled with PCL and available 3rdparty headers -# PCL_LIBRARY_DIRS is filled with PCL components libraries install directory and -# 3rdparty libraries paths -# -# www.pointclouds.org -#------------------------------------------------------------------------------------ - -include(CMakeFindDependencyMacro) -cmake_policy(VERSION 3.16.3) - -set(PCL_VERSION @CMAKE_PROJECT_VERSION@) - @PACKAGE_INIT@ -set_and_check(PCL_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") -if(POLICY CMP0144) - cmake_policy(SET CMP0144 NEW) -endif() - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/Modules") -### ---[ some useful macros -macro(pcl_report_not_found _reason) - unset(PCL_FOUND) - unset(PCL_LIBRARIES) - unset(PCL_COMPONENTS) - unset(PCL_INCLUDE_DIRS) - unset(PCL_LIBRARY_DIRS) - unset(PCL_DEFINITIONS) - if(PCL_FIND_REQUIRED) - message(FATAL_ERROR ${_reason}) - elseif(NOT PCL_FIND_QUIETLY) - message(WARNING ${_reason}) - endif() - return() -endmacro() - -macro(pcl_message) - if(NOT PCL_FIND_QUIETLY) - message(${ARGN}) - endif() -endmacro() - -### ---[ 3rd party libraries -macro(find_boost) - if(PCL_ALL_IN_ONE_INSTALLER) - set(BOOST_ROOT "${PCL_ROOT}/3rdParty/Boost") - elseif(NOT BOOST_INCLUDEDIR) - set(BOOST_INCLUDEDIR "@Boost_INCLUDE_DIR@") - endif() - - find_package(Boost 1.71.0 ${QUIET_} COMPONENTS @PCLCONFIG_AVAILABLE_BOOST_MODULES@ CONFIG) - - set(BOOST_FOUND ${Boost_FOUND}) - set(BOOST_INCLUDE_DIRS "${Boost_INCLUDE_DIR}") - set(BOOST_LIBRARY_DIRS "${Boost_LIBRARY_DIRS}") - set(BOOST_LIBRARIES ${Boost_LIBRARIES}) - if(WIN32 AND NOT MINGW AND NOT "${BOOST_DEFINITIONS}" MATCHES "BOOST_ALL_NO_LIB") - string(APPEND BOOST_DEFINITIONS -DBOOST_ALL_NO_LIB) - endif() -endmacro() - -macro(find_eigen3) - if(PCL_ALL_IN_ONE_INSTALLER) - set(Eigen3_DIR "${PCL_ROOT}/3rdParty/Eigen3/share/eigen3/cmake/") - endif() - find_package(Eigen3 REQUIRED NO_MODULE) - if (Eigen3_VERSION VERSION_LESS 3.3) - message(FATAL_ERROR "Eigen version>=3.3 is required, but found ${Eigen3_VERSION}") - endif() - if(NOT EIGEN3_FOUND AND Eigen3_FOUND) - set(EIGEN3_FOUND ${Eigen3_FOUND}) - endif() - # In very new Eigen versions, EIGEN3_INCLUDE_DIR(S) is not defined any more, only the target: - if(TARGET Eigen3::Eigen) - set(EIGEN3_LIBRARIES Eigen3::Eigen) - endif() -endmacro() - -#remove this as soon as qhull is shipped with FindQhull.cmake -macro(find_qhull) - if(PCL_ALL_IN_ONE_INSTALLER) - set(QHULL_ROOT "${PCL_ROOT}/3rdParty/Qhull") - elseif(NOT QHULL_ROOT) - get_filename_component(QHULL_ROOT "@QHULL_INCLUDE_DIRS@" PATH) - endif() - - set(PCL_QHULL_REQUIRED_TYPE @PCL_QHULL_REQUIRED_TYPE@) - find_package(Qhull) -endmacro() - -#remove this as soon as libopenni is shipped with FindOpenni.cmake -macro(find_openni) - if(PCL_FIND_QUIETLY) - set(OpenNI_FIND_QUIETLY TRUE) - endif() - - if(NOT OPENNI_ROOT AND ("@HAVE_OPENNI@" STREQUAL "TRUE")) - set(OPENNI_INCLUDE_DIRS_HINT "@OPENNI_INCLUDE_DIRS@") - get_filename_component(OPENNI_LIBRARY_HINT "@OPENNI_LIBRARY@" PATH) - endif() - - find_package(OpenNI) -endmacro() - -#remove this as soon as libopenni2 is shipped with FindOpenni2.cmake -macro(find_openni2) - if(PCL_FIND_QUIETLY) - set(OpenNI2_FIND_QUIETLY TRUE) - endif() - - if(NOT OPENNI2_ROOT AND ("@HAVE_OPENNI2@" STREQUAL "TRUE")) - set(OPENNI2_INCLUDE_DIRS_HINT "@OPENNI2_INCLUDE_DIRS@") - get_filename_component(OPENNI2_LIBRARY_HINT "@OPENNI2_LIBRARY@" PATH) - endif() - - find_package(OpenNI2) -endmacro() - -#remove this as soon as the Ensenso SDK is shipped with FindEnsenso.cmake -macro(find_ensenso) - if(PCL_FIND_QUIETLY) - set(ensenso_FIND_QUIETLY TRUE) - endif() - - if(NOT ENSENSO_ROOT AND ("@HAVE_ENSENSO@" STREQUAL "TRUE")) - get_filename_component(ENSENSO_ABI_HINT "@ENSENSO_INCLUDE_DIR@" PATH) - endif() - - find_package(Ensenso) -endmacro() - -#remove this as soon as the davidSDK is shipped with FinddavidSDK.cmake -macro(find_davidSDK) - if(PCL_FIND_QUIETLY) - set(DAVIDSDK_FIND_QUIETLY TRUE) - endif() - - if(NOT davidSDK_ROOT AND ("@HAVE_DAVIDSDK@" STREQUAL "TRUE")) - get_filename_component(DAVIDSDK_ABI_HINT @DAVIDSDK_INCLUDE_DIR@ PATH) - endif() - - find_package(davidSDK) -endmacro() - -macro(find_dssdk) - if(PCL_FIND_QUIETLY) - set(DSSDK_FIND_QUIETLY TRUE) - endif() - if(NOT DSSDK_DIR AND ("@HAVE_DSSDK@" STREQUAL "TRUE")) - get_filename_component(DSSDK_DIR_HINT "@DSSDK_INCLUDE_DIRS@" PATH) - endif() - - find_package(DSSDK) -endmacro() - -macro(find_rssdk) - if(PCL_FIND_QUIETLY) - set(RSSDK_FIND_QUIETLY TRUE) - endif() - if(NOT RSSDK_DIR AND ("@HAVE_RSSDK@" STREQUAL "TRUE")) - get_filename_component(RSSDK_DIR_HINT "@RSSDK_INCLUDE_DIRS@" PATH) - endif() - - find_package(RSSDK) -endmacro() - -macro(find_rssdk2) - if(PCL_ALL_IN_ONE_INSTALLER) - set(realsense2_DIR "${PCL_ROOT}/3rdParty/librealsense2/lib/cmake/realsense2" CACHE PATH "The directory containing realsense2Config.cmake") - elseif(NOT realsense2_DIR) - get_filename_component(realsense2_DIR "@REALSENSE2_INCLUDE_DIRS@" PATH) - set(realsense2_DIR "${realsense2_DIR}/lib/cmake/realsense2" CACHE PATH "The directory containing realsense2Config.cmake") - endif() - find_package(RSSDK2) -endmacro() - -#remove this as soon as flann is shipped with FindFlann.cmake -macro(find_flann) - if(PCL_ALL_IN_ONE_INSTALLER) - set(FLANN_ROOT "${PCL_ROOT}/3rdParty/Flann") - elseif(NOT FLANN_ROOT) - set(FLANN_ROOT "@FLANN_ROOT@") - endif() - - set(PCL_FLANN_REQUIRED_TYPE @PCL_FLANN_REQUIRED_TYPE@) - find_package(FLANN) -endmacro() - -macro(find_VTK) - if(PCL_ALL_IN_ONE_INSTALLER AND NOT ANDROID) - if(EXISTS "${PCL_ROOT}/3rdParty/VTK/lib/cmake") - set(VTK_DIR "${PCL_ROOT}/3rdParty/VTK/lib/cmake/vtk-@VTK_MAJOR_VERSION@.@VTK_MINOR_VERSION@" CACHE PATH "The directory containing VTKConfig.cmake") - else() - set(VTK_DIR "${PCL_ROOT}/3rdParty/VTK/lib/vtk-@VTK_MAJOR_VERSION@.@VTK_MINOR_VERSION@" CACHE PATH "The directory containing VTKConfig.cmake") - endif() - elseif(NOT VTK_DIR AND NOT ANDROID) - set(VTK_DIR "@VTK_DIR@" CACHE PATH "The directory containing VTKConfig.cmake") - endif() - if(NOT ANDROID) - find_package(VTK ${QUIET_} COMPONENTS ${PCL_VTK_COMPONENTS}) - endif() -endmacro() - -macro(find_libusb) - find_package(libusb) -endmacro() - -macro(find_glew) - find_package(GLEW) -endmacro() - -# Finds each component external libraries if any -# The functioning is as following -# try to find _lib -# |--> _lib found ==> include the headers, -# | link to its library directories or include _lib_USE_FILE -# `--> _lib not found -# |--> _lib is optional ==> disable it (thanks to the guardians) -# | and warn -# `--> _lib is required -# |--> component is required explicitly ==> error -# `--> component is induced ==> warn and remove it -# from the list - -function(find_external_library _component _lib _is_optional) - if("${_lib}" STREQUAL "boost") - find_boost() - elseif("${_lib}" STREQUAL "eigen3") - find_eigen3() - elseif("${_lib}" STREQUAL "flann") - find_flann() - elseif("${_lib}" STREQUAL "qhull") - find_qhull() - elseif("${_lib}" STREQUAL "openni") - find_openni() - elseif("${_lib}" STREQUAL "openni2") - find_openni2() - elseif("${_lib}" STREQUAL "ensenso") - find_ensenso() - elseif("${_lib}" STREQUAL "davidSDK") - find_davidSDK() - elseif("${_lib}" STREQUAL "dssdk") - find_dssdk() - elseif("${_lib}" STREQUAL "rssdk") - find_rssdk() - elseif("${_lib}" STREQUAL "rssdk2") - find_rssdk2() - elseif("${_lib}" STREQUAL "vtk") - find_VTK() - elseif("${_lib}" STREQUAL "libusb") - find_libusb() - elseif("${_lib}" STREQUAL "glew") - find_glew() - elseif("${_lib}" STREQUAL "opengl") - find_package(OpenGL) - elseif("${_lib}" STREQUAL "pcap") - find_package(Pcap) - elseif("${_lib}" STREQUAL "png") - find_package(PNG) - elseif("${_lib}" STREQUAL "OpenMP") - find_package(OpenMP COMPONENTS CXX) - # the previous find_package call sets OpenMP_CXX_LIBRARIES, but not OPENMP_LIBRARIES, which is used further down - # we can link to the CMake target OpenMP::OpenMP_CXX by setting the following: - set(OPENMP_LIBRARIES OpenMP::OpenMP_CXX) - else() - message(WARNING "${_lib} is not handled by find_external_library") - endif() - - string(TOUPPER "${_component}" COMPONENT) - string(TOUPPER "${_lib}" LIB) - string(REGEX REPLACE "[.-]" "_" LIB "${LIB}") - - if(${LIB}_FOUND) - list(APPEND PCL_${COMPONENT}_INCLUDE_DIRS ${${LIB}_INCLUDE_DIRS}) - set(PCL_${COMPONENT}_INCLUDE_DIRS ${PCL_${COMPONENT}_INCLUDE_DIRS} PARENT_SCOPE) - - if(${LIB} MATCHES "VTK") - if(${${LIB}_VERSION_MAJOR} GREATER_EQUAL 9) - set(ISVTK9ORGREATER TRUE) - endif() - endif() - else() - if("${_is_optional}" STREQUAL "OPTIONAL") - list(APPEND PCL_${COMPONENT}_DEFINITIONS "-DDISABLE_${LIB}") - pcl_message("** WARNING ** ${_component} features related to ${_lib} will be disabled") - elseif("${_is_optional}" STREQUAL "REQUIRED") - if((NOT PCL_FIND_ALL) OR (PCL_FIND_ALL EQUAL 1)) - pcl_report_not_found("${_component} is required but ${_lib} was not found") - elseif(PCL_FIND_ALL EQUAL 0) - # raise error and remove _component from PCL_TO_FIND_COMPONENTS - string(TOUPPER "${_component}" COMPONENT) - pcl_message("** WARNING ** ${_component} will be disabled cause ${_lib} was not found") - list(REMOVE_ITEM PCL_TO_FIND_COMPONENTS ${_component}) - endif() - endif() - endif() -endfunction() - -#flatten dependencies recursivity is great \o/ -macro(compute_dependencies TO_FIND_COMPONENTS) - foreach(component ${${TO_FIND_COMPONENTS}}) - set(pcl_component pcl_${component}) - if(${pcl_component}_int_dep AND (NOT PCL_FIND_ALL)) - foreach(dependency ${${pcl_component}_int_dep}) - list(FIND ${TO_FIND_COMPONENTS} ${component} pos) - list(FIND ${TO_FIND_COMPONENTS} ${dependency} found) - if(found EQUAL -1) - set(pcl_dependency pcl_${dependency}) - if(${pcl_dependency}_int_dep) - list(INSERT ${TO_FIND_COMPONENTS} ${pos} ${dependency}) - if(pcl_${dependency}_ext_dep) - list(APPEND pcl_${component}_ext_dep ${pcl_${dependency}_ext_dep}) - endif() - if(pcl_${dependency}_opt_dep) - list(APPEND pcl_${component}_opt_dep ${pcl_${dependency}_opt_dep}) - endif() - compute_dependencies(${TO_FIND_COMPONENTS}) - else() - list(INSERT ${TO_FIND_COMPONENTS} 0 ${dependency}) - endif() - endif() - endforeach() - endif() - endforeach() -endmacro() - -set(PCL_RELWITHDEBINFO_SUFFIX "@CMAKE_RELWITHDEBINFO_POSTFIX@") -set(PCL_MINSIZEREL_SUFFIX "@CMAKE_MINSIZEREL_POSTFIX@") -set(pcl_all_components @PCLCONFIG_AVAILABLE_COMPONENTS@) -# insert "io_ply" before "io" -list(FIND pcl_all_components "io" pcl_pos_io) -list(INSERT pcl_all_components ${pcl_pos_io} "io_ply") -unset(pcl_pos_io) -list(LENGTH pcl_all_components PCL_NB_COMPONENTS) - -#list each component dependencies IN PCL -@PCLCONFIG_INTERNAL_DEPENDENCIES@ +include(CMakeFindDependencyMacro) -#list each component external dependencies (ext means mandatory and opt means optional) @PCLCONFIG_EXTERNAL_DEPENDENCIES@ @PCLCONFIG_OPTIONAL_DEPENDENCIES@ -# io_ply subcomponent -list(APPEND pcl_io_int_dep io_ply) -set(pcl_io_ply_int_dep common) -set(pcl_io_ply_ext_dep boost) - -# VTK components required by PCL -set(PCL_VTK_COMPONENTS "@PCL_VTK_COMPONENTS@") - -#check if user provided a list of components -#if no components at all or full list is given set PCL_FIND_ALL -if(PCL_FIND_COMPONENTS) - list(LENGTH PCL_FIND_COMPONENTS PCL_FIND_COMPONENTS_LENGTH) - if(PCL_FIND_COMPONENTS_LENGTH EQUAL PCL_NB_COMPONENTS) - set(PCL_TO_FIND_COMPONENTS ${pcl_all_components}) - set(PCL_FIND_ALL 1) - else() - set(PCL_TO_FIND_COMPONENTS ${PCL_FIND_COMPONENTS}) - endif() -else() - set(PCL_TO_FIND_COMPONENTS ${pcl_all_components}) - set(PCL_FIND_ALL 1) +if(@WITH_OPENMP@) + find_dependency(OpenMP) endif() -compute_dependencies(PCL_TO_FIND_COMPONENTS) +set(PCLComponents @PCLCONFIG_AVAILABLE_COMPONENTS@) -# compute external dependencies per component -foreach(component ${PCL_TO_FIND_COMPONENTS}) - foreach(opt ${pcl_${component}_opt_dep}) - find_external_library(${component} ${opt} OPTIONAL) - endforeach() - foreach(ext ${pcl_${component}_ext_dep}) - find_external_library(${component} ${ext} REQUIRED) - endforeach() +foreach(_component ${PCLComponents}) + foreach(_externComponent ${pcl_${_component}_ext_dep}) + find_dependency(${_externComponent}) + endforeach() + foreach(_optComponent ${pcl_${_component}_opt_dep}) + find_package(${_optComponent}) + if(NOT ${_optComponent}_FOUND) + message(STATUS "Optional dependency ${_optComponent} for PCL component ${_component} not found.") + endif() + endforeach() endforeach() -set(PCL_LIBRARIES) -foreach(component ${PCL_TO_FIND_COMPONENTS}) - # Add the targets file - include("${CMAKE_CURRENT_LIST_DIR}/pcl_${component}.cmake") - check_required_components(${component}) - list(APPEND PCL_LIBRARIES "pcl::pcl_${component}") +include("${CMAKE_CURRENT_LIST_DIR}/PCLTargets.cmake") + +# iterate through components attempting to be found +foreach(component ${${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS}) + # if we couldn't find the component, set the phrases library to no + # longer be found and notify the user about the missing component + if (NOT ${component} IN_LIST PCLComponents) + set(PCL_FOUND False) + set(PCL_NOT_FOUND_MESSAGE "Unsupported component: ${component}") + endif() endforeach() diff --git a/cmake/pcl_targets.cmake b/cmake/pcl_targets.cmake index 89afec33a75..a514e49bdbb 100644 --- a/cmake/pcl_targets.cmake +++ b/cmake/pcl_targets.cmake @@ -223,33 +223,25 @@ function(PCL_ADD_LIBRARY _name) if(MSVC) target_link_libraries(${_name} delayimp.lib) # because delay load is enabled for openmp.dll endif() - endif() - - PCL_ADD_VERSION_INFO(${_name}) - - if(ARGS_SOURCES OR CMAKE_VERSION VERSION_GREATER_EQUAL 3.19) + set_target_properties(${_name} PROPERTIES VERSION ${PCL_VERSION} SOVERSION ${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR} DEFINE_SYMBOL "PCLAPI_EXPORTS") - set_target_properties(${_name} PROPERTIES FOLDER "Libraries") - endif() - set_target_properties(${_name} PROPERTIES FOLDER "Libraries") endif() + + PCL_ADD_VERSION_INFO(${_name}) + + add_library(PCL::${_name} ALIAS ${_name}) + install(TARGETS ${_name} - EXPORT ${_name}Targets - RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} - LIBRARY DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} - ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT}) - - install( - EXPORT ${_name}Targets - NAMESPACE pcl:: - FILE ${_name}.cmake - DESTINATION ${PCLCONFIG_INSTALL_DIR} - ) + EXPORT PCLTargets + RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} + LIBRARY DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} + ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT}) + # Copy PDB if available if(MSVC AND ${PCL_LIB_TYPE} EQUAL "SHARED") @@ -277,6 +269,7 @@ function(PCL_CUDA_ADD_LIBRARY _name) endif() REMOVE_VTK_DEFINITIONS() + if(NOT ARGS_SOURCES) add_library(${_name} INTERFACE) @@ -284,44 +277,43 @@ function(PCL_CUDA_ADD_LIBRARY _name) $ $ ) - else() add_library(${_name} ${PCL_LIB_TYPE} ${ARGS_SOURCES}) - - PCL_ADD_VERSION_INFO(${_name}) - + target_compile_options(${_name} PRIVATE $<$: ${GEN_CODE} --expt-relaxed-constexpr>) target_include_directories(${_name} PUBLIC $ $ ) - + target_include_directories(${_name} PRIVATE ${CUDA_TOOLKIT_INCLUDE}) if(MSVC) target_link_libraries(${_name} delayimp.lib) # because delay load is enabled for openmp.dll endif() - + set_target_properties(${_name} PROPERTIES VERSION ${PCL_VERSION} SOVERSION ${PCL_VERSION_MAJOR}.${PCL_VERSION_MINOR} DEFINE_SYMBOL "PCLAPI_EXPORTS") set_target_properties(${_name} PROPERTIES FOLDER "Libraries") endif() + + PCL_ADD_VERSION_INFO(${_name}) + + add_library(PCL::${_name} ALIAS ${_name}) install(TARGETS ${_name} - EXPORT ${_name}Targets - RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} - LIBRARY DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} - ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT}) - - install( - EXPORT ${_name}Targets - NAMESPACE pcl:: - FILE ${_name}.cmake - DESTINATION ${LIB_INSTALL_DIR}/cmake - ) + EXPORT PCLTargets + RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} + LIBRARY DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT} + ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT pcl_${ARGS_COMPONENT}) + + # Copy PDB if available + if(MSVC AND ${PCL_LIB_TYPE} EQUAL "SHARED") + install(FILES $ DESTINATION ${BIN_INSTALL_DIR} OPTIONAL) + endif() endfunction() ############################################################################### diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 0a27abc2956..0960b4cdbd3 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -3,7 +3,7 @@ set(SUBSYS_DESC "Point cloud common library") set(SUBSYS_DEPS) PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON) -PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS eigen3 boost) +PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS Eigen3 Boost) PCL_ADD_DOC("${SUBSYS_NAME}") diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt index f1b2b7b15dd..fb6580d97c6 100644 --- a/io/CMakeLists.txt +++ b/io/CMakeLists.txt @@ -1,7 +1,7 @@ set(SUBSYS_NAME io) set(SUBSYS_DESC "Point cloud IO library") set(SUBSYS_DEPS common io_ply octree) -set(SUBSYS_EXT_DEPS boost eigen3) +set(SUBSYS_EXT_DEPS Boost Eigen3) PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON) if(WIN32) @@ -322,7 +322,7 @@ add_definitions(${VTK_DEFINES}) PCL_ADD_LIBRARY(${LIB_NAME} COMPONENT ${SUBSYS_NAME} SOURCES ${srcs} ${incs} ${compression_incs} ${impl_incs} ${OPENNI_INCLUDES} ${OPENNI2_INCLUDES}) -target_link_libraries("${LIB_NAME}" Boost::boost Boost::iostreams pcl_common pcl_io_ply) +target_link_libraries("${LIB_NAME}" Boost::boost Boost::iostreams pcl_common pcl_octree pcl_io_ply) if(TARGET Boost::filesystem) target_link_libraries("${LIB_NAME}" Boost::filesystem) diff --git a/kdtree/CMakeLists.txt b/kdtree/CMakeLists.txt index 88b293d0a05..21dfb4b97b1 100644 --- a/kdtree/CMakeLists.txt +++ b/kdtree/CMakeLists.txt @@ -3,7 +3,7 @@ set(SUBSYS_DESC "Point cloud kd-tree library") set(SUBSYS_DEPS common) PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON) -PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS flann) +PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS FLANN) PCL_ADD_DOC("${SUBSYS_NAME}") diff --git a/search/CMakeLists.txt b/search/CMakeLists.txt index 87070ca0ecc..ad49b994e23 100644 --- a/search/CMakeLists.txt +++ b/search/CMakeLists.txt @@ -3,7 +3,7 @@ set(SUBSYS_DESC "Point cloud generic search library") set(SUBSYS_DEPS common kdtree octree) PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON) -PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS OpenMP EXT_DEPS flann) +PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS OpenMP EXT_DEPS FLANN) PCL_ADD_DOC("${SUBSYS_NAME}") diff --git a/simulation/CMakeLists.txt b/simulation/CMakeLists.txt index 0591f09f70c..23624ddae91 100644 --- a/simulation/CMakeLists.txt +++ b/simulation/CMakeLists.txt @@ -3,7 +3,7 @@ set(SUBSYS_DESC "Point Cloud Library Simulation") set(SUBSYS_DEPS common io surface kdtree features search octree visualization filters geometry) PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" OFF) -PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS opengl glew) +PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS OpenGL GLEW) PCL_ADD_DOC("${SUBSYS_NAME}") diff --git a/surface/CMakeLists.txt b/surface/CMakeLists.txt index a9976b70c45..6a0b782f540 100644 --- a/surface/CMakeLists.txt +++ b/surface/CMakeLists.txt @@ -4,7 +4,7 @@ set(SUBSYS_DEPS common search kdtree octree) set(SUBSYS_EXT_DEPS "") PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON) -PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS qhull vtk OpenMP) +PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} OPT_DEPS Qhull VTK OpenMP) PCL_ADD_DOC("${SUBSYS_NAME}") diff --git a/visualization/CMakeLists.txt b/visualization/CMakeLists.txt index 4d775081248..f080e71dfc4 100644 --- a/visualization/CMakeLists.txt +++ b/visualization/CMakeLists.txt @@ -3,7 +3,7 @@ set(SUBSYS_DESC "Point cloud visualization library") set(SUBSYS_DEPS common io kdtree geometry search octree) PCL_SUBSYS_OPTION(build "${SUBSYS_NAME}" "${SUBSYS_DESC}" ON) -PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS vtk) +PCL_SUBSYS_DEPEND(build NAME ${SUBSYS_NAME} DEPS ${SUBSYS_DEPS} EXT_DEPS VTK) if(ANDROID) message("VTK was found, but cannot be compiled for Android. Please use VES instead.") From 5e32684d1d18c6e4c8e28197d1b26cb5f86d64de Mon Sep 17 00:00:00 2001 From: Lars Glud Date: Tue, 7 Oct 2025 12:47:19 +0200 Subject: [PATCH 3/5] Remove private src dir from public include directories. --- gpu/people/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/gpu/people/CMakeLists.txt b/gpu/people/CMakeLists.txt index 6c9c3abad16..5777cfd9e09 100644 --- a/gpu/people/CMakeLists.txt +++ b/gpu/people/CMakeLists.txt @@ -55,8 +55,6 @@ target_include_directories( PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/cuda - PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/src/cuda/nvidia ) if(UNIX OR APPLE) From d354d06005073a1826f221e64dabdc9d8dfe474c Mon Sep 17 00:00:00 2001 From: Lars Glud Date: Tue, 7 Oct 2025 17:31:01 +0200 Subject: [PATCH 4/5] Properly propagate sse definitions / flags and AVX flags. --- cmake/pcl_targets.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/pcl_targets.cmake b/cmake/pcl_targets.cmake index a514e49bdbb..ae4d56967f8 100644 --- a/cmake/pcl_targets.cmake +++ b/cmake/pcl_targets.cmake @@ -200,6 +200,8 @@ function(PCL_ADD_LIBRARY _name) add_library(${_name} ${PCL_LIB_TYPE} ${ARGS_SOURCES}) target_compile_features(${_name} PUBLIC ${PCL_CXX_COMPILE_FEATURES}) + target_compile_definitions(${_name} PUBLIC ${SSE_DEFINITIONS}) + target_compile_options(${_name} PUBLIC $,-Xcompiler="${SSE_FLAGS} ${AVX_FLAGS}",${SSE_FLAGS} ${AVX_FLAGS}>) target_include_directories(${_name} PUBLIC $ From 4084e25b3a2aa7437290b1ed8af02a630542afa5 Mon Sep 17 00:00:00 2001 From: Lars Glud Date: Tue, 14 Oct 2025 17:56:44 +0200 Subject: [PATCH 5/5] Use per target and public/private compiler settings. --- CMakeLists.txt | 249 ++------------------------ cmake/pcl_check_atomic.cmake | 13 ++ cmake/pcl_find_avx.cmake | 10 +- cmake/pcl_find_sse.cmake | 36 ++-- cmake/pcl_set_compiler_settings.cmake | 221 +++++++++++++++++++++++ cmake/pcl_targets.cmake | 94 +++++++++- 6 files changed, 358 insertions(+), 265 deletions(-) create mode 100644 cmake/pcl_check_atomic.cmake create mode 100644 cmake/pcl_set_compiler_settings.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 6920f26ac5a..40af1fdd464 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,25 +1,6 @@ ### ---[ PCL global CMake cmake_minimum_required(VERSION 3.16.3 FATAL_ERROR) -# Set target C++ standard and required compiler features -set(CMAKE_CXX_STANDARD 17 CACHE STRING "The target C++ standard. PCL requires C++14 or higher.") -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) -if("${CMAKE_CXX_STANDARD}" GREATER_EQUAL 17) - set(PCL_CXX_COMPILE_FEATURES cxx_std_17) - set(PCL__cplusplus 201703L) - set(PCL_REQUIRES_MSC_VER 1912) -elseif("${CMAKE_CXX_STANDARD}" EQUAL 14) - set(PCL_CXX_COMPILE_FEATURES cxx_std_14) - set(PCL__cplusplus 201402L) - set(PCL_REQUIRES_MSC_VER 1900) -else() - message(FATAL_ERROR "Unknown or unsupported C++ standard specified") -endif() - -set(CMAKE_CUDA_STANDARD 17 CACHE STRING "The target CUDA/C++ standard. PCL requires CUDA/C++ 14 or higher.") -set(CMAKE_CUDA_STANDARD_REQUIRED ON) - set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "possible configurations" FORCE) # In case the user does not setup CMAKE_BUILD_TYPE, assume it's RelWithDebInfo @@ -30,10 +11,6 @@ endif() project(PCL VERSION 1.15.1.99) string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER) -if(MSVC AND ("${MSVC_VERSION}" LESS 1910)) - message(FATAL_ERROR "The compiler versions prior to Visual Studio version 2017 are not supported. Please upgrade to a newer version or another compiler!") -endif() - ### ---[ Find universal dependencies set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/" ${CMAKE_MODULE_PATH}) @@ -52,44 +29,11 @@ set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) -# Compiler identification -# Define a variable CMAKE_COMPILER_IS_X where X is the compiler short name. -# Note: CMake automatically defines one for GNUCXX, nothing to do in this case. -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_COMPILER_IS_CLANG 1) -elseif(__COMPILER_PATHSCALE) - set(CMAKE_COMPILER_IS_PATHSCALE 1) -elseif(MSVC) - set(CMAKE_COMPILER_IS_MSVC 1) -elseif(MINGW) - set(CMAKE_COMPILER_IS_MINGW 1) -endif() - # Ensure try_compile sets the include paths (e.g. for Eigen3) set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE}) -# https://github.com/fish-shell/fish-shell/issues/5865 -include(CheckCXXSourceCompiles) -CHECK_CXX_SOURCE_COMPILES(" -#include -struct big { int foo[64]; }; -std::atomic x; -int main() { - return x.load().foo[13]; -}" -LIBATOMIC_NOT_NEEDED) -IF (NOT LIBATOMIC_NOT_NEEDED) - SET(ATOMIC_LIBRARY "atomic") -ENDIF() - -# Create a variable with expected default CXX flags -# This will be used further down the road to check if the user explicitly provided CXX flags -if(CMAKE_COMPILER_IS_MSVC) - set(CMAKE_CXX_FLAGS_DEFAULT ${CMAKE_CXX_FLAGS_INIT}) - string(STRIP ${CMAKE_CXX_FLAGS_DEFAULT} CMAKE_CXX_FLAGS_DEFAULT) -else() - set(CMAKE_CXX_FLAGS_DEFAULT "") -endif() +# Check if we need to link against libatomic (armel) +include("${PCL_SOURCE_DIR}/cmake/pcl_check_atomic.cmake") include("${PCL_SOURCE_DIR}/cmake/pcl_verbosity.cmake") include("${PCL_SOURCE_DIR}/cmake/pcl_targets.cmake") @@ -100,11 +44,15 @@ DISSECT_VERSION() GET_OS_INFO() SET_INSTALL_DIRS() - -if(${PCL_ENABLE_CCACHE}) - include (UseCompilerCache) - UseCompilerCache(ccache REQUIRED) -endif() +# Check/Set compiler settings +include("cmake/pcl_set_compiler_settings.cmake") +message(STATUS "PCL public Options: ${PCL_PUBLIC_COMPILER_OPTIONS}") +message(STATUS "PCL private Options: ${PCL_PRIVATE_COMPILER_OPTIONS}") +message(STATUS "PCL public Definitions: ${PCL_PUBLIC_COMPILER_DEFINITIONS}") +message(STATUS "PCL private Definitions: ${PCL_PRIVATE_COMPILER_DEFINITIONS}") +message(STATUS "PCL public Compile Features: ${PCL_PUBLIC_COMPILER_FEATURES}") +message(STATUS "PCL private Compile Features: ${PCL_PRIVATE_COMPILER_FEATURES}") +message(STATUS "PCL private Link Options: ${PCL_PRIVATE_LINK_OPTIONS}") # Enable verbose timing display? if(CMAKE_TIMING_VERBOSE AND UNIX) @@ -112,146 +60,12 @@ if(CMAKE_TIMING_VERBOSE AND UNIX) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_SOURCE_DIR}/cmake/custom_output.sh") endif() -# check for allocation functions that return aligned memory -include("${PCL_SOURCE_DIR}/cmake/pcl_alignment.cmake") -PCL_CHECK_FOR_ALIGNMENT() - -# check for SSE flags -include("${PCL_SOURCE_DIR}/cmake/pcl_find_sse.cmake") -if(PCL_ENABLE_SSE AND "${CMAKE_CXX_FLAGS}" STREQUAL "${CMAKE_CXX_FLAGS_DEFAULT}") - PCL_CHECK_FOR_SSE() -endif() - -# check for AVX flags -if(PCL_ENABLE_AVX AND "${CMAKE_CXX_FLAGS}" STREQUAL "${CMAKE_CXX_FLAGS_DEFAULT}") - include("${PCL_SOURCE_DIR}/cmake/pcl_find_avx.cmake") - PCL_CHECK_FOR_AVX() -endif() - # Cuda option(WITH_CUDA "Build NVIDIA-CUDA support" TRUE) if(WITH_CUDA) include("${PCL_SOURCE_DIR}/cmake/pcl_find_cuda.cmake") endif() - -# ---[ Unix/Darwin/Windows specific flags -if(CMAKE_COMPILER_IS_GNUCXX) - if("${CMAKE_CXX_FLAGS}" STREQUAL "${CMAKE_CXX_FLAGS_DEFAULT}") - if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7) - string(APPEND CMAKE_CXX_FLAGS " -Wabi=18") - else() - string(APPEND CMAKE_CXX_FLAGS " -Wabi") - endif() - string(APPEND CMAKE_CXX_FLAGS " -Wall -Wextra -fno-strict-aliasing ${SSE_FLAGS} ${AVX_FLAGS}") - endif() - - if(PCL_WARNINGS_ARE_ERRORS) - string(APPEND CMAKE_CXX_FLAGS " -Werror -fno-strict-aliasing") - endif() - - if("${CMAKE_SHARED_LINKER_FLAGS}" STREQUAL "" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") - set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed") - endif() - - if(WIN32) - if(PCL_SHARED_LIBS) - string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,--export-all-symbols -Wl,--enable-auto-import") - if(MINGW) - add_definitions("-DBOOST_THREAD_USE_LIB") - string(APPEND CMAKE_SHARED_LINKER_FLAGS " -Wl,--allow-multiple-definition") - endif() - else() - add_definitions("-DBOOST_LIB_DIAGNOSTIC -DBOOST_THREAD_USE_LIB") - endif() - endif() -endif() - -if(CMAKE_COMPILER_IS_MSVC) - add_definitions("-DBOOST_ALL_NO_LIB -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -DNOMINMAX ${SSE_DEFINITIONS}") - - if("${CMAKE_CXX_FLAGS}" STREQUAL "${CMAKE_CXX_FLAGS_DEFAULT}") - - string(APPEND CMAKE_CXX_FLAGS " /fp:precise ${SSE_FLAGS} ${AVX_FLAGS}") - set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler=/bigobj") - - set(PCL_USE_GLOBAL_OPTIMIZATION TRUE) - if(CUDA_FOUND) - if(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "10.0" AND ${CUDA_VERSION_STRING} VERSION_LESS "12.0") - set(PCL_USE_GLOBAL_OPTIMIZATION FALSE) - message("Global optimizations /GL has been turned off, as it doesn't work with nvcc/thrust in CUDA 10 and 11.") - endif() - endif() - - # Add extra code generation/link optimizations - if(CMAKE_MSVC_CODE_LINK_OPTIMIZATION AND PCL_USE_GLOBAL_OPTIMIZATION) - string(APPEND CMAKE_CXX_FLAGS_RELEASE " /GL") - string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /LTCG /OPT:REF") - string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /LTCG") - endif() - # /MANIFEST:NO") # please, don't disable manifest generation, otherwise crash at start for vs2008 - - # Disable some warnings - string(APPEND CMAKE_CXX_FLAGS " /wd4800 /wd4521 /wd4251 /wd4275 /wd4305 /wd4355") - - # Enable warnings, which are disabled by default (see https://learn.microsoft.com/de-de/cpp/preprocessor/compiler-warnings-that-are-off-by-default) - string(APPEND CMAKE_CXX_FLAGS " /w34265") - - if(PCL_WARNINGS_ARE_ERRORS) - # MSVC supports external includes only since Visual Studio 2019 version 16.10.0. - # CMake supports external includes since 3.22.0 using the Ninja generator or NMake files (see https://gitlab.kitware.com/cmake/cmake/-/merge_requests/4766) - # CMake supports external includes for Visual Studio also since 3.24.0 (see https://gitlab.kitware.com/cmake/cmake/-/merge_requests/7238) - if(CMAKE_C_COMPILER_VERSION VERSION_LESS "19.29.30036.3" OR CMAKE_VERSION VERSION_LESS 3.22.0 OR (CMAKE_VERSION VERSION_LESS 3.24.0 AND CMAKE_GENERATOR MATCHES "Visual Studio")) - message(WARNING "With the used combination of compiler and CMake version it is not recommended to activate PCL_WARNINGS_ARE_ERRORS, " - "because also warnings from 3rd party components are marked as errors. It is recommended to upgrade to " - "Visual Studio 2019 version 16.10.0 and CMake 3.24.0 (or CMake 3.22.0 if using Ninja or NMake files).") - endif() - string(APPEND CMAKE_CXX_FLAGS " /WX") - endif() - - include(ProcessorCount) - ProcessorCount(CPUCores) - set(MSVC_MP ${CPUCores} CACHE STRING "Number of simultaneously running compilers (0 = automatic detection by MSVC). See documentation of /MP flag.") - - if(MSVC_MP EQUAL 0) - # MSVC_MP is 0 in case the information cannot be determined by ProcessorCount => fallback - # Generator expression is necessary to limit /MP flag to C/CXX, so flag will be not set to e.g. CUDA (see https://gitlab.kitware.com/cmake/cmake/issues/17535) - add_compile_options($<$,$>:/MP>) - elseif(MSVC_MP GREATER 1) - add_compile_options($<$,$>:/MP${MSVC_MP}>) - endif() - endif() - string(APPEND CMAKE_CXX_FLAGS " /bigobj") - - if(CMAKE_GENERATOR STREQUAL "Ninja") - string(APPEND CMAKE_C_FLAGS " /FS") - string(APPEND CMAKE_CXX_FLAGS " /FS") - endif() -endif() - -if(CMAKE_COMPILER_IS_PATHSCALE) - if("${CMAKE_CXX_FLAGS}" STREQUAL "${CMAKE_CXX_FLAGS_DEFAULT}") - set(CMAKE_CXX_FLAGS "-Wno-uninitialized -zerouv -mp") - endif() - if("${CMAKE_SHARED_LINKER_FLAGS}" STREQUAL "") - set(CMAKE_SHARED_LINKER_FLAGS "-mp") - endif() -endif() - -if(CMAKE_COMPILER_IS_CLANG) - if("${CMAKE_C_FLAGS}" STREQUAL "${CMAKE_CXX_FLAGS_DEFAULT}") - string(APPEND CMAKE_C_FLAGS " -Wall -Wextra") - endif() - if("${CMAKE_CXX_FLAGS}" STREQUAL "") - set(CMAKE_CXX_FLAGS "-ftemplate-depth=1024 -Wno-invalid-offsetof ${SSE_FLAGS} ${AVX_FLAGS}") # Unfortunately older Clang versions do not have this: -Wno-unnamed-type-template-args - if(APPLE AND WITH_CUDA AND CUDA_FOUND) - string(APPEND CMAKE_CXX_FLAGS " -stdlib=libstdc++") - endif() - string(APPEND CMAKE_CXX_FLAGS " -Wall -Wextra") - endif() - set(CLANG_LIBRARIES "stdc++") -endif() - if(WIN32) set(PCL_RESOURCES_DIR "${PCL_SOURCE_DIR}/resources") set(PCL_POINTCLOUDS_DIR "${PCL_RESOURCES_DIR}/pointclouds") @@ -306,44 +120,6 @@ set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}") endif() ### ---[ Find universal dependencies - -# OpenMP (optional) -option(WITH_OPENMP "Build with parallelization using OpenMP" TRUE) -option(USE_HOMEBREW_FALLBACK "(macOS-only) also look in 'brew --prefix' for libraries (e.g. OpenMP)" TRUE) -if(WITH_OPENMP) - find_package(OpenMP COMPONENTS C CXX) - if(APPLE AND NOT OpenMP_FOUND) - if(USE_HOMEBREW_FALLBACK) - # libomp 15.0+ from brew is keg-only, so have to search in other locations. - # See https://github.com/Homebrew/homebrew-core/issues/112107#issuecomment-1278042927. - execute_process(COMMAND brew --prefix libomp - OUTPUT_VARIABLE HOMEBREW_LIBOMP_PREFIX - OUTPUT_STRIP_TRAILING_WHITESPACE) - set(OpenMP_C_FLAGS "-Xpreprocessor -fopenmp -I${HOMEBREW_LIBOMP_PREFIX}/include") - set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp -I${HOMEBREW_LIBOMP_PREFIX}/include") - set(OpenMP_C_LIB_NAMES omp) - set(OpenMP_CXX_LIB_NAMES omp) - set(OpenMP_omp_LIBRARY ${HOMEBREW_LIBOMP_PREFIX}/lib/libomp.dylib) - find_package(OpenMP COMPONENTS C CXX) - endif() - endif() -endif() -if(OpenMP_FOUND) - string(APPEND CMAKE_C_FLAGS " ${OpenMP_C_FLAGS}") - string(APPEND CMAKE_CXX_FLAGS " ${OpenMP_CXX_FLAGS}") - - # We could use OpenMP_CXX_VERSION starting from CMake 3.9, but this value is only available on first run of CMake (see https://gitlab.kitware.com/cmake/cmake/issues/19150), - # so we use always OpenMP_CXX_SPEC_DATE, which is available since CMake 3.7. - message(STATUS "Found OpenMP, spec date ${OpenMP_CXX_SPEC_DATE}") - - if((MSVC_VERSION EQUAL 1900) OR (MSVC_VERSION MATCHES "^191[0-9]$")) - string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DELAYLOAD:VCOMP140D.dll") - string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /DELAYLOAD:VCOMP140.dll") - endif() -else() - message(STATUS "Not found OpenMP") -endif() - # Threads (required) find_package(Threads REQUIRED) @@ -471,6 +247,8 @@ if(WITH_SYSTEM_CJSON) endif() set(CMAKE_REQUIRED_LIBRARIES Eigen3::Eigen) # so that Eigen/Core is found below +string(REPLACE ";" " " PCL_PUBLIC_COMPILE_OPTIONS_STR "${PCL_PUBLIC_COMPILER_OPTIONS}") +set(CMAKE_REQUIRED_FLAGS ${PCL_PUBLIC_COMPILE_OPTIONS_STR}) CHECK_CXX_SOURCE_COMPILES(" #include #if (EIGEN_DEFAULT_ALIGN_BYTES==0) || EIGEN_MALLOC_ALREADY_ALIGNED @@ -484,6 +262,7 @@ else() set(PCL_USES_EIGEN_HANDMADE_ALIGNED_MALLOC 0) endif() unset(CMAKE_REQUIRED_LIBRARIES) +unset(CMAKE_REQUIRED_FLAGS) ### --[ Set variables for pcl_config.h if (BUILD_visualization) diff --git a/cmake/pcl_check_atomic.cmake b/cmake/pcl_check_atomic.cmake new file mode 100644 index 00000000000..3300225cdf2 --- /dev/null +++ b/cmake/pcl_check_atomic.cmake @@ -0,0 +1,13 @@ +# https://github.com/fish-shell/fish-shell/issues/5865 +include(CheckCXXSourceCompiles) +CHECK_CXX_SOURCE_COMPILES(" +#include +struct big { int foo[64]; }; +std::atomic x; +int main() { + return x.load().foo[13]; +}" +LIBATOMIC_NOT_NEEDED) +IF (NOT LIBATOMIC_NOT_NEEDED) + SET(ATOMIC_LIBRARY "atomic") +ENDIF() \ No newline at end of file diff --git a/cmake/pcl_find_avx.cmake b/cmake/pcl_find_avx.cmake index 216e4670db7..757c7013b13 100644 --- a/cmake/pcl_find_avx.cmake +++ b/cmake/pcl_find_avx.cmake @@ -39,9 +39,9 @@ function(PCL_CHECK_FOR_AVX) # and this allows the compiler to use the codes for AVX behind code guards. if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) if(HAVE_AVX2) - set(AVX_FLAGS "-mavx2" PARENT_SCOPE) + list(APPEND AVX_FLAGS "-mavx2") elseif(HAVE_AVX) - set(AVX_FLAGS "-mavx" PARENT_SCOPE) + list(APPEND AVX_FLAGS "-mavx") endif() endif() @@ -51,9 +51,11 @@ function(PCL_CHECK_FOR_AVX) # TODO: Add AVX512 variant if needed. if(MSVC) if(HAVE_AVX2) - set(AVX_FLAGS "/arch:AVX2" PARENT_SCOPE) + list(APPEND AVX_FLAGS "/arch:AVX2") elseif(HAVE_AVX) - set(AVX_FLAGS "/arch:AVX" PARENT_SCOPE) + list(APPEND AVX_FLAGS "/arch:AVX") endif() endif() + + set(AVX_FLAGS ${AVX_FLAGS} PARENT_SCOPE) endfunction() diff --git a/cmake/pcl_find_sse.cmake b/cmake/pcl_find_sse.cmake index 4661abf136b..133ab58fca4 100644 --- a/cmake/pcl_find_sse.cmake +++ b/cmake/pcl_find_sse.cmake @@ -176,57 +176,57 @@ function(PCL_CHECK_FOR_SSE) if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) if(SSE_LEVEL GREATER_EQUAL 1.0) if(SSE_LEVEL GREATER_EQUAL 4.2) - set(SSE_FLAGS "-msse4.2") + list(APPEND SSE_FLAGS "-msse4.2") elseif(SSE_LEVEL GREATER_EQUAL 4.1) - set(SSE_FLAGS "-msse4.1") + list(APPEND SSE_FLAGS "-msse4.1") elseif(SSE_LEVEL GREATER_EQUAL 3.1) - set(SSE_FLAGS "-msse3") + list(APPEND SSE_FLAGS "-msse3") elseif(SSE_LEVEL GREATER_EQUAL 3.0) - set(SSE_FLAGS "-msse3") + list(APPEND SSE_FLAGS "-msse3") elseif(SSE_LEVEL GREATER_EQUAL 2.0) - set(SSE_FLAGS "-msse2") + list(APPEND SSE_FLAGS "-msse2") else() - set(SSE_FLAGS "-msse") + list(APPEND SSE_FLAGS "-msse") endif() - string(APPEND SSE_FLAGS " -mfpmath=sse") + list(APPEND SSE_FLAGS "-mfpmath=sse") else() # Setting -ffloat-store to alleviate 32bit vs 64bit discrepancies on non-SSE # platforms. - string(APPEND SSE_FLAGS " -ffloat-store") + list(APPEND SSE_FLAGS "-ffloat-store") endif() if(PCL_ENABLE_MARCHNATIVE AND (NOT CMAKE_CROSSCOMPILING)) if(HAVE_MARCH) - string(APPEND SSE_FLAGS " -march=native") + list(APPEND SSE_FLAGS "-march=native") else() - string(APPEND SSE_FLAGS " -mtune=native") + list(APPEND SSE_FLAGS "-mtune=native") endif() message(STATUS "Using CPU native flags for SSE optimization: ${SSE_FLAGS}") endif() elseif(MSVC AND NOT CMAKE_SIZEOF_VOID_P) if(SSE_LEVEL GREATER_EQUAL 2.0) - set( SSE_FLAGS "/arch:SSE2") + list(APPEND SSE_FLAGS "/arch:SSE2") elseif(SSE_LEVEL GREATER_EQUAL 1.0) - set( SSE_FLAGS "/arch:SSE") + list(APPEND SSE_FLAGS "/arch:SSE") endif() elseif(MSVC) if(SSE_LEVEL GREATER_EQUAL 4.2) - string(APPEND SSE_DEFINITIONS " -D__SSE4_2__") + list(APPEND SSE_DEFINITIONS "-D__SSE4_2__") endif() if(SSE_LEVEL GREATER_EQUAL 4.1) - string(APPEND SSE_DEFINITIONS " -D__SSE4_1__") + list(APPEND SSE_DEFINITIONS "-D__SSE4_1__") endif() if(SSE_LEVEL GREATER_EQUAL 3.1) - string(APPEND SSE_DEFINITIONS " -D__SSSE3__") + list(APPEND SSE_DEFINITIONS "-D__SSSE3__") endif() if(SSE_LEVEL GREATER_EQUAL 3.0) - string(APPEND SSE_DEFINITIONS " -D__SSE3__") + list(APPEND SSE_DEFINITIONS "-D__SSE3__") endif() if(SSE_LEVEL GREATER_EQUAL 2.0) - string(APPEND SSE_DEFINITIONS " -D__SSE2__") + list(APPEND SSE_DEFINITIONS "-D__SSE2__") endif() if(SSE_LEVEL GREATER_EQUAL 1.0) - string(APPEND SSE_DEFINITIONS " -D__SSE__") + list(APPEND SSE_DEFINITIONS "-D__SSE__") endif() endif() diff --git a/cmake/pcl_set_compiler_settings.cmake b/cmake/pcl_set_compiler_settings.cmake new file mode 100644 index 00000000000..8ddc70ca8df --- /dev/null +++ b/cmake/pcl_set_compiler_settings.cmake @@ -0,0 +1,221 @@ + +# If user has specified compiler options/definitions/features/link options, do not override them +if(PCL_PRIVATE_COMPILER_OPTIONS OR PCL_PUBLIC_COMPILER_OPTIONS OR + PCL_PRIVATE_COMPILER_DEFINITIONS OR PCL_PUBLIC_COMPILER_DEFINITIONS OR + PCL_PRIVATE_COMPILER_FEATURES OR PCL_PUBLIC_COMPILER_FEATURES OR + PCL_PRIVATE_LINK_OPTIONS) + return() +endif() + +set(PCL_PRIVATE_COMPILER_OPTIONS "") +set(PCL_PUBLIC_COMPILER_OPTIONS "") + +set(PCL_PRIVATE_COMPILER_DEFINITIONS "") +set(PCL_PUBLIC_COMPILER_DEFINITIONS "") + +set(PCL_PRIVATE_COMPILER_FEATURES "") +set(PCL_PUBLIC_COMPILER_FEATURES "") + +set(PCL_PRIVATE_LINK_OPTIONS "") + +# Check for unsupported compiler versions +if(MSVC AND ("${MSVC_VERSION}" LESS 1910)) + message(FATAL_ERROR "The compiler versions prior to Visual Studio version 2017 are not supported. Please upgrade to a newer version or another compiler!") +endif() + +# Compiler identification +# Define a variable CMAKE_COMPILER_IS_X where X is the compiler short name. +# Note: CMake automatically defines one for GNUCXX, nothing to do in this case. +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_COMPILER_IS_CLANG 1) +elseif(__COMPILER_PATHSCALE) + set(CMAKE_COMPILER_IS_PATHSCALE 1) +elseif(MSVC) + set(CMAKE_COMPILER_IS_MSVC 1) +elseif(MINGW) + set(CMAKE_COMPILER_IS_MINGW 1) +endif() + +# Set target C++ standard and required compiler features +set(CMAKE_CXX_STANDARD 17 CACHE STRING "The target C++ standard. PCL requires C++14 or higher.") +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) +if("${CMAKE_CXX_STANDARD}" GREATER_EQUAL 17) + set(PCL_PRIVATE_COMPILER_FEATURES cxx_std_17) + set(PCL__cplusplus 201703L) + set(PCL_REQUIRES_MSC_VER 1912) +elseif("${CMAKE_CXX_STANDARD}" EQUAL 14) + set(PCL_PRIVATE_COMPILER_FEATURES cxx_std_14) + set(PCL__cplusplus 201402L) + set(PCL_REQUIRES_MSC_VER 1900) +else() + message(FATAL_ERROR "Unknown or unsupported C++ standard specified") +endif() + +set(CMAKE_CUDA_STANDARD 17 CACHE STRING "The target CUDA/C++ standard. PCL requires CUDA/C++ 14 or higher.") +set(CMAKE_CUDA_STANDARD_REQUIRED ON) + +# check for allocation functions that return aligned memory +include("${PCL_SOURCE_DIR}/cmake/pcl_alignment.cmake") +PCL_CHECK_FOR_ALIGNMENT() + +# check for SSE flags +if(PCL_ENABLE_SSE) + include("${PCL_SOURCE_DIR}/cmake/pcl_find_sse.cmake") + PCL_CHECK_FOR_SSE() + list(APPEND PCL_PUBLIC_COMPILER_OPTIONS ${SSE_FLAGS}) +endif() + +# check for AVX flags +if(PCL_ENABLE_AVX) + include("${PCL_SOURCE_DIR}/cmake/pcl_find_avx.cmake") + PCL_CHECK_FOR_AVX() + list(APPEND PCL_PUBLIC_COMPILER_OPTIONS ${AVX_FLAGS}) +endif() + +# ---[ Unix/Darwin/Windows specific flags +if(CMAKE_COMPILER_IS_GNUCXX) + if("${CMAKE_CXX_FLAGS}" STREQUAL "${CMAKE_CXX_FLAGS_DEFAULT}") + if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7) + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "-Wabi=18") + else() + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "-Wabi") + endif() + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "-Wall" "-Wextra" "-fno-strict-aliasing") + endif() + + if(PCL_WARNINGS_ARE_ERRORS) + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "-Werror" "-fno-strict-aliasing") + endif() + + if("${CMAKE_SHARED_LINKER_FLAGS}" STREQUAL "" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") + list(APPEND PCL_PRIVATE_LINK_OPTIONS "-Wl,--as-needed") + endif() +endif() + +if(CMAKE_COMPILER_IS_MSVC) + if(PCL_SHARED_LIBS) + list(APPEND PCL_PRIVATE_LINK_OPTIONS "-Wl,--export-all-symbols" "-Wl,--enable-auto-import") + else() + list(APPEND PCL_PRIVATE_DEFINITIONS "BOOST_LIB_DIAGNOSTIC" "BOOST_THREAD_USE_LIB") + endif() + + list(APPEND PCL_PRIVATE_DEFINITIONS "BOOST_ALL_NO_LIB" "_SCL_SECURE_NO_WARNINGS" "_CRT_SECURE_NO_WARNINGS" "NOMINMAX") + + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "/fp:precise") + + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "/bigobj") + + set(PCL_USE_GLOBAL_OPTIMIZATION TRUE) + if(CUDA_FOUND) + if(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "10.0" AND ${CUDA_VERSION_STRING} VERSION_LESS "12.0") + set(PCL_USE_GLOBAL_OPTIMIZATION FALSE) + message("Global optimizations /GL has been turned off, as it doesn't work with nvcc/thrust in CUDA 10 and 11.") + endif() + endif() + + # Add extra code generation/link optimizations + if(CMAKE_MSVC_CODE_LINK_OPTIMIZATION AND PCL_USE_GLOBAL_OPTIMIZATION AND ${CMAKE_BUILD_TYPE} EQUAL Release) + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "/GL") + list(APPEND PCL_PRIVATE_LINK_OPTIONS "/LTCG" "/OPT:REF") + endif() + # /MANIFEST:NO") # please, don't disable manifest generation, otherwise crash at start for vs2008 + + # Disable some warnings + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "/wd4800" "/wd4521" "/wd4251" "/wd4275" "/wd4305" "/wd4355") + + # Enable warnings, which are disabled by default (see https://learn.microsoft.com/de-de/cpp/preprocessor/compiler-warnings-that-are-off-by-default) + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "/w34265") + + if(PCL_WARNINGS_ARE_ERRORS) + # MSVC supports external includes only since Visual Studio 2019 version 16.10.0. + # CMake supports external includes since 3.22.0 using the Ninja generator or NMake files (see https://gitlab.kitware.com/cmake/cmake/-/merge_requests/4766) + # CMake supports external includes for Visual Studio also since 3.24.0 (see https://gitlab.kitware.com/cmake/cmake/-/merge_requests/7238) + if(CMAKE_C_COMPILER_VERSION VERSION_LESS "19.29.30036.3" OR CMAKE_VERSION VERSION_LESS 3.22.0 OR (CMAKE_VERSION VERSION_LESS 3.24.0 AND CMAKE_GENERATOR MATCHES "Visual Studio")) + message(WARNING "With the used combination of compiler and CMake version it is not recommended to activate PCL_WARNINGS_ARE_ERRORS, " + "because also warnings from 3rd party components are marked as errors. It is recommended to upgrade to " + "Visual Studio 2019 version 16.10.0 and CMake 3.24.0 (or CMake 3.22.0 if using Ninja or NMake files).") + endif() + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "/WX") + endif() + + include(ProcessorCount) + ProcessorCount(CPUCores) + set(MSVC_MP ${CPUCores} CACHE STRING "Number of simultaneously running compilers (0 = automatic detection by MSVC). See documentation of /MP flag.") + + if(MSVC_MP EQUAL 0) + # MSVC_MP is 0 in case the information cannot be determined by ProcessorCount => fallback + # Generator expression is necessary to limit /MP flag to C/CXX, so flag will be not set to e.g. CUDA (see https://gitlab.kitware.com/cmake/cmake/issues/17535) + add_compile_options($<$,$>:/MP>) + elseif(MSVC_MP GREATER 1) + add_compile_options($<$,$>:/MP${MSVC_MP}>) + endif() + + if(CMAKE_GENERATOR STREQUAL "Ninja") + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "/FS") + endif() +endif() + +if(CMAKE_COMPILER_IS_PATHSCALE) + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "-Wno-uninitialized" "-zerouv" "-mp") + list(APPEND PCL_PRIVATE_LINK_OPTIONS "-mp") +endif() + +if(CMAKE_COMPILER_IS_CLANG) + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "-Wall" "-Wextra") + # Unfortunately older Clang versions do not have this: -Wno-unnamed-type-template-args + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "-ftemplate-depth=1024" "-Wno-invalid-offsetof") + if(APPLE AND WITH_CUDA AND CUDA_FOUND) + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS "-stdlib=libstdc++") + endif() + set(CLANG_LIBRARIES "stdc++") +endif() + +if(CMAKE_COMPILER_IS_MINGW) + list(APPEND PCL_PRIVATE_DEFINITIONS "BOOST_THREAD_USE_LIB") + list(APPEND PCL_PRIVATE_LINK_OPTIONS "-Wl,--allow-multiple-definition") +endif() + +# OpenMP (optional) +option(WITH_OPENMP "Build with parallelization using OpenMP" TRUE) +option(USE_HOMEBREW_FALLBACK "(macOS-only) also look in 'brew --prefix' for libraries (e.g. OpenMP)" TRUE) +if(WITH_OPENMP) + find_package(OpenMP COMPONENTS C CXX) + if(APPLE AND NOT OpenMP_FOUND) + if(USE_HOMEBREW_FALLBACK) + # libomp 15.0+ from brew is keg-only, so have to search in other locations. + # See https://github.com/Homebrew/homebrew-core/issues/112107#issuecomment-1278042927. + execute_process(COMMAND brew --prefix libomp + OUTPUT_VARIABLE HOMEBREW_LIBOMP_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(OpenMP_C_FLAGS "-Xpreprocessor -fopenmp -I${HOMEBREW_LIBOMP_PREFIX}/include") + set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp -I${HOMEBREW_LIBOMP_PREFIX}/include") + set(OpenMP_C_LIB_NAMES omp) + set(OpenMP_CXX_LIB_NAMES omp) + set(OpenMP_omp_LIBRARY ${HOMEBREW_LIBOMP_PREFIX}/lib/libomp.dylib) + find_package(OpenMP COMPONENTS C CXX) + endif() + endif() +endif() +if(OpenMP_FOUND) + list(APPEND PCL_PRIVATE_COMPILER_OPTIONS ${OpenMP_CXX_FLAGS}) + + # We could use OpenMP_CXX_VERSION starting from CMake 3.9, but this value is only available on first run of CMake (see https://gitlab.kitware.com/cmake/cmake/issues/19150), + # so we use always OpenMP_CXX_SPEC_DATE, which is available since CMake 3.7. + message(STATUS "Found OpenMP, spec date ${OpenMP_CXX_SPEC_DATE}") + if((MSVC_VERSION EQUAL 1900) OR (MSVC_VERSION MATCHES "^191[0-9]$")) + if(${CMAKE_BUILD_TYPE} EQUAL Debug) + list(APPEND PCL_PRIVATE_DEFINITIONS "/DELAYLOAD:VCOMP140D.dll") + else() + list(APPEND PCL_PRIVATE_DEFINITIONS "/DELAYLOAD:VCOMP140.dll") + endif() + endif() +else() + message(STATUS "Not found OpenMP") +endif() + +if(${PCL_ENABLE_CCACHE}) + include (UseCompilerCache) + UseCompilerCache(ccache REQUIRED) +endif() + diff --git a/cmake/pcl_targets.cmake b/cmake/pcl_targets.cmake index ae4d56967f8..ae607d84e23 100644 --- a/cmake/pcl_targets.cmake +++ b/cmake/pcl_targets.cmake @@ -198,11 +198,22 @@ function(PCL_ADD_LIBRARY _name) ) else() add_library(${_name} ${PCL_LIB_TYPE} ${ARGS_SOURCES}) - - target_compile_features(${_name} PUBLIC ${PCL_CXX_COMPILE_FEATURES}) - target_compile_definitions(${_name} PUBLIC ${SSE_DEFINITIONS}) - target_compile_options(${_name} PUBLIC $,-Xcompiler="${SSE_FLAGS} ${AVX_FLAGS}",${SSE_FLAGS} ${AVX_FLAGS}>) - + + target_compile_options(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_OPTIONS} + PUBLIC $,-Xcompiler=${PCL_PUBLIC_COMPILER_OPTIONS},${PCL_PUBLIC_COMPILER_OPTIONS}>) + + target_compile_definitions(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_DEFINITIONS} + PUBLIC ${PCL_PUBLIC_COMPILER_DEFINITIONS}) + + target_compile_features(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_FEATURES} + PUBLIC ${PCL_PUBLIC_COMPILER_FEATURES}) + + target_link_options(${_name} + PRIVATE ${PCL_PRIVATE_LINK_OPTIONS}) + target_include_directories(${_name} PUBLIC $ $ @@ -273,7 +284,13 @@ function(PCL_CUDA_ADD_LIBRARY _name) REMOVE_VTK_DEFINITIONS() if(NOT ARGS_SOURCES) - add_library(${_name} INTERFACE) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.19) + add_library(${_name} INTERFACE ${ARGS_INCLUDES}) + + set_target_properties(${_name} PROPERTIES FOLDER "Libraries") + else() + add_library(${_name} INTERFACE) + endif() target_include_directories(${_name} INTERFACE $ @@ -343,8 +360,21 @@ function(PCL_ADD_EXECUTABLE _name) else() add_executable(${_name} ${ARGS_SOURCES}) endif() + PCL_ADD_VERSION_INFO(${_name}) + target_compile_options(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_OPTIONS}) + + target_compile_definitions(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_DEFINITIONS}) + + target_compile_features(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_FEATURES}) + + target_link_options(${_name} + PRIVATE ${PCL_PRIVATE_LINK_OPTIONS}) + target_link_libraries(${_name} Threads::Threads) if(WIN32 AND MSVC) @@ -394,10 +424,20 @@ function(PCL_CUDA_ADD_EXECUTABLE _name) REMOVE_VTK_DEFINITIONS() add_executable(${_name} ${ARGS_SOURCES}) - + PCL_ADD_VERSION_INFO(${_name}) - target_compile_options(${_name} PRIVATE $<$: ${GEN_CODE} --expt-relaxed-constexpr>) + target_compile_options(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_OPTIONS} $<$: ${GEN_CODE} --expt-relaxed-constexpr>) + + target_compile_definitions(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_DEFINITIONS}) + + target_compile_features(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_FEATURES}) + + target_link_options(${_name} + PRIVATE ${PCL_PRIVATE_LINK_OPTIONS}) target_include_directories(${_name} PRIVATE ${CUDA_TOOLKIT_INCLUDE}) @@ -433,6 +473,19 @@ macro(PCL_ADD_TEST _name _exename) endif() add_executable(${_exename} ${ARGS_FILES}) + + target_compile_options(${_exename} + PRIVATE ${PCL_PRIVATE_COMPILER_OPTIONS} $<$: ${GEN_CODE} --expt-relaxed-constexpr>) + + target_compile_definitions(${_exename} + PRIVATE ${PCL_PRIVATE_COMPILER_DEFINITIONS}) + + target_compile_features(${_exename} + PRIVATE ${PCL_PRIVATE_COMPILER_FEATURES}) + + target_link_options(${_exename} + PRIVATE ${PCL_PRIVATE_LINK_OPTIONS}) + if(NOT WIN32) set_target_properties(${_exename} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) endif() @@ -478,6 +531,18 @@ function(PCL_ADD_BENCHMARK _name) target_link_libraries(benchmark_${_name} benchmark::benchmark ${ARGS_LINK_WITH}) set_target_properties(benchmark_${_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + target_compile_options(benchmark_${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_OPTIONS} $<$: ${GEN_CODE} --expt-relaxed-constexpr>) + + target_compile_definitions(benchmark_${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_DEFINITIONS}) + + target_compile_features(benchmark_${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_FEATURES}) + + target_link_options(benchmark_${_name} + PRIVATE ${PCL_PRIVATE_LINK_OPTIONS}) + # See https://github.com/google/benchmark/issues/1457 if(BenchmarkBuildType STREQUAL "STATIC_LIBRARY" AND benchmark_VERSION STREQUAL "1.7.0") target_compile_definitions(benchmark_${_name} PUBLIC -DBENCHMARK_STATIC_DEFINE) @@ -517,6 +582,19 @@ macro(PCL_ADD_EXAMPLE _name) endif() add_executable(${_name} ${ARGS_FILES}) + + target_compile_options(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_OPTIONS} $<$: ${GEN_CODE} --expt-relaxed-constexpr>) + + target_compile_definitions(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_DEFINITIONS}) + + target_compile_features(${_name} + PRIVATE ${PCL_PRIVATE_COMPILER_FEATURES}) + + target_link_options(${_name} + PRIVATE ${PCL_PRIVATE_LINK_OPTIONS}) + target_link_libraries(${_name} ${ARGS_LINK_WITH} ${CLANG_LIBRARIES}) if(WIN32 AND MSVC) set_target_properties(${_name} PROPERTIES DEBUG_OUTPUT_NAME ${_name}${CMAKE_DEBUG_POSTFIX}