From dbf7d08c23eaf608e6b791ac20eeea7992b31bd0 Mon Sep 17 00:00:00 2001 From: Jukka Laitinen Date: Wed, 30 Dec 2020 15:57:55 +0200 Subject: [PATCH] Add support for compiling modules into kernel side Define __KERNEL__ macro during compilation and place the module in separate library Remove default library linking to m or libc on NuttX. Add these in platform layer instead, since they are different on kernel and user side Signed-off-by: Jukka Laitinen --- CMakeLists.txt | 6 ++++++ cmake/px4_add_board.cmake | 26 ++++++++++++++++++++++++++ cmake/px4_add_library.cmake | 10 +++------- cmake/px4_add_module.cmake | 25 +++++++++++++++++++++++-- 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e9d253c7a..05f3f93fde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,6 +125,11 @@ define_property(GLOBAL PROPERTY PX4_MODULE_LIBRARIES FULL_DOCS "List of all PX4 module libraries" ) +define_property(GLOBAL PROPERTY PX4_KERNEL_MODULE_LIBRARIES + BRIEF_DOCS "PX4 kernel side module libs" + FULL_DOCS "List of all PX4 kernel module libraries" + ) + define_property(GLOBAL PROPERTY PX4_MODULE_PATHS BRIEF_DOCS "PX4 module paths" FULL_DOCS "List of paths to all PX4 modules" @@ -142,6 +147,7 @@ set(CONFIG "px4_sitl_default" CACHE STRING "desired configuration") include(px4_add_module) set(config_module_list) +set(config_kernel_list) include(px4_config) include(px4_add_board) diff --git a/cmake/px4_add_board.cmake b/cmake/px4_add_board.cmake index f8d3c4dd34..c70b2110ec 100644 --- a/cmake/px4_add_board.cmake +++ b/cmake/px4_add_board.cmake @@ -147,6 +147,9 @@ function(px4_add_board) CRYPTO KEYSTORE MULTI_VALUE + KERNEL_DRIVERS + KERNEL_MODULES + KERNEL_SYSTEMCMDS DRIVERS MODULES SYSTEMCMDS @@ -296,6 +299,28 @@ function(px4_add_board) ########################################################################### # Modules (includes drivers, examples, modules, systemcmds) set(config_module_list) + set(config_kernel_list) + + if(KERNEL_DRIVERS) + foreach(driver ${KERNEL_DRIVERS}) + list(APPEND config_module_list drivers/${driver}) + list(APPEND config_kernel_list drivers/${driver}) + endforeach() + endif() + + if(KERNEL_MODULES) + foreach(module ${KERNEL_MODULES}) + list(APPEND config_module_list modules/${module}) + list(APPEND config_kernel_list modules/${module}) + endforeach() + endif() + + if(KERNEL_SYSTEMCMDS) + foreach(systemcmd ${KERNEL_SYSTEMCMDS}) + list(APPEND config_module_list systemcmds/${systemcmd}) + list(APPEND config_kernel_list systemcmds/${systemcmd}) + endforeach() + endif() if(DRIVERS) foreach(driver ${DRIVERS}) @@ -326,5 +351,6 @@ function(px4_add_board) list(APPEND config_module_list ${board_support_src_rel}/src) set(config_module_list ${config_module_list} PARENT_SCOPE) + set(config_kernel_list ${config_kernel_list} PARENT_SCOPE) endfunction() diff --git a/cmake/px4_add_library.cmake b/cmake/px4_add_library.cmake index 8d56a69ae4..7a917b629f 100644 --- a/cmake/px4_add_library.cmake +++ b/cmake/px4_add_library.cmake @@ -43,14 +43,10 @@ function(px4_add_library target) target_compile_definitions(${target} PRIVATE MODULE_NAME="${target}") - # all PX4 libraries have access to parameters and uORB - add_dependencies(${target} uorb_headers) - target_link_libraries(${target} PRIVATE prebuild_targets parameters_interface px4_platform uorb_msgs) + add_dependencies(${target} uorb_headers parameters) - # TODO: move to platform layer - if ("${PX4_PLATFORM}" MATCHES "nuttx") - target_link_libraries(${target} PRIVATE m nuttx_c) - endif() + # all PX4 libraries have access to uORB + target_link_libraries(${target} PRIVATE prebuild_targets uorb_msgs) set_property(GLOBAL APPEND PROPERTY PX4_MODULE_PATHS ${CMAKE_CURRENT_SOURCE_DIR}) px4_list_make_absolute(ABS_SRCS ${CMAKE_CURRENT_SOURCE_DIR} ${ARGN}) diff --git a/cmake/px4_add_module.cmake b/cmake/px4_add_module.cmake index 660b2e622d..03e89ca7c9 100644 --- a/cmake/px4_add_module.cmake +++ b/cmake/px4_add_module.cmake @@ -153,9 +153,26 @@ function(px4_add_module) # all modules can potentially use parameters and uORB add_dependencies(${MODULE} uorb_headers) + # Check if the modules source dir exists in config_kernel_list + # in this case, treat is as a kernel side component for + # protected build + get_target_property(MODULE_SOURCE_DIR ${MODULE} SOURCE_DIR) + file(RELATIVE_PATH module ${PROJECT_SOURCE_DIR}/src ${MODULE_SOURCE_DIR}) + + list (FIND config_kernel_list ${module} _index) + if (${_index} GREATER -1) + set (KERNEL TRUE) + endif() + if(NOT DYNAMIC) - target_link_libraries(${MODULE} PRIVATE prebuild_targets parameters_interface px4_layer px4_platform systemlib) - set_property(GLOBAL APPEND PROPERTY PX4_MODULE_LIBRARIES ${MODULE}) + target_link_libraries(${MODULE} PRIVATE prebuild_targets parameters_interface px4_platform systemlib perf) + if (${PX4_PLATFORM} STREQUAL "nuttx" AND NOT CONFIG_BUILD_FLAT AND KERNEL) + target_link_libraries(${MODULE} PRIVATE px4_kernel_layer uORB_kernel) + set_property(GLOBAL APPEND PROPERTY PX4_KERNEL_MODULE_LIBRARIES ${MODULE}) + else() + target_link_libraries(${MODULE} PRIVATE px4_layer uORB) + set_property(GLOBAL APPEND PROPERTY PX4_MODULE_LIBRARIES ${MODULE}) + endif() set_property(GLOBAL APPEND PROPERTY PX4_MODULE_PATHS ${CMAKE_CURRENT_SOURCE_DIR}) px4_list_make_absolute(ABS_SRCS ${CMAKE_CURRENT_SOURCE_DIR} ${SRCS}) set_property(GLOBAL APPEND PROPERTY PX4_SRC_FILES ${ABS_SRCS}) @@ -195,6 +212,10 @@ function(px4_add_module) target_compile_options(${MODULE} PRIVATE ${COMPILE_FLAGS}) endif() + if (KERNEL) + target_compile_options(${MODULE} PRIVATE -D__KERNEL__) + endif() + if(INCLUDES) target_include_directories(${MODULE} PRIVATE ${INCLUDES}) endif()