@@ -25,6 +25,8 @@ project(
2525 HOMEPAGE_URL "https://github.com/astomodynamics/cddp-cpp"
2626)
2727
28+ include (GNUInstallDirs )
29+
2830set (CMAKE_CXX_STANDARD 17) # Enforce C++17 as the minimum standard
2931set (CMAKE_CXX_STANDARD_REQUIRED ON ) # Enforce C++17 as the minimum standard
3032set (ABSL_PROPAGATE_CXX_STD ON ) # Enforce C++17 for absl
@@ -43,6 +45,7 @@ endif()
4345
4446# Options
4547option (CDDP_CPP_BUILD_TESTS "Whether to build tests." ON )
48+ option (CDDP_CPP_BUILD_EXAMPLES "Whether to build examples." ON )
4649
4750# CasADi Configuration
4851option (CDDP_CPP_CASADI "Whether to use CasADi" OFF )
@@ -92,16 +95,6 @@ endif()
9295# Enable FetchContent for downloading dependencies
9396include (FetchContent )
9497
95- # Matplotplusplus
96- FetchContent_Declare (matplotplusplus
97- GIT_REPOSITORY https://github.com/alandefreitas/matplotplusplus
98- GIT_TAG origin/master) # or whatever tag you want
99- FetchContent_GetProperties (matplotplusplus)
100- if (NOT matplotplusplus_POPULATED)
101- FetchContent_Populate (matplotplusplus)
102- add_subdirectory (${matplotplusplus_SOURCE_DIR} ${matplotplusplus_BINARY_DIR} EXCLUDE_FROM_ALL )
103- endif ()
104-
10598# autodiff
10699set (AUTODIFF_BUILD_TESTS OFF CACHE BOOL "Don't build autodiff tests" )
107100set (AUTODIFF_BUILD_EXAMPLES OFF CACHE BOOL "Don't build autodiff examples" )
@@ -116,6 +109,7 @@ FetchContent_MakeAvailable(autodiff)
116109# Googletest
117110if (CDDP_CPP_BUILD_TESTS)
118111 enable_testing ()
112+ set (INSTALL_GTEST OFF CACHE BOOL "Don't install GTest alongside cddp" FORCE )
119113 FetchContent_Declare (
120114 googletest
121115 GIT_REPOSITORY https://github.com/google/googletest.git
@@ -172,29 +166,33 @@ set(dynamics_model_srcs
172166 src/dynamics_model/euler_attitude.cpp
173167)
174168
175- add_library (${PROJECT_NAME}
169+ add_library (${PROJECT_NAME}
176170 ${cddp_core_srcs}
177171 ${dynamics_model_srcs}
178172)
179173
180- target_link_libraries (${PROJECT_NAME}
181- $<IF :$<BOOL :${Eigen3_FOUND} >,Eigen3 ::Eigen ,>
182- matplot
183- autodiff
184- )
174+ # Enable position-independent code (required for Python shared library linking)
175+ set_target_properties (${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON )
176+
177+ target_link_libraries (${PROJECT_NAME}
178+ PUBLIC
179+ $<IF :$<BOOL :${Eigen3_FOUND} >,Eigen3 ::Eigen ,>
180+ autodiff
181+ )
185182
186183if (NOT Eigen3_FOUND)
187184 target_include_directories (${PROJECT_NAME} PUBLIC ${EIGEN3_INCLUDE_DIRS} )
188185endif ()
189186
190187target_include_directories (${PROJECT_NAME} PUBLIC
191188 $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /include /cddp -cpp >
192- $<INSTALL_INTERFACE :include >
189+ $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >
190+ $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} /cddp -cpp >
193191)
194192
195193if (CDDP_CPP_CASADI)
196194 target_include_directories (${PROJECT_NAME} PUBLIC ${CASADI_INCLUDE_DIR} )
197- target_link_libraries (${PROJECT_NAME} ${CASADI_LIBRARIES} )
195+ target_link_libraries (${PROJECT_NAME} PRIVATE ${CASADI_LIBRARIES} )
198196endif ()
199197
200198# ACADOS
@@ -241,7 +239,7 @@ if (CDDP_CPP_ACADOS)
241239 include_directories (${BLASFEO_INCLUDE_DIR} )
242240 include_directories (${HPIPM_INCLUDE_DIR} )
243241 link_directories (${ACADOS_LIB_DIR} )
244- target_link_libraries (${PROJECT_NAME} ${ACADOS_LIBRARIES} )
242+ target_link_libraries (${PROJECT_NAME} PRIVATE ${ACADOS_LIBRARIES} )
245243
246244 # Add preprocessor definition to enable ACADOS in code
247245 target_compile_definitions (${PROJECT_NAME} PRIVATE CDDP_CPP_ACADOS_ENABLED=1 )
@@ -258,11 +256,52 @@ if (CDDP_CPP_BUILD_TESTS)
258256endif ()
259257
260258# Build examples
261- add_subdirectory (examples )
262-
263- # Cmake compile commmand:
264- # $ mkdir build
265- # $ cd build
266- # $ cmake -DCDDP_CPP_BUILD_TESTS=ON -DCDDP_CPP_CASADI=ON ..
267- # $ make -j4
268- # $ make test
259+ if (CDDP_CPP_BUILD_EXAMPLES)
260+ add_subdirectory (examples )
261+ endif ()
262+
263+ # Python bindings (optional)
264+ option (CDDP_CPP_BUILD_PYTHON "Build Python bindings" OFF )
265+ if (CDDP_CPP_BUILD_PYTHON)
266+ add_subdirectory (python )
267+ endif ()
268+
269+ # Install targets
270+ include (CMakePackageConfigHelpers )
271+
272+ install (TARGETS ${PROJECT_NAME}
273+ EXPORT cddpTargets
274+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
275+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
276+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
277+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
278+ )
279+
280+ install (DIRECTORY include/cddp-cpp/
281+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /cddp-cpp
282+ FILES_MATCHING PATTERN "*.hpp"
283+ )
284+
285+ install (EXPORT cddpTargets
286+ FILE cddpTargets.cmake
287+ NAMESPACE cddp::
288+ DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/cddp
289+ )
290+
291+ configure_package_config_file (
292+ ${CMAKE_CURRENT_SOURCE_DIR} /cmake/cddpConfig.cmake.in
293+ ${CMAKE_CURRENT_BINARY_DIR} /cddpConfig.cmake
294+ INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/cddp
295+ )
296+
297+ write_basic_package_version_file (
298+ ${CMAKE_CURRENT_BINARY_DIR} /cddpConfigVersion.cmake
299+ VERSION ${PROJECT_VERSION}
300+ COMPATIBILITY SameMajorVersion
301+ )
302+
303+ install (FILES
304+ ${CMAKE_CURRENT_BINARY_DIR} /cddpConfig.cmake
305+ ${CMAKE_CURRENT_BINARY_DIR} /cddpConfigVersion.cmake
306+ DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/cddp
307+ )
0 commit comments