# TARGET_ARCH, DEBUG, OPTIMIZE, DEFS - forms CFLAGS
# from base: SOURCES_DIR
# from Makefile.omk: lib_LOADLIBES
+# xxx_PROGBUILTIN - list of builtin programs linked into final system image
+# when "all" is used then all programs provided by build are linked
+# xxx_PROGBUILTIN_EXCLUDE - list of builtin user or NuttX provided programs which are excluded
+# xxx_KMODBUILTIN - list of builtin programs linked into final system image
# Output variables:
# SOURCES - all the source files that needs to be compiled (except for shared library sources)
# 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
-AR = $(CROSS_COMPILE)ar
-OBJCOPY = $(CROSS_COMPILE)objcopy
-NM = $(CROSS_COMPILE)nm
+CROSS_COMPILE ?= $$(CROSSDEV)
+
+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
+
+NUTTXLIBES += $$(LDSTARTGROUP) $$(LDLIBS) $$(EXTRA_LIBS) $$(LDENDGROUP)
+NUTTXREGISTRY += $$(NUTTX_EXPORT)/registry
+
+TARGET_ARCH += $$(ARCHCFLAGS) $$(ARCHCPUFLAGS)
-CFLAGS += $(TARGET_ARCH) $(DEBUG) $(OPTIMIZE)
+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
-LOADLIBES += -L$(LIB_DIR)
-LOADLIBES += $(lib_LOADLIBES:%=-l%)
+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
+
+LD_SCRIPT = $$(NUTTX_EXPORT)/scripts/$$(LDNAME)
--include $(OBJS_DIR)/*.d
+ELF_FILE_LDSCRIPT?=$$(wildcard $$(NUTTX_EXPORT)/scripts/gnu-elf.ld)
-SOURCES2OBJS = .o/.c .o/.cc .o/.cxx .o/.S .o/.s .o/.o
+LOADLIBES += -L$$(LIB_DIR)
+LOADLIBES += $$(lib_LOADLIBES:%=-l%)
+
+-include $$(OBJS_DIR)/*.d
+
+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
$(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
$$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
)
+$(1)_OBJS += $$($(1)_EMBEDROMFS:%=%_img$$(OBJ_EXT))
$(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%))
SOURCES += $$($(1)_SOURCES)
+EMBEDROMFS += $$($(1)_EMBEDROMFS)
ifneq ($$($(1)_PROGBUILTIN),)
ifneq ($$($(1)_PROGBUILTIN),all)
-$(1)_PROGBUILTIN_LIST = $$($(1)_PROGBUILTIN)
+$(1)_PROGBUILTIN_TMP = $$($(1)_PROGBUILTIN)
else
-$(1)_PROGBUILTIN_TMP = $$(wildcard $$(USER_REGISTRY_DIR)/*.pbi)
-$(1)_PROGBUILTIN_LIST = $$($(1)_PROGBUILTIN_TMP:$$(USER_REGISTRY_DIR)/%.pbi=%)
+$(1)_PROGBUILTIN_TMP1 = $$(wildcard $$(USER_REGISTRY_DIR)/*.pbi)
+$(1)_PROGBUILTIN_TMP = $$($(1)_PROGBUILTIN_TMP1:$$(USER_REGISTRY_DIR)/%.pbi=%)
endif
+$(1)_PROGBUILTIN_LIST = $$(filter-out $$($(1)_PROGBUILTIN_EXCLUDE),$$($(1)_PROGBUILTIN_TMP))
$(1)_PROGBUILTIN_OTHER=$$(filter-out $(1),$$($(1)_PROGBUILTIN_LIST))
$(1)_PROGBUILTIN_PBI=$$($(1)_PROGBUILTIN_OTHER:%=$$(USER_REGISTRY_DIR)/%.pbi)
$(1)_PROGBUILTIN_LDAT=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_REGISTRY_DIR)/%.ldat)
$(1)_PROGBUILTIN_PDAT=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_REGISTRY_DIR)/%.pdat) \
- $$(wildcard $(NUTTXREGISTRY)/*.pdat)
+ $$(filter-out $$($(1)_PROGBUILTIN_EXCLUDE:%=$(NUTTXREGISTRY)/%.pdat),\
+ $$(wildcard $(NUTTXREGISTRY)/*.pdat))
$(1)_PROGBUILTIN_BDAT=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_REGISTRY_DIR)/%.bdat) \
- $$(wildcard $(NUTTXREGISTRY)/*.bdat)
+ $$(filter-out $$($(1)_PROGBUILTIN_EXCLUDE:%=$(NUTTXREGISTRY)/%.bdat),\
+ $$(wildcard $(NUTTXREGISTRY)/*.bdat))
+
+ifneq ($$($(1)_KMODBUILTIN),all)
+$(1)_KMODBUILTIN_LIBS = $$($(1)_KMODBUILTIN:%=$$(KERN_MODULES_DIR)/lib%.ka)
+else
+$(1)_KMODBUILTIN_LIBS = $$(wildcard $$(KERN_MODULES_DIR)/lib*.ka)
+endif
+
ifneq ($$($(1)_PROGBUILTIN_PDAT),)
$(1)_BUILTINTABLE = $(OBJS_DIR)/$(1)-builtintab.c
$(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)
+$(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) \
- $$($(1)_PROGBUILTIN_PBI) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
+ $(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 $$@
@echo "$(2)/$(1)$(3:%=-%): \\" >$(OBJS_DIR)/$(1)$(3:%=-%).exe.d
$(2)/$(1).elf: $$($(1)_OBJS)
@$(QUIET_CMD_ECHO) " ELF $$@"
- $(Q) $(LINK) \
- -r -e main -T $(NUTTX_EXPORT)/build/gnu-elf.ld \
+ $(Q) $(LD_RAW) \
+ -r -e main -T $(ELF_FILE_LDSCRIPT) \
-Map $(1).elf.map \
$$($(1)_OBJS) $$($(1)_MOREOBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
-o $$@
@echo "$(2)/$(1).elf: \\" >$(OBJS_DIR)/$(1).elf.d
- @echo " $(NUTTX_EXPORT)/build/gnu-elf.ld \\" >>$(OBJS_DIR)/$(1).elf.d
+ @echo " $(ELF_FILE_LDSCRIPT) \\" >>$(OBJS_DIR)/$(1).elf.d
@$(SED4OMK) -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $(OBJS_DIR)/$(1).elf.map|tr '&' '\134' >>$(OBJS_DIR)/$(1).elf.d
@echo >>$(OBJS_DIR)/$(1).elf.d
endef
$(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) \
$(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
$$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
)
+$(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
$(LIB_DIR)/lib$(1).so: $$($(1)_OBJSLO)
@$(QUIET_CMD_ECHO) " LINK $$@"
- $(Q) $(LD) --shared --soname=lib$(1).so -o $$@ $$^
+ $(Q) $(LD_RAW) --shared --soname=lib$(1).so -o $$@ $$^
endef
ifneq ($(bin_PROGRAMS),)
force_builtin_library_hook:
endif
+
+# Syntax: $(call ROMFS_template,<filename>,<filename2>,<directory>) FIXME: Is this correct?
+define ROMFS_template
+
+.PHONY: $(2)
+
+$(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)$$(OBJ_EXT): $(2)
+ @$(QUIET_CMD_ECHO) " ROMFS $$@"
+ $(Q) $(LD_RAW) -r --accept-unknown-input-arch -b binary \
+ --defsym=$(2)_size=_binary_$(2)_size \
+ --defsym=$(2)_start=_binary_$(2)_start \
+ --defsym=$(2)_end=_binary_$(2)_end \
+ -o $$@.tmp $$^
+ $(Q) $(OBJCOPY) --rename-section .data=.rodata,alloc,load,readonly,data,contents \
+ $$@.tmp $$@
+
+endef