1+ #
2+ # Copyright 2025 INRIA
3+ #
4+
15cmake_minimum_required (VERSION 3.18)
26
37set (PROJECT_NAME nanoeigenpy)
4- set (PROJECT_URL https://github.com/ManifoldFR /nanoeigenpy)
8+ set (PROJECT_URL https://github.com/Simple-Robotics /nanoeigenpy)
59set (PROJECT_DESCRIPTION "Tools for using Eigen with nanobind" )
610set (PROJECT_CUSTOM_HEADER_EXTENSION "hpp" )
711set (PROJECT_USE_CMAKE_EXPORT True )
812
9- include (cmake/base.cmake)
13+ # To enable jrl-cmakemodules compatibility with workspace we must define the two
14+ # following lines
15+ set (PROJECT_AUTO_RUN_FINALIZE FALSE )
16+ set (PROJECT_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR} )
17+
18+ # Check if the submodule cmake have been initialized
19+ set (JRL_CMAKE_MODULES "${CMAKE_CURRENT_LIST_DIR} /cmake" )
20+ if (EXISTS "${JRL_CMAKE_MODULES} /base.cmake" )
21+ message (STATUS "JRL cmakemodules found in 'cmake/' git submodule" )
22+ else ()
23+ find_package (jrl-cmakemodules QUIET CONFIG)
24+ if (jrl-cmakemodules_FOUND)
25+ get_property (
26+ JRL_CMAKE_MODULES
27+ TARGET jrl-cmakemodules::jrl-cmakemodules
28+ PROPERTY INTERFACE_INCLUDE_DIRECTORIES
29+ )
30+ message (STATUS "JRL cmakemodules found on system at ${JRL_CMAKE_MODULES} " )
31+ elseif (${CMAKE_VERSION} VERSION_LESS "3.14.0" )
32+ message (
33+ FATAL_ERROR
34+ "\n Can't find jrl-cmakemodules. Please either:\n "
35+ " - use git submodule: 'git submodule update --init'\n "
36+ " - or install https://github.com/jrl-umi3218/jrl-cmakemodules\n "
37+ " - or upgrade your CMake version to >= 3.14 to allow automatic fetching\n "
38+ )
39+ else ()
40+ message (STATUS "JRL cmakemodules not found. Let's fetch it." )
41+ include (FetchContent)
42+ FetchContent_Declare(
43+ "jrl-cmakemodules"
44+ GIT_REPOSITORY "https://github.com/jrl-umi3218/jrl-cmakemodules.git"
45+ )
46+ FetchContent_MakeAvailable("jrl-cmakemodules" )
47+ FetchContent_GetProperties("jrl-cmakemodules" SOURCE_DIR JRL_CMAKE_MODULES)
48+ endif ()
49+ endif ()
50+
51+ option (INSTALL_DOCUMENTATION "Generate and install the documentation" OFF )
1052
53+ if (POLICY CMP0167)
54+ cmake_policy (SET CMP0167 NEW)
55+ set (CMAKE_POLICY_DEFAULT_CMP0167 NEW)
56+ endif ()
57+ if (POLICY CMP0177)
58+ cmake_policy (SET CMP0177 NEW)
59+ set (CMAKE_POLICY_DEFAULT_CMP0177 NEW)
60+ endif ()
61+ include ("${JRL_CMAKE_MODULES} /base.cmake" )
1162COMPUTE_PROJECT_ARGS(PROJECT_ARGS LANGUAGES CXX)
63+ include ("${JRL_CMAKE_MODULES} /ide.cmake" )
64+ include ("${JRL_CMAKE_MODULES} /apple.cmake" )
1265project (${PROJECT_NAME} ${PROJECT_ARGS} )
1366
67+ string (REPLACE "-pedantic" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} )
68+ string (REPLACE "-Wcast-qual" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} )
69+ string (REPLACE "-Wconversion" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} )
70+
1471set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /bin)
1572set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
1673set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
1774
18- find_package (Eigen3 REQUIRED)
19-
20- add_library (nanoeigenpy_headers INTERFACE )
21- target_link_libraries (nanoeigenpy_headers INTERFACE Eigen3::Eigen)
22-
23- find_package (Python REQUIRED COMPONENTS Interpreter Development)
24-
2575if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES )
2676 set (CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
2777 set_property (
@@ -30,6 +80,25 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
3080 )
3181endif ()
3282
83+ option (
84+ BUILD_WITH_CHOLMOD_SUPPORT
85+ "Build NanoEigenPy with the Cholmod support"
86+ OFF
87+ )
88+
89+ if (APPLE )
90+ option (
91+ BUILD_WITH_ACCELERATE_SUPPORT
92+ "Build EigenPy with the Accelerate support"
93+ OFF
94+ )
95+ endif (APPLE )
96+
97+ # Find dependencies
98+ ADD_PROJECT_DEPENDENCY(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.3.1" )
99+
100+ find_package (Python REQUIRED COMPONENTS Interpreter Development)
101+
33102# Detect the installed nanobind package and import it into CMake
34103execute_process (
35104 COMMAND "${Python_EXECUTABLE} " -m nanobind --cmake_dir
@@ -38,29 +107,133 @@ execute_process(
38107)
39108find_package (nanobind CONFIG REQUIRED)
40109
41- file (GLOB nanoeigenpy_SOURCES src/*.cpp)
42- nanobind_add_module(nanoeigenpy NB_STATIC NB_SUPPRESS_WARNINGS ${nanoeigenpy_SOURCES} )
43- target_link_libraries (nanoeigenpy PUBLIC nanoeigenpy_headers)
110+ # Setup main targets
111+ file (
112+ GLOB_RECURSE ${PROJECT_NAME} _HEADERS
113+ CONFIGURE_DEPENDS
114+ include /nanoeigenpy/*.hpp
115+ )
116+
117+ add_library (nanoeigenpy_headers INTERFACE )
118+ target_include_directories (
119+ nanoeigenpy_headers
120+ INTERFACE
121+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} >
122+ $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR} /include >
123+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /include >
124+ )
125+ target_link_libraries (nanoeigenpy_headers INTERFACE Eigen3::Eigen)
126+
127+ set (${PROJECT_NAME} _SOURCES src/module.cpp src/solvers.cpp)
128+ nanobind_add_module(nanoeigenpy NB_STATIC NB_SUPPRESS_WARNINGS ${nanoeigenpy_SOURCES} ${nanoeigenpy_HEADERS} )
129+ target_link_libraries (nanoeigenpy PRIVATE nanoeigenpy_headers)
130+
131+ # Cholmod
132+ if (BUILD_WITH_CHOLMOD_SUPPORT)
133+ set (
134+ CMAKE_MODULE_PATH
135+ ${JRL_CMAKE_MODULES} /find -external/CHOLMOD
136+ ${CMAKE_MODULE_PATH}
137+ )
138+ ADD_PROJECT_DEPENDENCY(CHOLMOD REQUIRED FIND_EXTERNAL "CHOLMOD" )
139+ message (
140+ STATUS
141+ "Build with CHOLMOD support (LGPL). See CHOLMOD/Doc/License.txt for further details."
142+ )
143+ file (
144+ GLOB ${PROJECT_NAME} _DECOMPOSITIONS_SPARSE_CHOLMOD_HEADERS
145+ include /nanoeigenpy/decompositions/sparse/cholmod/*.hpp
146+ )
147+ list (
148+ APPEND
149+ ${PROJECT_NAME} _HEADERS
150+ ${${PROJECT_NAME} _DECOMPOSITIONS_SPARSE_CHOLMOD_HEADERS}
151+ )
152+ target_link_libraries (nanoeigenpy PRIVATE CHOLMOD::CHOLMOD)
153+ else ()
154+ list (
155+ FILTER ${PROJECT_NAME} _HEADERS
156+ EXCLUDE
157+ REGEX "include/nanoeigenpy/decompositions/sparse/cholmod/.*"
158+ )
159+ endif (BUILD_WITH_CHOLMOD_SUPPORT)
160+
161+ # Apple accelerate
162+ if (BUILD_WITH_ACCELERATE_SUPPORT)
163+ if (NOT ${Eigen3_VERSION} VERSION_GREATER_EQUAL "3.4.90" )
164+ message (
165+ FATAL_ERROR
166+ "Your version of Eigen is too low. Should be at least 3.4.90. Current version is ${Eigen3_VERSION} ."
167+ )
168+ endif ()
169+
170+ set (
171+ CMAKE_MODULE_PATH
172+ ${JRL_CMAKE_MODULES} /find -external/Accelerate
173+ ${CMAKE_MODULE_PATH}
174+ )
175+ find_package (Accelerate REQUIRED)
176+ message (STATUS "Build with Accelerate support framework." )
177+ target_compile_definitions (
178+ nanoeigenpy_headers
179+ INTERFACE -DNANOEIGENPY_WITH_ACCELERATE_SUPPORT
180+ )
181+ endif (BUILD_WITH_ACCELERATE_SUPPORT)
182+
183+ if (BUILD_WITH_ACCELERATE_SUPPORT)
184+ file (
185+ GLOB ${PROJECT_NAME} _DECOMPOSITIONS_SPARSE_ACCELERATE_HEADERS
186+ include /nanoeigenpy/decompositions/sparse/accelerate/*.hpp
187+ )
188+ list (
189+ APPEND
190+ ${PROJECT_NAME} _HEADERS
191+ ${${PROJECT_NAME} _DECOMPOSITIONS_SPARSE_ACCELERATE_HEADERS}
192+ )
193+ else ()
194+ list (
195+ FILTER ${PROJECT_NAME} _HEADERS
196+ EXCLUDE
197+ REGEX "include/nanoeigenpy/decompositions/sparse/accelerate/.*"
198+ )
199+ endif (BUILD_WITH_ACCELERATE_SUPPORT)
200+
201+ if (BUILD_WITH_ACCELERATE_SUPPORT)
202+ target_link_libraries (nanoeigenpy PRIVATE Accelerate)
203+ endif ()
44204
45205if (BUILD_TESTING)
46206 add_subdirectory (tests)
47207endif ()
48208
49- install (
50- TARGETS nanoeigenpy_headers
51- EXPORT ${TARGETS_EXPORT_NAME}
52- INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
209+ nanobind_add_stub(
210+ nanoeigenpy_stub
211+ INSTALL_TIME
212+ VERBOSE
213+ MODULE nanoeigenpy
214+ OUTPUT nanoeigenpy.pyi
215+ PYTHON_PATH $<TARGET_FILE_DIR:nanoeigenpy>
216+ DEPENDS nanoeigenpy
53217)
54218
219+ # Install targets
55220install (
56- DIRECTORY include /nanoeigenpy
57- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
58- FILES_MATCHING
59- PATTERN "*.hpp"
221+ TARGETS ${PROJECT_NAME} _headers
222+ EXPORT ${TARGETS_EXPORT_NAME}
223+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
224+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
225+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
226+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
227+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
60228)
61229
62230install (
63- TARGETS nanoeigenpy
231+ TARGETS ${PROJECT_NAME}
64232 EXPORT ${TARGETS_EXPORT_NAME}
65233 LIBRARY DESTINATION ${Python_SITELIB}
66234)
235+
236+ ADD_HEADER_GROUP(${PROJECT_NAME} _HEADERS)
237+ ADD_SOURCE_GROUP(${PROJECT_NAME} _SOURCES)
238+
239+ SETUP_PROJECT_FINALIZE()
0 commit comments