]> rtime.felk.cvut.cz Git - omk.git/blobdiff - snippets/nuttx-compile.omk
NuttX: allow to specify xxx_PROGBUILTIN_EXCLUDE list of user and or NuttX programs...
[omk.git] / snippets / nuttx-compile.omk
index 6276a79381b01eaf49c778bb55c9dafa8b0f0006..5538451a8dbe6de9f65e7a37f341418202191d56 100644 (file)
 # 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)
@@ -57,6 +61,8 @@ CFLAGS        += -Wall
 CFLAGS += -I$(SOURCES_DIR)
 CFLAGS += -I$(INCLUDE_DIR)
 
+ELF_FILE_LDSCRIPT?=$(wildcard $(NUTTX_EXPORT)/build/gnu-elf.ld)
+
 LOADLIBES += -L$(LIB_DIR)
 LOADLIBES += $(lib_LOADLIBES:%=-l%)
 
@@ -134,24 +140,37 @@ $(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 := $$(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_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) \
+       $$(filter-out $$($(1)_PROGBUILTIN_EXCLUDE:%=$(NUTTXREGISTRY)/%.pdat),\
+       $$(wildcard $(NUTTXREGISTRY)/*.pdat))
+$(1)_PROGBUILTIN_BDAT=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_REGISTRY_DIR)/%.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)_PROGBUILTIN_TMP = $$(wildcard $$(USER_COMPILED_DIR_NAME)/registry/*.pbi)
-$(1)_PROGBUILTIN_LIST = $$($(1)_PROGBUILTIN_TMP:$$(USER_COMPILED_DIR_NAME)/registry/%.pbi=%)
+$(1)_KMODBUILTIN_LIBS = $$(wildcard $$(KERN_MODULES_DIR)/lib*.ka)
 endif
 
-$(1)_PROGBUILTIN_PBI=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_COMPILED_DIR_NAME)/registry/%.pbi)
-$(1)_PROGBUILTIN_ldat=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_COMPILED_DIR_NAME)/registry/%.ldat)
-$(1)_PROGBUILTIN_PDAT=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_COMPILED_DIR_NAME)/registry/%.pdat) \
-       $$(wildcard $(NUTTXREGISTRY)/*.pdat)
-$(1)_PROGBUILTIN_BDAT=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_COMPILED_DIR_NAME)/registry/%.bdat) \
-       $$(wildcard $(NUTTXREGISTRY)/*.bdat)
 
 ifneq ($$($(1)_PROGBUILTIN_PDAT),)
 $(1)_BUILTINTABLE = $(OBJS_DIR)/$(1)-builtintab.c
@@ -166,10 +185,20 @@ $$($(1)_BUILTINTABLE): $$($(1)_PROGBUILTIN_PDAT) $$($(1)_PROGBUILTIN_BDAT)
        $(Q) echo "const int g_builtin_count = sizeof(g_builtins) / sizeof(g_builtins[0]);" >>$$@
 
 GEN_SOURCES += $$($(1)_BUILTINTABLE)
+
+$(1)_BUILTINWRAPMAIN = $(OBJS_DIR)/$(1)-builtinwrapmain.c
+
+$$($(1)_BUILTINWRAPMAIN):
+       $(Q) echo "#include <nuttx/config.h>" >$$@
+       $(Q) echo "#include <nuttx/compiler.h>" >>$$@
+       $(Q) echo "int main(int argc, FAR char *argv[]);" >>$$@
+       $(Q) echo "int weak_function $(1)_main(int argc, FAR char *argv[]) {return main(argc, argv);}" >>$$@
+
+GEN_SOURCES += $$($(1)_BUILTINWRAPMAIN)
+
 endif
 endif
 
-
 ifneq ($$(LD_SCRIPT$(3:%=-%)),)
 $(1)$(3:%=-%)_LD_SCRIPT_FN = $$(LD_SCRIPT$(3:%=-%))
 else
@@ -184,16 +213,15 @@ endif
 
 $(1)$(3:%=-%)_LDFLAGS = -Wl,-T,$$($(1)$(3:%=-%)_LD_SCRIPT)
 
-$(2)/$(1)$(3:%=-%): $$($(1)_OBJS) $$($(1)_BUILTINTABLE:%.c=%.o) $$($(1)_PROGBUILTIN_ldat) $$($(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)
        @$(QUIET_CMD_ECHO) "  LINK    $$@"
-       $(Q) if [ -n "$$($(1)_PROGBUILTIN_LIST)" ] ; then echo ; fi
        $(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)_PROGBUILTIN_PBI) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
-         $$(shell for i in $$($(1)_PROGBUILTIN_ldat); do cat $$$$i ; done) $$(NUTTXLIBES) \
+         $$($(1)_OBJS) $$($(1)_MOREOBJS) $$($(1)_BUILTINTABLE:%.c=%.o) $$($(1)_BUILTINWRAPMAIN:%.c=%.o) \
+         $$($(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
        @$(SED4OMK) -n -e 's|^LOAD \(.*\)$$$$|  \1  \&|p' $(OBJS_DIR)/$(1)$(3:%=-%).map|tr '&' '\134'  >>$(OBJS_DIR)/$(1)$(3:%=-%).exe.d
@@ -206,12 +234,12 @@ define ELF_template
 $(2)/$(1).elf: $$($(1)_OBJS)
        @$(QUIET_CMD_ECHO) "  ELF     $$@"
        $(Q) $(LINK) \
-         -r -e main -T $(NUTTX_EXPORT)/build/gnu-elf.ld \
+         -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
@@ -261,9 +289,11 @@ $(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 := $$(sort $$($(1)_OBJS:%/=%))
 
 SOURCES += $$($(1)_SOURCES)
+EMBEDROMFS += $$($(1)_EMBEDROMFS)
 
 $(LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
        @$(QUIET_CMD_ECHO) "  AR      $$@"
@@ -297,3 +327,24 @@ library-pass_HOOKS += force_builtin_library_hook
 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).o: $(2)
+       @$(QUIET_CMD_ECHO) "  ROMFS   $$@"
+       $(Q) $(LD) -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