Linux çekirdek markaları Kbuild çerçevesini kullanır. Bunlar GNU markası tarafından yorumlanmasına rağmen, Kbuild kendine özgü kullanım kurallarına sahip çok sayıda makrodan oluşur, bu nedenle tipik makefile yönergeleri geçerli değildir. Kbuild ile ilgili güzel olan şey, görevin karmaşıklığını göz önünde bulundurarak çok az kazan plakasına ihtiyaç duymanızdır.
Kbuild, içindeki çekirdek kaynağında belgelenmiştir Documentation/kbuild
. Bir modül yazarı olarak, özelliklemodules.txt
(ve en azından diğerlerini gözden geçirmelisiniz).
Şu anda yaptığınız şey çalışmıyor çünkü değişken kullanıldığında $(shell pwd)
genişliyor EXTRA_CFLAGS
. Makefile modülünüzün dizininden ziyade çekirdek kaynak ağacından çalıştığından (bu, Kbuild'in pek çok açık olmayan yönlerinden biridir), yanlış dizini alıyor.
Ağaç dışı bir modül içindeki dizinleri belirtmek için resmi deyim, §5.3 modules.txt
. src
Değişken sizin modülün toplevel dizinine ayarlanır. Bu nedenle:
EXTRA_CFLAGS := -I$(src)/src/inc
Bu bildirimin Kbuild
modül ağacınızın kökünde çağrılan bir dosyada olması gerektiğini unutmayın . ( src
Dizinin modül ağacınızın kökü olduğunu düşünebilirsiniz ; öyleyse, Kbuild
buraya koyun ve yukarıdaki değeri değiştirin -I$(src)/inc
). Onları a'ya koymak da mümkündür Makefile
, ancak bu tanımın (sadece bir çekirdek modülü oluştururken geçerli olan herhangi bir şey olduğu sürece) koşullu bir yönerge içinde olması gerektiğini unutmayın ifeq ($(KERNELRELEASE),)
. Bkz.modules.txt
.
Kbuild
Zaten bir dosyanız yoksa ve bir dosyaya geçmek istiyorsanız, §4.1 modules.txt
. Ayrı bir Kbuild
dosyaya sahip olmak biraz daha nettir. Ana kuralınızdaki çekirdek için geçerli bir çağırma kuralı dışında hiçbir şey koymayın make -C $(KERNELDIR) M=$(pwd)
. Olarak Kbuild
, size gereken asgari Sen yapı modüllerinin listesi (genellikle sadece bir) ve modülünde dahil etmek dosyaların bir listesini, artı bir bağımlılık beyanıdır:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h