]> rtime.felk.cvut.cz Git - omk.git/commitdiff
NuttX: support kernel modules linked directly into system image.
authorPavel Pisa <ppisa@pikron.com>
Wed, 11 Sep 2019 08:45:43 +0000 (10:45 +0200)
committerPavel Pisa <ppisa@pikron.com>
Wed, 11 Sep 2019 08:45:43 +0000 (10:45 +0200)
The module entry module_initialize is renamed
to <module_name>_module_initialize and module objects are
packed into library archive. Kernel libraries and modules
can be linked into target system image by specifying
<progname>_KMODBUILTIN define.

Signed-off-by: Pavel Pisa <ppisa@pikron.com>
snippets/nuttx-bin.omk
snippets/nuttx-compile.omk
snippets/nuttx-kernel.omk

index 516efb8d56d2a891ec200f33cd11c2c5f0907229..9e3c156ca7863b6a68132ff0f0d81698418c4dd5 100644 (file)
@@ -16,10 +16,10 @@ USER_REGISTRY_DIR = $(USER_COMPILED_DIR_NAME)/registry
 
 # Use same output directories for kernel modules as for user
 KERN_INCLUDE_DIR := $(USER_INCLUDE_DIR)
-KERN_LIB_DIR     := $(USER_LIB_DIR)
 KERN_MODULES_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/modules
-KERN_BUILD_DIR   := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/kern
-KERN_LINK_SUFFIX := .elf
+KERN_LIB_DIR     := $(KERN_MODULES_DIR)
+KERN_BUILD_DIR   := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)
+KERN_LINK_SUFFIX := .klm
 
 $(eval $(call include-pass-template,$(KERN_INCLUDE_DIR),kernel))
 
@@ -29,11 +29,11 @@ $(foreach lib,$(kernel_LIBRARIES),$(eval $(call LIBRARY_kern_template,$(lib))))
 
 KERN_SOURCES := $(sort $(KERN_SOURCES))
 
-$(foreach src,$(filter %.c,$(KERN_SOURCES)),$(eval $(call COMPILE_c_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.o),)))
-$(foreach src,$(filter %.cc,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.o),)))
-$(foreach src,$(filter %.cxx,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.o),)))
-$(foreach src,$(filter %.cpp,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cpp=%.o),)))
-$(foreach src,$(filter %.S,$(KERN_SOURCES)),$(eval $(call COMPILE_S_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.S=%.o),)))
+$(foreach src,$(filter %.c,$(KERN_SOURCES)),$(eval $(call COMPILE_c_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.ko),)))
+$(foreach src,$(filter %.cc,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.ko),)))
+$(foreach src,$(filter %.cxx,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.ko),)))
+$(foreach src,$(filter %.cpp,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cpp=%.ko),)))
+$(foreach src,$(filter %.S,$(KERN_SOURCES)),$(eval $(call COMPILE_S_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.S=%.ko),)))
 
 check-dir::
        @$(call mkdir_def,$(USER_REGISTRY_DIR))
@@ -43,15 +43,15 @@ check-dir::
 $(foreach prog,$(bin_PROGRAMS),$(eval $(call ELF_template,$(prog),$(USER_BIN_DIR))))
 $(foreach prog,$(test_PROGRAMS),$(eval $(call ELF_template,$(prog),$(USER_TESTS_DIR))))
 
-binary-pass-local:  $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%.elf) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%$(KERN_LINK_SUFFIX))
+binary-pass-local:  $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%.elf) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%.elf)
 
-binary-pass-local:  $(kernel_MODULES:%=$(KERN_MODULES_DIR)/%$(KERN_LINK_SUFFIX))
+binary-pass-local:  $(kernel_MODULES:%=$(KERN_MODULES_DIR)/%$(KERN_LINK_SUFFIX)) $(kernel_MODULES:%=$(KERN_MODULES_DIR)/lib%.ka)
 
 $(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGBUILTIN_template,$(prog),$(USER_REGISTRY_DIR),$(USER_REGISTRY_DIR))))
 
 library-pass-local:  $(bin_PROGRAMS:%=$(USER_REGISTRY_DIR)/%.pbi)
 
-library-pass-local: $(kernel_LIBRARIES:%=$(KERN_LIB_DIR)/lib%.a)
+library-pass-local: $(kernel_LIBRARIES:%=$(KERN_LIB_DIR)/lib%.ka)
 
 clean-local::
        $(Q)rm -f $(bin_PROGRAMS:%=$(USER_REGISTRY_DIR)/%.*)
index c76d41852f4eb5f88aa01780b38beb23b05f3fa9..f4a1d15509b67008bd87c750831a44c2fa7edcc1 100644 (file)
@@ -18,6 +18,8 @@
 # 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
+# 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)
@@ -154,6 +156,12 @@ $(1)_PROGBUILTIN_PDAT=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_REGISTRY_DIR)/%.pdat) \
 $(1)_PROGBUILTIN_BDAT=$$($(1)_PROGBUILTIN_LIST:%=$$(USER_REGISTRY_DIR)/%.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
 
@@ -195,14 +203,14 @@ endif
 
 $(1)$(3:%=-%)_LDFLAGS = -Wl,-T,$$($(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=%.o) $$($(1)_BUILTINWRAPMAIN:%.c=%.o) $$($(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%) \
+         $$($(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
index dff7e1aec419cd66426e57f7476741a2cb4ea2cb..07b3eec961b6f422bdbb7d307102c6ec96cab85f 100644 (file)
@@ -1,5 +1,7 @@
 KERN_MQ=\"
-KERN_AR = $(CROSS_COMPILE)ar
+KERN_AR = $(AR)
+KERN_OBJCOPY = $(OBJCOPY)
+KERN_SOURCES2OBJS = .ko/.c .ko/.cc .ko/.cxx .ko/.S .ko/.s .ko/.ko
 
 c_o_kern_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(OMK_CPPFLAGS) \
        $(CPPFLAGS) $(OMK_CFLAGS) $(CFLAGS)
@@ -54,8 +56,9 @@ endef
 
 
 
+# Syntax: $(call MODULE_kern_template,<module-name>,<dir>
 define MODULE_kern_template
-$(foreach x, $(SOURCES2OBJS),
+$(foreach x, $(KERN_SOURCES2OBJS),
 $(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
                $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
 )
@@ -75,10 +78,16 @@ $(2)/$(1)$(KERN_LINK_SUFFIX): $$($(1)_OBJS)
        @echo "  $(NUTTX_EXPORT)/build/gnu-elf.ld \\" >>$(OBJS_DIR)/$(1)$(KERN_LINK_SUFFIX).d
        @$(SED4OMK) -n -e 's|^LOAD \(.*\)$$$$|  \1  \&|p' $(OBJS_DIR)/$(1)$(KERN_LINK_SUFFIX).map|tr '&' '\134'  >>$(OBJS_DIR)/$(1)$(KERN_LINK_SUFFIX).d
        @echo >>$(OBJS_DIR)/$(1)$(KERN_LINK_SUFFIX).d
+
+$(2)/lib$(1).ka: $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  AR [K]  $$@"
+       $(Q) $(KERN_AR) rcs $(1).ka.tmp $$^
+       $(Q) $(KERN_OBJCOPY) --redefine-sym module_initialize=$(1)_module_initialize $(1).ka.tmp $$@
+
 endef
 
 define LIBRARY_kern_template
-$(foreach x, $(SOURCES2OBJS),
+$(foreach x, $(KERN_SOURCES2OBJS),
 $(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
                $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
 )
@@ -87,7 +96,7 @@ $(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%))
 KERN_OBJS  += $$($(1)_OBJS)
 KERN_SOURCES += $$($(1)_SOURCES)
 
-$(KERN_LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
+$(KERN_LIB_DIR)/lib$(1).ka: $$($(1)_OBJS)
        @$(QUIET_CMD_ECHO) "  AR [K]  $$@"
        $(Q) $(KERN_AR) rcs $$@ $$^
 endef