From 9dfa1d0280c711c459a10d5e249141fdc9303dd4 Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Sat, 1 Apr 2023 00:46:04 +0200 Subject: [PATCH] NuttX: update rules for 12.0.0 release yet attempt to support old versions. The most of the NuttX specific logic is moved inside OMK rules. The user has to provide only NUTTX_EXPORT in config.target or at command line. Debugging and output formats list are another optional useful variables to choose by user. I.e. DEBUG ?= -g -ggdb OUTPUT_FORMATS = bin hex Signed-off-by: Pavel Pisa --- snippets/nuttx-compile.omk | 132 +++++++++++++++++++++++++++---------- snippets/nuttx-kernel.omk | 2 +- 2 files changed, 98 insertions(+), 36 deletions(-) diff --git a/snippets/nuttx-compile.omk b/snippets/nuttx-compile.omk index eb04b47..d8ffc6b 100644 --- a/snippets/nuttx-compile.omk +++ b/snippets/nuttx-compile.omk @@ -43,48 +43,108 @@ # create rules for compilation of a program, library and shared # library. The rules can use rules produced by COMPILE_xxx_template. +EMPTY := +LD_OPTION_SEP = $(EMPTY) $(EMPTY) + define COMPILER_DEFS_template +OBJ_EXT ?= $$(OBJEXT) +ifeq ($$(OBJ_EXT),) OBJ_EXT = .o +endif +LIB_EXT ?= $$(LIBEXT) +ifeq ($$(LIB_EXT),) LIB_EXT = .a +endif + LIB_PREF = lib ASM_EXT = .S -CC = $(CROSS_COMPILE)gcc -CXX = $(CROSS_COMPILE)g++ -LINK = $(CROSS_COMPILE)ld -LD = $(CROSS_COMPILE)ld -AR = $(CROSS_COMPILE)ar -OBJCOPY = $(CROSS_COMPILE)objcopy -NM = $(CROSS_COMPILE)nm +CC ?= $$(CROSS_COMPILE)gcc +CXX ?= $$(CROSS_COMPILE)g++ +LD ?= $$(CROSS_COMPILE)ld +ifneq ($$(filter -Wl%, $$(NXFLATLDFLAGS1)$$(NXFLATLDFLAGS2)$$(LDFLAGS)),) +CC_LD_OPTION = -Wl, +LD_OPTION_SEP := , +LD_BY_CC := 1 +LD_RAW ?= $$(CROSS_COMPILE)ld +endif +LD_RAW ?= $$(LD) +AR ?= $$(CROSS_COMPILE)ar +OBJCOPY ?= $$(CROSS_COMPILE)objcopy +NM ?= $$(CROSS_COMPILE)nm + +ifeq ($$(LDSTARTGROUP),) +LDSTARTGROUP = $$(CC_LD_OPTION)--start-group +LDENDGROUP = $$(CC_LD_OPTION)--end-group +endif -CFLAGS += $(TARGET_ARCH) $(DEBUG) $(OPTIMIZE) +NUTTXLIBES += $$(LDSTARTGROUP) $$(LDLIBS) $$(EXTRA_LIBS) $$(LDENDGROUP) +NUTTXREGISTRY += $$(NUTTX_EXPORT)/registry + +TARGET_ARCH += $$(ARCHCFLAGS) $$(ARCHCPUFLAGS) + +OPTIMIZE ?= $$(ARCHOPTIMIZATION) + +CFLAGS += $$(ARCHWARNINGS) +CXXFLAGS += $$(ARCHCXXFLAGS) +CXXFLAGS += $$(ARCHWARNINGSXX) +DEFAULT_INCLUDES = -isystem $$(NUTTX_EXPORT)/include +INCLUDES += + +CFLAGS += $$(TARGET_ARCH) $$(DEBUG) $$(OPTIMIZE) CFLAGS += -Wall -CFLAGS += -I$(SOURCES_DIR) -CFLAGS += -I$(INCLUDE_DIR) +CFLAGS += -I$$(SOURCES_DIR) +CFLAGS += -I$$(INCLUDE_DIR) + +LDFLAGS := $$(filter-out -Map=%, $$(LDFLAGS)) +LDFLAGS += -L"$(NUTTX_EXPORT)/libs" + +ifeq ($(word 2,$(AR)),) +ARFLAGS = rcs +else +ARFLAGS = +endif + +ifeq ($$(LDNAME),) +LDNAME := $$(LDSCRIPT) +endif + +LD_SCRIPT ?= $$(NUTTX_EXPORT)/scripts/$$(LDNAME) + +ifneq ($$(filter-out clean distclean, $$(MAKECMDGOALS)),) +ifeq ($(LDNAME),) +$$(error no LDNAME or LDSCRIPT is defined) +endif + +ifeq ($$(wildcard $$(LD_SCRIPT)),) +$$(error LD_SCRIPT='$$(LD_SCRIPT)' does not exists, correct config.target) +endif +endif -ELF_FILE_LDSCRIPT?=$(wildcard $(NUTTX_EXPORT)/scripts/gnu-elf.ld) +LD_SCRIPT = $$(NUTTX_EXPORT)/scripts/$$(LDNAME) -LOADLIBES += -L$(LIB_DIR) -LOADLIBES += $(lib_LOADLIBES:%=-l%) +ELF_FILE_LDSCRIPT?=$$(wildcard $$(NUTTX_EXPORT)/scripts/gnu-elf.ld) +LOADLIBES += -L$$(LIB_DIR) +LOADLIBES += $$(lib_LOADLIBES:%=-l%) --include $(OBJS_DIR)/*.d +-include $$(OBJS_DIR)/*.d -SOURCES2OBJS = .o/.c .o/.cc .o/.cxx .o/.S .o/.s .o/.o +SOURCES2OBJS = $$(OBJ_EXT)/.c $$(OBJ_EXT)/.cc $$(OBJ_EXT)/.cxx $$(OBJ_EXT)/.S $$(OBJ_EXT)/.s $$(OBJ_EXT)/$$(OBJ_EXT) SOURCES2OBJSLO = .lo/.c .lo/.cc .lo/.cxx .lo/.S .lo/.s .lo/.lo #%.lo: %.c # $(CC) -o $@ $(LCFLAGS) -c $< -c_o_COMPILE = $$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(OMK_CPPFLAGS) \ - $(CPPFLAGS) $(OMK_CFLAGS) $$(CFLAGS) +c_o_COMPILE = $$(CC) $$(DEFS) $$(DEFAULT_INCLUDES) $$(INCLUDES) $$(OMK_CPPFLAGS) \ + $$(CPPFLAGS) $$(OMK_CFLAGS) $$(CFLAGS) -cc_o_COMPILE = $$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(OMK_CPPFLAGS) \ - $(CPPFLAGS) $(CXXFLAGS) $(OMK_CFLAGS) $$(CFLAGS) +cc_o_COMPILE = $$(CXX) $$(DEFS) $$(DEFAULT_INCLUDES) $$(INCLUDES) $$(OMK_CPPFLAGS) \ + $$(CPPFLAGS) $$(CXXFLAGS) $$(OMK_CFLAGS) $$(CFLAGS) -S_o_COMPILE = $$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(CPPFLAGS) $(OMK_CFLAGS) $$(CFLAGS) $(ASFLAGS) +S_o_COMPILE = $$(CC) $(DEFS) $(DEFAULT_INCLUDES) $$(INCLUDES) \ + $$(CPPFLAGS) $$(OMK_CFLAGS) $$(CFLAGS) $$(ASFLAGS) # Check GCC version for user build @@ -141,7 +201,7 @@ $(foreach x, $(SOURCES2OBJS), $(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\ $$($(1)_SOURCES) $$($(1)_GEN_SOURCES))) ) -$(1)_OBJS += $$($(1)_EMBEDROMFS:%=%_img.o) +$(1)_OBJS += $$($(1)_EMBEDROMFS:%=%_img$$(OBJ_EXT)) $(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%)) SOURCES += $$($(1)_SOURCES) @@ -212,15 +272,17 @@ else $(1)$(3:%=-%)_LD_SCRIPT = $$($(1)$(3:%=-%)_LD_SCRIPT_FN) endif -$(1)$(3:%=-%)_LDFLAGS = -Wl,-T,$$($(1)$(3:%=-%)_LD_SCRIPT) +$(1)$(3:%=-%)_LDFLAGS = $$(CC_LD_OPTION)-T$$(LD_OPTION_SEP)$$($(1)$(3:%=-%)_LD_SCRIPT) -$(2)/$(1)$(3:%=-%): $$($(1)_OBJS) $$($(1)_BUILTINTABLE:%.c=%.o) $$($(1)_BUILTINWRAPMAIN:%.c=%.o) $$($(1)_PROGBUILTIN_LDAT) $$($(1)$(3:%=-%)_LD_SCRIPT) $$($(1)_KMODBUILTIN_LIBS) +$(2)/$(1)$(3:%=-%): $$($(1)_OBJS) $$($(1)_BUILTINTABLE:%.c=%$$(OBJ_EXT)) $$($(1)_BUILTINWRAPMAIN:%.c=%$$(OBJ_EXT)) $$($(1)_PROGBUILTIN_LDAT) $$($(1)$(3:%=-%)_LD_SCRIPT) $$($(1)_KMODBUILTIN_LIBS) @$(QUIET_CMD_ECHO) " LINK $$@" - $(Q) $$(if $$(filter %.cc,$$($(1)_SOURCES)) , \ - $$(CXX) $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CXXFLAGS) $$(CXXFLAGS) , \ - $$(CC) $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CFLAGS) $$(CFLAGS) ) \ - $$(OMK_LDFLAGS) $$(LDFLAGS) $$($(1)$(3:%=-%)_LDFLAGS) -Wl,-Map,$(1)$(3:%=-%).map \ - $$($(1)_OBJS) $$($(1)_MOREOBJS) $$($(1)_BUILTINTABLE:%.c=%.o) $$($(1)_BUILTINWRAPMAIN:%.c=%.o) \ + $(Q) $$(if $$(LD_BY_CC) , $$(if $$(filter %.cc,$$($(1)_SOURCES)) , \ + $$(CXX) $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CXXFLAGS) $$(CXXFLAGS) , \ + $$(CC) $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CFLAGS) $$(CFLAGS) ) , \ + $$(LD) \ + ) \ + $$(OMK_LDFLAGS) $$(LDFLAGS) $$($(1)$(3:%=-%)_LDFLAGS) $$(CC_LD_OPTION)-Map$$(LD_OPTION_SEP)$(1)$(3:%=-%).map \ + $$($(1)_OBJS) $$($(1)_MOREOBJS) $$($(1)_BUILTINTABLE:%.c=%$$(OBJ_EXT)) $$($(1)_BUILTINWRAPMAIN:%.c=%$$(OBJ_EXT)) \ $$($(1)_PROGBUILTIN_PBI) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) $$($(1)_KMODBUILTIN_LIBS) \ $$(shell for i in $$($(1)_PROGBUILTIN_LDAT); do cat $$$$i ; done) $$(NUTTXLIBES) \ -o $$@ @@ -234,7 +296,7 @@ define ELF_template $(2)/$(1).elf: $$($(1)_OBJS) @$(QUIET_CMD_ECHO) " ELF $$@" - $(Q) $(LINK) \ + $(Q) $(LD_RAW) \ -r -e main -T $(ELF_FILE_LDSCRIPT) \ -Map $(1).elf.map \ $$($(1)_OBJS) $$($(1)_MOREOBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \ @@ -253,7 +315,7 @@ $(1)_STACKSIZE ?= 2048 $(2)/$(1).pbi: $$($(1)_OBJS) @$(QUIET_CMD_ECHO) " PROGMOD $$@" - $(Q) $(LINK) \ + $(Q) $(LD_RAW) \ -r -x --defsym=$(1)_main=main \ -Map $(1).pbi.map \ $$($(1)_OBJS) $$($(1)_MOREOBJS) \ @@ -290,15 +352,15 @@ $(foreach x, $(SOURCES2OBJS), $(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\ $$($(1)_SOURCES) $$($(1)_GEN_SOURCES))) ) -$(1)_OBJS += $$($(1)_EMBEDROMFS:%=%_img.o) +$(1)_OBJS += $$($(1)_EMBEDROMFS:%=%_img$$(OBJ_EXT)) $(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%)) SOURCES += $$($(1)_SOURCES) EMBEDROMFS += $$($(1)_EMBEDROMFS) -$(LIB_DIR)/lib$(1).a: $$($(1)_OBJS) +$(LIB_DIR)/lib$(1)$$(LIB_EXT): $$($(1)_OBJS) @$(QUIET_CMD_ECHO) " AR $$@" - $(Q) $(AR) rcs $$@ $$^ + $(Q) $(AR) $(ARFLAGS) $$@ $$^ endef @@ -338,7 +400,7 @@ $(2): $(Q) genromfs -f $(2).tmp -V $(1) -d $(3) $(Q) if ( [ ! -e $(2) ] || ! cmp -s $(2).tmp $(2) ) ; then cp $(2).tmp $(2) ; fi -$(2).o: $(2) +$(2)$$(OBJ_EXT): $(2) @$(QUIET_CMD_ECHO) " ROMFS $$@" $(Q) $(LD) -r --accept-unknown-input-arch -b binary \ --defsym=$(2)_size=_binary_$(2)_size \ diff --git a/snippets/nuttx-kernel.omk b/snippets/nuttx-kernel.omk index ed2370f..81eb163 100644 --- a/snippets/nuttx-kernel.omk +++ b/snippets/nuttx-kernel.omk @@ -69,7 +69,7 @@ KERN_SOURCES += $$($(1)_SOURCES) $(2)/$(1)$(KERN_LINK_SUFFIX): $$($(1)_OBJS) @$(QUIET_CMD_ECHO) " LD [K] $$@" - $(Q) $(LINK) \ + $(Q) $(LD_RAW) \ -r -e module_initialize -T $(ELF_FILE_LDSCRIPT) \ -Map $(1)$(KERN_LINK_SUFFIX).map \ $$($(1)_OBJS) $$($(1)_MOREOBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \ -- 2.39.2