cmake_minimum_required(VERSION 3.10) project(CeresWrapper VERSION 1.0.0 LANGUAGES CXX) # Set C++ standard set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Build shared library set(CMAKE_POSITION_INDEPENDENT_CODE ON) # Find required packages find_package(Ceres REQUIRED) find_package(Eigen3 REQUIRED) # Include directories include_directories( ${CERES_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIR} ) # Source files set(SOURCES ceres_wrapper.cc ) # Header files set(HEADERS ceres_wrapper.h ) # Create shared library add_library(ceres_wrapper SHARED ${SOURCES} ${HEADERS}) # Set library properties set_target_properties(ceres_wrapper PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1 PUBLIC_HEADER "${HEADERS}" CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON ) # Add compile definition for export macro target_compile_definitions(ceres_wrapper PRIVATE CERES_WRAPPER_BUILDING) # Link libraries target_link_libraries(ceres_wrapper PUBLIC Ceres::ceres Eigen3::Eigen ) # Compiler-specific options if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(ceres_wrapper PRIVATE -Wall -Wextra -Wpedantic -fvisibility=hidden ) endif() # Install rules install(TARGETS ceres_wrapper LIBRARY DESTINATION lib ARCHIVE DESTINATION lib PUBLIC_HEADER DESTINATION include/ceres_wrapper ) # Install header install(FILES ${HEADERS} DESTINATION include/ceres_wrapper ) # ============================================================================ # Test executable # ============================================================================ option(BUILD_TESTS "Build test executable" ON) if(BUILD_TESTS) enable_language(C) # Test source add_executable(ceres_wrapper_test ceres_wrapper_test.c ) # Link test executable target_link_libraries(ceres_wrapper_test PRIVATE ceres_wrapper Ceres::ceres ) # Include directories for test target_include_directories(ceres_wrapper_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CERES_INCLUDE_DIRS} ) # Add compile definition for Ceres include if needed if(CERES_INCLUDE_DIRS) target_compile_definitions(ceres_wrapper_test PRIVATE CERES_INCLUDE_DIR="${CERES_INCLUDE_DIRS}" ) endif() # Add test to CTest add_test(NAME CeresWrapperTest COMMAND ceres_wrapper_test) message(STATUS " Tests: Enabled") else() message(STATUS " Tests: Disabled") endif() # Build configuration summary message(STATUS "CeresWrapper Configuration:") message(STATUS " Version: ${PROJECT_VERSION}") message(STATUS " C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS " Ceres Include: ${CERES_INCLUDE_DIRS}") message(STATUS " Eigen3 Include: ${EIGEN3_INCLUDE_DIR}") message(STATUS " Build Type: ${CMAKE_BUILD_TYPE}") message(STATUS " Install Prefix: ${CMAKE_INSTALL_PREFIX}")