Các makefile kernel Linux sử dụng khung Kbuild. Mặc dù những điều này được giải thích bởi GNU make, Kbuild bao gồm một tập hợp các macro lớn với các quy ước sử dụng đặc biệt, vì vậy các hướng dẫn makefile điển hình không được áp dụng. Điều hay ho ở Kbuild là bạn cần rất ít nồi hơi xem xét sự phức tạp của nhiệm vụ.
Kbuild được ghi lại trong nguồn kernel, in Documentation/kbuild
. Là một người viết mô-đun, bạn đặc biệt nên đọc modules.txt
(và ít nhất là đọc lướt qua những người khác).
Những gì bạn đang làm bây giờ không hoạt động vì $(shell pwd)
được mở rộng khi EXTRA_CFLAGS
biến được sử dụng. Vì tệp Makefile chạy từ cây nguồn kernel chứ không phải từ thư mục của mô-đun của bạn (đây là một trong nhiều khía cạnh không gây khó chịu của Kbuild), nên nó chọn thư mục sai.
Thành ngữ chính thức để chỉ định bao gồm các thư mục trong mô-đun ngoài cây nằm trong §5.3 của modules.txt
. Các src
biến được đặt vào thư mục mục cấp đầu của mô-đun của bạn. Vì thế:
EXTRA_CFLAGS := -I$(src)/src/inc
Lưu ý rằng khai báo này phải ở trong một tệp được gọi Kbuild
ở gốc của cây mô-đun của bạn. (Bạn có thể muốn coi src
thư mục là gốc của cây mô-đun của mình; nếu vậy, hãy đặt Kbuild
ở đó và thay thế giá trị ở trên bằng -I$(src)/inc
). Cũng có thể đặt chúng vào một Makefile
, nhưng lưu ý rằng định nghĩa này (miễn là mọi thứ khác chỉ áp dụng khi xây dựng mô-đun hạt nhân) phải nằm trong một lệnh có điều kiện ifeq ($(KERNELRELEASE),)
. Xem §4.1 của modules.txt
.
Nếu bạn chưa có Kbuild
tệp và muốn chuyển sang có tệp, hãy đọc §4.1 modules.txt
. Có một Kbuild
tập tin riêng thì rõ ràng hơn một chút. Đừng đặt bất cứ thứ gì áp dụng cho kernel vào tệp chính của bạn, ngoài quy tắc cần gọi make -C $(KERNELDIR) M=$(pwd)
. Trong đó Kbuild
, tối thiểu bạn cần là danh sách các mô-đun bạn đang xây dựng (thường chỉ là một) và danh sách các tệp cần có trong mô-đun của bạn, cộng với khai báo phụ thuộc:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h