# 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_FRONTEND_ONLY && !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_SUPPORT
	depends on LOG_FMT_SECTION
	depends on LINKER_DEVNULL_SUPPORT
	depends on !LOG_ALWAYS_RUNTIME
	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
