-
Notifications
You must be signed in to change notification settings - Fork 6.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
llext: define add_llext_target() for llext compilation
This patch defines a generic function that encapsulates all the architecture-specific machinery needed to compile llexts from source files. Current tests are updated to use this function. Output and source files must be specified using the OUTPUT and SOURCES arguments. Only one source file is currently supported. Arch-specific flags will be added automatically. The C_FLAGS argument can be used to pass additional compiler flags to the compilation of the source file. Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
- Loading branch information
Showing
3 changed files
with
87 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,84 @@ | ||
if(CONFIG_LLEXT) | ||
|
||
# Include all llext kernel sources as a library target | ||
zephyr_library() | ||
zephyr_library_sources(llext.c llext_export.c buf_loader.c) | ||
zephyr_library_sources_ifdef(CONFIG_LLEXT_SHELL shell.c) | ||
|
||
# Add a custom target that compiles a single source file to a .llext file. | ||
# | ||
# Output and source files must be specified using the OUTPUT and SOURCES | ||
# arguments. Only one source file is currently supported. | ||
# | ||
# Arch-specific flags will be added automatically. The C_FLAGS argument | ||
# can be used to pass additional compiler flags to the compilation of | ||
# the source file. | ||
# | ||
# Example usage: | ||
# add_llext_target(hello_world | ||
# OUTPUT ${PROJECT_BINARY_DIR}/hello_world.llext | ||
# SOURCES ${PROJECT_SOURCE_DIR}/src/llext/hello_world.c | ||
# C_FLAGS -Werror | ||
# ) | ||
# will compile the source file src/llext/hello_world.c to a file | ||
# ${PROJECT_BINARY_DIR}/hello_world.llext, adding -Werror to the compilation. | ||
# | ||
function(add_llext_target target_name) | ||
set(single_args OUTPUT) | ||
set(multi_args SOURCES;C_FLAGS) | ||
cmake_parse_arguments(PARSE_ARGV 1 LLEXT "${options}" "${single_args}" "${multi_args}") | ||
|
||
# Output file must be provided | ||
if(NOT LLEXT_OUTPUT) | ||
message(FATAL_ERROR "add_llext_target: OUTPUT argument must be provided") | ||
endif() | ||
|
||
# Source list length must currently be 1 | ||
list(LENGTH LLEXT_SOURCES source_count) | ||
if(NOT source_count EQUAL 1) | ||
message(FATAL_ERROR "add_llext_target: only one source file is supported") | ||
endif() | ||
|
||
set(output_file ${LLEXT_OUTPUT}) | ||
set(source_file ${LLEXT_SOURCES}) | ||
get_filename_component(output_name ${output_file} NAME) | ||
|
||
# Add user-visible target and dependency | ||
add_custom_target(${target_name} ALL | ||
COMMENT "Compiling ${output_name}" | ||
DEPENDS ${output_file} | ||
) | ||
|
||
# Compile the source file to an .llext file | ||
if(CONFIG_ARM) | ||
list(PREPEND LLEXT_C_FLAGS "-mlong-calls" "-mthumb") | ||
add_custom_command(OUTPUT ${output_file} | ||
COMMAND ${CMAKE_C_COMPILER} ${LLEXT_C_FLAGS} -c | ||
-I ${ZEPHYR_BASE}/include | ||
-imacros ${AUTOCONF_H} | ||
-o ${output_file} | ||
${source_file} | ||
DEPENDS ${source_file} | ||
) | ||
elseif(CONFIG_XTENSA) | ||
list(PREPEND LLEXT_C_FLAGS "-shared" "-fPIC" "-nostdlib" "-nodefaultlibs") | ||
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) | ||
add_custom_command(OUTPUT ${output_file} | ||
COMMAND ${CMAKE_C_COMPILER} ${LLEXT_C_FLAGS} | ||
-I ${ZEPHYR_BASE}/include | ||
-imacros ${AUTOCONF_H} | ||
-o ${pre_output_file} | ||
${source_file} | ||
COMMAND ${CROSS_COMPILE}strip -R .xt.* | ||
-o ${output_file} | ||
${pre_output_file} | ||
DEPENDS ${source_file} | ||
) | ||
else() | ||
message(FATAL_ERROR "add_llext_target: unsupported architecture") | ||
endif() | ||
endfunction() | ||
|
||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters