Skip to content

Commit

Permalink
llext: use CMake shared library support on Xtensa
Browse files Browse the repository at this point in the history
This change reworks the Xtensa support in llext to use CMake's native
shared library support instead of manually running "gcc -shared".

This change minimizes the differences in llext handling by defining
appropriate CMake targets for the different architectures.

Signed-off-by: Luca Burelli <[email protected]>
  • Loading branch information
pillo79 committed Jan 23, 2024
1 parent 8556ae5 commit 01909fb
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 23 deletions.
1 change: 0 additions & 1 deletion cmake/compiler/gcc/target_xtensa.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,4 @@ set(LLEXT_APPEND_FLAGS
-fPIC
-nostdlib
-nodefaultlibs
-shared
)
59 changes: 37 additions & 22 deletions cmake/modules/extensions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4869,24 +4869,48 @@ function(add_llext_target target_name)
"$<FILTER:${zephyr_flags},EXCLUDE,${llext_remove_flags_regexp}>"
)

# Compile the source file to an object file using current Zephyr settings
# but a different set of flags
add_library(${target_name}_lib OBJECT ${source_file})
target_compile_definitions(${target_name}_lib PRIVATE
# Compile the source file using current Zephyr settings but a
# different set of flags

set(link_target ${target_name}_lib)
if(CONFIG_ARM)

# Create an object library to compile the source file
add_library(${link_target} OBJECT ${source_file})
set(linked_file $<TARGET_OBJECTS:${link_target}>)

elseif(CONFIG_XTENSA)

# Ensure shared library support is enabled
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS true)

# Create a shared library
add_library(${link_target} SHARED ${source_file})
set(linked_file $<TARGET_FILE:${link_target}>)

# Add the llext flags to the linking step as well
# (the linker will ignore the compilation-related ones)
target_link_options(${link_target} PRIVATE
${LLEXT_APPEND_FLAGS}
)

endif()

target_compile_definitions(${link_target} PRIVATE
$<TARGET_PROPERTY:zephyr_interface,INTERFACE_COMPILE_DEFINITIONS>
)
target_compile_options(${target_name}_lib PRIVATE
target_compile_options(${link_target} PRIVATE
${zephyr_filtered_flags}
${LLEXT_APPEND_FLAGS}
${LLEXT_C_FLAGS}
)
target_include_directories(${target_name}_lib PRIVATE
target_include_directories(${link_target} PRIVATE
$<TARGET_PROPERTY:zephyr_interface,INTERFACE_INCLUDE_DIRECTORIES>
)
target_include_directories(${target_name}_lib SYSTEM PUBLIC
target_include_directories(${link_target} SYSTEM PUBLIC
$<TARGET_PROPERTY:zephyr_interface,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
)
add_dependencies(${target_name}_lib
add_dependencies(${link_target}
zephyr_interface
zephyr_generated_headers
)
Expand All @@ -4897,31 +4921,22 @@ function(add_llext_target target_name)
# No conversion required, simply copy the object file
add_custom_command(
OUTPUT ${output_file}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:${target_name}_lib> ${output_file}
DEPENDS ${target_name}_lib $<TARGET_OBJECTS:${target_name}_lib>
COMMAND ${CMAKE_COMMAND} -E copy ${linked_file} ${output_file}
DEPENDS ${link_target} ${linked_file}
)

elseif(CONFIG_XTENSA)

# Generate an intermediate file name
get_filename_component(output_dir ${output_file} DIRECTORY)
get_filename_component(output_name_we ${output_file} NAME_WE)
set(pre_output_file ${output_dir}/${output_name_we}.pre.llext)

# Need to convert the object file to a shared library, then strip some sections
# Need to strip the shared library of some sections
add_custom_command(
OUTPUT ${output_file}
BYPRODUCTS ${pre_output_file}
COMMAND ${CMAKE_C_COMPILER} ${LLEXT_APPEND_FLAGS}
-o ${pre_output_file}
$<TARGET_OBJECTS:${target_name}_lib>
COMMAND $<TARGET_PROPERTY:bintools,strip_command>
$<TARGET_PROPERTY:bintools,strip_flag>
$<TARGET_PROPERTY:bintools,strip_flag_remove_section>.xt.*
$<TARGET_PROPERTY:bintools,strip_flag_infile>${pre_output_file}
$<TARGET_PROPERTY:bintools,strip_flag_infile>${linked_file}
$<TARGET_PROPERTY:bintools,strip_flag_outfile>${output_file}
$<TARGET_PROPERTY:bintools,strip_flag_final>
DEPENDS ${target_name}_lib $<TARGET_OBJECTS:${target_name}_lib>
DEPENDS ${link_target} ${linked_file}
)

else()
Expand Down

0 comments on commit 01909fb

Please sign in to comment.