# Copyright (c) 2021 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

menu "Misc"

config LOG_CMDS
	bool "Shell commands"
	depends on SHELL
	depends on !LOG_MODE_MINIMAL

config LOG_TEST_CLEAR_MESSAGE_SPACE
	bool "Clear message after allocation"
	default y
	depends on ZTEST
	help
	  Used in testing to simplify message comparision if message contains
	  paddings.

config LOG_USE_VLA
	bool "Using variable length arrays"
	default y if !MISRA_SANE
	help
	  Using VLA slightly decreases stack usage in some cases it may not be
	  supported. Note that VLA are used for arrays which size is resolved at
	  compile time so at runtime arrays have fixed size.

config LOG_SIMPLE_MSG_OPTIMIZE
	bool "Optimize simple messages for size"
	depends on !64BIT && !CBPRINTF_PACKAGE_HEADER_STORE_CREATION_FLAGS
	default y
	help
	  Dedicated code for handling simple log messages (0-2 32 bit word arguments).
	  Approximately, 70%-80% log messages in the application fit into that category.
	  Depending on the architecture code size reduction is from 0-40% (highest seen on
	  RISCV32) and execution time also up to 40%.

config LOG_ALWAYS_RUNTIME
	bool "Always use runtime message creation (v2)"
	default y if NO_OPTIMIZATIONS
	default y if LOG_MODE_IMMEDIATE
	default y if "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "xcc"
	help
	  If enabled, runtime method is always used for message creation. Static
	  creation relies on compiler being able to optimize and remove code
	  based on information known at compile time. Runtime only approach must
	  be used when optimization is disabled because some compilers
	  (seen on arm_cortex_m and x86) were using unrealistic amount of stack
	  for dead code. It is also required in immediate mode since it requires
	  less stack than static message creation and speed has lower priority
	  in that mode.

config LOG_FMT_SECTION
	bool "Keep log strings in dedicated section"
	help
	  When enabled, logs are kept in dedicated memory section. It allows
	  removing strings from final binary and should be used for dictionary
	  logging.

config LOG_FMT_SECTION_STRIP
	bool "Strip log strings from binary"
	depends on LOG_DICTIONARY_DB
	depends on LOG_FMT_SECTION
	depends on LINKER_DEVNULL_SUPPORT
	depends on !LOG_ALWAYS_RUNTIME
	depends on !LOG_OUTPUT
	imply LINKER_DEVNULL_MEMORY
	imply LOG_FMT_STRING_VALIDATE

config LOG_FMT_STRING_VALIDATE
	bool "Validate logging strings"
	help
	  Logging strings cannot use %p with character pointers. They should be
	  casted to the pointer of another type (e.g. void *). With this feature
	  enabled, at compile time, the preprocessor detects strings with %p
	  without casting and reports an error at runtime.

config LOG_USE_TAGGED_ARGUMENTS
	bool "Using tagged arguments for packaging"
	depends on !PICOLIBC
	select CBPRINTF_PACKAGE_SUPPORT_TAGGED_ARGUMENTS
	select LOG_ALWAYS_RUNTIME
	help
	  If enabled, packaging uses tagged arguments.

config LOG_MEM_UTILIZATION
	bool "Tracking maximum memory utilization"
	depends on LOG_MODE_DEFERRED
	default y if LOG_CMDS
	help
	  When enabled, maximum usage of memory used for log messages in deferred
	  mode is tracked. It can be used to trim LOG_BUFFER_SIZE.

config LOG_DICTIONARY_DB
	bool

config LOG_DICTIONARY_DB_TARGET
	bool "Only generated log dictionary database from target"
	depends on LOG_DICTIONARY_DB
	help
	  Enable this option to make generating the log dictionary database
	  only done by its own build target.
	  This removes the target from the ALL make target and the target
	  'log_dict_db_gen' has to be called in addition.

config LOG_MSG_APPEND_RO_STRING_LOC
	bool
	help
	  Enable this option to force log messages to always append location of
	  read-only string arguments in the package. This should be selected by
	  backends if required.

config LOG_FAILURE_REPORT_PERIOD
	int "Failure report period (in milliseconds)"
	default 1000
	depends on LOG_MODE_DEFERRED
	help
	  Determines how often failures are reported. Report contains number
	  of dropped messages. It may contain additional information depending
	  on the mode.

config LOG_DOMAIN_NAME
	string "Domain name"
	default ""

if LOG_MULTIDOMAIN

config LOG_REMOTE_DOMAIN_MAX_COUNT
	int "Maximum number of link domains"
	default 4
	help
	  Number of domains that can be handled by a link

endif
endmenu
