include(../cmakemodules/AssureCMakeRootFile.cmake) # Avoid user mistake in CMake source directory
# ----------------------------------
# wxThings
# ----------------------------------
option(MRPT_BUILD_wxThings "Build wxThings" ON)
mark_as_advanced(MRPT_BUILD_wxThings)
if(CMAKE_MRPT_HAS_WXWIDGETS AND MRPT_BUILD_wxThings)
add_subdirectory(wxThings)
endif()
# ----------------------------------
# libfreenect: Embedded version
# ----------------------------------
if(CMAKE_MRPT_HAS_FREENECT AND NOT CMAKE_MRPT_HAS_FREENECT_SYSTEM)
#find_package(libusb-1.0)
PKG_CHECK_MODULES(PKG_LIBUSB10 QUIET libusb-1.0 IMPORTED_TARGET GLOBAL) # PkgConfig::PKG_LIBUSB10
if (NOT PKG_LIBUSB10_FOUND)
# Error:
message(SEND_ERROR "*** ERROR *** Please, set libusb-1 variables, disable CMAKE_MRPT_HAS_FREENECT, or provide a system library for libfreenect.")
endif()
# Special stuff for windows:
set(SRCS
libfreenect/src/cameras.c
libfreenect/src/core.c
libfreenect/src/flags.c
libfreenect/src/loader.c
libfreenect/src/registration.c
libfreenect/src/audio.c
libfreenect/src/tilt.c
libfreenect/src/usb_libusb10.c
)
if (WIN32)
list(APPEND SRCS
libfreenect/platform/windows/libusb10emu/libusb-1.0/libusbemu.cpp
libfreenect/platform/windows/libusb10emu/libusb-1.0/failguard.cpp
)
endif()
add_library(mrpt_freenect STATIC ${SRCS})
if (WIN32)
target_include_directories(mrpt_freenect SYSTEM PUBLIC
${MRPT_SOURCE_DIR}/3rdparty/libfreenect/platform/windows
${MRPT_SOURCE_DIR}/3rdparty/libfreenect/platform/windows/libusb10emu
)
endif()
if (MSVC)
set_source_files_properties(${SRCS} PROPERTIES LANGUAGE CXX) # Build as C++
endif()
if (MRPT_COMPILER_IS_GCC_OR_CLANG)
target_compile_options(mrpt_freenect PRIVATE
-fPIC
-Wno-ignored-qualifiers
-Wno-unused-function
-Wno-unused-const-variable
)
# Needed for usleep
target_compile_definitions(mrpt_freenect PRIVATE
_GNU_SOURCE
_BSD_SOURCE
_DEFAULT_SOURCE
)
endif()
# Embedded version:
target_include_directories(mrpt_freenect SYSTEM PUBLIC
${MRPT_SOURCE_DIR}/3rdparty/libfreenect/include
)
# libfreenect.h includes libusb.h:
if (LIBUSB_1_INCLUDE_DIRS)
target_include_directories(mrpt_freenect SYSTEM PUBLIC
${LIBUSB_1_INCLUDE_DIRS}
${LIBUSB_1_INCLUDE_DIRS}/libusb-1.0
)
endif()
target_link_libraries(mrpt_freenect PUBLIC PkgConfig::PKG_LIBUSB10)
set_target_properties(mrpt_freenect PROPERTIES FOLDER "3rd party")
unset(SRCS)
endif()
# ----------------------------------
# Build RPLIDAR?
# ----------------------------------
option(MRPT_BUILD_rplidar_sdk "Build rplidar_sdk" ON)
mark_as_advanced(MRPT_BUILD_rplidar_sdk)
if(CMAKE_MRPT_HAS_ROBOPEAK_LIDAR AND MRPT_BUILD_rplidar_sdk)
set(RPLIDAR_ROOT ${MRPT_SOURCE_DIR}/3rdparty/rplidar_sdk/sdk/)
set(SRCS_LIST
${RPLIDAR_ROOT}/src/*.cpp
${RPLIDAR_ROOT}/src/hal/*.cpp
${RPLIDAR_ROOT}/src/dataunpacker/*.cpp
${RPLIDAR_ROOT}/src/dataunpacker/unpacker/*.cpp
${RPLIDAR_ROOT}/include/*.h
)
if (WIN32)
list(APPEND SRCS_LIST ${RPLIDAR_ROOT}/src/arch/win32/*.cpp)
else()
list(APPEND SRCS_LIST ${RPLIDAR_ROOT}/src/arch/linux/*.cpp)
endif()
file(GLOB SRCS ${SRCS_LIST})
add_library(mrpt_rplidar STATIC ${SRCS})
if (MRPT_COMPILER_IS_GCC_OR_CLANG)
target_compile_options(mrpt_rplidar PRIVATE
-fPIC
)
endif()
if(MSVC)
target_compile_options(mrpt_rplidar PRIVATE /DWIN64)
endif()
if (MRPT_COMPILER_IS_CLANG)
target_compile_options(mrpt_rplidar PRIVATE -Wno-c++11-narrowing)
endif()
if (CMAKE_COMPILER_IS_GNUCXX)
target_compile_options(mrpt_rplidar PRIVATE -Wno-narrowing)
endif()
# Embedded version:
target_include_directories(mrpt_rplidar SYSTEM PUBLIC
$
$
)
set_target_properties(mrpt_rplidar PROPERTIES FOLDER "3rd party")
if((DEFINED BUILD_mrpt-core) AND (NOT BUILD_mrpt-core))
find_package(mrpt-core REQUIRED)
endif()
target_link_libraries(mrpt_rplidar PRIVATE mrpt::core) # To enforce c++17
# needs to be exported, even if private, to make cmake happy since it wants
# libraries to be statically-linkable:
export(
TARGETS mrpt_rplidar
FILE "${CMAKE_CURRENT_BINARY_DIR}/mrpt_rplidar-targets.cmake"
)
install(TARGETS mrpt_rplidar EXPORT mrpt_rplidar-targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(EXPORT mrpt_rplidar-targets
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/mrpt_rplidar
)
unset(SRCS_LIST)
unset(SRCS)
unset(RPLIDAR_ROOT)
endif()
# ----------------------------------
# Build xSens IMU library
# ----------------------------------
option(MRPT_BUILD_xsens "Build mrpt_xsens lib" ON)
mark_as_advanced(MRPT_BUILD_xsens)
if(CMAKE_MRPT_HAS_xSENS AND MRPT_BUILD_xsens)
file(GLOB_RECURSE SRCS
xspublic/*.cpp
xspublic/*.c
xspublic/*.h
)
add_library(mrpt_xsens STATIC ${SRCS})
if (MRPT_COMPILER_IS_GCC_OR_CLANG)
target_compile_options(mrpt_xsens PRIVATE
-fPIC
-fms-extensions # Unnamed structs in unions
-Wno-variadic-macros
-Wno-parentheses
)
target_compile_definitions(mrpt_xsens PRIVATE
_POSIX_C_SOURCE=200809L # Needed to have CLOCK_REALTIME,... in gcc
_LOG_TO_STDOUT
)
endif()
# Embedded version:
target_include_directories(mrpt_xsens SYSTEM PUBLIC
$
$
$
$
)
# Couldn't make this to work with a regular target_compile_options() cmd:
if (MSVC)
set(xsens_flag "/FI ${MRPT_SOURCE_DIR}/3rdparty/xspublic/msvc_include.h ")
else()
set(xsens_flag "-include xscommon_config.h -include xsens_compat.h -include xscontrollerconfig.h ")
endif()
set_property(TARGET mrpt_xsens APPEND_STRING
PROPERTY COMPILE_FLAGS ${xsens_flag}
)
if (MSVC)
target_compile_definitions(mrpt_xsens PRIVATE XDA_STATIC_LIB)
else()
# Needed for to define timegm()
target_compile_definitions(mrpt_xsens PRIVATE
_GNU_SOURCE
_BSD_SOURCE
_DEFAULT_SOURCE
)
endif()
# needs to be exported, even if private, to make cmake happy since it wants
# libraries to be statically-linkable:
export(
TARGETS mrpt_xsens
FILE "${CMAKE_CURRENT_BINARY_DIR}/mrpt_xsens-targets.cmake"
)
install(TARGETS mrpt_xsens EXPORT mrpt_xsens-targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(EXPORT mrpt_xsens-targets
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/mrpt_xsens
)
# Feature should be "cxx_std_11", but it's unknown to cmake 3.5.1 in Xenial:
target_compile_features(mrpt_xsens PRIVATE cxx_constexpr)
set_target_properties(mrpt_xsens PROPERTIES FOLDER "3rd party")
unset(SRCS)
endif()
# ----------------------------------
# Built-in version of freeglut?
# ----------------------------------
if(CMAKE_MRPT_HAS_OPENGL_GLUT AND NOT CMAKE_MRPT_HAS_OPENGL_GLUT_SYSTEM)
file(GLOB SRCS
freeglut/*.c
freeglut/GL/*.h
)
add_library(mrpt_freeglut STATIC ${SRCS})
if (MRPT_COMPILER_IS_GCC_OR_CLANG)
target_compile_options(mrpt_freeglut PRIVATE
-fPIC
)
endif()
CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H)
CHECK_INCLUDE_FILE("sys/ioctl.h" HAVE_SYS_IOCTL_H)
CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H)
CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
target_compile_definitions(mrpt_freeglut PUBLIC
FREEGLUT_STATIC # or /DFREEGLUT_EXPORTS
HAVE_SYS_TIME_H=$
HAVE_SYS_IOCTL_H=$
HAVE_FCNTL_H=$
HAVE_UNISTD_H=$
)
# Embedded version:
target_include_directories(mrpt_freeglut SYSTEM PUBLIC
${MRPT_SOURCE_DIR}/3rdparty/freeglut/
)
set_target_properties(mrpt_freeglut PROPERTIES FOLDER "3rd party")
# Depend on X11 lib:
if (UNIX)
target_link_libraries(mrpt_freeglut PUBLIC
X11
${OPENGL_glu_LIBRARY}
)
endif()
if (MINGW)
target_link_libraries(mrpt_freeglut PRIVATE winmm
)
endif()
unset(SRCS)
endif()
# ----------------------------------
# Built-in version of Glew?
# ----------------------------------
if(WIN32)
file(GLOB SRCS
glew/src/glew.c
glew/include/GL/*.h
)
add_library(mrpt_glew STATIC ${SRCS})
if (MRPT_COMPILER_IS_GCC_OR_CLANG)
target_compile_options(mrpt_glew PRIVATE
-fPIC
)
endif()
if (MINGW)
target_compile_options(mrpt_glew PRIVATE
-Wno-cast-function-type
)
endif()
target_compile_definitions(mrpt_glew PUBLIC
GLEW_STATIC
)
# Embedded version:
target_include_directories(mrpt_glew SYSTEM PUBLIC
${MRPT_SOURCE_DIR}/3rdparty/glew/include/
${MRPT_SOURCE_DIR}/3rdparty/glext/include/
)
set_target_properties(mrpt_glew PROPERTIES FOLDER "3rd party")
unset(SRCS)
endif()
# ----------------------------------
# nanogui:
# ----------------------------------
# Already handled in cmakemodules/script_nanogui.cmake
# ----------------------------------
# libfyaml
# ----------------------------------
# already handled in cmakemodules/script_libfyaml.cmake
# ----------------------------------
# simpleini
# ----------------------------------
# already handled in cmakemodules/script_simpleini.cmake
# ----------------------------------
# nanoflann:
# ----------------------------------
# Already handled in cmakemodules/script_nanoflann.cmake
# ----------------------------------
# googletest
# ----------------------------------
if (NOT CMAKE_MRPT_HAS_GTEST_SYSTEM)
add_library(mrptgtest
STATIC
${MRPT_SOURCE_DIR}/3rdparty/googletest/googletest/src/gtest-all.cc
)
target_include_directories(mrptgtest PRIVATE
${MRPT_SOURCE_DIR}/3rdparty/googletest/googletest/src/
${MRPT_SOURCE_DIR}/3rdparty/googletest/googletest/
)
target_include_directories(mrptgtest PUBLIC
${MRPT_SOURCE_DIR}/3rdparty/googletest/googletest/include/
)
mrpt_lib_target_requires_cpp17(mrptgtest)
if (UNIX AND MRPT_COMPILER_IS_GCC_OR_CLANG)
target_compile_options(mrptgtest PRIVATE -fPIC)
endif()
# Fix a "bug" in VS11 (MSVC 2012):
if(MSVC)
target_compile_definitions(mrptgtest PUBLIC _VARIADIC_MAX=10)
endif()
if(MRPT_COMPILER_IS_CLANG AND APPLE)
target_compile_definitions(mrptgtest PUBLIC GTEST_USE_OWN_TR1_TUPLE=1)
endif()
set_target_properties(mrptgtest PROPERTIES FOLDER "3rd party")
endif()