.
authorThomas Walker Lynch <eknp9n@reasoningtechnology.com>
Tue, 21 Oct 2025 07:50:55 +0000 (07:50 +0000)
committerThomas Walker Lynch <eknp9n@reasoningtechnology.com>
Tue, 21 Oct 2025 07:50:55 +0000 (07:50 +0000)
developer/make/target_kmod.mk

index 06ad92b..9442c0d 100644 (file)
@@ -1,86 +1,71 @@
 .SUFFIXES:
-# make/target_kmod.mk — build *.kmod.c as kernel modules
-# written for the Harmony skeleton, always invoked from cwd  $REPO_HOME/<role>
+# make/target_kmod.mk — build *.kmod.c as kernel modules (single-pass, kmod-only)
+# invoked from $REPO_HOME/<role>
+# version 1.2
 
 SOURCE_DIR  := cc
 BUILD_DIR   := /lib/modules/$(shell uname -r)/build
+# Isolate per-kernel output (safe) or collapse to 'scratchpad/kmod' (simpler)
+OUTPUT_DIR  := $(abspath scratchpad/kmod/$(shell uname -r))
 
-# must be an absolute path
-OUTPUT_DIR  := $(abspath scratchpad/kmod)
+# authored module basenames (without .kmod.c) — kmod-only
+BASE_LIST   := $(patsubst %.kmod.c,%,$(notdir $(wildcard $(SOURCE_DIR)/*.kmod.c)))
 
-# authored module basenames (without .kmod.c)
-BASE_LIST   := $(patsubst %.kmod.c,%,$(notdir $(wildcard cc/*.kmod.c)))
-
-# paths in scratchpad/kmod
-C_SOURCE_LIST     := $(addsuffix .c,$(addprefix $(OUTPUT_DIR)/,$(BASE_LIST)))
-TARGET_LIST       := $(addsuffix .ko,$(addprefix $(OUTPUT_DIR)/,$(BASE_LIST)))
+# prepared sources under OUTPUT_DIR (Kbuild expects sources under M)
+ALL_C       := $(addsuffix .c,$(addprefix $(OUTPUT_DIR)/,$(BASE_LIST)))
 
 .PHONY: usage
 usage:
-       @printf "Usage: make [kmod|clean]\n"
+       @printf "Usage: make [kmod|clean|information|version]\n"
 
-.PHONY: version 
+.PHONY: version
 version:
-       @echo target_kmod version 1.0
+       @echo target_kmod version 1.2
 
 .PHONY: information
 information:
-       @echo "SOURCE_DIR: " $(SOURCE_DIR)
-       @echo "BUILD_DIR: " $(BUILD_DIR)
-       @echo "OUTPUT_DIR: " $(OUTPUT_DIR)
-       @echo "BASE_LIST: " $(BASE_LIST)
-       @echo "C_SOURCE_LIST: " $(C_SOURCE_LIST)
-       @echo "TARGET_LIST: " $(TARGET_LIST)
-
-
-.PHONY: kmod
-kmod: _prepare $(TARGET_LIST)
-
-.PHONY: _prepare
-_prepare:
-       @mkdir -p $(OUTPUT_DIR)
-       @printf "obj-m := %s\n" "$(foreach m,$(BASE_LIST),$(m).o)" > $(OUTPUT_DIR)/Makefile
-
-# copy authored .kmod.c → scratchpad/kmod/*.c (Kbuild expects sources under M)
-$(OUTPUT_DIR)/%.c: $(SOURCE_DIR)/%.kmod.c | _prepare
-       @echo "--- Preparing Kbuild Source: $@ ---"
-       cp $< $@
-
-# 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:
-       @if [ -d "$(OUTPUT_DIR)" ]; then \
-         echo "--- Cleaning Kbuild Artifacts in $(OUTPUT_DIR) ---"; \
-         $(MAKE) -C $(BUILD_DIR) M=$(OUTPUT_DIR) clean; \
-       fi
+       @echo "SOURCE_DIR:   " $(SOURCE_DIR)
+       @echo "BUILD_DIR:    " $(BUILD_DIR)
+       @echo "OUTPUT_DIR:   " $(OUTPUT_DIR)
+       @echo "BASE_LIST:    " $(BASE_LIST)
+       @echo "ALL_C:        " $(ALL_C)
 
------
-# add this near BASE_LIST
-ALL_C := $(addsuffix .c,$(addprefix $(OUTPUT_DIR)/,$(BASE_LIST)))
+# guard: fail early if no kmod sources (prevents confusing empty builds)
+ifndef BASE_LIST
+$(warning No *.kmod.c found under $(SOURCE_DIR); nothing to build)
+endif
 
 .PHONY: kmod
-# build everything in one go
 kmod: _prepare modules
 
 .PHONY: _prepare
 _prepare:
        @mkdir -p $(OUTPUT_DIR)
-       @printf "obj-m := %s\n" "$(foreach m,$(BASE_LIST),$(m).o)" > $(OUTPUT_DIR)/Makefile
+       # purge any non-kmod staged *.c to avoid accidental pickup
+       @find "$(OUTPUT_DIR)" -maxdepth 1 -type f -name '*.c' ! -name '*.tmp' -delete 2>/dev/null || true
+       # declare exactly which modules to build
+       @printf "obj-m := %s\n" "$(foreach m,$(BASE_LIST),$(m).o)" > "$(OUTPUT_DIR)/Makefile"
+       # stage only kmod sources (symlink preferred; fallback to copy)
        @for b in $(BASE_LIST); do \
          src="$(SOURCE_DIR)/$$b.kmod.c"; dst="$(OUTPUT_DIR)/$$b.c"; \
          echo "--- Preparing Kbuild Source: $$dst ---"; \
-         ln -s $$src $$dst; \
+         ln -sf "$$src" "$$dst" 2>/dev/null || cp "$$src" "$$dst"; \
        done
 
 .PHONY: modules
 modules: $(OUTPUT_DIR)/Makefile $(ALL_C)
        @echo "--- Invoking Kbuild for Modules: $(BASE_LIST) ---"
-       $(MAKE) -C $(BUILD_DIR) M=$(OUTPUT_DIR) modules
+       $(MAKE) -C "$(BUILD_DIR)" M="$(OUTPUT_DIR)" modules
 
-# optional: keep these as no-ops so 'make …/foo.ko' still succeeds
+# Allow 'make scratchpad/kmod/.../foo.ko' after batch build
 $(OUTPUT_DIR)/%.ko: modules
        @true
+
+.PHONY: clean
+clean:
+       @if [ -d "$(OUTPUT_DIR)" ]; then \
+         echo "--- Cleaning Kbuild Artifacts in $(OUTPUT_DIR) ---"; \
+         $(MAKE) -C "$(BUILD_DIR)" M="$(OUTPUT_DIR)" clean; \
+         find "$(OUTPUT_DIR)" -maxdepth 1 -type l -name '*.c' -delete 2>/dev/null || true; \
+         find "$(OUTPUT_DIR)" -maxdepth 1 -type f -name '*.c' -delete 2>/dev/null || true; \
+       fi