# General configuration options

# Copyright (c) 2014-2015 Wind River Systems, Inc.
# Copyright (c) 2016 Intel Corporation
# SPDX-License-Identifier: Apache-2.0


# Include Kconfig.defconfig files first so that they can override defaults and
# other symbol/choice properties by adding extra symbol/choice definitions.
# After merging all definitions for a symbol/choice, Kconfig picks the first
# property (e.g. the first default) with a satisfied condition.
#
# Shield defaults should have precedence over board defaults, which should have
# precedence over SoC defaults, so include them in that order.
#
# $ARCH and $BOARD_DIR will be glob patterns when building documentation.
# This loads custom shields defconfigs (from BOARD_ROOT)
osource "$(KCONFIG_BINARY_DIR)/Kconfig.shield.defconfig"
# This loads Zephyr base shield defconfigs
source "boards/shields/*/Kconfig.defconfig"

source "$(BOARD_DIR)/Kconfig.defconfig"

# This loads custom SoC root defconfigs
osource "$(KCONFIG_BINARY_DIR)/Kconfig.soc.defconfig"
# This loads Zephyr base SoC root defconfigs
osource "soc/$(ARCH)/*/Kconfig.defconfig"
# This loads the toolchain defconfigs
osource "$(TOOLCHAIN_KCONFIG_DIR)/Kconfig.defconfig"

menu "Modules"

source "modules/Kconfig"

endmenu

source "boards/Kconfig"
source "soc/Kconfig"
source "arch/Kconfig"
source "kernel/Kconfig"
source "dts/Kconfig"
source "drivers/Kconfig"
source "lib/Kconfig"
source "subsys/Kconfig"

osource "$(TOOLCHAIN_KCONFIG_DIR)/Kconfig"

menu "Build and Link Features"

menu "Linker Options"

choice
	prompt "Linker Orphan Section Handling"
	default LINKER_ORPHAN_SECTION_WARN

config LINKER_ORPHAN_SECTION_PLACE
	bool "Place"
	help
	  Linker puts orphan sections in place without warnings
	  or errors.

config LINKER_ORPHAN_SECTION_WARN
	bool "Warn"
	help
	  Linker places the orphan sections in output and issues
	  warning about those sections.

config LINKER_ORPHAN_SECTION_ERROR
	bool "Error"
	help
	  Linker exits with error when an orphan section is found.

endchoice

config HAS_FLASH_LOAD_OFFSET
	bool
	help
	  This option is selected by targets having a FLASH_LOAD_OFFSET
	  and FLASH_LOAD_SIZE.

if HAS_FLASH_LOAD_OFFSET

config USE_DT_CODE_PARTITION
	bool "Link application into /chosen/zephyr,code-partition from devicetree"
	help
	  When enabled, the application will be linked into the flash partition
	  selected by the zephyr,code-partition property in /chosen in devicetree.
	  When this is disabled, the flash load offset and size can be set manually
	  below.

# Workaround for not being able to have commas in macro arguments
DT_CHOSEN_Z_CODE_PARTITION := zephyr,code-partition

config FLASH_LOAD_OFFSET
	# Only user-configurable when USE_DT_CODE_PARTITION is disabled
	hex "Kernel load offset" if !USE_DT_CODE_PARTITION
	default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_CODE_PARTITION)) if USE_DT_CODE_PARTITION
	default 0
	help
	  This option specifies the byte offset from the beginning of flash that
	  the kernel should be loaded into. Changing this value from zero will
	  affect the Zephyr image's link, and will decrease the total amount of
	  flash available for use by application code.

	  If unsure, leave at the default value 0.

config FLASH_LOAD_SIZE
	# Only user-configurable when USE_DT_CODE_PARTITION is disabled
	hex "Kernel load size" if !USE_DT_CODE_PARTITION
	default $(dt_chosen_reg_size_hex,$(DT_CHOSEN_Z_CODE_PARTITION)) if USE_DT_CODE_PARTITION
	default 0
	help
	  If non-zero, this option specifies the size, in bytes, of the flash
	  area that the Zephyr image will be allowed to occupy.  If zero, the
	  image will be able to occupy from the FLASH_LOAD_OFFSET to the end of
	  the device.

	  If unsure, leave at the default value 0.

endif # HAS_FLASH_LOAD_OFFSET

config ROM_START_OFFSET
	hex
	prompt "ROM start offset" if !BOOTLOADER_MCUBOOT
	default 0x200 if BOOTLOADER_MCUBOOT
	default 0
	help
	  If the application is built for chain-loading by a bootloader this
	  variable is required to be set to value that leaves sufficient
	  space between the beginning of the image and the start of the first
	  section to store an image header or any other metadata.
	  In the particular case of the MCUboot bootloader this reserves enough
	  space to store the image header, which should also meet vector table
	  alignment requirements on most ARM targets, although some targets
	  may require smaller or larger values.

config LD_LINKER_SCRIPT_SUPPORTED
	bool
	default y

choice LINKER_SCRIPT
	prompt "Linker script"
	default LD_LINKER_TEMPLATE if LD_LINKER_SCRIPT_SUPPORTED

config LD_LINKER_TEMPLATE
	bool "LD template"
	depends on LD_LINKER_SCRIPT_SUPPORTED
	help
	  Select this option to use the LD linker script templates.
	  The templates are pre-processed by the C pre-processor to create the
	  final LD linker script.

config CMAKE_LINKER_GENERATOR
	bool "CMake generator"
	depends on ARM
	help
	  Select this option to use the Zephyr CMake linker script generator.
	  The linker configuration is written in CMake and the final linker
	  script will be generated by the toolchain specific linker generator.
	  For LD based linkers, this will be the ld generator, for ARMClang /
	  armlink based linkers it will be the scatter generator.

endchoice

config LLVM_USE_LD
	bool "LLVM use ld linker"
	depends on "${ZEPHYR_TOOLCHAIN_VARIANT}" = "llvm"
	default y
	help
	  Use binutils ld linker instead of LLVM built-in lld linker.

config HAVE_CUSTOM_LINKER_SCRIPT
	bool "Custom linker script provided"
	help
	  Set this option if you have a custom linker script which needed to
	  be define in CUSTOM_LINKER_SCRIPT.

config CUSTOM_LINKER_SCRIPT
	string "Path to custom linker script"
	depends on HAVE_CUSTOM_LINKER_SCRIPT
	help
	  Path to the linker script to be used instead of the one define by the
	  board.

	  The linker script must be based on a version provided by Zephyr since
	  the kernel can expect a certain layout/certain regions.

	  This is useful when an application needs to add sections into the
	  linker script and avoid having to change the script provided by
	  Zephyr.

config KERNEL_ENTRY
	string "Kernel entry symbol"
	default "__start"
	help
	  Code entry symbol, to be set at linking phase.

config LINKER_SORT_BY_ALIGNMENT
	bool "Sort input sections by alignment"
	default y
	help
	  This turns on the linker flag to sort sections by alignment
	  in decreasing size of symbols. This helps to minimize
	  padding between symbols.

config SRAM_VECTOR_TABLE
	bool "Place the vector table in SRAM instead of flash"
	help
	  The option specifies that the vector table should be placed at the
	  start of SRAM instead of the start of flash.

config HAS_SRAM_OFFSET
	bool
	help
	  This option is selected by targets that require SRAM_OFFSET.

config SRAM_OFFSET
	hex "Kernel SRAM offset" if HAS_SRAM_OFFSET
	default 0
	help
	  This option specifies the byte offset from the beginning of SRAM
	  where the kernel begins. Changing this value from zero will affect
	  the Zephyr image's link, and will decrease the total amount of
	  SRAM available for use by application code.

	  If unsure, leave at the default value 0.

menu "Linker Sections"

config LINKER_USE_BOOT_SECTION
	bool "Use Boot Linker Section"
	help
	  If enabled, the symbols which are needed for the boot process
	  will be put into another linker section reserved for these
	  symbols.

	  Requires that boot sections exist in the architecture, SoC,
	  board or custom linker script.

config LINKER_USE_PINNED_SECTION
	bool "Use Pinned Linker Section"
	help
	  If enabled, the symbols which need to be pinned in memory
	  will be put into another linker section reserved for pinned
	  symbols. During boot, the corresponding memory will be marked
	  as pinned.

	  Requires that pinned sections exist in the architecture, SoC,
	  board or custom linker script.

config LINKER_GENERIC_SECTIONS_PRESENT_AT_BOOT
	bool "Generic sections are present at boot" if DEMAND_PAGING && LINKER_USE_PINNED_SECTION
	default y
	help
	  When disabled, the linker sections other than the boot and
	  pinned sections will be marked as not present in the page
	  tables. This allows kernel to pull in data pages on demand
	  as required by current execution context when demand paging
	  is enabled. There is no need to load all code and data into
	  memory at once.

	  If unsure, say Y.

endmenu # "Linker Sections"

endmenu

menu "Compiler Options"

config CODING_GUIDELINE_CHECK
	bool "Enforce coding guideline rules"
	help
	  Use available compiler flags to check coding guideline rules during
	  the build.

config NATIVE_APPLICATION
	bool "Build as a native host application"
	help
	  Build as a native application that can run on the host and using
	  resources and libraries provided by the host.

choice COMPILER_OPTIMIZATIONS
	prompt "Optimization level"
	default NO_OPTIMIZATIONS    if COVERAGE
	default DEBUG_OPTIMIZATIONS if DEBUG
	default SIZE_OPTIMIZATIONS
	help
	  Note that these flags shall only control the compiler
	  optimization level, and that no extra debug code shall be
	  conditionally compiled based on them.

config SIZE_OPTIMIZATIONS
	bool "Optimize for size"
	help
	  Compiler optimizations will be set to -Os independently of other
	  options.

config SPEED_OPTIMIZATIONS
	bool "Optimize for speed"
	help
	  Compiler optimizations will be set to -O2 independently of other
	  options.

config DEBUG_OPTIMIZATIONS
	bool "Optimize debugging experience"
	help
	  Compiler optimizations will be set to -Og independently of other
	  options.

config NO_OPTIMIZATIONS
	bool "Optimize nothing"
	help
	  Compiler optimizations will be set to -O0 independently of other
	  options.

endchoice

config COMPILER_COLOR_DIAGNOSTICS
	bool "Colored diagnostics"
	default y
	help
	  Compiler diagnostic messages are colorized.

config COMPILER_OPT
	string "Custom compiler options"
	help
	  This option is a free-form string that is passed to the compiler
	  when building all parts of a project (i.e. kernel).
	  The compiler options specified by this string supplement the
	  predefined set of compiler supplied by the build system,
	  and can be used to change compiler optimization, warning and error
	  messages, and so on.

config MISRA_SANE
	bool "MISRA standards compliance features"
	help
	  Causes the source code to build in "MISRA" mode, which
	  disallows some otherwise-permitted features of the C
	  standard for safety reasons.  Specifically variable length
	  arrays are not permitted (and gcc will enforce this).

endmenu

choice
	prompt "Error checking behavior for CHECK macro"
	default RUNTIME_ERROR_CHECKS

config ASSERT_ON_ERRORS
	bool "Assert on all errors"
	help
	  Assert on errors covered with the CHECK macro.

config NO_RUNTIME_CHECKS
	bool "No runtime error checks"
	help
	  Do not do any runtime checks or asserts when using the CHECK macro.

config RUNTIME_ERROR_CHECKS
	bool "Runtime error checks"
	help
	  Always perform runtime checks covered with the CHECK macro. This
	  option is the default and the only option used during testing.

endchoice

menu "Build Options"

config KERNEL_BIN_NAME
	string "The kernel binary name"
	default "zephyr"
	help
	  This option sets the name of the generated kernel binary.

config OUTPUT_STAT
	bool "Create a statistics file"
	default y
	help
	  Create a stat file using readelf -e <elf>

config OUTPUT_DISASSEMBLY
	bool "Create a disassembly file"
	default y
	help
	  Create an .lst file with the assembly listing of the firmware.

config OUTPUT_DISASSEMBLE_ALL
	bool "Disassemble all sections with source. Fill zeros."
	default n
	depends on OUTPUT_DISASSEMBLY
	help
	  The .lst file will contain complete disassembly of the firmware
	  not just those expected to contain instructions including zeros

config OUTPUT_PRINT_MEMORY_USAGE
	bool "Print memory usage to stdout"
	default y
	help
	  If the toolchain supports it, this option will pass
	  --print-memory-region to the linker when it is doing it's first
	  linker pass. Note that the memory regions are symbolic concepts
	  defined by the linker scripts and do not necessarily map
	  directly to the real physical address space. Take also note that
	  some platforms do two passes of the linker so the results do not
	  match exactly to the final elf file. See also rom_report,
	  ram_report and
	  https://sourceware.org/binutils/docs/ld/MEMORY.html

config CLEANUP_INTERMEDIATE_FILES
	bool "Remove all intermediate files"
	help
	  Delete intermediate files to save space and cleanup clutter resulting
	  from the build process.

config BUILD_NO_GAP_FILL
	bool "Don't fill gaps in generated hex/bin/s19 files."

config BUILD_OUTPUT_HEX
	bool "Build a binary in HEX format"
	help
	  Build an Intel HEX binary zephyr/zephyr.hex in the build directory.
	  The name of this file can be customized with CONFIG_KERNEL_BIN_NAME.

config BUILD_OUTPUT_BIN
	bool "Build a binary in BIN format"
	default y
	help
	  Build a "raw" binary zephyr/zephyr.bin in the build directory.
	  The name of this file can be customized with CONFIG_KERNEL_BIN_NAME.

config BUILD_OUTPUT_EFI
	bool "Build as an EFI application"
	default n
	depends on X86_64
	help
	  Build as an EFI application.

	  This works by creating a "zephyr.efi" EFI binary containing a zephyr
	  image extracted from a built zephyr.elf file.  EFI applications are
	  relocatable, and cannot be placed at specific locations in memory.
	  Instead, the stub code will copy the embedded zephyr sections to the
	  appropriate locations at startup, clear any zero-filled (BSS, etc...)
	  areas, then jump into the 64 bit entry point.

config BUILD_OUTPUT_EXE
	bool "Build a binary in ELF format with .exe extension"
	help
	  Build an ELF binary that can run in the host system at
	  zephyr/zephyr.exe in the build directory.
	  The name of this file can be customized with CONFIG_KERNEL_BIN_NAME.

config BUILD_OUTPUT_S19
	bool "Build a binary in S19 format"
	help
	  Build an S19 binary zephyr/zephyr.s19 in the build directory.
	  The name of this file can be customized with CONFIG_KERNEL_BIN_NAME.

config BUILD_OUTPUT_UF2
	bool "Build a binary in UF2 format"
	depends on BUILD_OUTPUT_BIN
	help
	  Build a UF2 binary zephyr/zephyr.uf2 in the build directory.
	  The name of this file can be customized with CONFIG_KERNEL_BIN_NAME.

if BUILD_OUTPUT_UF2

config BUILD_OUTPUT_UF2_FAMILY_ID
	string "UF2 device family ID"
	default "0x1c5f21b0" if SOC_ESP32
	default "0x621e937a" if SOC_NRF52833_QIAA
	default "0xada52840" if SOC_NRF52840_QIAA
	default "0x4fb2d5bd" if SOC_SERIES_IMX_RT
	default "0x2abc77ec" if SOC_SERIES_LPC55XXX
	default "0xe48bff56" if SOC_SERIES_RP2XXX
	default "0x68ed2b88" if SOC_SERIES_SAMD21
	default "0x55114460" if SOC_SERIES_SAMD51
	default "0x647824b6" if SOC_SERIES_STM32F0X
	default "0x5d1a0a2e" if SOC_SERIES_STM32F2X
	default "0x6b846188" if SOC_SERIES_STM32F3X
	default "0x53b80f00" if SOC_SERIES_STM32F7X
	default "0x300f5633" if SOC_SERIES_STM32G0X
	default "0x4c71240a" if SOC_SERIES_STM32G4X
	default "0x6db66082" if SOC_SERIES_STM32H7X
	default "0x202e3a91" if SOC_SERIES_STM32L0X
	default "0x1e1f432d" if SOC_SERIES_STM32L1X
	default "0x00ff6919" if SOC_SERIES_STM32L4X
	default "0x04240bdf" if SOC_SERIES_STM32L5X
	default "0x70d16653" if SOC_SERIES_STM32WBX
	default "0x5ee21072" if SOC_STM32F103XE
	default "0x57755a57" if SOC_STM32F401XC || SOC_STM32F401XE
	default "0x6d0922fa" if SOC_STM32F407XE
	default "0x8fb060fe" if SOC_STM32F407XG
	help
	  UF2 bootloaders only accept UF2 files with a matching family ID.
	  This can be either a hex, e.g. 0x68ed2b88, or well-known family
	  name string. If the SoC in use is known by UF2, the Family ID will
	  be pre-filled with the known value.

config BUILD_OUTPUT_UF2_USE_FLASH_BASE
	bool
	default n

config BUILD_OUTPUT_UF2_USE_FLASH_OFFSET
	bool
	default n

endif # BUILD_OUTPUT_UF2

config BUILD_OUTPUT_STRIPPED
	bool "Build a stripped binary"
	help
	  Build a stripped binary zephyr/zephyr.strip in the build directory.
	  The name of this file can be customized with CONFIG_KERNEL_BIN_NAME.

config BUILD_OUTPUT_ADJUST_LMA
	string
	help
	  This will adjust the LMA address in the final ELF and hex files with
	  the value provided.
	  This will not affect the internal address symbols inside the image but
	  can be useful when adjusting the LMA address for flash tools or multi
	  stage loaders where a pre-loader may copy image to a second location
	  before booting a second core.
	  The value will be evaluated as a math expression, this means that
	  following are valid expression
	  - 1024
	  - 0x1000
	  - -0x1000
	  - 0x20000000 - 0x10000000
	  Note: negative numbers are valid.
	  To adjust according to a chosen flash partition one can specify a
	  default as:
	  DT_CHOSEN_IMAGE_<name> := <name>,<name>-partition
	  DT_CHOSEN_Z_FLASH := zephyr,flash
	  config BUILD_OUTPUT_ADJUST_LMA
	    default "$(dt_chosen_reg_addr_hex,$(DT_CHOSEN_IMAGE_M4))-\
	             $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_FLASH))"

config BUILD_OUTPUT_INFO_HEADER
	bool "Create a image information header"
	help
	  Create an image information header which will contain image
	  information from the Zephyr binary.
	  Example of information contained in the header file:
	  - Number of segments in the image
	  - LMA address of each segment
	  - VMA address of each segment
	  - Size of each segment

config APPLICATION_DEFINED_SYSCALL
	bool "Scan application folder for any syscall definition"
	help
	  Scan additional folders inside application source folder
	  for application defined syscalls.

config MAKEFILE_EXPORTS
	bool "Generate build metadata files named Makefile.exports"
	help
	  Generates a file with build information that can be read by
	  third party Makefile-based build systems.

config BUILD_OUTPUT_META
	bool "Create a build meta file"
	help
	  Create a build meta file in the build directory containing lists of:
	  - Zephyr: path and revision (if git repo)
	  - Zephyr modules: name, path, and revision (if git repo)
	  - West:
	    - manifest: path and revision
	    - projects: path and revision
	  - Workspace:
	    - dirty: one or more repositories are marked dirty
	    - extra: extra Zephyr modules are manually included in the build
	    - off:   the SHA of one or more west projects are not what the manifest
	             defined when `west update` was run the last time (`manifest-rev`).
	             The off state is only present if a west workspace is found.
	  File extension is .meta

config BUILD_OUTPUT_META_STATE_PROPAGATE
	bool "Propagate module and project state"
	depends on BUILD_OUTPUT_META
	help
	  Propagate to state of each module to the Zephyr revision field.
	  If west is used the state of each west project is also propagated to
	  the Zephyr revision field.
	  West manifest repo revision field will also
	  be marked with the same state as the Zephyr revision.
	  The final revision will become: <SHA>-<state1>-<state2>-<state3>...
	  If no states are appended to the SHA it means the build is of a clean
	  tree.
	  - dirty: one or more repositories are marked dirty
	  - extra: extra Zephyr modules are manually included in the build
	  - off:   the SHA of one or more west projects are not what the manifest
	           defined when `west update` was run the last time (`manifest-rev`).
	           The off state is only present if a west workspace is found.

endmenu

config EXPERIMENTAL
	bool
	help
	  Symbol that must be selected by a feature if it is considered to be
	  at an experimental implementation stage.

config WARN_EXPERIMENTAL
	bool
	prompt "Warn on experimental usage"
	help
	  Print a warning when the Kconfig tree is parsed if any experimental
	  features are enabled.

config ENFORCE_ZEPHYR_STDINT
	bool
	prompt "Enforce Zephyr convention for stdint"
	depends on !ARCH_POSIX
	default y
	help
	  This enforces the Zephyr stdint convention where int32_t = int,
	  int64_t = long long, and intptr_t = long so that short string
	  format length modifiers can be used universally across ILP32
	  and LP64 architectures. Sometimes this is not possible e.g. when
	  linking against a binary-only C++ library whose type mangling
	  is incompatible with the Zephyr convention, or if the build
	  environment doesn't allow such enforcement, in which case this
	  should be turned off with the caveat that argument type validation
	  on Zephyr code will be skipped.

endmenu


menu "Boot Options"

config IS_BOOTLOADER
	bool "Act as a bootloader"
	depends on XIP
	depends on ARM
	help
	  This option indicates that Zephyr will act as a bootloader to execute
	  a separate Zephyr image payload.

config BOOTLOADER_SRAM_SIZE
	int "SRAM reserved for bootloader"
	default 16
	depends on !XIP || IS_BOOTLOADER
	depends on ARM || XTENSA
	help
	  This option specifies the amount of SRAM (measure in kB) reserved for
	  a bootloader image, when either:
	  - the Zephyr image itself is to act as the bootloader, or
	  - Zephyr is a !XIP image, which implicitly assumes existence of a
	  bootloader that loads the Zephyr !XIP image onto SRAM.

config MCUBOOT
	bool
	help
	  Hidden option used to indicate that the current image is MCUBoot

config BOOTLOADER_MCUBOOT
	bool "MCUboot bootloader support"
	select USE_DT_CODE_PARTITION
	imply INIT_ARCH_HW_AT_BOOT if ARCH_SUPPORTS_ARCH_HW_INIT
	depends on !MCUBOOT
	help
	  This option signifies that the target uses MCUboot as a bootloader,
	  or in other words that the image is to be chain-loaded by MCUboot.
	  This sets several required build system and Device Tree options in
	  order for the image generated to be bootable using the MCUboot open
	  source bootloader. Currently this includes:

	    * Setting ROM_START_OFFSET to a default value that allows space
	      for the MCUboot image header
	    * Activating SW_VECTOR_RELAY_CLIENT on Cortex-M0
	      (or Armv8-M baseline) targets with no built-in vector relocation
	      mechanisms

	  By default, this option instructs Zephyr to initialize the core
	  architecture HW registers during boot, when this is supported by
	  the application. This removes the need by MCUboot to reset
	  the core registers' state itself.

if BOOTLOADER_MCUBOOT

config MCUBOOT_SIGNATURE_KEY_FILE
	string "Path to the mcuboot signing key file"
	default ""
	depends on !MCUBOOT_GENERATE_UNSIGNED_IMAGE
	help
	  The file contains a key pair whose public half is verified
	  by your target's MCUboot image. The file is in PEM format.

	  If set to a non-empty value, the build system tries to
	  sign the final binaries using a 'west sign -t imgtool' command.
	  The signed binaries are placed in the build directory
	  at zephyr/zephyr.signed.bin and zephyr/zephyr.signed.hex.

	  The file names can be customized with CONFIG_KERNEL_BIN_NAME.
	  The existence of bin and hex files depends on CONFIG_BUILD_OUTPUT_BIN
	  and CONFIG_BUILD_OUTPUT_HEX.

	  This option should contain a path to the same file as the
	  BOOT_SIGNATURE_KEY_FILE option in your MCUboot .config. The path
	  may be absolute or relative to the west workspace topdir. (The MCUboot
	  config option is used for the MCUboot bootloader image; this option is
	  for your application which is to be loaded by MCUboot. The MCUboot
	  config option can be a relative path from the MCUboot repository
	  root.)

	  If left empty, you must sign the Zephyr binaries manually.

config MCUBOOT_ENCRYPTION_KEY_FILE
	string "Path to the mcuboot encryption key file"
	default ""
	depends on MCUBOOT_SIGNATURE_KEY_FILE != ""
	help
	  The file contains the public key that is used to encrypt the
	  ephemeral key that encrypts the image. The corresponding
	  private key is hard coded in the MCUboot source code and is
	  used to decrypt the ephemeral key that is embedded in the
	  image. The file is in PEM format.

	  If set to a non-empty value, the build system tries to
	  sign and encrypt the final binaries using a 'west sign -t imgtool'
	  command. The binaries are placed in the build directory at
	  zephyr/zephyr.signed.encrypted.bin and
	  zephyr/zephyr.signed.encrypted.hex.

	  The file names can be customized with CONFIG_KERNEL_BIN_NAME.
	  The existence of bin and hex files depends on CONFIG_BUILD_OUTPUT_BIN
	  and CONFIG_BUILD_OUTPUT_HEX.

	  This option should either be an absolute path or a path relative to
	  the west workspace topdir.
	  Example: './bootloader/mcuboot/enc-rsa2048-pub.pem'

	  If left empty, you must encrypt the Zephyr binaries manually.

config MCUBOOT_EXTRA_IMGTOOL_ARGS
	string "Extra arguments to pass to imgtool"
	default ""
	help
	  If CONFIG_MCUBOOT_SIGNATURE_KEY_FILE is a non-empty string,
	  you can use this option to pass extra options to imgtool.
	  For example, you could set this to "--version 1.2".

config MCUBOOT_GENERATE_UNSIGNED_IMAGE
	bool "Generate unsigned binary image bootable with MCUboot"
	help
	  Enabling this configuration allows automatic unsigned binary image
	  generation when MCUboot signing key is not provided,
	  i.e., MCUBOOT_SIGNATURE_KEY_FILE is left empty.

config MCUBOOT_GENERATE_CONFIRMED_IMAGE
	bool "Also generate a padded, confirmed image"
	help
	  The signed, padded, and confirmed binaries are placed in the build
	  directory at zephyr/zephyr.signed.confirmed.bin and
	  zephyr/zephyr.signed.confirmed.hex.

	  The file names can be customized with CONFIG_KERNEL_BIN_NAME.
	  The existence of bin and hex files depends on CONFIG_BUILD_OUTPUT_BIN
	  and CONFIG_BUILD_OUTPUT_HEX.

endif # BOOTLOADER_MCUBOOT

config BOOTLOADER_ESP_IDF
	bool "ESP-IDF bootloader support"
	depends on (SOC_ESP32 || SOC_ESP32S2 || SOC_ESP32C3) && !BOOTLOADER_MCUBOOT
	default y
	help
	  This option will trigger the compilation of the ESP-IDF bootloader
	  inside the build folder.
	  At flash time, the bootloader will be flashed with the zephyr image

config BOOTLOADER_BOSSA
	bool "BOSSA bootloader support"
	select USE_DT_CODE_PARTITION

	help
	  Signifies that the target uses a BOSSA compatible bootloader.  If CDC
	  ACM USB support is also enabled then the board will reboot into the
	  bootloader automatically when bossac is run.

config BOOTLOADER_BOSSA_DEVICE_NAME
	string "BOSSA CDC ACM device name"
	depends on BOOTLOADER_BOSSA && CDC_ACM_DTE_RATE_CALLBACK_SUPPORT
	default "CDC_ACM_0"
	help
	  Sets the CDC ACM port to watch for reboot commands.

choice
	prompt "BOSSA bootloader variant"
	depends on BOOTLOADER_BOSSA

config BOOTLOADER_BOSSA_LEGACY
	bool "Legacy"
	help
	  Select the Legacy variant of the BOSSA bootloader.  This is defined
	  for compatibility mode only.  The recommendation is use newer
	  versions like Arduino or Adafruit UF2.

config BOOTLOADER_BOSSA_ARDUINO
	bool "Arduino"
	help
	  Select the Arduino variant of the BOSSA bootloader.  Uses 0x07738135
	  as the magic value to enter the bootloader.

config BOOTLOADER_BOSSA_ADAFRUIT_UF2
	bool "Adafruit UF2"
	help
	  Select the Adafruit UF2 variant of the BOSSA bootloader.  Uses
	  0xf01669ef as the magic value to enter the bootloader.

endchoice

endmenu

menu "Compatibility"

config COMPAT_INCLUDES
	bool "Suppress warnings when using header shims"
	default y
	help
	  Suppress any warnings from the pre-processor when including
	  deprecated header files.

endmenu

config LEGACY_INCLUDE_PATH
	bool "Allow for the legacy include paths (without the zephyr/ prefix)"
	default y
	help
	  Allow applications and libraries to use the Zephyr legacy include
	  path which does not use the zephyr/ prefix. For example, the
	  preferred way to include a Zephyr header is to use <zephyr/kernel.h>,
	  but enabling CONFIG_LEGACY_INCLUDE_PATH will allow developers to
	  use <kernel.h> instead. This (without the zephyr/ prefix) is
	  deprecated and should be avoided. Eventually, it will not be
	  supported.
