blob: f701098b23a11c2fdafaf422bf6ef4effb799175 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
CC ?= clang
BIN ?= a.out
SRC ?= $(firstword $(wildcard *.c))
CFLAGS ?= -O2 -g -Wall -Wextra -std=gnu11
LDFLAGS ?=
# Kernel build dir (for module builds)
UNAME_R := $(shell uname -r)
# Prefer DKMS-provided KVER when present, otherwise fallback to running kernel
ifeq ($(origin KVER), undefined)
KDIR ?= /lib/modules/$(UNAME_R)/build
else
KDIR ?= /lib/modules/$(KVER)/build
endif
PWD := $(shell pwd)
# If the running kernel was built with clang/lld, mirror that toolchain
LLVM_OPT := $(shell grep -q "^#define CONFIG_CC_IS_CLANG 1" $(KDIR)/include/generated/autoconf.h 2>/dev/null && echo LLVM=1)
# Allow building one or more modules: MODULE=foo or MODULES="foo bar"
# When building with `make modules MODULE=xyz`, the kernel will treat this
# Makefile as the Kbuild file because of M=$(PWD).
ifneq ($(strip $(MODULES)$(MODULE)),)
MODULES ?= $(MODULE)
export obj-m := $(patsubst %,%.o,$(MODULES))
endif
DEFAULT_MODULES := dchu_core dchu_hwmon dchu_leds
compile: $(BIN)
$(BIN): $(SRC)
$(CC) $(CFLAGS) -o $@ $(SRC) $(LDFLAGS)
# ===== kernel module =====
# e.g. `make modules MODULE=foo` (expects foo.c in this dir)
modules:
@test -n "$(obj-m)" || { echo "Set MODULE=<name> or MODULES=\"a b\""; exit 2; }
$(MAKE) -C $(KDIR) M=$(PWD) $(LLVM_OPT) modules
modules_install:
@test -n "$(obj-m)" || { echo "Set MODULE=<name> or MODULES=\"a b\""; exit 2; }
$(MAKE) -C $(KDIR) M=$(PWD) $(LLVM_OPT) modules_install
all: modules_all
modules_all:
$(MAKE) modules MODULES="$(DEFAULT_MODULES)"
load: modules
@test -n "$(MODULE)" || { echo "need MODULE=<name>, e.g. make load MODULE=dchu_hwmon"; exit 1; }
sudo modprobe -r $(MODULE) >/dev/null 2>&1 || true
sudo insmod ./$(MODULE).ko $(PARAMS)
dmesg | tail -n 30
unload:
@test -n "$(MODULE)" || { echo "need MODULE=<name>, e.g. make unload MODULE=dchu_hwmon"; exit 1; }
sudo modprobe -r $(MODULE) || sudo rmmod $(MODULE) || true
reload: unload load
load_all: modules_all
sudo insmod ./dchu_core.ko
sudo insmod ./dchu_hwmon.ko $(PARAMS)
sudo insmod ./dchu_leds.ko
unload_all:
sudo rmmod dchu_hwmon dchu_leds dchu_core 2>/dev/null || true
clean:
$(RM) $(BIN) *.o *.ko *.mod *.mod.c *.symvers Module.symvers modules.order .*.cmd
.PHONY: compile modules modules_install modules_all all clean load unload reload load_all unload_all help
|