-
Notifications
You must be signed in to change notification settings - Fork 638
/
Copy pathCMakeLists.txt
144 lines (116 loc) · 4.66 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
project(pymrpt)
# BINDER
# Wrapper generated with binder git commit 95938b8a6d7afd564ee5f0d3430964bd8ea3df1a
#
#find_package(PythonInterp)
# Note: relative paths are relative to ${CMAKE_INSTALL_PREFIX} (defaults to /usr/local on Ubuntu)
#
# According to debian policy https://debian-python.readthedocs.io/en/latest/debian-policy.html#module-path
# this should be: /usr/lib/python3/dist-packages
#
#set(PYMRPT_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib/python3/dist-packages/")
#install(TARGETS pymrpt LIBRARY DESTINATION ${PYMRPT_INSTALL_DIR})
if (NOT CMAKE_MRPT_HAS_PYTHON_BINDINGS)
return()
endif()
# Take list of sources:
file(READ ${CMAKE_CURRENT_LIST_DIR}/src/pymrpt.sources PY_ALL_SRCS)
string(REPLACE "\n" ";" PY_ALL_SRCS "${PY_ALL_SRCS}") # string -> list of strings
list(TRANSFORM PY_ALL_SRCS PREPEND "src/")
pybind11_add_module(pymrpt
${PY_ALL_SRCS}
# -- manually crafted files --
pymrpt_internals.cpp
)
# Remove LTO from pybind flags:
option(MRPT_PYBIND11_WITH_LTO "If disabled, MRPT will remove the LTO build flags added by pybind for pymrpt. Default is ON, so enabling LTO" "ON")
if (NOT MRPT_PYBIND11_WITH_LTO)
get_target_property(_opts pymrpt LINK_LIBRARIES)
string(REPLACE "pybind11::lto" "" _opts "${_opts}")
string(REPLACE "pybind11::thin_lto" "" _opts "${_opts}")
set_target_properties(pymrpt PROPERTIES LINK_LIBRARIES ${_opts})
else()
# Add parallel lto:
set(MRPT_PYTHON_LTO_PARALLEL_JOBS "3" CACHE STRING "Number of parallel threads for link-time -flto in pymrpt. Setting it to a large number may lead to RAM swapping. Default=3. Set to 'auto' for automatic core detection.")
target_link_options(pymrpt PRIVATE -flto=${MRPT_PYTHON_LTO_PARALLEL_JOBS})
endif()
# enable separate build of pymrpt for ros packages:
if(NOT TARGET mrpt::apps AND NOT TARGET mrpt-apps)
find_package(mrpt-apps REQUIRED)
endif()
if(NOT TARGET mrpt::nav AND NOT TARGET mrpt-nav)
find_package(mrpt-nav REQUIRED)
endif()
if(NOT TARGET mrpt::slam AND NOT TARGET mrpt-slam)
find_package(mrpt-slam REQUIRED)
endif()
if(NOT TARGET mrpt::gui AND NOT TARGET mrpt-gui)
find_package(mrpt-gui REQUIRED)
endif()
# Link:
target_link_libraries(pymrpt PUBLIC
mrpt::apps
mrpt::slam
mrpt::gui
mrpt::nav
)
# Avoid warnings for pybind auto-generated code:
if (MRPT_COMPILER_IS_GCC_OR_CLANG)
target_compile_options(pymrpt PRIVATE -Wno-shadow)
endif()
# Includes:
target_include_directories(pymrpt PRIVATE ".")
#target_compile_definitions(pymrpt PRIVATE
# PYBIND11_MAJOR_VERSION=${PYBIND11_MAJOR_VERSION}
# PYBIND11_MINOR_VERSION=${PYBIND11_MINOR_VERSION}
# PYBIND11_PATCH_VERSION=${PYBIND11_PATCH_VERSION}
# )
# Fix for pybind 2.4.x:
# override_caster_t was overload_caster_t
if ("${PYBIND11_MAJOR_VERSION}.${PYBIND11_MINOR_VERSION}" VERSION_LESS "2.9")
target_compile_definitions(pymrpt PRIVATE override_caster_t=overload_caster_t)
endif()
target_compile_definitions(pymrpt PRIVATE MRPT_BUILDING_PYTHON_WRAPPER)
# Python files:
file(MAKE_DIRECTORY ${MRPT_PYTHON_BUILD_DIRECTORY}/mrpt/)
add_custom_command(TARGET pymrpt POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pymrpt>
${MRPT_PYTHON_BUILD_DIRECTORY}/mrpt/
)
file(WRITE ${MRPT_PYTHON_BUILD_DIRECTORY}/mrpt/__init__.py
"from . import *")
# Required if we provide the stub files: ( https://peps.python.org/pep-0561/ )
file(WRITE ${MRPT_PYTHON_BUILD_DIRECTORY}/mrpt/py.typed "")
# install stub files too:
file(COPY
${CMAKE_CURRENT_LIST_DIR}/stubs-out/
DESTINATION ${MRPT_PYTHON_BUILD_DIRECTORY}/
)
# copy ROS stuff
file(COPY
${CMAKE_CURRENT_LIST_DIR}/ros_bridge.py
DESTINATION ${MRPT_PYTHON_BUILD_DIRECTORY}/mrpt/
)
# Generate setup.py
configure_file(${MRPT_SOURCE_DIR}/parse-files/setup.py.in
${MRPT_PYTHON_BUILD_DIRECTORY}/setup.py)
if (NOT DEFINED PYTHON_INSTALL_DIRECTORY)
set(PYTHON_INSTALL_DIRECTORY ${CMAKE_INSTALL_PREFIX} CACHE PATH "Install prefix for python modules with 'make python-install'")
endif()
mrpt_ament_cmake_python_get_python_install_dir() # Gets PYTHON_INSTALL_DIR
# We need to do the install via a script run during "make install" so we can
# catch the variable DESTDIR, used in debian builds:
configure_file(
${MRPT_SOURCE_DIR}/parse-files/install-python.cmake.in
${MRPT_BINARY_DIR}/install-python.cmake
@ONLY
)
add_custom_target(python-install
COMMAND ${CMAKE_COMMAND} -P ${MRPT_BINARY_DIR}/install-python.cmake
COMMENT "Running 'python-install'...")
add_dependencies(python-install pymrpt)
install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} --build \"${MRPT_BINARY_DIR}\" --target python-install)")
# -------------------------------------
# Special handle for ROS builds
# -------------------------------------
# See: https://github.com/ros-infrastructure/rosdep/issues/724#issuecomment-643015997