From ccee9fa1355899b8de147ff7b778e50ad2f3ae01 Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Fri, 17 Oct 2025 06:27:09 +0000 Subject: [PATCH] kmod build environment --- developer/make/environment_RT_1.mk | 3 +- developer/make/target_kmod.mk | 68 ++++++++++++++++++++---------- developer/make/target_lib_cli.mk | 26 ++++++------ 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/developer/make/environment_RT_1.mk b/developer/make/environment_RT_1.mk index f448b9f..13368e1 100644 --- a/developer/make/environment_RT_1.mk +++ b/developer/make/environment_RT_1.mk @@ -10,8 +10,7 @@ ECHO := printf "%b\n" # sources found in these subdirectories: -SRCDIR_List=cc -SCRATCHPAD := scratchpad +SRCDIR_LIST=cc LIBDIR := $(SCRATCHPAD) LIBFILE := $(LIBDIR)/lib.a LINKFLAGS := -L$(LIBDIR) -L/lib64 -L/lib diff --git a/developer/make/target_kmod.mk b/developer/make/target_kmod.mk index 99f42f1..3c74865 100644 --- a/developer/make/target_kmod.mk +++ b/developer/make/target_kmod.mk @@ -1,38 +1,60 @@ -# make/targets_kmod.mk -# make a Linux kernel module +.SUFFIXES: +# make/target_kmod.mk — build *.kmod.c as kernel modules +# written for the Harmony skeleton, always invoked from cwd $REPO_HOME/ -ifndef REPO_HOME - $(error REPO_HOME is not set; build must be done in a project environment) -endif +SOURCE_DIR := cc +BUILD_DIR := /lib/modules/$(shell uname -r)/build +OUTPUT_DIR := scratchpad/kmod -KBUILD_BASE_List := $(basename $(notdir $(wildcard $(REPO_HOME)/developer/cc/*.mod.c))) -KMOD_BUILD_DPath := /lib/modules/$(shell uname -r)/build -KBUILD_OUTPUT_DIR := $(SCRATCHPAD) +# authored module basenames (without .mod.c) +BASE_LIST := $(patsubst %.kmod.c,%,$(notdir $(wildcard cc/*.kmod.c))) -# Basenames → kbuild objects and final .ko targets in scratchpad -KERNEL_OBJS_M := $(addsuffix .o, $(KBUILD_BASE_List)) -KMOD_TARGETS := $(addsuffix .ko, $(addprefix $(KBUILD_OUTPUT_DIR)/, $(KBUILD_BASE_List))) +# paths in scratchpad/kmod +C_SOURCE_LIST := $(addsuffix .c,$(addprefix $(OUTPUT_DIR)/,$(BASE_LIST))) +TARGET_LIST := $(addsuffix .ko,$(addprefix $(OUTPUT_DIR)/,$(BASE_LIST))) .PHONY: usage usage: - @printf "Usage: make [usage|kmod|clean]\n"; exit 2 + @printf "Usage: make [kmod|clean]\n" + +.PHONY: version +version: + @echo target_kmod version 1.0 + +.PHONY: information,info +info: +information: + @printf "· → Unicode middle dot — visible: [%b]\n" "·" + @echo "SOURCE_DIR: " $(SOURCE_DIR) + @echo "BUILD_DIR: " $(BUILD_DIR) + @echo "OUTPUT_DIR: " $(KOUTPUT_DIR) + @echo "BASE_LIST: " $(BASE_LIST) + @echo "C_SOURCE_LIST: " $(C_SOURCE_LIST) + @echo "TARGET_LIST: " $(TARGET_LIST) + -# Build every module .PHONY: kmod -kmod: $(KMOD_TARGETS) +kmod: _prepare $(TARGET_LIST) -# Link each module via kbuild (M points at project root) -$(KBUILD_OUTPUT_DIR)/%.ko: $(KBUILD_OUTPUT_DIR)/%.c - @echo "--- Invoking Kbuild for Module: $* ---" - $(MAKE) -C $(KMOD_BUILD_DPath) M=$(REPO_HOME) O=$(KBUILD_OUTPUT_DIR) obj-m=$*.o +.PHONY: _prepare +_prepare: + @mkdir -p $(OUTPUT_DIR) + @printf "obj-m := %s\n" "$(foreach m,$(BASE_LIST),$(m).o)" > $(OUTPUT_DIR)/Makefile -# Prepare kbuild-compatible .c in scratchpad from authored .mod.c in developer/cc -$(KBUILD_OUTPUT_DIR)/%.c: $(REPO_HOME)/developer/cc/%.mod.c +# copy authored .mod.c → scratchpad/kmod/*.c (Kbuild expects sources under M) +$(OUTPUT_DIR)/%.c: $(SOURCE_DIR)/%.mod.c | _prepare @echo "--- Preparing Kbuild Source: $@ ---" cp $< $@ -# Clean kbuild artifacts (confined to scratchpad) +# build .ko via kernel Kbuild (the 'modules' target drives the build) +$(OUTPUT_DIR)/%.ko: $(OUTPUT_DIR)/%.c $(OUTPUT_DIR)/Makefile + @echo "--- Invoking Kbuild for Module: $* ---" + $(MAKE) -C $(BUILD_DIR) M=$(OUTPUT_DIR) modules + .PHONY: clean clean: - @echo "--- Cleaning Kbuild Artifacts in $(KBUILD_OUTPUT_DIR) ---" - $(MAKE) -C $(KMOD_BUILD_DPath) M=$(REPO_HOME) O=$(KBUILD_OUTPUT_DIR) obj-m="$(KERNEL_OBJS_M)" clean + @if [ -d "$(OUTPUT_DIR)" ]; then \ + echo "--- Cleaning Kbuild Artifacts in $(OUTPUT_DIR) ---"; \ + $(MAKE) -C $(BUILD_DIR) M=$(OUTPUT_DIR) clean; \ + fi + diff --git a/developer/make/target_lib_cli.mk b/developer/make/target_lib_cli.mk index cba5bcf..06032cf 100644 --- a/developer/make/target_lib_cli.mk +++ b/developer/make/target_lib_cli.mk @@ -1,4 +1,6 @@ .SUFFIXES: +# make/target_lib_cli.mk — build *.lib.c and *.cli.c +# written for the Harmony skeleton, always invoked from cwd $REPO_HOME/ #-------------------------------------------------------------------------------- # files have two suffixes by convention, e.g.: X.lib.c or Y.cli.c @@ -10,26 +12,26 @@ ifeq ($(C),) endif # keep only the source directories that are in the file system -SRCDIR_List := $(wildcard $(SRCDIR_List)) +SRCDIR_LIST := $(wildcard $(SRCDIR_LIST)) # bail early if the SRCDIR_list is empty -ifeq ($(SRCDIR_List),) - $(error source directory found so nothing to do) +ifeq ($(SRCDIR_LIST),) + exit endif # duplicate source file names in different directories will cause # problems with this makefile -C_SOURCE_LIB := $(foreach dir, $(SRCDIR_List), $(wildcard $(dir)/*.lib.c)) -C_SOURCE_EXEC := $(foreach dir, $(SRCDIR_List), $(wildcard $(dir)/*.cli.c)) +C_SOURCE_LIB := $(foreach dir, $(SRCDIR_LIST), $(wildcard $(dir)/*.lib.c)) +C_SOURCE_EXEC := $(foreach dir, $(SRCDIR_LIST), $(wildcard $(dir)/*.cli.c)) #remove the suffix to get base name C_BASE_LIB= $(sort $(patsubst %.lib.c, %, $(notdir $(C_SOURCE_LIB)))) C_BASE_EXEC= $(sort $(patsubst %.cli.c, %, $(notdir $(C_SOURCE_EXEC)))) # two sets of object files, one for the lib, and one for the command line interface progs -OBJECT_LIB= $(patsubst %, $(SCRATCHPAD)/%.lib.o, $(C_BASE_LIB)) -OBJECT_EXEC= $(patsubst %, $(SCRATCHPAD)/%.cli.o, $(C_BASE_EXEC)) +OBJECT_LIB= $(patsubst %, scratchpad/%.lib.o, $(C_BASE_LIB)) +OBJECT_EXEC= $(patsubst %, scratchpad/%.cli.o, $(C_BASE_EXEC)) -include $(OBJECT_LIB:.o=.d) $(OBJECT_EXEC:.o=.d) @@ -37,7 +39,7 @@ OBJECT_EXEC= $(patsubst %, $(SCRATCHPAD)/%.cli.o, $(C_BASE_EXEC)) EXEC= $(patsubst %, $(EXECDIR)/%, $(C_BASE_EXEC)) # the new C programming style gated sections in source instead of header filesheader -INCFLAG_List := $(foreach dir, $(SRCDIR_List), -I $(dir)) +INCFLAG_List := $(foreach dir, $(SRCDIR_LIST), -I $(dir)) CFLAGS += $(INCFLAG_List) #-------------------------------------------------------------------------------- @@ -60,7 +62,7 @@ version: .PHONY: information information: @printf "· → Unicode middle dot — visible: [%b]\n" "·" - @echo "SRCDIR_List: " $(SRCDIR_List) + @echo "SRCDIR_LIST: " $(SRCDIR_LIST) @echo "C_SOURCE_LIB: " $(C_SOURCE_LIB) @echo "C_SOURCE_EXEC: " $(C_SOURCE_EXEC) @echo "C_BASE_LIB: " $(C_BASE_LIB) @@ -96,10 +98,10 @@ clean: # recipes -vpath %.c $(SRCDIR_List) -$(SCRATCHPAD)/%.o: %.c +vpath %.c $(SRCDIR_LIST) +scratchpad/%.o: %.c $(C) $(CFLAGS) -o $@ -c $< -$(EXECDIR)/%: $(SCRATCHPAD)/%.cli.o $(LIBFILE) +$(EXECDIR)/%: scratchpad/%.cli.o $(LIBFILE) $(C) -o $@ $< $(LIBFILE) $(LINKFLAGS) -- 2.20.1