Skip to content

Commit

Permalink
cmake: modules: dts: make Device Tree error messages more visible
Browse files Browse the repository at this point in the history
This commit modifies the DTS cmake module to capture `stderr`
output of the `gen_defines.py` script and `dtc` program during
their execution. The messages can then be printed as CMake
`message`s, which improves QoL when debugging device tree
errors, and reduces the risk of introducing malformed DTS,
as the warning/error messages are made much more visible.

Signed-off-by: Mathieu Choplain <[email protected]>
  • Loading branch information
mathieuchopstm authored and carlescufi committed Aug 5, 2024
1 parent e8e5169 commit 059aae7
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 additions & 2 deletions cmake/modules/dts.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -290,10 +290,25 @@ execute_process(
COMMAND ${CMD_GEN_DEFINES}
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
RESULT_VARIABLE ret
ERROR_VARIABLE stderr
)
if(NOT "${ret}" STREQUAL "0")
if (stderr)
# gen_defines.py failed after printing message(s) to stderr.
# Append stream content to the FATAL_ERROR message on a new line.
set(stderr "\n${stderr}")
else()
# gen_defines.py did not print anything on stderr. To inform users
# of this condition, set ${stderr} to "<empty>" to have this printed
# in the error message. Note that we do NOT want a newline, such that
# the error message is printed as a single line, e.g.:
#
# gen_defines.py failed with result code: 1 - stderr contents: <empty>
#
set(stderr "<empty>")
endif()
message(STATUS "In: ${PROJECT_BINARY_DIR}, command: ${CMD_GEN_DEFINES}")
message(FATAL_ERROR "gen_defines.py failed with return code: ${ret}")
message(FATAL_ERROR "gen_defines.py failed with result code: ${ret} - stderr contents: ${stderr}")
else()
zephyr_file_copy(${ZEPHYR_DTS}.new ${ZEPHYR_DTS} ONLY_IF_DIFFERENT)
zephyr_file_copy(${DEVICETREE_GENERATED_H}.new ${DEVICETREE_GENERATED_H} ONLY_IF_DIFFERENT)
Expand Down Expand Up @@ -377,9 +392,14 @@ execute_process(
OUTPUT_QUIET # Discard stdout
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
RESULT_VARIABLE ret
ERROR_VARIABLE stderr
)

if(NOT "${ret}" STREQUAL "0")
message(FATAL_ERROR "command failed with return code: ${ret}")
message(FATAL_ERROR "dtc failed with return code: ${ret}")
elseif(stderr)
# dtc printed warnings on stderr but did not fail.
# Display them as CMake warnings to draw attention.
message(WARNING "dtc raised one or more warnings:\n${stderr}")
endif()
endif(DTC)

0 comments on commit 059aae7

Please sign in to comment.