#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

config SYSTEM_NXINIT
	tristate "NuttX Init"
	default n
	depends on EXPERIMENTAL
	depends on LIBC_EXECFUNCS
	depends on SCHED_CHILD_STATUS
	---help---
		Enable NxInit(NuttX Init) component for system initialization.
		The script of NxInit(init.rc) is compatible with the Android Init Language syntax.

if SYSTEM_NXINIT

comment "NXInit Basic"

config SYSTEM_NXINIT_PRIORITY
	int "Thread priority"
	default 100

config SYSTEM_NXINIT_STACKSIZE
	int "Stack size"
	default DEFAULT_TASK_STACKSIZE

config SYSTEM_NXINIT_PROGNAME
	string "Program name"
	default "init"

comment "NXInit Run Control(RC)"

config SYSTEM_NXINIT_RC_FILE_PATH
	string "Path to RC file"
	default "/etc/init.d/init.rc"
	---help---
		Path to the init.rc file to use for NXInit's boot logic.

config SYSTEM_NXINIT_RC_LINE_MAX
	int "Max line length of RC file"
	default 128
	range 64 4096
	---help---
		Maximum line length of RC file.
		More details: https://android.googlesource.com/platform/system/core/+/master/init/README.md

comment "NXInit Action"

config SYSTEM_NXINIT_ACTION_CMD_ARGS_MAX
	int "Max number of command arguments"
	default 8
	---help---
		Maximum number of command arguments.
		Form:
		```
		on <event> [&& <event>]*
		   <command>
		   <command>
		   <command>
		   ...
		```

config SYSTEM_NXINIT_ACTION_WARN_SLOW
	int "Slow command warning timeout"
	default 50
	depends on SYSTEM_NXINIT_WARN
	---help---
		Warning if command took more than `SYSTEM_NXINIT_ACTION_WARN_SLOW` ms.

config SYSTEM_NXINIT_ACTION_EVENTS_MAX
	int "Max number of events"
	default 2
	range 1 64
	---help---
		Maximum number of event and action events.
		See action.h:
		```
		struct action_s
		{
		  ...
		  struct action_event_s events[CONFIG_SYSTEM_NXINIT_ACTION_EVENTS_MAX];
		  ...
		};
		```
config SYSTEM_NXINIT_FINALINIT
	bool "Enable NXInit final event"
	default n
	---help---
		Enable support to run the "final" event. Currently only "boot",
		and "init" event are enabled by default, where "netinit" and
		"final" are optional.

comment "NXInit Service"

config SYSTEM_NXINIT_SERVICE_ARGS_MAX
	int "Max number of service arguments"
	default 16
	range 3 64
	---help---
		Maximum number of service arguments,
		including "name", "pathname" and key word "service"(at least 3). Form:
		```
		service <name> <pathname> [ <argument> ]*
		   <option>
		   <option>
		   ...
		```

config SYSTEM_NXINIT_SERVICE_RESTART_PERIOD
	int "Service restart period in ms"
	default 5000

config SYSTEM_NXINIT_CONSOLE_DEV
	string "Default console device of a service"
	default "/dev/console"
	---help---
		The device used as stdin/stdout/stderr of a service declared with the
		option "console" and no explicit device, i.e. "console" rather than
		"console <device>".

		This is needed by services which expect a controlling terminal but do
		not open one themselves (e.g. plain "sh"), and is the only way to get
		a console when the console device is not available at the time the
		file descriptors of the idle task are set up, as is the case for a USB
		gadget console.

comment "NXInit Testing"

config SYSTEM_NXINIT_TEST
	bool "NxInit unit tests"
	default n
	depends on TESTING_CMOCKA
	---help---
		Enable cmocka-based unit tests covering NxInit's argument/config
		parser, action event matching, and service conflict detection.
		Builds a separate "nxinit_unit_test" program. Under the CMake
		build the test sources compile into a dedicated target and the
		"init" program is unaffected; under the Make build the test
		sources are appended to the shared CSRCS list, so they are also
		linked into "init", enlarging it and pulling in the cmocka
		dependency. Keep this disabled for production Make builds.

if SYSTEM_NXINIT_TEST

config SYSTEM_NXINIT_TEST_PRIORITY
	int "Test task priority"
	default 100

config SYSTEM_NXINIT_TEST_STACKSIZE
	int "Test task stack size"
	default 8192
	---help---
		Several of the parser test cases build multi-hundred-byte
		buffers on the stack (e.g. lines several times
		CONFIG_SYSTEM_NXINIT_RC_LINE_MAX long) on top of cmocka's own
		framework overhead. On at least one real embedded target this
		overflowed the default DEFAULT_TASK_STACKSIZE (2048) silently
		(no crash dump, no watchdog reset, the test task just stopped
		producing output), which is far harder to diagnose than an
		outright test failure. 8192 has been verified to run all test
		cases cleanly on that target; lower it back down only if you
		have confirmed your target's stack usage stays within bounds.

endif # SYSTEM_NXINIT_TEST

comment "NXInit Log level"

config SYSTEM_NXINIT_ERR
	bool "Enable error log"
	default !DEFAULT_SMALL

config SYSTEM_NXINIT_WARN
	bool "Enable warning log"
	depends on SYSTEM_NXINIT_ERR

config SYSTEM_NXINIT_INFO
	bool "Enable info log"
	depends on SYSTEM_NXINIT_WARN

config SYSTEM_NXINIT_DEBUG
	bool "Enable debug log"
	depends on SYSTEM_NXINIT_INFO

endif
