209 lines
6.6 KiB
CMake
209 lines
6.6 KiB
CMake
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
function(runners_yaml_append content)
|
|
# Append ${content}\n to a target property which is later evaluated as a
|
|
# generator expression when writing the flash runner yaml file.
|
|
# We define this function here to have access to the `flash` target.
|
|
|
|
set_property(
|
|
TARGET runners_yaml_props_target
|
|
APPEND_STRING
|
|
PROPERTY yaml_contents
|
|
"${content}\n"
|
|
)
|
|
endfunction()
|
|
|
|
function(get_runners_prop prop out_var default_value)
|
|
# Get property 'prop' from runners_yaml_props_target, storing its
|
|
# value in 'out_var'. If the property is not found (value is
|
|
# ...-NOTFOUND), 'out_var' is set to 'default_value'.
|
|
|
|
get_target_property(out runners_yaml_props_target "${prop}")
|
|
|
|
if("${out}" STREQUAL "out-NOTFOUND")
|
|
set("${out_var}" "${default_value}" PARENT_SCOPE)
|
|
else()
|
|
set("${out_var}" "${out}" PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(runners_yaml_append_config)
|
|
# Append the common configuration values to the relevant property target.
|
|
|
|
runners_yaml_append("\n# Common runner configuration values.")
|
|
runners_yaml_append("config:")
|
|
runners_yaml_append(" board_dir: ${BOARD_DIR}")
|
|
get_runners_prop(elf_file elf "${KERNEL_ELF_NAME}")
|
|
runners_yaml_append(" # Build outputs:")
|
|
runners_yaml_append(" elf_file: ${elf}")
|
|
if(CONFIG_BUILD_OUTPUT_EXE)
|
|
get_runners_prop(exe_file exe "${KERNEL_EXE_NAME}")
|
|
else()
|
|
get_runners_prop(exe_file exe "")
|
|
endif()
|
|
if(exe)
|
|
runners_yaml_append(" exe_file: ${exe}")
|
|
endif()
|
|
if(CONFIG_BUILD_OUTPUT_HEX)
|
|
get_runners_prop(hex_file hex "${KERNEL_HEX_NAME}")
|
|
else()
|
|
get_runners_prop(hex_file hex "")
|
|
endif()
|
|
if(hex)
|
|
runners_yaml_append(" hex_file: ${hex}")
|
|
endif()
|
|
if(CONFIG_BUILD_OUTPUT_BIN)
|
|
get_runners_prop(bin_file bin "${KERNEL_BIN_NAME}")
|
|
runners_yaml_append(" bin_file: ${bin}")
|
|
endif()
|
|
if(CONFIG_BUILD_OUTPUT_UF2)
|
|
get_runners_prop(uf2_file uf2 "${KERNEL_UF2_NAME}")
|
|
runners_yaml_append(" uf2_file: ${uf2}")
|
|
endif()
|
|
|
|
if(CMAKE_GDB OR OPENOCD OR OPENOCD_DEFAULT_PATH)
|
|
runners_yaml_append(" # Host tools:")
|
|
endif()
|
|
if(CMAKE_GDB)
|
|
runners_yaml_append(" gdb: ${CMAKE_GDB}")
|
|
endif()
|
|
if(OPENOCD)
|
|
runners_yaml_append(" openocd: ${OPENOCD}")
|
|
runners_yaml_append(" openocd_search:")
|
|
if(OPENOCD_DEFAULT_PATH)
|
|
runners_yaml_append(" - ${OPENOCD_DEFAULT_PATH}")
|
|
endif()
|
|
endif()
|
|
runners_yaml_append("")
|
|
endfunction()
|
|
|
|
# Save runner state in a YAML file.
|
|
function(create_runners_yaml)
|
|
set(runners ${ARGV})
|
|
|
|
set(runners_yaml "${PROJECT_BINARY_DIR}/runners.yaml")
|
|
|
|
runners_yaml_append("# Available runners configured by board.cmake.\nrunners:")
|
|
foreach(runner ${runners})
|
|
runners_yaml_append("- ${runner}")
|
|
endforeach()
|
|
|
|
if(DEFINED BOARD_FLASH_RUNNER)
|
|
runners_yaml_append("\n# Default flash runner if --runner is not given.")
|
|
runners_yaml_append("flash-runner: ${BOARD_FLASH_RUNNER}")
|
|
endif()
|
|
if(DEFINED BOARD_DEBUG_RUNNER)
|
|
runners_yaml_append("\n# Default debug runner if --runner is not given.")
|
|
runners_yaml_append("debug-runner: ${BOARD_DEBUG_RUNNER}")
|
|
endif()
|
|
if(DEFINED BOARD_SIM_RUNNER)
|
|
runners_yaml_append("\n# Default simulation runner if --runner is not given.")
|
|
runners_yaml_append("sim-runner: ${BOARD_SIM_RUNNER}")
|
|
endif()
|
|
if(DEFINED BOARD_ROBOT_RUNNER)
|
|
runners_yaml_append("\n# Default test runner if --runner is not given.")
|
|
runners_yaml_append("robot-runner: ${BOARD_ROBOT_RUNNER}")
|
|
endif()
|
|
|
|
# Sets up common runner configuration values.
|
|
runners_yaml_append_config()
|
|
|
|
# Get runner-specific arguments set in the board files.
|
|
runners_yaml_append("# Runner specific arguments")
|
|
runners_yaml_append("args:")
|
|
foreach(runner ${runners})
|
|
string(MAKE_C_IDENTIFIER ${runner} runner_id)
|
|
runners_yaml_append(" ${runner}:")
|
|
get_property(args GLOBAL PROPERTY "BOARD_RUNNER_ARGS_${runner_id}")
|
|
if(args)
|
|
# Usually, the runner has arguments. Append them to runners.yaml,
|
|
# one per line.
|
|
foreach(arg ${args})
|
|
runners_yaml_append(" - ${arg}")
|
|
endforeach()
|
|
else()
|
|
# If the runner doesn't need any arguments, just use an empty list.
|
|
runners_yaml_append(" []\n")
|
|
endif()
|
|
endforeach()
|
|
|
|
# Write the final contents.
|
|
file(GENERATE OUTPUT "${runners_yaml}" CONTENT
|
|
$<TARGET_PROPERTY:runners_yaml_props_target,yaml_contents>)
|
|
endfunction()
|
|
|
|
get_property(RUNNERS GLOBAL PROPERTY ZEPHYR_RUNNERS)
|
|
|
|
# Persist the runner-related state.
|
|
#
|
|
# Available runners and their arguments are configured in board.cmake
|
|
# files.
|
|
#
|
|
# Everything is marked with FORCE so that re-running CMake updates the
|
|
# configuration if the board files change.
|
|
if(RUNNERS)
|
|
create_runners_yaml(${RUNNERS})
|
|
endif()
|
|
|
|
zephyr_get(WEST_DIR)
|
|
if(WEST_DIR)
|
|
set(WEST "PYTHONPATH=${WEST_DIR}/src" "${PYTHON_EXECUTABLE};${WEST_DIR}/src/west/app/main.py;--zephyr-base=${ZEPHYR_BASE} ")
|
|
endif()
|
|
|
|
# Generate the flash, debug, debugserver, attach targets within the build
|
|
# system itself.
|
|
foreach(target flash debug debugserver attach)
|
|
if(target STREQUAL flash)
|
|
set(comment "Flashing ${BOARD}")
|
|
elseif(target STREQUAL debug)
|
|
set(comment "Debugging ${BOARD}")
|
|
elseif(target STREQUAL debugserver)
|
|
set(comment "Debugging ${BOARD}")
|
|
if(SUPPORTED_EMU_PLATFORMS)
|
|
# cmake/qemu/CMakeLists.txt will add a debugserver target for
|
|
# emulation platforms, so we don't add one here
|
|
continue()
|
|
endif()
|
|
elseif(target STREQUAL attach)
|
|
set(comment "Debugging ${BOARD}")
|
|
endif()
|
|
string(TOUPPER ${target} TARGET_UPPER)
|
|
|
|
list(APPEND RUNNERS_DEPS ${logical_target_for_zephyr_elf})
|
|
|
|
# Enable verbose output, if requested.
|
|
if(CMAKE_VERBOSE_MAKEFILE)
|
|
set(RUNNER_VERBOSE "--verbose")
|
|
else()
|
|
set(RUNNER_VERBOSE)
|
|
endif()
|
|
|
|
if(WEST)
|
|
add_custom_target(${target}
|
|
# This script will print an error message and fail if <target> has added
|
|
# dependencies. This is done using dedicated CMake script, as
|
|
# `cmake -E {true|false}` is not available until CMake 3.16.
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-DTARGET=${target}
|
|
-DDEPENDENCIES="$<TARGET_PROPERTY:${target},MANUALLY_ADDED_DEPENDENCIES>"
|
|
-P ${CMAKE_CURRENT_LIST_DIR}/check_runner_dependencies.cmake
|
|
COMMAND
|
|
${CMAKE_COMMAND} -E env
|
|
${WEST}
|
|
${RUNNER_VERBOSE}
|
|
${target}
|
|
WORKING_DIRECTORY
|
|
${APPLICATION_BINARY_DIR}
|
|
COMMENT
|
|
${comment}
|
|
USES_TERMINAL
|
|
)
|
|
else()
|
|
add_custom_target(${target}
|
|
COMMAND ${CMAKE_COMMAND} -E echo \"West was not found in path. To support
|
|
'${CMAKE_MAKE_PROGRAM} ${target}', please create a west workspace.\"
|
|
USES_TERMINAL
|
|
)
|
|
endif(WEST)
|
|
endforeach()
|