diff --git a/Kconfig.zephyr b/Kconfig.zephyr index 3a4ed0e9dae..22bc9e88e64 100644 --- a/Kconfig.zephyr +++ b/Kconfig.zephyr @@ -22,10 +22,10 @@ endmenu # $ARCH and $BOARD_DIR will be glob patterns when building documentation. source "boards/shields/*/Kconfig.defconfig" source "$(BOARD_DIR)/Kconfig.defconfig" -source "$(SOC_DIR)/$(ARCH)/*/Kconfig.defconfig" +source "$(KCONFIG_BINARY_DIR)/Kconfig.soc.defconfig" source "boards/Kconfig" -source "$(SOC_DIR)/Kconfig" +source "soc/Kconfig" source "arch/Kconfig" source "kernel/Kconfig" source "dts/Kconfig" diff --git a/cmake/app/boilerplate.cmake b/cmake/app/boilerplate.cmake index d6e163ec669..98df14b3097 100644 --- a/cmake/app/boilerplate.cmake +++ b/cmake/app/boilerplate.cmake @@ -276,11 +276,9 @@ set(CACHED_SHIELD ${SHIELD} CACHE STRING "Selected shield") # be found. It always includes ${ZEPHYR_BASE} at the lowest priority. list(APPEND BOARD_ROOT ${ZEPHYR_BASE}) -if(NOT SOC_ROOT) - set(SOC_DIR ${ZEPHYR_BASE}/soc) -else() - set(SOC_DIR ${SOC_ROOT}/soc) -endif() +# 'SOC_ROOT' is a prioritized list of directories where socs may be +# found. It always includes ${ZEPHYR_BASE}/soc at the lowest priority. +list(APPEND SOC_ROOT ${ZEPHYR_BASE}) if(NOT ARCH_ROOT) set(ARCH_DIR ${ZEPHYR_BASE}/arch) @@ -493,6 +491,7 @@ include(${ZEPHYR_BASE}/cmake/host-tools.cmake) include(${BOARD_DIR}/pre_dt_board.cmake OPTIONAL) # Build directory for generated KConfig files, such as: +# - Multiple SOC_ROOT inclusion # - Zephyr modules Kconfig files set(KCONFIG_BINARY_DIR ${CMAKE_BINARY_DIR}/Kconfig) file(MAKE_DIRECTORY ${KCONFIG_BINARY_DIR}) @@ -525,6 +524,21 @@ else() set(SOC_PATH ${SOC_FAMILY}/${SOC_SERIES}) endif() +# Use SOC to search for a 'CMakeLists.txt' file. +# e.g. zephyr/soc/xtense/intel_apl_adsp/CMakeLists.txt. +foreach(root ${SOC_ROOT}) + if(EXISTS ${root}/soc/${ARCH}/${SOC_PATH}) + set(SOC_DIR ${root}/soc) + break() + endif() +endforeach() + +if(NOT SOC_DIR) + message(FATAL_ERROR "Could not find SOC=${SOC_NAME} for BOARD=${BOARD}, \ +please check your installation. SOC roots searched: \n\ +${SOC_ROOT}") +endif() + include(${ZEPHYR_BASE}/cmake/target_toolchain.cmake) project(Zephyr-Kernel VERSION ${PROJECT_VERSION}) diff --git a/cmake/kconfig.cmake b/cmake/kconfig.cmake index a6bb9052b2b..2193e79768b 100644 --- a/cmake/kconfig.cmake +++ b/cmake/kconfig.cmake @@ -5,6 +5,22 @@ file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/kconfig/include/generated) file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/kconfig/include/config) +# Support multiple SOC_ROOT +set(OPERATION WRITE) +foreach(root ${SOC_ROOT}) + file(${OPERATION} ${KCONFIG_BINARY_DIR}/Kconfig.soc.defconfig + "osource \"${root}/soc/$(ARCH)/*/Kconfig.defconfig\"\n" + ) + file(${OPERATION} ${KCONFIG_BINARY_DIR}/Kconfig.soc + "osource \"${root}/soc/$(ARCH)/*/Kconfig.soc\"\n" + ) + file(${OPERATION} ${KCONFIG_BINARY_DIR}/Kconfig.soc.arch + "osource \"${root}/soc/$(ARCH)/Kconfig\"\n" + "osource \"${root}/soc/$(ARCH)/*/Kconfig\"\n" + ) + set(OPERATION APPEND) +endforeach() + if(KCONFIG_ROOT) # KCONFIG_ROOT has either been specified as a CMake variable or is # already in the CMakeCache.txt. This has precedence. @@ -41,7 +57,6 @@ set(ENV{PYTHON_EXECUTABLE} ${PYTHON_EXECUTABLE}) # files for other architectures set(ENV{ARCH} ${ARCH}) set(ENV{BOARD_DIR} ${BOARD_DIR}) -set(ENV{SOC_DIR} ${SOC_DIR}) set(ENV{SHIELD_AS_LIST} "${SHIELD_AS_LIST}") set(ENV{KCONFIG_BINARY_DIR} ${KCONFIG_BINARY_DIR}) set(ENV{ARCH_DIR} ${ARCH_DIR}) @@ -85,7 +100,6 @@ foreach(kconfig_target KCONFIG_CONFIG=${DOTCONFIG} ARCH=$ENV{ARCH} BOARD_DIR=$ENV{BOARD_DIR} - SOC_DIR=$ENV{SOC_DIR} SHIELD_AS_LIST=$ENV{SHIELD_AS_LIST} KCONFIG_BINARY_DIR=$ENV{KCONFIG_BINARY_DIR} ZEPHYR_TOOLCHAIN_VARIANT=${ZEPHYR_TOOLCHAIN_VARIANT} diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 4db1ce4d5a3..414bfcfc8e4 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -42,6 +42,8 @@ endif() # Include version info include(${ZEPHYR_BASE}/cmake/version.cmake) # Process modules +set(KCONFIG_BINARY_DIR ${CMAKE_BINARY_DIR}/Kconfig) +file(MAKE_DIRECTORY ${KCONFIG_BINARY_DIR}) include(${ZEPHYR_BASE}/cmake/zephyr_module.cmake) # Note that this won't force fatal error if latexmk is not found. @@ -195,6 +197,17 @@ else() set(SEP :) endif() +file(WRITE ${KCONFIG_BINARY_DIR}/Kconfig.soc.defconfig + "osource \"${ZEPHYR_BASE}/soc/$(ARCH)/*/Kconfig.defconfig\"\n" +) +file(WRITE ${KCONFIG_BINARY_DIR}/Kconfig.soc + "osource \"${ZEPHYR_BASE}/soc/$(ARCH)/*/Kconfig.soc\"\n" +) +file(WRITE ${KCONFIG_BINARY_DIR}/Kconfig.soc.arch + "osource \"${ZEPHYR_BASE}/soc/$(ARCH)/Kconfig\"\n" + "osource \"${ZEPHYR_BASE}/soc/$(ARCH)/*/Kconfig\"\n" +) + add_custom_target( kconfig COMMAND ${CMAKE_COMMAND} -E make_directory ${RST_OUT}/doc/reference/kconfig @@ -206,7 +219,7 @@ add_custom_target( ARCH=* ARCH_DIR=arch SOC_DIR=soc - CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR} + KCONFIG_BINARY_DIR=${KCONFIG_BINARY_DIR} KCONFIG_WARN_UNDEF=y KCONFIG_TURBO_MODE=${KCONFIG_TURBO_MODE} KCONFIG_DOC_MODE=1 diff --git a/scripts/ci/check_compliance.py b/scripts/ci/check_compliance.py index e1fe1bd1bbe..9bdbb031a2b 100755 --- a/scripts/ci/check_compliance.py +++ b/scripts/ci/check_compliance.py @@ -256,6 +256,28 @@ class KconfigCheck(ComplianceTest): except subprocess.CalledProcessError as ex: self.error(ex.output) + def write_kconfig_soc(self): + """ + Write KConfig soc files to be sourced during Kconfig parsing + + """ + + soc_defconfig_file = os.path.join(tempfile.gettempdir(), "Kconfig.soc.defconfig") + soc_file = os.path.join(tempfile.gettempdir(), "Kconfig.soc") + soc_arch_file = os.path.join(tempfile.gettempdir(), "Kconfig.soc.arch") + try: + with open(soc_defconfig_file, 'w', encoding="utf-8") as fp: + fp.write(f'osource "{ZEPHYR_BASE}/soc/$(ARCH)/*/Kconfig.defconfig"\n') + + with open(soc_file, 'w', encoding="utf-8") as fp: + fp.write(f'osource "{ZEPHYR_BASE}/soc/$(ARCH)/*/Kconfig.soc"\n') + + with open(soc_arch_file, 'w', encoding="utf-8") as fp: + fp.write(f'osource "{ZEPHYR_BASE}/soc/$(ARCH)/Kconfig"\n\ +osource "{ZEPHYR_BASE}/soc/$(ARCH)/*/Kconfig"\n') + except IOError as ex: + self.error(ex.output) + def parse_kconfig(self): """ Returns a kconfiglib.Kconfig object for the Kconfig files. We reuse @@ -284,7 +306,7 @@ class KconfigCheck(ComplianceTest): os.environ["ARCH_DIR"] = "arch/" os.environ["BOARD_DIR"] = "boards/*/*" os.environ["ARCH"] = "*" - os.environ["CMAKE_BINARY_DIR"] = tempfile.gettempdir() + os.environ["KCONFIG_BINARY_DIR"] = tempfile.gettempdir() os.environ['DEVICETREE_CONF'] = "dummy" # Older name for DEVICETREE_CONF, for compatibility with older Zephyr @@ -294,6 +316,9 @@ class KconfigCheck(ComplianceTest): # For multi repo support self.get_modules(os.path.join(tempfile.gettempdir(), "Kconfig.modules")) + # For list of SOC_ROOT support + self.write_kconfig_soc() + # Tells Kconfiglib to generate warnings for all references to undefined # symbols within Kconfig files os.environ["KCONFIG_WARN_UNDEF"] = "y" diff --git a/soc/Kconfig b/soc/Kconfig index f411239de4c..4e8db269477 100644 --- a/soc/Kconfig +++ b/soc/Kconfig @@ -3,13 +3,12 @@ choice prompt "SoC/CPU/Configuration Selection" -source "$(SOC_DIR)/$(ARCH)/*/Kconfig.soc" +source "$(KCONFIG_BINARY_DIR)/Kconfig.soc" endchoice menu "Hardware Configuration" -osource "$(SOC_DIR)/$(ARCH)/Kconfig" -osource "$(SOC_DIR)/$(ARCH)/*/Kconfig" +source "$(KCONFIG_BINARY_DIR)/Kconfig.soc.arch" module = SOC