From d7d3c29c18182944b7050a4e3d12ba5d6153ff2f Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Tue, 21 Oct 2025 07:50:55 +0000 Subject: [PATCH] . --- developer/make/target_kmod.mk | 91 +++++++++++++++-------------------- 1 file changed, 38 insertions(+), 53 deletions(-) diff --git a/developer/make/target_kmod.mk b/developer/make/target_kmod.mk index 06ad92b..9442c0d 100644 --- a/developer/make/target_kmod.mk +++ b/developer/make/target_kmod.mk @@ -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/ +# make/target_kmod.mk — build *.kmod.c as kernel modules (single-pass, kmod-only) +# invoked from $REPO_HOME/ +# 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 -- 2.20.1