From 0ee60c7d9cf44e687f5847308259dc9bc7fd0e69 Mon Sep 17 00:00:00 2001 From: Ansh Rai Date: Thu, 16 Jul 2026 20:17:06 +0000 Subject: [PATCH] apps: Sanitize PROGNAME for _main symbol generation Program names containing '-' (e.g. renaming hello to hello-world via PROGNAME) previously generated an invalid identifier _main when constructing internal entry-point symbols. This caused build failures for C/C++ applications due to invalid identifiers in compiler definitions and generated builtin_proto.h. Introduce PROGSYM, a sanitized copy of PROGNAME with '-' replaced by '_', and use it wherever an internal C/Zig identifier is constructed (the -Dmain= defines, the Zig RENAMEMAIN rule, and the REGISTER call's entry-point argument). Preserve the original PROGNAME for the registered NSH command name and builtin registry entry, where hyphens are valid and expected. The Zig RENAMEMAIN path is also updated to use PROGSYM for consistency. The current hello_zig and leds_zig examples do not exercise this path, since neither uses a literal 'fn main' entry point, but the change keeps symbol generation consistent for future Zig applications. Testing (WSL2 Ubuntu, x86_64, sim:nsh): - CONFIG_EXAMPLES_HELLO_PROGNAME="hello-world": clean build, 'hello-world' runs and prints 'Hello, World!!' - Reverted to default PROGNAME="hello": clean build, no regression - Confirmed by inspection that RENAMEMAIN's sed substitution does not fire on either current .zig source (generated _tmp.zig is byte-identical to the source) Fixes #19447 Signed-off-by: Ansh Rai --- Application.mk | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Application.mk b/Application.mk index 1b6eab63eab..5cba93f3dba 100644 --- a/Application.mk +++ b/Application.mk @@ -122,6 +122,7 @@ ifneq ($(strip $(PROGNAME)),) NLIST := $(shell seq 1 $(words $(PROGNAME))) $(foreach i, $(NLIST), \ $(eval PROGNAME_$(word $i,$(PROGOBJ)) := $(word $i,$(PROGNAME))) \ + $(eval PROGSYM_$(word $i,$(PROGOBJ)) := $(subst -,_,$(word $i,$(PROGNAME)))) \ $(eval PROGOBJ_$(word $i,$(PROGLIST)) := $(word $i,$(PROGOBJ))) \ $(eval PRIORITY_$(word $i,$(REGLIST)) := \ $(if $(word $i,$(PRIORITY)),$(word $i,$(PRIORITY)),$(lastword $(PRIORITY)))) \ @@ -223,7 +224,7 @@ endef # rename "main()" in $1 to "xxx_main()" and save to $2 define RENAMEMAIN $(ECHO_BEGIN)"Rename main() in $1 and save to $2" - $(Q) ${shell cat $1 | sed -e "s/fn[ ]\+main/fn $(addsuffix _main,$(PROGNAME_$@))/" > $2} + $(Q) ${shell cat $1 | sed -e "s/fn[ ]\+main/fn $(addsuffix _main,$(PROGSYM_$@))/" > $2} $(ECHO_END) endef @@ -319,14 +320,14 @@ install:: $(PROGLIST) else $(MAINCXXOBJ): $(PREFIX)%$(CXXEXT)$(SUFFIX)$(OBJEXT): %$(CXXEXT) - $(eval $<_CXXFLAGS += ${shell $(DEFINE) "$(CXX)" main=$(addsuffix _main,$(PROGNAME_$@))}) - $(eval $<_CXXELFFLAGS += ${shell $(DEFINE) "$(CXX)" main=$(addsuffix _main,$(PROGNAME_$@))}) + $(eval $<_CXXFLAGS += ${shell $(DEFINE) "$(CXX)" main=$(addsuffix _main,$(PROGSYM_$@))}) + $(eval $<_CXXELFFLAGS += ${shell $(DEFINE) "$(CXX)" main=$(addsuffix _main,$(PROGSYM_$@))}) $(if $(and $(CONFIG_MODULES),$(MODCXXFLAGS)), \ $(call ELFCOMPILEXX, $<, $@), $(call COMPILEXX, $<, $@)) $(MAINCOBJ): $(PREFIX)%.c$(SUFFIX)$(OBJEXT): %.c - $(eval $<_CFLAGS += ${DEFINE_PREFIX}main=$(addsuffix _main,$(PROGNAME_$@))) - $(eval $<_CELFFLAGS += ${DEFINE_PREFIX}main=$(addsuffix _main,$(PROGNAME_$@))) + $(eval $<_CFLAGS += ${DEFINE_PREFIX}main=$(addsuffix _main,$(PROGSYM_$@))) + $(eval $<_CELFFLAGS += ${DEFINE_PREFIX}main=$(addsuffix _main,$(PROGSYM_$@))) $(if $(and $(CONFIG_MODULES),$(MODCFLAGS)), \ $(call ELFCOMPILE, $<, $@), $(call COMPILE, $<, $@)) @@ -362,10 +363,11 @@ ifeq ($(DO_REGISTRATION),y) $(REGLIST): $(DEPCONFIG) Makefile $(eval PROGNAME_$@ := $(basename $(notdir $@))) + $(eval PROGSYM_$@ := $(subst -,_,$(PROGNAME_$@))) ifeq ($(CONFIG_SCHED_USER_IDENTITY),y) - $(call REGISTER,$(PROGNAME_$@),$(PRIORITY_$@),$(STACKSIZE_$@),$(if $(BUILD_MODULE),,$(PROGNAME_$@)_main),$(UID_$@),$(GID_$@),$(MODE_$@)) + $(call REGISTER,$(PROGNAME_$@),$(PRIORITY_$@),$(STACKSIZE_$@),$(if $(BUILD_MODULE),,$(PROGSYM_$@)_main),$(UID_$@),$(GID_$@),$(MODE_$@)) else - $(call REGISTER,$(PROGNAME_$@),$(PRIORITY_$@),$(STACKSIZE_$@),$(if $(BUILD_MODULE),,$(PROGNAME_$@)_main)) + $(call REGISTER,$(PROGNAME_$@),$(PRIORITY_$@),$(STACKSIZE_$@),$(if $(BUILD_MODULE),,$(PROGSYM_$@)_main)) endif register:: $(REGLIST)