zephyr/dts/dts.cmake

130 lines
4.4 KiB
CMake

# Zephyr code can configure itself based on a KConfig'uration with the
# header file autoconf.h. There exists an analogous file
# generated_dts_board.h that allows configuration based on information
# encoded in DTS.
#
# Here we call on dtc, the gcc preprocessor, and
# scripts/dts/extract_dts_includes.py to generate this header file at
# CMake configure-time.
#
# See ~/zephyr/doc/dts
set(GENERATED_DTS_BOARD_H ${PROJECT_BINARY_DIR}/include/generated/generated_dts_board.h)
set(GENERATED_DTS_BOARD_CONF ${PROJECT_BINARY_DIR}/include/generated/generated_dts_board.conf)
set_ifndef(DTS_SOURCE ${PROJECT_SOURCE_DIR}/boards/${ARCH}/${BOARD_FAMILY}/${BOARD_FAMILY}.dts)
message(STATUS "Generating zephyr/include/generated/generated_dts_board.h")
if(CONFIG_HAS_DTS)
set(DTC_INCLUDE_FLAG_FOR_SOURCE
-include ${DTS_SOURCE}
)
if(NOT DTC_OVERLAY_FILE)
# overlay file is not set, so try to use overlay dir instead.
set_ifndef(DTC_OVERLAY_DIR ${APPLICATION_SOURCE_DIR})
set(DTC_OVERLAY_FILE ${DTC_OVERLAY_DIR}/${BOARD_FAMILY}.overlay)
endif()
if(EXISTS ${DTC_OVERLAY_FILE})
set(DTC_INCLUDE_FLAG_FOR_OVERLAY
-include ${DTC_OVERLAY_FILE}
)
else()
unset(DTC_INCLUDE_FLAG_FOR_OVERLAY)
endif()
# TODO: Cut down on CMake configuration time by avoiding
# regeneration of generated_dts_board.h on every configure. How
# challenging is this? What are the dts dependencies? We run the
# preprocessor, and it seems to be including all kinds of
# directories with who-knows how many header files.
# Run the C preprocessor on an empty C source file that has one or
# more DTS source files -include'd into it to create the
# intermediary file *.dts.pre.tmp
execute_process(
COMMAND ${CMAKE_C_COMPILER}
-x assembler-with-cpp
-nostdinc
-I${PROJECT_SOURCE_DIR}/arch/${ARCH}/soc
-isystem ${PROJECT_SOURCE_DIR}/include
-isystem ${PROJECT_SOURCE_DIR}/dts/${ARCH}
-isystem ${PROJECT_SOURCE_DIR}/dts
-include ${AUTOCONF_H}
${DTC_INCLUDE_FLAG_FOR_SOURCE} # include the DTS source
${DTC_INCLUDE_FLAG_FOR_OVERLAY} # Possibly include an overlay after the source
-I${PROJECT_SOURCE_DIR}/dts/common
-I${PROJECT_SOURCE_DIR}/drivers
-undef -D__DTS__
-P
-E ${ZEPHYR_BASE}/misc/empty_file.c
-o ${BOARD_FAMILY}.dts.pre.tmp
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
RESULT_VARIABLE ret
)
if(NOT "${ret}" STREQUAL "0")
message(FATAL_ERROR "command failed with return code: ${ret}")
endif()
# Run the DTC on *.dts.pre.tmp to create the intermediary file *.dts_compiled
execute_process(
COMMAND ${DTC}
-O dts
-o ${BOARD_FAMILY}.dts_compiled
-b 0
${BOARD_FAMILY}.dts.pre.tmp
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
RESULT_VARIABLE ret
)
if(NOT "${ret}" STREQUAL "0")
message(FATAL_ERROR "command failed with return code: ${ret}")
endif()
# Run extract_dts_includes.py for the header file
# generated_dts_board.h
set_ifndef(DTS_BOARD_FIXUP_FILE ${PROJECT_SOURCE_DIR}/boards/${ARCH}/${BOARD_FAMILY}/dts.fixup)
if(EXISTS ${DTS_BOARD_FIXUP_FILE})
set(DTS_BOARD_FIXUP -f ${DTS_BOARD_FIXUP_FILE})
endif()
set(CMD_EXTRACT_DTS_INCLUDES ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/dts/extract_dts_includes.py
--dts ${BOARD_FAMILY}.dts_compiled
--yaml ${PROJECT_SOURCE_DIR}/dts/bindings
${DTS_BOARD_FIXUP}
)
execute_process(
COMMAND ${CMD_EXTRACT_DTS_INCLUDES}
OUTPUT_VARIABLE STDOUT
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
RESULT_VARIABLE ret
)
if(NOT "${ret}" STREQUAL "0")
message(FATAL_ERROR "command failed with return code: ${ret}")
endif()
# extract_dts_includes.py writes the header file contents to stdout,
# which we capture in the variable STDOUT and then finaly write into
# the header file.
file(WRITE ${GENERATED_DTS_BOARD_H} "${STDOUT}" )
# Run extract_dts_includes.py to create a .conf file that can be
# included into the CMake namespace
execute_process(
COMMAND ${CMD_EXTRACT_DTS_INCLUDES} --keyvalue
OUTPUT_VARIABLE STDOUT
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
RESULT_VARIABLE ret
)
if(NOT "${ret}" STREQUAL "0")
message(FATAL_ERROR "command failed with return code: ${ret}")
endif()
file(WRITE ${GENERATED_DTS_BOARD_CONF} "${STDOUT}" )
import_kconfig(${GENERATED_DTS_BOARD_CONF})
else()
file(WRITE ${GENERATED_DTS_BOARD_H} "/* WARNING. THIS FILE IS AUTO-GENERATED. DO NOT MODIFY! */")
endif()