CMakeLists.txt 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. cmake_minimum_required(VERSION 3.4)
  2. project(Sophus VERSION 1.1.0)
  3. include(CMakePackageConfigHelpers)
  4. include(GNUInstallDirs)
  5. # Release by default
  6. # Turn on Debug with "-DCMAKE_BUILD_TYPE=Debug"
  7. if(NOT CMAKE_BUILD_TYPE)
  8. set(CMAKE_BUILD_TYPE Release)
  9. endif()
  10. set(CMAKE_CXX_STANDARD 11)
  11. # Set compiler specific settings (FixMe: Should not cmake do this for us automatically?)
  12. IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  13. SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
  14. SET(CMAKE_CXX_FLAGS_RELEASE "-O3")
  15. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -Wno-deprecated-register -Qunused-arguments -fcolor-diagnostics")
  16. ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  17. SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
  18. SET(CMAKE_CXX_FLAGS_RELEASE "-O3")
  19. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -std=c++11 -Wno-deprecated-declarations -ftemplate-backtrace-limit=0")
  20. SET(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG} --coverage -fno-inline -fno-inline-small-functions -fno-default-inline")
  21. SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE "${CMAKE_EXE_LINKER_FLAGS_DEBUG} --coverage")
  22. SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} --coverage")
  23. ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "^MSVC$")
  24. ADD_DEFINITIONS("-D _USE_MATH_DEFINES /bigobj /wd4305 /wd4244 /MP")
  25. ENDIF()
  26. # Add local path for finding packages, set the local version first
  27. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
  28. # Find Eigen 3 (dependency)
  29. find_package(Eigen3 3.3.0 REQUIRED)
  30. # Define interface library target
  31. add_library(sophus INTERFACE)
  32. set(SOPHUS_HEADER_FILES
  33. sophus/average.hpp
  34. sophus/common.hpp
  35. sophus/geometry.hpp
  36. sophus/interpolate.hpp
  37. sophus/interpolate_details.hpp
  38. sophus/num_diff.hpp
  39. sophus/rotation_matrix.hpp
  40. sophus/rxso2.hpp
  41. sophus/rxso3.hpp
  42. sophus/se2.hpp
  43. sophus/se3.hpp
  44. sophus/sim2.hpp
  45. sophus/sim3.hpp
  46. sophus/sim_details.hpp
  47. sophus/so2.hpp
  48. sophus/so3.hpp
  49. sophus/types.hpp
  50. sophus/velocities.hpp
  51. sophus/formatstring.hpp
  52. )
  53. set(SOPHUS_OTHER_FILES
  54. sophus/test_macros.hpp
  55. sophus/example_ensure_handler.cpp
  56. )
  57. if(MSVC)
  58. # Define common math constants if we compile with MSVC
  59. target_compile_definitions (sophus INTERFACE _USE_MATH_DEFINES)
  60. endif (MSVC)
  61. # Add Eigen interface dependency, depending on available cmake info
  62. if(TARGET Eigen3::Eigen)
  63. target_link_libraries(sophus INTERFACE Eigen3::Eigen)
  64. set(Eigen3_DEPENDENCY "find_dependency (Eigen3 ${Eigen3_VERSION})")
  65. else(TARGET Eigen3::Eigen)
  66. target_include_directories (sophus SYSTEM INTERFACE ${EIGEN3_INCLUDE_DIR})
  67. endif(TARGET Eigen3::Eigen)
  68. # Associate target with include directory
  69. target_include_directories(sophus INTERFACE
  70. "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
  71. "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
  72. )
  73. # Declare all used C++11 features
  74. target_compile_features (sophus INTERFACE
  75. cxx_auto_type
  76. cxx_decltype
  77. cxx_nullptr
  78. cxx_right_angle_brackets
  79. cxx_variadic_macros
  80. cxx_variadic_templates
  81. )
  82. # Add sources as custom target so that they are shown in IDE's
  83. add_custom_target(other SOURCES ${SOPHUS_OTHER_FILES})
  84. # Create 'test' make target using ctest
  85. option(BUILD_TESTS "Build tests." ON)
  86. if(BUILD_TESTS)
  87. enable_testing()
  88. add_subdirectory(test)
  89. endif()
  90. # Create examples make targets using ctest
  91. option(BUILD_EXAMPLES "Build examples." ON)
  92. if(BUILD_EXAMPLES)
  93. add_subdirectory(examples)
  94. endif()
  95. # Export package for use from the build tree
  96. set(SOPHUS_CMAKE_EXPORT_DIR ${CMAKE_INSTALL_DATADIR}/sophus/cmake)
  97. set_target_properties(sophus PROPERTIES EXPORT_NAME Sophus)
  98. install(TARGETS sophus EXPORT SophusTargets)
  99. install(EXPORT SophusTargets
  100. NAMESPACE Sophus::
  101. DESTINATION ${SOPHUS_CMAKE_EXPORT_DIR}
  102. )
  103. export(TARGETS sophus NAMESPACE Sophus:: FILE SophusTargets.cmake)
  104. export(PACKAGE Sophus)
  105. configure_package_config_file(
  106. SophusConfig.cmake.in
  107. ${CMAKE_CURRENT_BINARY_DIR}/SophusConfig.cmake
  108. INSTALL_DESTINATION ${SOPHUS_CMAKE_EXPORT_DIR}
  109. NO_CHECK_REQUIRED_COMPONENTS_MACRO
  110. )
  111. # Remove architecture dependence. Sophus is a header-only library.
  112. set(TEMP_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
  113. unset(CMAKE_SIZEOF_VOID_P)
  114. # Write version to file
  115. write_basic_package_version_file (
  116. SophusConfigVersion.cmake
  117. VERSION ${PROJECT_VERSION}
  118. COMPATIBILITY SameMajorVersion
  119. )
  120. # Recover architecture dependence
  121. set(CMAKE_SIZEOF_VOID_P ${TEMP_SIZEOF_VOID_P})
  122. # Install cmake targets
  123. install(
  124. FILES ${CMAKE_CURRENT_BINARY_DIR}/SophusConfig.cmake
  125. ${CMAKE_CURRENT_BINARY_DIR}/SophusConfigVersion.cmake
  126. DESTINATION ${SOPHUS_CMAKE_EXPORT_DIR}
  127. )
  128. # Install header files
  129. install(
  130. FILES ${SOPHUS_HEADER_FILES}
  131. DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sophus
  132. )