Skip to content

Commit dd468a3

Browse files
hakonfamSebastianBoe
authored andcommitted
cmake: multi image userspace support
This commits adds multi image support to userspace-specific code. Signed-off-by: Håkon Øye Amundsen <[email protected]>
1 parent e641463 commit dd468a3

File tree

1 file changed

+74
-49
lines changed

1 file changed

+74
-49
lines changed

CMakeLists.txt

Lines changed: 74 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ set(LINKER_SCRIPT_TARGET ${IMAGE}linker_script_target)
4141
set(OFFSETS_LIB ${IMAGE}offsets)
4242
set(KERNEL_LIBRARY ${IMAGE}kernel)
4343

44+
set(PRIV_STACKS_PREBUILT ${IMAGE}priv_stacks_prebuilt)
45+
4446
if(NOT ${IMAGE}PROPERTY_LINKER_SCRIPT_DEFINES)
4547
set_property(GLOBAL PROPERTY ${IMAGE}PROPERTY_LINKER_SCRIPT_DEFINES -D__GCC_LINKER_CMD__)
4648
endif()
@@ -343,7 +345,7 @@ if(CONFIG_USERSPACE)
343345
set(APP_SMEM_DEP app_smem_linker)
344346
endif()
345347
if(CONFIG_ARM)
346-
set(PRIV_STACK_DEP priv_stacks_prebuilt)
348+
set(PRIV_STACK_DEP ${PRIV_STACKS_PREBUILT})
347349
endif()
348350
endif()
349351

@@ -867,7 +869,7 @@ if(CONFIG_USERSPACE)
867869
get_property(compile_definitions_interface TARGET zephyr_interface
868870
PROPERTY INTERFACE_COMPILE_DEFINITIONS)
869871

870-
set(complete_include_dirs ${include_dir_in_interface} ${sys_include_dir_in_interface})
872+
set(${IMAGE}complete_include_dirs ${include_dir_in_interface} ${sys_include_dir_in_interface})
871873
endif()
872874

873875

@@ -881,6 +883,14 @@ if(CONFIG_ARM AND CONFIG_USERSPACE)
881883
set(PRIV_STACKS_OUTPUT_OBJ priv_stacks_hash.c.obj)
882884
set(PRIV_STACKS_OUTPUT_OBJ_RENAMED priv_stacks_hash_renamed.o)
883885

886+
set(PRIV_STACKS_T ${IMAGE}priv_stacks)
887+
set(PRIV_STACKS_OUTPUT_SRC_PRE_T ${IMAGE}priv_stacks_output_src_pre)
888+
set(PRIV_STACKS_OUTPUT_SRC_T ${IMAGE}priv_stacks_output_src)
889+
set(PRIV_STACKS_OUTPUT_LIB ${IMAGE}priv_stacks_output_lib)
890+
set(PRIV_STACKS_OUTPUT_LIB_INTERFACE ${IMAGE}priv_stacks_output_lib_interface)
891+
set(PRIV_STACKS_OUTPUT_OBJ_RENAMED_T ${IMAGE}priv_stacks_output_obj_renamed)
892+
set(PRIV_STACKS_OUTPUT_OBJ_RENAMED_LIB ${IMAGE}priv_stacks_output_obj_renamed_lib)
893+
884894
# Essentially what we are doing here is extracting some information
885895
# out of the nearly finished elf file, generating the source code
886896
# for a hash table based on that information, and then compiling and
@@ -895,13 +905,13 @@ if(CONFIG_ARM AND CONFIG_USERSPACE)
895905
COMMAND
896906
${PYTHON_EXECUTABLE}
897907
${GEN_PRIV_STACKS}
898-
--kernel $<TARGET_FILE:priv_stacks_prebuilt>
908+
--kernel $<TARGET_FILE:${PRIV_STACKS_PREBUILT}>
899909
--output ${PRIV_STACKS}
900910
$<$<BOOL:${CMAKE_VERBOSE_MAKEFILE}>:--verbose>
901-
DEPENDS priv_stacks_prebuilt
911+
DEPENDS ${PRIV_STACKS_PREBUILT}
902912
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
903913
)
904-
add_custom_target(priv_stacks DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS})
914+
add_custom_target(${PRIV_STACKS_T} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS})
905915

906916
# Use gperf to generate C code (PRIV_STACKS_OUTPUT_SRC_PRE) which implements a
907917
# perfect hashtable based on PRIV_STACKS
@@ -911,10 +921,11 @@ if(CONFIG_ARM AND CONFIG_USERSPACE)
911921
${GPERF} -C
912922
--output-file ${PRIV_STACKS_OUTPUT_SRC_PRE}
913923
${PRIV_STACKS}
914-
DEPENDS priv_stacks ${PRIV_STACKS}
924+
DEPENDS ${PRIV_STACKS_T} ${PRIV_STACKS}
915925
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
916926
)
917-
add_custom_target(priv_stacks_output_src_pre DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_SRC_PRE})
927+
add_custom_target(${PRIV_STACKS_OUTPUT_SRC_PRE_T}
928+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_SRC_PRE})
918929

919930
# For our purposes the code/data generated by gperf is not optimal.
920931
#
@@ -930,10 +941,11 @@ if(CONFIG_ARM AND CONFIG_USERSPACE)
930941
-o ${PRIV_STACKS_OUTPUT_SRC}
931942
-p "struct _k_priv_stack_map"
932943
$<$<BOOL:${CMAKE_VERBOSE_MAKEFILE}>:--verbose>
933-
DEPENDS priv_stacks_output_src_pre ${PRIV_STACKS_OUTPUT_SRC_PRE}
944+
DEPENDS ${PRIV_STACKS_OUTPUT_SRC_PRE_T} ${PRIV_STACKS_OUTPUT_SRC_PRE}
934945
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
935946
)
936-
add_custom_target(priv_stacks_output_src DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_SRC})
947+
add_custom_target(${PRIV_STACKS_OUTPUT_SRC_T}
948+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_SRC})
937949

938950
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_SRC}
939951
PROPERTIES COMPILE_DEFINITIONS "${compile_definitions_interface}")
@@ -946,21 +958,24 @@ if(CONFIG_ARM AND CONFIG_USERSPACE)
946958
# We need precise control of where generated text/data ends up in the final
947959
# kernel image. Disable function/data sections and use objcopy to move
948960
# generated data into special section names
949-
add_library(priv_stacks_output_lib STATIC
961+
add_library(${PRIV_STACKS_OUTPUT_LIB} STATIC
950962
${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_SRC}
951963
)
952964

953965
# Turn off -ffunction-sections, etc.
954-
# NB: Using a library instead of target_compile_options(priv_stacks_output_lib
966+
# NB: Using a library instead of
967+
# target_compile_options(${PRIV_STACKS_OUTPUT_LIB}
955968
# [...]) because a library's options have precedence
956-
add_library(priv_stacks_output_lib_interface INTERFACE)
957-
foreach(incl ${complete_include_dirs})
958-
target_include_directories(priv_stacks_output_lib_interface INTERFACE ${incl})
969+
add_library(${PRIV_STACKS_OUTPUT_LIB_INTERFACE} INTERFACE)
970+
foreach(incl ${${IMAGE}complete_include_dirs})
971+
target_include_directories(${PRIV_STACKS_OUTPUT_LIB_INTERFACE} INTERFACE ${incl})
959972
endforeach()
960973

961-
target_link_libraries(priv_stacks_output_lib priv_stacks_output_lib_interface)
974+
target_link_libraries(${PRIV_STACKS_OUTPUT_LIB}
975+
${PRIV_STACKS_OUTPUT_LIB_INTERFACE})
962976

963-
set(PRIV_STACKS_OUTPUT_OBJ_PATH ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/priv_stacks_output_lib.dir/${PRIV_STACKS_OUTPUT_OBJ})
977+
set(PRIV_STACKS_OUTPUT_OBJ_PATH
978+
${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${PRIV_STACKS_OUTPUT_LIB}.dir/${PRIV_STACKS_OUTPUT_OBJ})
964979

965980
add_custom_command(
966981
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_OBJ_RENAMED}
@@ -972,23 +987,25 @@ if(CONFIG_ARM AND CONFIG_USERSPACE)
972987
--rename-section .rodata=.priv_stacks.rodata
973988
${PRIV_STACKS_OUTPUT_OBJ_PATH}
974989
${PRIV_STACKS_OUTPUT_OBJ_RENAMED}
975-
DEPENDS priv_stacks_output_lib
990+
DEPENDS ${PRIV_STACKS_OUTPUT_LIB}
976991
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
977992
)
978-
add_custom_target(priv_stacks_output_obj_renamed DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_OBJ_RENAMED})
993+
add_custom_target(${PRIV_STACKS_OUTPUT_OBJ_RENAMED_T}
994+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_OBJ_RENAMED})
979995

980-
add_library(priv_stacks_output_obj_renamed_lib STATIC IMPORTED GLOBAL)
996+
add_library(${PRIV_STACKS_OUTPUT_OBJ_RENAMED_LIB} STATIC IMPORTED GLOBAL)
981997
set_property(
982-
TARGET priv_stacks_output_obj_renamed_lib
998+
TARGET ${PRIV_STACKS_OUTPUT_OBJ_RENAMED_LIB}
983999
PROPERTY
9841000
IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${PRIV_STACKS_OUTPUT_OBJ_RENAMED}
9851001
)
9861002
add_dependencies(
987-
priv_stacks_output_obj_renamed_lib
988-
priv_stacks_output_obj_renamed
1003+
${PRIV_STACKS_OUTPUT_OBJ_RENAMED_LIB}
1004+
${PRIV_STACKS_OUTPUT_OBJ_RENAMED_T}
9891005
)
9901006

991-
set_property(GLOBAL APPEND PROPERTY ${IMAGE}GENERATED_KERNEL_OBJECT_FILES priv_stacks_output_obj_renamed_lib)
1007+
set_property(GLOBAL APPEND PROPERTY ${IMAGE}GENERATED_KERNEL_OBJECT_FILES
1008+
${PRIV_STACKS_OUTPUT_OBJ_RENAMED_LIB})
9921009
endif()
9931010

9941011
if(CONFIG_USERSPACE)
@@ -1001,6 +1018,13 @@ if(CONFIG_USERSPACE)
10011018
set(OUTPUT_OBJ kobject_hash.c.obj)
10021019
set(OUTPUT_OBJ_RENAMED kobject_hash_renamed.o)
10031020

1021+
set(OUTPUT_SRC_PRE_T ${IMAGE}output_src_pre)
1022+
set(OBJ_LIST_T ${IMAGE}obj_list)
1023+
set(OUTPUT_SRC_T ${IMAGE}output_src)
1024+
set(OUTPUT_LIB ${IMAGE}output_lib)
1025+
set(OUTPUT_LIB_INTERFACE ${IMAGE}output_lib_interface)
1026+
set(OUTPUT_OBJ_RENAMED_T ${IMAGE}output_obj_renamed)
1027+
set(OUTPUT_OBJ_RENAMED_LIB ${IMAGE}output_obj_renamed_lib)
10041028
# Essentially what we are doing here is extracting some information
10051029
# out of the nearly finished elf file, generating the source code
10061030
# for a hash table based on that information, and then compiling and
@@ -1021,7 +1045,7 @@ if(CONFIG_USERSPACE)
10211045
DEPENDS ${ZEPHYR_PREBUILT_EXECUTABLE}
10221046
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
10231047
)
1024-
add_custom_target(obj_list DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OBJ_LIST})
1048+
add_custom_target(${OBJ_LIST_T} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OBJ_LIST})
10251049

10261050
# Use gperf to generate C code (OUTPUT_SRC_PRE) which implements a
10271051
# perfect hashtable based on OBJ_LIST
@@ -1031,10 +1055,10 @@ if(CONFIG_USERSPACE)
10311055
${GPERF}
10321056
--output-file ${OUTPUT_SRC_PRE}
10331057
${OBJ_LIST}
1034-
DEPENDS obj_list ${OBJ_LIST}
1058+
DEPENDS ${OBJ_LIST_T} ${OBJ_LIST}
10351059
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
10361060
)
1037-
add_custom_target(output_src_pre DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_SRC_PRE})
1061+
add_custom_target(${OUTPUT_SRC_PRE_T} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_SRC_PRE})
10381062

10391063
# For our purposes the code/data generated by gperf is not optimal.
10401064
#
@@ -1050,15 +1074,15 @@ if(CONFIG_USERSPACE)
10501074
-o ${OUTPUT_SRC}
10511075
-p "struct _k_object"
10521076
$<$<BOOL:${CMAKE_VERBOSE_MAKEFILE}>:--verbose>
1053-
DEPENDS output_src_pre ${OUTPUT_SRC_PRE}
1077+
DEPENDS ${OUTPUT_SRC_PRE_T} ${OUTPUT_SRC_PRE}
10541078
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
10551079
)
1056-
add_custom_target(output_src DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_SRC})
1080+
add_custom_target(${OUTPUT_SRC_T} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_SRC})
10571081

10581082
# We need precise control of where generated text/data ends up in the final
10591083
# kernel image. Disable function/data sections and use objcopy to move
10601084
# generated data into special section names
1061-
add_library(output_lib STATIC
1085+
add_library(${OUTPUT_LIB} STATIC
10621086
${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_SRC}
10631087
)
10641088

@@ -1070,18 +1094,18 @@ if(CONFIG_USERSPACE)
10701094
PROPERTIES COMPILE_DEFINITIONS "${compile_definitions_interface}")
10711095

10721096
# Turn off -ffunction-sections, etc.
1073-
# NB: Using a library instead of target_compile_options(output_lib
1097+
# NB: Using a library instead of target_compile_options(${OUTPUT_LIB}
10741098
# [...]) because a library's options have precedence
1075-
add_library(output_lib_interface INTERFACE)
1099+
add_library(${OUTPUT_LIB}_interface INTERFACE)
10761100

1077-
target_link_libraries(output_lib output_lib_interface)
1101+
target_link_libraries(${OUTPUT_LIB} ${OUTPUT_LIB_INTERFACE})
10781102

1079-
foreach(incl ${complete_include_dirs})
1080-
target_include_directories(output_lib_interface INTERFACE ${incl})
1103+
foreach(incl ${${IMAGE}complete_include_dirs})
1104+
target_include_directories(${OUTPUT_LIB_INTERFACE} INTERFACE ${incl})
10811105
endforeach()
10821106

10831107

1084-
set(OUTPUT_OBJ_PATH ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/output_lib.dir/${OUTPUT_OBJ})
1108+
set(OUTPUT_OBJ_PATH ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${OUTPUT_LIB}.dir/${OUTPUT_OBJ})
10851109

10861110
add_custom_command(
10871111
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_OBJ_RENAMED}
@@ -1092,23 +1116,24 @@ if(CONFIG_USERSPACE)
10921116
--rename-section .rodata=.kobject_data.rodata
10931117
${OUTPUT_OBJ_PATH}
10941118
${OUTPUT_OBJ_RENAMED}
1095-
DEPENDS output_lib
1119+
DEPENDS ${OUTPUT_LIB}
10961120
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
10971121
)
1098-
add_custom_target(output_obj_renamed DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_OBJ_RENAMED})
1122+
add_custom_target(${OUTPUT_OBJ_RENAMED_T} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_OBJ_RENAMED})
10991123

1100-
add_library(output_obj_renamed_lib STATIC IMPORTED GLOBAL)
1124+
add_library(${OUTPUT_OBJ_RENAMED_LIB} STATIC IMPORTED GLOBAL)
11011125
set_property(
1102-
TARGET output_obj_renamed_lib
1126+
TARGET ${OUTPUT_OBJ_RENAMED_LIB}
11031127
PROPERTY
11041128
IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_OBJ_RENAMED}
11051129
)
11061130
add_dependencies(
1107-
output_obj_renamed_lib
1108-
output_obj_renamed
1131+
${OUTPUT_OBJ_RENAMED_LIB}
1132+
${OUTPUT_OBJ_RENAMED_T}
11091133
)
11101134

1111-
set_property(GLOBAL APPEND PROPERTY ${IMAGE}GENERATED_KERNEL_OBJECT_FILES output_obj_renamed_lib)
1135+
set_property(GLOBAL APPEND PROPERTY ${IMAGE}GENERATED_KERNEL_OBJECT_FILES
1136+
${OUTPUT_OBJ_RENAMED_LIB})
11121137
endif()
11131138

11141139
# Read global variables into local variables
@@ -1175,22 +1200,22 @@ if(CONFIG_USERSPACE AND CONFIG_ARM)
11751200
)
11761201

11771202
add_custom_target(
1178-
linker_priv_stacks_script
1203+
${IMAGE}linker_priv_stacks_script
11791204
DEPENDS
11801205
linker_priv_stacks.cmd
11811206
)
11821207

11831208
set_property(TARGET
1184-
linker_priv_stacks_script
1209+
${IMAGE}linker_priv_stacks_script
11851210
PROPERTY INCLUDE_DIRECTORIES
11861211
${ZEPHYR_INCLUDE_DIRS}
11871212
)
11881213

1189-
set(PRIV_STACK_LIB priv_stacks_output_obj_renamed_lib)
1190-
add_executable( priv_stacks_prebuilt misc/empty_file.c)
1191-
target_link_libraries(priv_stacks_prebuilt ${TOPT} ${PROJECT_BINARY_DIR}/linker_priv_stacks.cmd ${zephyr_lnk} ${CODE_RELOCATION_DEP})
1192-
set_property(TARGET priv_stacks_prebuilt PROPERTY LINK_DEPENDS ${PROJECT_BINARY_DIR}/linker_priv_stacks.cmd)
1193-
add_dependencies( priv_stacks_prebuilt ${ALIGN_SIZING_DEP} linker_priv_stacks_script ${OFFSETS_LIB})
1214+
set(PRIV_STACK_LIB ${IMAGE}priv_stacks_output_obj_renamed_lib)
1215+
add_executable( ${PRIV_STACKS_PREBUILT} misc/empty_file.c)
1216+
target_link_libraries(${PRIV_STACKS_PREBUILT} ${TOPT} ${PROJECT_BINARY_DIR}/linker_priv_stacks.cmd ${zephyr_lnk} ${CODE_RELOCATION_DEP})
1217+
set_property(TARGET ${PRIV_STACKS_PREBUILT} PROPERTY LINK_DEPENDS ${PROJECT_BINARY_DIR}/linker_priv_stacks.cmd)
1218+
add_dependencies( ${PRIV_STACKS_PREBUILT} ${ALIGN_SIZING_DEP} ${IMAGE}linker_priv_stacks_script ${OFFSETS_LIB})
11941219
endif()
11951220

11961221
# FIXME: Is there any way to get rid of empty_file.c?

0 commit comments

Comments
 (0)