89a197be84
Automatically detect the Kconfig file in it's conventional placement ${APPLICATION_SOURCE_DIR}/Kconfig and set KCONFIG_ROOT accordingly. 'Convention over configuration' is an imporant principle for minimizing metadata and keeping things consistent. We use this principle for instance with the file prj.conf. This commit applies this principle to also re-direrct KCONFIG_ROOT. Signed-off-by: Sebastian Bøe <sebastian.boe@nordicsemi.no>
170 lines
5.4 KiB
CMake
170 lines
5.4 KiB
CMake
# Folders needed for conf/mconf files (kconfig has no method of redirecting all output files).
|
|
# conf/mconf needs to be run from a different directory because of: GH-3408
|
|
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/kconfig/include/generated)
|
|
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/kconfig/include/config)
|
|
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/include/generated)
|
|
|
|
if(KCONFIG_ROOT)
|
|
# KCONFIG_ROOT has either been specified as a CMake variable or is
|
|
# already in the CMakeCache.txt. This has precedence.
|
|
elseif(EXISTS ${APPLICATION_SOURCE_DIR}/Kconfig)
|
|
set(KCONFIG_ROOT ${APPLICATION_SOURCE_DIR}/Kconfig)
|
|
else()
|
|
set(KCONFIG_ROOT ${ZEPHYR_BASE}/Kconfig)
|
|
endif()
|
|
|
|
set(BOARD_DEFCONFIG ${BOARD_DIR}/${BOARD}_defconfig)
|
|
set(DOTCONFIG ${PROJECT_BINARY_DIR}/.config)
|
|
|
|
if(CONF_FILE)
|
|
string(REPLACE " " ";" CONF_FILE_AS_LIST "${CONF_FILE}")
|
|
endif()
|
|
|
|
set(ENV{srctree} ${ZEPHYR_BASE})
|
|
set(ENV{KERNELVERSION} ${PROJECT_VERSION})
|
|
set(ENV{KCONFIG_CONFIG} ${DOTCONFIG})
|
|
set(ENV{KCONFIG_AUTOHEADER} ${AUTOCONF_H})
|
|
|
|
# Set environment variables so that Kconfig can prune Kconfig source
|
|
# files for other architectures
|
|
set(ENV{ARCH} ${ARCH})
|
|
set(ENV{BOARD_DIR} ${BOARD_DIR})
|
|
set(ENV{SOC_DIR} ${SOC_DIR})
|
|
|
|
add_custom_target(
|
|
menuconfig
|
|
${CMAKE_COMMAND} -E env
|
|
srctree=${ZEPHYR_BASE}
|
|
KERNELVERSION=${PROJECT_VERSION}
|
|
KCONFIG_CONFIG=${DOTCONFIG}
|
|
ARCH=$ENV{ARCH}
|
|
BOARD_DIR=$ENV{BOARD_DIR}
|
|
SOC_DIR=$ENV{SOC_DIR}
|
|
${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/scripts/kconfig/menuconfig.py ${KCONFIG_ROOT}
|
|
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/kconfig
|
|
USES_TERMINAL
|
|
)
|
|
|
|
# Support assigning Kconfig symbols on the command-line with CMake
|
|
# cache variables prefixed with 'CONFIG_'. This feature is
|
|
# experimental and undocumented until it has undergone more
|
|
# user-testing.
|
|
unset(EXTRA_KCONFIG_OPTIONS)
|
|
get_cmake_property(cache_variable_names CACHE_VARIABLES)
|
|
foreach (name ${cache_variable_names})
|
|
if("${name}" MATCHES "^CONFIG_")
|
|
# When a cache variable starts with 'CONFIG_', it is assumed to be
|
|
# a CLI Kconfig symbol assignment.
|
|
set(EXTRA_KCONFIG_OPTIONS
|
|
"${EXTRA_KCONFIG_OPTIONS}\n${name}=${${name}}"
|
|
)
|
|
endif()
|
|
endforeach()
|
|
|
|
if(EXTRA_KCONFIG_OPTIONS)
|
|
set(EXTRA_KCONFIG_OPTIONS_FILE ${PROJECT_BINARY_DIR}/misc/generated/extra_kconfig_options.conf)
|
|
file(WRITE
|
|
${EXTRA_KCONFIG_OPTIONS_FILE}
|
|
${EXTRA_KCONFIG_OPTIONS}
|
|
)
|
|
endif()
|
|
|
|
# Bring in extra configuration files dropped in by the user or anyone else;
|
|
# make sure they are set at the end so we can override any other setting
|
|
file(GLOB config_files ${APPLICATION_BINARY_DIR}/*.conf)
|
|
list(SORT config_files)
|
|
set(
|
|
merge_config_files
|
|
${BOARD_DEFCONFIG}
|
|
${CONF_FILE_AS_LIST}
|
|
${OVERLAY_CONFIG}
|
|
${EXTRA_KCONFIG_OPTIONS_FILE}
|
|
${config_files}
|
|
)
|
|
|
|
# Create a list of absolute paths to the .config sources from
|
|
# merge_config_files, which is a mix of absolute and relative paths.
|
|
set(merge_config_files_with_absolute_paths "")
|
|
foreach(f ${merge_config_files})
|
|
if(IS_ABSOLUTE ${f})
|
|
set(path ${f})
|
|
else()
|
|
set(path ${APPLICATION_SOURCE_DIR}/${f})
|
|
endif()
|
|
|
|
list(APPEND merge_config_files_with_absolute_paths ${path})
|
|
endforeach()
|
|
|
|
foreach(f ${merge_config_files_with_absolute_paths})
|
|
if(NOT EXISTS ${f} OR IS_DIRECTORY ${f})
|
|
message(FATAL_ERROR "File not found: ${f}")
|
|
endif()
|
|
endforeach()
|
|
|
|
# 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_with_absolute_paths})
|
|
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 ${PROJECT_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)
|
|
file(WRITE
|
|
${merge_config_files_checksum_file}
|
|
${merge_config_files_checksum}
|
|
)
|
|
|
|
set(merge_fragments ${merge_config_files})
|
|
else()
|
|
set(merge_fragments ${DOTCONFIG})
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND
|
|
${PYTHON_EXECUTABLE}
|
|
${ZEPHYR_BASE}/scripts/kconfig/kconfig.py
|
|
${KCONFIG_ROOT}
|
|
${PROJECT_BINARY_DIR}/.config
|
|
${PROJECT_BINARY_DIR}/include/generated/autoconf.h
|
|
${merge_fragments}
|
|
WORKING_DIRECTORY ${APPLICATION_SOURCE_DIR}
|
|
# 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 "command failed with return code: ${ret}")
|
|
endif()
|
|
|
|
# Force CMAKE configure when the configuration files changes.
|
|
foreach(merge_config_input ${merge_config_files} ${DOTCONFIG})
|
|
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${merge_config_input})
|
|
endforeach()
|
|
|
|
add_custom_target(config-sanitycheck DEPENDS ${DOTCONFIG})
|
|
|
|
# Parse the lines prefixed with CONFIG_ in the .config file from Kconfig
|
|
import_kconfig(${DOTCONFIG})
|