nuttx-apps/system/nxinit/Kconfig
wangjianyu3 c8ffe2a5e1 system/nxinit: add CONFIG_SYSTEM_NXINIT_STDOUT for printf-based log output
Syslog may be output via services such as DFX. When debugging the init
component (e.g., service startup failures, including DFX-related
exceptions), syslog may not be output properly.

Add a debug Kconfig option SYSTEM_NXINIT_STDOUT that redirects all init
log macros (init_debug/info/warn/err) to printf instead of syslog.
This is useful for early boot debugging when syslog is not yet
available or serial console shows no output.

Introduce init_log_output() macro as the common log backend, selected
at compile time between printf (with appended newline) and syslog.

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
2026-09-15 09:17:06 -03:00

193 lines
5.1 KiB
Text

#
# 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
config SYSTEM_NXINIT_STDOUT
bool "Output log to stdout (printf)"
default n
---help---
Debug option: redirect all init logs to stdout via printf
instead of syslog. Useful when syslog is not available or
serial console has no output during early boot.
endif