From: Pavel Pisa Date: Sun, 8 Sep 2019 20:25:56 +0000 (+0200) Subject: NuttX: initial kernel modules compilation logic. X-Git-Url: http://rtime.felk.cvut.cz/gitweb/omk.git/commitdiff_plain/ea18ae7d824c1674d41cc1089e56a1350a85d0e4 NuttX: initial kernel modules compilation logic. Signed-off-by: Pavel Pisa --- diff --git a/snippets/Makefile.rules.nuttx b/snippets/Makefile.rules.nuttx index ac8bbb1..c4f9f5a 100644 --- a/snippets/Makefile.rules.nuttx +++ b/snippets/Makefile.rules.nuttx @@ -1,6 +1,7 @@ OMK_RULES_TYPE=nuttx include base.omk #omkbuild include nuttx-compile.omk #omkbuild +include nuttx-kernel.omk #omkbuild include include.omk #omkbuild include sysless.omk #omkbuild include nuttx-bin.omk #omkbuild diff --git a/snippets/nuttx-bin.omk b/snippets/nuttx-bin.omk index 3d14dbe..d3752ea 100644 --- a/snippets/nuttx-bin.omk +++ b/snippets/nuttx-bin.omk @@ -14,16 +14,39 @@ 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 + +$(eval $(call include-pass-template,$(KERN_INCLUDE_DIR),kernel)) + +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),))) + check-dir:: @$(call mkdir_def,$(USER_REGISTRY_DIR)) + @$(call mkdir_def,$(KERN_MODULES_DIR)) + @$(call mkdir_def,$(KERN_BUILD_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)/%.elf) +binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%.elf) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%$(KERN_LINK_SUFFIX)) + +binary-pass-local: $(kernel_MODULES:%=$(KERN_MODULES_DIR)/%$(KERN_LINK_SUFFIX)) $(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGBUILTIN_template,$(prog),$(USER_REGISTRY_DIR),$(USER_REGISTRY_DIR)))) +$(foreach module,$(kernel_MODULES),$(eval $(call MODULE_kern_template,$(module),$(KERN_MODULES_DIR)))) + library-pass-local: $(bin_PROGRAMS:%=$(USER_REGISTRY_DIR)/%.pbi) clean-local:: diff --git a/snippets/nuttx-compile.omk b/snippets/nuttx-compile.omk index 1f10667..6276a79 100644 --- a/snippets/nuttx-compile.omk +++ b/snippets/nuttx-compile.omk @@ -3,6 +3,8 @@ # sources using GNU toolchain. # Interface to other rules: +# kernel_HEADERS .. list of the kernel-space public header files +# kernel_MODULES .. list of the kernel side modules/applications # Input variables: # NUTTX_EXPORT - export directory of NuttX build diff --git a/snippets/nuttx-kernel.omk b/snippets/nuttx-kernel.omk new file mode 100644 index 0000000..503c2da --- /dev/null +++ b/snippets/nuttx-kernel.omk @@ -0,0 +1,91 @@ +define COMPILE_c_o_kern_template + +$(2): $(1) + @$(QUIET_CMD_ECHO) " CC [K] $$@" + $(Q) if $$(c_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) $(KERN_KBUILD_MODNAME) \ + -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \ + -o $$@ -c $$< ; \ + then mv -f "$$@.d.tmp" "$$@.d" ; \ + else rm -f "$$@.d.tmp" ; exit 1; \ + fi +endef + + + +define COMPILE_cc_o_kern_template + +$(2): $(1) + @$(QUIET_CMD_ECHO) " CXX [K] $$@" + $(Q) if $$(cc_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) $(KERN_KBUILD_MODNAME) \ + -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \ + -o $$@ -c $$< ; \ + then mv -f "$$@.d.tmp" "$$@.d" ; \ + else rm -f "$$@.d.tmp" ; exit 1; \ + fi +endef + + + +define COMPILE_S_o_kern_template + +$(2): $(1) + @$(QUIET_CMD_ECHO) " AS [K] $$@" + $(Q) if $$(S_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) $(KERN_KBUILD_MODNAME) \ + -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \ + -o $$@ -c $$< ; \ + then mv -f "$$@.d.tmp" "$$@.d" ; \ + else rm -f "$$@.d.tmp" ; exit 1; \ + fi +endef + + + +define MODULE_kern_template +$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o)) +$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o)) +$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o)) +$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cpp=%.o)) +$(1)_OBJS := $$(sort $$($(1)_OBJS)) + +KERN_OBJS += $$($(1)_OBJS) +KERN_SOURCES += $$($(1)_SOURCES) + +# this is hack to build "__this_module" structure for 2.6.x kernels +# modpost is used for that purpose now + +$$(warning $(1)_OBJS=$$($(1)_OBJS)) + +#$(eval $(call COMPILE_c_o_kern_template,$(1).mod.c,$(1).mod.o,-DKBUILD_MODNAME=$(1))) + +$$(warning $(2)/$(1)$(KERN_LINK_SUFFIX): $$($(1)_OBJS)) +$(2)/$(1)$(KERN_LINK_SUFFIX): $$($(1)_OBJS) + @$(QUIET_CMD_ECHO) " LD [K] $$@" + $(Q) $(LINK) \ + -r -e module_initialize -T $(NUTTX_EXPORT)/build/gnu-elf.ld \ + -Map $(1)$(KERN_LINK_SUFFIX).map \ + $$($(1)_OBJS) $$($(1)_MOREOBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \ + -o $$@ + @echo "$(2)/$(1)$(KERN_LINK_SUFFIX): \\" >$(OBJS_DIR)/$(1)$(KERN_LINK_SUFFIX).d + @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 +endef + +define LIBRARY_kern_template +$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o)) +$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o)) +$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o)) +$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cpp=%.o)) +$(1)_OBJS := $$(sort $$($(1)_OBJS)) + +KERN_OBJS += $$($(1)_OBJS) +KERN_SOURCES += $$($(1)_SOURCES) + +$(KERN_LIB_DIR)/lib$(1).a: $$($(1)_OBJS) + @$(QUIET_CMD_ECHO) " AR [K] $$@" + $(Q) $(KERN_AR) rcs $$@ $$^ +endef + +ifneq ($(kernel_MODULES),) +binary-pass_REQUIRED=y +endif