Skip to content

Commit b2cc9d7

Browse files
Merge pull request #71 from nim65s/standalone
CMake: BUILD_STANDALONE_PYTHON_INTERFACE
2 parents 176db0e + 7df5186 commit b2cc9d7

File tree

6 files changed

+81
-53
lines changed

6 files changed

+81
-53
lines changed

CMakeLists.txt

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.10)
1+
cmake_minimum_required(VERSION 3.22)
22

33
# Project properties
44
set(PROJECT_NAMESPACE machines-in-motion)
@@ -16,7 +16,6 @@ set(CMAKE_VERBOSE_MAKEFILE True)
1616
add_compile_options(--warn-no-conversion)
1717

1818
# Project options
19-
option(BUILD_PYTHON_INTERFACE "Build the python binding" ON)
2019
option(SUFFIX_SO_VERSION "Suffix library name with its version" ON)
2120
option(BUILD_WITH_PROXSUITE "Build the ProxQP-based SQP solver" OFF)
2221
option(BUILD_BENCHMARKS "Build the benchmarks" OFF)
@@ -47,14 +46,6 @@ else()
4746
TARGET jrl-cmakemodules::jrl-cmakemodules
4847
PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
4948
message(STATUS "JRL cmakemodules found on system at ${JRL_CMAKE_MODULES}")
50-
elseif(${CMAKE_VERSION} VERSION_LESS "3.14.0")
51-
message(
52-
FATAL_ERROR
53-
"\nCan't find jrl-cmakemodules. Please either:\n"
54-
" - use git submodule: 'git submodule update --init'\n"
55-
" - or install https://github.com/jrl-umi3218/jrl-cmakemodules\n"
56-
" - or upgrade your CMake version to >= 3.14 to allow automatic fetching\n"
57-
)
5849
else()
5950
message(STATUS "JRL cmakemodules not found. Let's fetch it.")
6051
include(FetchContent)
@@ -129,25 +120,33 @@ if(BUILD_WITH_PROXSUITE)
129120
list(APPEND ${PROJECT_NAME}_SOURCES src/csqp_proxqp.cpp)
130121
endif(BUILD_WITH_PROXSUITE)
131122

132-
add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES}
133-
${${PROJECT_NAME}_HEADERS})
134-
target_include_directories(
135-
${PROJECT_NAME} PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
136-
137-
if(SUFFIX_SO_VERSION)
138-
set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION})
139-
endif()
123+
if(BUILD_STANDALONE_PYTHON_INTERFACE)
124+
add_project_dependency(${PROJECT_NAME} REQUIRED CONFIG)
125+
set(PROJECT_EXPORT_NO_TARGET ON)
126+
else()
127+
add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES}
128+
${${PROJECT_NAME}_HEADERS})
129+
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
130+
target_include_directories(
131+
${PROJECT_NAME} PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
132+
133+
if(SUFFIX_SO_VERSION)
134+
set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION
135+
${PROJECT_VERSION})
136+
endif()
140137

141-
# Main Executable
142-
target_link_libraries(${PROJECT_NAME} crocoddyl::crocoddyl)
143-
if(BUILD_WITH_PROXSUITE)
144-
target_link_libraries(${PROJECT_NAME} proxsuite::proxsuite)
145-
endif()
138+
# Main Executable
139+
target_link_libraries(${PROJECT_NAME} crocoddyl::crocoddyl)
140+
if(BUILD_WITH_PROXSUITE)
141+
target_link_libraries(${PROJECT_NAME} proxsuite::proxsuite)
142+
endif()
146143

147-
if(UNIX)
148-
get_relative_rpath(${CMAKE_INSTALL_LIBDIR} ${PROJECT_NAME}_INSTALL_RPATH)
149-
set_target_properties(
150-
${PROJECT_NAME} PROPERTIES INSTALL_RPATH "${${PROJECT_NAME}_INSTALL_RPATH}")
144+
if(UNIX)
145+
get_relative_rpath(${CMAKE_INSTALL_LIBDIR} ${PROJECT_NAME}_INSTALL_RPATH)
146+
set_target_properties(
147+
${PROJECT_NAME} PROPERTIES INSTALL_RPATH
148+
"${${PROJECT_NAME}_INSTALL_RPATH}")
149+
endif()
151150
endif()
152151

153152
# Python Bindings
@@ -161,13 +160,14 @@ if(BUILD_TESTING)
161160
endif()
162161

163162
# Benchmarks
164-
if(BUILD_BENCHMARKS)
163+
if(BUILD_BENCHMARKS AND NOT BUILD_STANDALONE_PYTHON_INTERFACE)
165164
add_subdirectory(benchmarks)
166165
endif()
167166

168167
# Installation
169-
install(
170-
TARGETS ${PROJECT_NAME}
171-
EXPORT ${TARGETS_EXPORT_NAME}
172-
DESTINATION ${CMAKE_INSTALL_LIBDIR})
173-
install(FILES package.xml DESTINATION share/${PROJECT_NAME})
168+
if(NOT BUILD_STANDALONE_PYTHON_INTERFACE)
169+
install(
170+
TARGETS ${PROJECT_NAME}
171+
EXPORT ${TARGETS_EXPORT_NAME}
172+
DESTINATION ${CMAKE_INSTALL_LIBDIR})
173+
endif()

benchmarks/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ add_library(${PROJECT_NAME}_BENCHMARK_TOOLS SHARED
88
foreach(BENCHMARK_NAME ${${PROJECT_NAME}_BENCHMARK})
99
add_executable(${BENCHMARK_NAME} ${BENCHMARK_NAME}.cpp)
1010
target_link_libraries(
11-
${BENCHMARK_NAME} ${PROJECT_NAME} example-robot-data::example-robot-data
12-
${PROJECT_NAME}_BENCHMARK_TOOLS)
11+
${BENCHMARK_NAME} ${PROJECT_NAME}::${PROJECT_NAME}
12+
example-robot-data::example-robot-data ${PROJECT_NAME}_BENCHMARK_TOOLS)
1313
add_custom_target("benchmarks-cpp-${BENCHMARK_NAME}" ${BENCHMARK_NAME}
1414
\${INPUT})
1515
endforeach(BENCHMARK_NAME ${${PROJECT_NAME}_BENCHMARK})

bindings/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ if(BUILD_WITH_PROXSUITE)
1717
endif(BUILD_WITH_PROXSUITE)
1818

1919
add_library(${PY_NAME} MODULE ${${PY_NAME}_SOURCES})
20-
target_link_libraries(${PY_NAME} PUBLIC ${PROJECT_NAME} eigenpy::eigenpy)
20+
target_link_libraries(${PY_NAME} PUBLIC ${PROJECT_NAME}::${PROJECT_NAME}
21+
eigenpy::eigenpy)
2122

2223
set_target_properties(
2324
${PY_NAME}

cmake

Submodule cmake updated 439 files

flake.nix

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,23 @@
1111
inputs.flake-parts.lib.mkFlake { inherit inputs; } {
1212
systems = inputs.nixpkgs.lib.systems.flakeExposed;
1313
perSystem =
14-
{ pkgs, self', ... }:
14+
{
15+
lib,
16+
pkgs,
17+
self',
18+
...
19+
}:
1520
{
1621
apps.default = {
1722
type = "app";
1823
program = pkgs.python3.withPackages (_: [ self'.packages.default ]);
1924
};
20-
devShells.default = pkgs.mkShell {
21-
inputsFrom = [ self'.packages.default ];
22-
packages = [ (pkgs.python3.withPackages (p: [p.tomlkit])) ];
23-
};
2425
packages = {
25-
default = self'.packages.mim-solvers;
26-
mim-solvers = pkgs.python3Packages.mim-solvers.overrideAttrs (old: {
27-
src = pkgs.lib.fileset.toSource {
26+
default = self'.packages.py-mim-solvers;
27+
mim-solvers = pkgs.mim-solvers.overrideAttrs {
28+
src = lib.fileset.toSource {
2829
root = ./.;
29-
fileset = pkgs.lib.fileset.unions [
30+
fileset = lib.fileset.unions [
3031
./benchmarks
3132
./bindings
3233
./examples
@@ -38,7 +39,31 @@
3839
./package.xml
3940
];
4041
};
41-
});
42+
};
43+
py-mim-solvers = pkgs.python3Packages.toPythonModule (
44+
self'.packages.mim-solvers.overrideAttrs (super: {
45+
pname = "py-${super.pname}";
46+
postPatch = "";
47+
cmakeFlags = super.cmakeFlags ++ [
48+
(lib.cmakeBool "BUILD_PYTHON_INTERFACE" true)
49+
(lib.cmakeBool "BUILD_STANDALONE_PYTHON_INTERFACE" true)
50+
];
51+
nativeBuildInputs = super.nativeBuildInputs ++ [
52+
pkgs.python3Packages.python
53+
];
54+
propagatedBuildInputs = [
55+
pkgs.python3Packages.crocoddyl
56+
pkgs.python3Packages.osqp
57+
pkgs.python3Packages.proxsuite
58+
pkgs.python3Packages.scipy
59+
self'.packages.mim-solvers
60+
]
61+
++ super.propagatedBuildInputs;
62+
nativeCheckInputs = [
63+
pkgs.python3Packages.pythonImportsCheckHook
64+
];
65+
})
66+
);
4267
};
4368
};
4469
};

tests/CMakeLists.txt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ set(${PROJECT_NAME}_FACTORY_TEST
1010
factory/solver.hpp
1111
factory/solver.cpp)
1212

13-
add_library(${PROJECT_NAME}_unittest SHARED ${${PROJECT_NAME}_FACTORY_TEST})
14-
target_link_libraries(
15-
${PROJECT_NAME}_unittest PUBLIC ${PROJECT_NAME}
16-
example-robot-data::example-robot-data)
13+
if(NOT BUILD_STANDALONE_PYTHON_INTERFACE)
14+
add_library(${PROJECT_NAME}_unittest SHARED ${${PROJECT_NAME}_FACTORY_TEST})
15+
target_link_libraries(
16+
${PROJECT_NAME}_unittest PUBLIC ${PROJECT_NAME}::${PROJECT_NAME}
17+
example-robot-data::example-robot-data)
1718

18-
add_unit_test(test_solvers test_solvers.cpp)
19-
target_link_libraries(test_solvers PUBLIC ${PROJECT_NAME}_unittest)
19+
add_unit_test(test_solvers test_solvers.cpp)
20+
target_link_libraries(test_solvers PUBLIC ${PROJECT_NAME}_unittest)
21+
endif()
2022

2123
if(BUILD_PYTHON_INTERFACE)
2224
add_python_unit_test("py-test-clqr-convergence-all"

0 commit comments

Comments
 (0)