Skip to content

Commit 8de7205

Browse files
authored
Merge pull request #340 from lasp/feature/build-improvements
Miscellaneous build system improvements
2 parents 59c867e + 55b5f60 commit 8de7205

File tree

5 files changed

+991
-211
lines changed

5 files changed

+991
-211
lines changed

src/CMakeLists.txt

+25-54
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,4 @@
11
cmake_minimum_required(VERSION 3.14)
2-
if(POLICY CMP0078)
3-
cmake_policy(SET CMP0078 NEW)
4-
endif()
5-
6-
if(POLICY CMP0025)
7-
cmake_policy(SET CMP0025 NEW)
8-
endif()
9-
10-
if(POLICY CMP0057)
11-
cmake_policy(SET CMP0057 NEW)
12-
endif()
13-
14-
if(POLICY CMP0086)
15-
cmake_policy(SET CMP0086 NEW)
16-
endif()
17-
18-
if(POLICY CMP0068)
19-
cmake_policy(SET CMP0068 NEW)
20-
endif()
21-
22-
if(POLICY CMP0046)
23-
cmake_policy(SET CMP0046 NEW)
24-
endif()
25-
26-
if(POLICY CMP0148)
27-
cmake_policy(SET CMP0148 OLD)
28-
endif ()
292

303
project("basilisk")
314

@@ -133,9 +106,6 @@ function(sub_dir_list result curdir)
133106
PARENT_SCOPE)
134107
endfunction(sub_dir_list)
135108

136-
# add header search directories
137-
include_directories("${CMAKE_SOURCE_DIR}")
138-
139109
function(generate_package_libraries INIT_DIRECTORY AllLibs)
140110
# Find all _GeneralModuleFiles and put them into library targets so they aren't rewrapped, built with every module.
141111

@@ -172,7 +142,7 @@ function(generate_package_libraries INIT_DIRECTORY AllLibs)
172142
# Link all necessary libraries
173143
target_link_libraries(${LIB_NAME} PUBLIC ArchitectureUtilities)
174144
target_link_libraries(${LIB_NAME} PRIVATE ModuleIdGenerator)
175-
target_link_libraries(${LIB_NAME} PRIVATE ${PYTHON_LIBRARIES})
145+
target_link_libraries(${LIB_NAME} PRIVATE Python3::Module)
176146
target_link_libraries(${LIB_NAME} PRIVATE Eigen3::Eigen3)
177147

178148
# define build location, IDE generation specifications
@@ -208,11 +178,6 @@ function(find_package_targets PKG_DIR ALL_TARGET_LIST)
208178
endfunction(find_package_targets)
209179

210180
function(generate_package_targets TARGET_LIST LIB_DEP_LIST MODULE_DIR)
211-
212-
find_package(SWIG REQUIRED)
213-
include(UseSWIG REQUIRED)
214-
find_package(PythonLibs 3 REQUIRED)
215-
216181
if(TARGET_LIST)
217182
string(REPLACE "/" ";" DirList "${TARGET_LIST}")
218183
list(GET DirList 1 SUBMODULE)
@@ -290,7 +255,6 @@ function(generate_package_targets TARGET_LIST LIB_DEP_LIST MODULE_DIR)
290255
include("${PARENT_DIR}/Custom.cmake")
291256
endif()
292257

293-
target_include_directories(${TARGET_NAME} PRIVATE ${PYTHON_INCLUDE_PATH}) # Exposes python.h to wrap.c(xx) file
294258
target_include_directories(
295259
${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/${PARENT_DIR}) # Exposes module .h files to the PYTHON_wrap.c(xx) file
296260
# (not located in src)
@@ -305,7 +269,7 @@ function(generate_package_targets TARGET_LIST LIB_DEP_LIST MODULE_DIR)
305269
foreach(LIB ${LIB_DEP_LIST})
306270
target_link_libraries(${TARGET_NAME} PRIVATE ${LIB})
307271
endforeach()
308-
target_link_libraries(${TARGET_NAME} PRIVATE ${PYTHON_LIBRARIES})
272+
target_link_libraries(${TARGET_NAME} PRIVATE Python3::Module)
309273

310274
if(${MODULE_DIR} STREQUAL "ExternalModules")
311275
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER ${MODULE_DIR})
@@ -339,9 +303,29 @@ function(generate_package_targets TARGET_LIST LIB_DEP_LIST MODULE_DIR)
339303
endforeach()
340304
endfunction(generate_package_targets)
341305

306+
# add header search directories
307+
include_directories("${CMAKE_SOURCE_DIR}")
308+
342309
# Start of main projection configuration
343-
find_package(PythonInterp 3 REQUIRED)
344-
find_package(PythonLibs 3 REQUIRED)
310+
find_package(Python3 REQUIRED COMPONENTS Interpreter Development)
311+
312+
# Hack the Python3 module link options to *not* use `-undefined dynamic_lookup`.
313+
# Instead, pass an explicit allowlist of symbols that may be left undefined.
314+
# This trick is adapted from:
315+
# https://github.com/wjakob/nanobind/blob/0a6f8f36006dadff4b6279f58ce2188be20c9ada/cmake/nanobind-config.cmake#L33-L42
316+
# The allowlist is obtained from:
317+
# https://github.com/python/cpython/issues/97524#issuecomment-1460492751
318+
if(APPLE)
319+
set_target_properties(Python3::Module PROPERTIES
320+
INTERFACE_LINK_OPTIONS
321+
"-Wl,@${CMAKE_CURRENT_SOURCE_DIR}/cmake/cpython-exported-symbols"
322+
)
323+
endif()
324+
325+
find_package(SWIG REQUIRED)
326+
include(UseSWIG)
327+
328+
set(SWIG_USE_SWIG_DEPENDENCIES True)
345329

346330
include(FetchContent)
347331
FetchContent_Declare(
@@ -625,7 +609,7 @@ file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Basilisk/architecture")
625609
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Basilisk/simulation")
626610
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Basilisk/fswAlgorithms")
627611

628-
if(WIN32 AND (PYTHON_VERSION VERSION_GREATER 3.8))
612+
if(WIN32 AND (Python3_VERSION VERSION_GREATER 3.8))
629613
file(WRITE "${CMAKE_BINARY_DIR}/Basilisk/__init__.py"
630614
"#init file written by the build\n" "import sys, os\n" "from Basilisk import __path__\n"
631615
"bskPath = __path__[0]\n" "os.add_dll_directory(bskPath)\n")
@@ -667,18 +651,5 @@ file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Basilisk/supportData")
667651
file(GLOB dataFiles "${CMAKE_SOURCE_DIR}/../supportData/*")
668652
create_symlinks("${CMAKE_BINARY_DIR}/Basilisk/supportData" ${dataFiles})
669653

670-
# run python script to modify swig gen code
671-
add_custom_target(OverwriteSwig ALL)
672-
set(ARG utilities/overwriteSwig.py ${CMAKE_BINARY_DIR} ${SWIG_VERSION})
673-
add_custom_command(
674-
TARGET OverwriteSwig
675-
COMMAND ${PYTHON_EXECUTABLE} ${ARG}
676-
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/../src/)
677-
if(TARGET _thrusterDynamicEffector)
678-
add_dependencies(OverwriteSwig _thrusterDynamicEffector _vscmgStateEffector _reactionWheelStateEffector)
679-
elseif(TARGET thrusterDynamicEffector)
680-
add_dependencies(OverwriteSwig thrusterDynamicEffector vscmgStateEffector reactionWheelStateEffector)
681-
endif()
682-
683654
# Tests targets
684655
add_subdirectory("architecture/utilities/tests")

src/architecture/messaging/CMakeLists.txt

+15-13
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
cmake_policy(SET CMP0078 NEW)
2-
find_package(SWIG REQUIRED)
3-
include(${SWIG_USE_FILE})
4-
find_package(PythonLibs 3 REQUIRED)
5-
find_package(PythonInterp 3 REQUIRED)
6-
71
function(generate_messages searchDir)
82
file(
93
GLOB_RECURSE message_files
@@ -16,25 +10,33 @@ function(generate_messages searchDir)
1610
set(COMP_OUT_NAME "${CMAKE_CURRENT_SOURCE_DIR}/../../../dist3/autoSource/${TARGET_NAME}.i")
1711
add_custom_command(
1812
OUTPUT ${COMP_OUT_NAME}
19-
COMMAND ${PYTHON_EXECUTABLE} generateSWIGModules.py ${COMP_OUT_NAME} ${msgFile} ${TARGET_NAME} ${searchDir}
20-
DEPENDS ${msgFile}
13+
COMMAND
14+
${Python3_EXECUTABLE}
15+
${CMAKE_CURRENT_SOURCE_DIR}/msgAutoSource/generateSWIGModules.py
16+
${COMP_OUT_NAME}
17+
${msgFile}
18+
${TARGET_NAME}
19+
${searchDir}
20+
DEPENDS
21+
${CMAKE_CURRENT_SOURCE_DIR}/msgAutoSource/generateSWIGModules.py
22+
${CMAKE_CURRENT_SOURCE_DIR}/msgAutoSource/msgInterfacePy.i.in
23+
${msgFile}
2124
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/msgAutoSource/)
2225
set_property(SOURCE ${COMP_OUT_NAME} PROPERTY CPLUSPLUS ON)
2326

2427
if(NOT "${EXTERNAL_MODULES_PATH}" STREQUAL "")
2528
set_property(
2629
SOURCE ${COMP_OUT_NAME}
2730
PROPERTY SWIG_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/../" "-I${CMAKE_CURRENT_SOURCE_DIR}/../../"
28-
"-I${EXTERNAL_MODULES_PATH}/" "-I${CMAKE_BINARY_DIR}/autoSource/" "-I${PYTHON_INCLUDE_PATH}")
31+
"-I${EXTERNAL_MODULES_PATH}/" "-I${CMAKE_BINARY_DIR}/autoSource/")
2932
include_directories("${EXTERNAL_MODULES_PATH}/")
3033
else()
3134
set_property(
3235
SOURCE ${COMP_OUT_NAME}
3336
PROPERTY SWIG_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/../" "-I${CMAKE_CURRENT_SOURCE_DIR}/../../"
34-
"-I${CMAKE_BINARY_DIR}/autoSource/" "-I${PYTHON_INCLUDE_PATH}")
37+
"-I${CMAKE_BINARY_DIR}/autoSource/")
3538
endif(NOT "${EXTERNAL_MODULES_PATH}" STREQUAL "")
3639

37-
include_directories(${PYTHON_INCLUDE_PATH})
3840
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../")
3941
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/")
4042
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../")
@@ -57,7 +59,7 @@ function(generate_messages searchDir)
5759
${SWIG_MODULE_${TARGET_NAME}_REAL_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELEASE
5860
"${CMAKE_BINARY_DIR}/Basilisk/architecture/messaging")
5961
target_link_libraries(${SWIG_MODULE_${TARGET_NAME}_REAL_NAME} PUBLIC architectureLib)
60-
target_link_libraries(${SWIG_MODULE_${TARGET_NAME}_REAL_NAME} PRIVATE ${PYTHON_LIBRARIES})
62+
target_link_libraries(${SWIG_MODULE_${TARGET_NAME}_REAL_NAME} PRIVATE Python3::Module)
6163
endforeach()
6264
endfunction(generate_messages)
6365

@@ -75,7 +77,7 @@ endif (NOT "${EXTERNAL_MODULES_PATH}" STREQUAL "")
7577
add_custom_command(
7678
OUTPUT ${CMAKE_BINARY_DIR}/Basilisk/architecture/messaging/__init__.py
7779
COMMAND
78-
${PYTHON_EXECUTABLE} generateMessagePackageInit.py ${message_directory_paths}
80+
${Python3_EXECUTABLE} generateMessagePackageInit.py ${message_directory_paths}
7981
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/msgAutoSource
8082
VERBATIM
8183
)

0 commit comments

Comments
 (0)