diff options
Diffstat (limited to 'cmake/helpers.cmake')
-rw-r--r-- | cmake/helpers.cmake | 93 |
1 files changed, 84 insertions, 9 deletions
diff --git a/cmake/helpers.cmake b/cmake/helpers.cmake index e3b604a..686488b 100644 --- a/cmake/helpers.cmake +++ b/cmake/helpers.cmake @@ -16,26 +16,48 @@ # limitations under the License. # -function(ethosu_link_options target scope) - cmake_parse_arguments(ARG "" "LINK_FILE" "" ${ARGN}) +# Add .elf to all executables +set(CMAKE_EXECUTABLE_SUFFIX ".elf") + +############################################################################# +# Link options +############################################################################# + +function(ethosu_target_link_options target scope) + cmake_parse_arguments(ARG "" "LINK_FILE;ENTRY" "" ${ARGN}) + + # Store the link file in a property to be evaluated by the executable. + set_property(GLOBAL PROPERTY ETHOSU_TARGET_LINK_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINK_FILE}) + + if (ARG_ENTRY) + target_link_options(${target} ${scope} --entry Reset_Handler) + endif() +endfunction() + +function(ethosu_eval_link_options target) + # Get the link file from the cache + get_property(LINK_FILE GLOBAL PROPERTY ETHOSU_TARGET_LINK_FILE) + + set(prop "$<TARGET_PROPERTY:${target},COMPILE_DEFINITIONS>") if (CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang") - set(LINK_FILE_OUT ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_LINK_FILE}.scatter) + set(LINK_FILE_OUT ${LINK_FILE}.scatter) set(LINK_FILE_OPTION "--scatter") + target_link_options(${target} PUBLIC + --predefine=\"-D$<JOIN:${prop},\" ;--predefine=\"-D>\") elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(LINK_FILE ${ARG_LINK_FILE}.ld) - set(LINK_FILE_IN ${CMAKE_CURRENT_SOURCE_DIR}/${LINK_FILE}) - set(LINK_FILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/${LINK_FILE}) + set(LINK_FILE_IN ${LINK_FILE}.ld) + get_filename_component(LINK_FILE_OUT_BASE ${LINK_FILE} NAME) + set(LINK_FILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/${LINK_FILE_OUT_BASE}-${target}.ld) set(LINK_FILE_OPTION "-T") - set(prop "$<TARGET_PROPERTY:${target},COMPILE_DEFINITIONS>") add_custom_command( OUTPUT ${LINK_FILE_OUT} DEPENDS ${LINK_FILE_IN} BYPRODUCTS ${LINK_FILE_OUT} COMMAND ${CMAKE_C_COMPILER} -E -x c -P -o ${LINK_FILE_OUT} ${LINK_FILE_IN} - COMMAND_EXPAND_LISTS "$<$<BOOL:${prop}>:-D$<JOIN:${prop},;-D>>" + COMMAND_EXPAND_LISTS "-D$<JOIN:${prop},;-D>" COMMENT "Preprocessing and generating linker script" VERBATIM) add_custom_target(${target}-linker-script @@ -44,6 +66,59 @@ function(ethosu_link_options target scope) add_dependencies(${target} ${target}-linker-script) endif() - target_link_options(${target} ${scope} ${LINK_FILE_OPTION} ${LINK_FILE_OUT}) + target_link_options(${target} PUBLIC ${LINK_FILE_OPTION} ${LINK_FILE_OUT}) set_target_properties(${target} PROPERTIES LINK_DEPENDS ${LINK_FILE_OUT}) endfunction() + +############################################################################# +# Executable +############################################################################# + +function(ethosu_add_executable target) + cmake_parse_arguments(ARGS "" "TARGET_LIBRARY" "SOURCES;LIBRARIES" ${ARGN}) + add_executable(${target}) + + target_sources(${target} PRIVATE + ${ARGS_SOURCES}) + + if(NOT ARGS_TARGET_LIBRARY) + set(ARGS_TARGET_LIBRARY ethosu_target_init) + endif() + + target_link_libraries(${target} PRIVATE + ${ARGS_TARGET_LIBRARY} ethosu_core ${ARGS_LIBRARIES}) + + ethosu_eval_link_options(${target}) +endfunction() + +############################################################################# +# Test +############################################################################# + +function(ethosu_add_test target) + if(NOT BUILD_TESTING) + return() + endif() + + cmake_parse_arguments(ARGS "" "NAME" "COMMAND" ${ARGN}) + + if (NOT ARGS_COMMAND) + set(ARGS_COMMAND ${ETHOSU_COMMAND_DEFAULT}) + endif() + + if (NOT ARGS_NAME) + set(ARGS_NAME ${target}) + endif() + + add_test(NAME ${ARGS_NAME} + COMMAND ${ARGS_COMMAND} $<TARGET_FILE:${target}>) +endfunction() + +############################################################################# +# Executable and test +############################################################################# + +function(ethosu_add_executable_test target) + ethosu_add_executable(${target} ${ARGN}) + ethosu_add_test(${target} ${ARGN}) +endfunction() |