177 lines
5.7 KiB
CMake
177 lines
5.7 KiB
CMake
# Copyright 2024 NXP
|
|
# All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
include_guard(GLOBAL)
|
|
# (1) merge each proj.conf (2) kconfig entry file generation (3) call Kconfiglib
|
|
# to generate .config file (4) process .config file to generate header file or
|
|
# set compiler/linker flags
|
|
|
|
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/kconfig)
|
|
|
|
set_ifndef(AUTOCONF_H
|
|
${CMAKE_CURRENT_BINARY_DIR}/kconfig/include/generated/autoconf.h)
|
|
|
|
set(SPLITCONFIG_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
|
# Re-configure (Re-execute all CMakeLists.txt code) when autoconf.h changes
|
|
set_property(
|
|
DIRECTORY
|
|
APPEND
|
|
PROPERTY CMAKE_CONFIGURE_DEPENDS ${AUTOCONF_H})
|
|
|
|
set_ifndef(KCONFIG_NAMESPACE "CONFIG")
|
|
set(DOTCONFIG ${CMAKE_CURRENT_BINARY_DIR}/.config)
|
|
set(PARSED_KCONFIG_SOURCES_TXT ${CMAKE_CURRENT_BINARY_DIR}/kconfig/sources.txt)
|
|
set(GENERATED_HEADERS_TXT ${CMAKE_CURRENT_BINARY_DIR}/kconfig/headers.txt)
|
|
|
|
# Only defined KCONFIG_ROOT if not set, because SYSBUILD has defined
|
|
# KCONFIG_ROOT before
|
|
if(NOT DEFINED KCONFIG_ROOT)
|
|
if(EXISTS ${APPLICATION_SOURCE_DIR}/Kconfig)
|
|
set(KCONFIG_ROOT ${APPLICATION_SOURCE_DIR}/Kconfig)
|
|
else()
|
|
set(KCONFIG_ROOT ${ERPC_BASE}/Kconfig)
|
|
endif()
|
|
endif()
|
|
|
|
set(COMMON_KCONFIG_ENV_SETTINGS
|
|
PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
|
|
CONFIG_=${KCONFIG_NAMESPACE}_
|
|
KCONFIG_CONFIG=${DOTCONFIG}
|
|
ERPC_BASE=${ERPC_BASE}
|
|
KCONFIG_BINARY_DIR=${KCONFIG_BINARY_DIR}
|
|
# The variables below is for sysbuild kconfig
|
|
config=${CMAKE_BUILD_CONFIG})
|
|
|
|
set(EXTRA_KCONFIG_TARGET_COMMAND_FOR_menuconfig
|
|
${ERPC_BASE}/scripts/kconfig/menuconfig.py)
|
|
|
|
set(EXTRA_KCONFIG_TARGET_COMMAND_FOR_guiconfig
|
|
${ERPC_BASE}/scripts/kconfig/guiconfig.py)
|
|
|
|
set_ifndef(KCONFIG_TARGETS menuconfig guiconfig hardenconfig)
|
|
|
|
foreach(kconfig_target ${KCONFIG_TARGETS} ${EXTRA_KCONFIG_TARGETS})
|
|
add_custom_target(
|
|
${kconfig_target}
|
|
${CMAKE_COMMAND}
|
|
-E
|
|
env
|
|
ZEPHYR_BASE=${ERPC_BASE}
|
|
${COMMON_KCONFIG_ENV_SETTINGS}
|
|
"SHIELD_AS_LIST=${SHIELD_AS_LIST_ESCAPED}"
|
|
DTS_POST_CPP=${DTS_POST_CPP}
|
|
DTS_ROOT_BINDINGS=${DTS_ROOT_BINDINGS}
|
|
${PYTHON_EXECUTABLE}
|
|
${EXTRA_KCONFIG_TARGET_COMMAND_FOR_${kconfig_target}}
|
|
${KCONFIG_ROOT}
|
|
WORKING_DIRECTORY ${ERPC_BASE}
|
|
USES_TERMINAL COMMAND_EXPAND_LISTS)
|
|
endforeach()
|
|
|
|
# if CUSTOM_PRJ_CONF_PATHS is not empty, append it to merge_config_files
|
|
if(CUSTOM_PRJ_CONF_PATHS)
|
|
foreach(path ${CUSTOM_PRJ_CONF_PATHS})
|
|
list(APPEND merge_config_files ${CUSTOM_PRJ_CONF_PATHS})
|
|
endforeach()
|
|
endif()
|
|
|
|
if(CONF_FILE)
|
|
string(CONFIGURE "${CONF_FILE}" CONF_FILE_EXPANDED)
|
|
string(REPLACE " " ";" CONF_FILE_AS_LIST "${CONF_FILE_EXPANDED}")
|
|
list(APPEND merge_config_files ${CONF_FILE_AS_LIST})
|
|
else()
|
|
list(APPEND merge_config_files ${ERPC_BASE}/prj.conf)
|
|
endif()
|
|
|
|
# Calculate a checksum of merge_config_files to determine if we need to
|
|
# re-generate .config
|
|
set(merge_config_files_checksum "")
|
|
foreach(f ${merge_config_files})
|
|
file(MD5 ${f} checksum)
|
|
set(merge_config_files_checksum "${merge_config_files_checksum}${checksum}")
|
|
endforeach()
|
|
|
|
# Create a new .config if it does not exists, or if the checksum of the
|
|
# dependencies has changed
|
|
set(merge_config_files_checksum_file
|
|
${CMAKE_CURRENT_BINARY_DIR}/.cmake.dotconfig.checksum)
|
|
set(CREATE_NEW_DOTCONFIG 1)
|
|
# Check if the checksum file exists too before trying to open it, though it
|
|
# should under normal circumstances
|
|
if(EXISTS ${DOTCONFIG} AND EXISTS ${merge_config_files_checksum_file})
|
|
# Read out what the checksum was previously
|
|
file(READ ${merge_config_files_checksum_file}
|
|
merge_config_files_checksum_prev)
|
|
if(${merge_config_files_checksum} STREQUAL
|
|
${merge_config_files_checksum_prev})
|
|
# Checksum is the same as before
|
|
set(CREATE_NEW_DOTCONFIG 0)
|
|
endif()
|
|
endif()
|
|
|
|
if(CREATE_NEW_DOTCONFIG)
|
|
set(input_configs_flags --handwritten-input-configs)
|
|
set(input_configs ${merge_config_files} ${FORCED_CONF_FILE})
|
|
else()
|
|
set(input_configs ${DOTCONFIG} ${FORCED_CONF_FILE})
|
|
endif()
|
|
# set(FORCED_CONF_FILE)
|
|
if(DEFINED FORCED_CONF_FILE)
|
|
list(APPEND input_configs_flags --forced-input-configs)
|
|
endif()
|
|
|
|
cmake_path(GET AUTOCONF_H PARENT_PATH autoconf_h_path)
|
|
if(NOT EXISTS ${autoconf_h_path})
|
|
file(MAKE_DIRECTORY ${autoconf_h_path})
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND
|
|
${CMAKE_COMMAND} -E env
|
|
${COMMON_KCONFIG_ENV_SETTINGS}
|
|
${PYTHON_EXECUTABLE}
|
|
${ERPC_BASE}/scripts/kconfig/kconfig.py
|
|
--zephyr-base=${ERPC_BASE}
|
|
${input_configs_flags}
|
|
${KCONFIG_ROOT}
|
|
${DOTCONFIG}
|
|
${AUTOCONF_H}
|
|
""
|
|
# ${SPLITCONFIG_DIR}
|
|
${PARSED_KCONFIG_SOURCES_TXT}
|
|
${GENERATED_HEADERS_TXT}
|
|
${input_configs}
|
|
WORKING_DIRECTORY ${ERPC_BASE}
|
|
# The working directory is set to the app dir such that the user can use
|
|
# relative paths in CONF_FILE, e.g. CONF_FILE=nrf5.conf
|
|
RESULT_VARIABLE ret)
|
|
if(NOT "${ret}" STREQUAL "0")
|
|
message(FATAL_ERROR "Kconfig process command run failed with return code: ${ret}")
|
|
endif()
|
|
|
|
if(CREATE_NEW_DOTCONFIG)
|
|
# Write the new configuration fragment checksum. Only do this if kconfig.py
|
|
# succeeds, to avoid marking zephyr/.config as up-to-date when it hasn't been
|
|
# regenerated.
|
|
file(WRITE ${merge_config_files_checksum_file} ${merge_config_files_checksum})
|
|
endif()
|
|
|
|
# Read out the list of 'Kconfig' sources that were used by the engine.
|
|
file(STRINGS ${PARSED_KCONFIG_SOURCES_TXT} PARSED_KCONFIG_SOURCES_LIST)
|
|
file(STRINGS ${GENERATED_HEADERS_TXT} GENERATED_HEADERS_LIST)
|
|
|
|
# Force CMAKE configure when the Kconfig sources or configuration files changes.
|
|
foreach(kconfig_input ${merge_config_files} ${DOTCONFIG}
|
|
${PARSED_KCONFIG_SOURCES_LIST} ${GENERATED_HEADERS_LIST})
|
|
set_property(
|
|
DIRECTORY
|
|
APPEND
|
|
PROPERTY CMAKE_CONFIGURE_DEPENDS ${kconfig_input})
|
|
endforeach()
|
|
|
|
# import config
|
|
import_kconfig(${KCONFIG_NAMESPACE} ${DOTCONFIG})
|