kmod build environment
authorThomas Walker Lynch <eknp9n@reasoningtechnology.com>
Fri, 17 Oct 2025 06:27:09 +0000 (06:27 +0000)
committerThomas Walker Lynch <eknp9n@reasoningtechnology.com>
Fri, 17 Oct 2025 06:27:09 +0000 (06:27 +0000)
developer/make/environment_RT_1.mk
developer/make/target_kmod.mk
developer/make/target_lib_cli.mk

index f448b9f..13368e1 100644 (file)
@@ -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
index 99f42f1..3c74865 100644 (file)
@@ -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/<role>
 
-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
+
index cba5bcf..06032cf 100644 (file)
@@ -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/<role>
 
 #--------------------------------------------------------------------------------
 # 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)