Kernel Linux membuat file menggunakan kerangka kerja Kbuild Meskipun ini ditafsirkan oleh GNU make, Kbuild terdiri dari sejumlah besar macro dengan konvensi penggunaan khusus, jadi pedoman makefile tipikal tidak berlaku. Hal yang menyenangkan tentang Kbuild adalah Anda memerlukan pelat ketel yang sangat sedikit mengingat kompleksitas tugasnya.
Kbuild didokumentasikan dalam sumber kernel, di Documentation/kbuild
. Sebagai penulis modul, Anda harus membaca modules.txt
(dan setidaknya membaca yang lainnya).
Apa yang Anda lakukan sekarang tidak berfungsi karena $(shell pwd)
diperluas ketika EXTRA_CFLAGS
variabel digunakan. Karena makefile berjalan dari pohon kode sumber bukan dari direktori modul Anda (ini adalah salah satu dari banyak aspek non-jelas Kbuild), itu mengambil direktori yang salah.
Ungkapan resmi untuk menentukan menyertakan direktori dalam modul out-of-tree adalah dalam §5.3 dari modules.txt
. The src
variabel diatur untuk direktori level atas modul Anda. Karena itu:
EXTRA_CFLAGS := -I$(src)/src/inc
Perhatikan bahwa deklarasi ini harus dalam file yang disebut Kbuild
di root pohon modul Anda. (Anda mungkin ingin menganggap src
direktori sebagai root dari pohon modul Anda; jika demikian, letakkan di Kbuild
sana dan ganti nilai di atas dengan -I$(src)/inc
). Dimungkinkan juga untuk meletakkannya di dalam Makefile
, tetapi perlu diingat bahwa definisi ini (selama hal lain yang hanya berlaku ketika membangun modul kernel) harus berada dalam arahan kondisional ifeq ($(KERNELRELEASE),)
. Lihat §4.1 dari modules.txt
.
Jika Anda belum memiliki Kbuild
file dan ingin beralih untuk memilikinya, baca §4.1 dari modules.txt
. Memiliki Kbuild
file terpisah sedikit lebih jelas. Jangan menaruh apa pun yang berlaku untuk kernel di makefile utama Anda, selain aturan untuk memanggil make -C $(KERNELDIR) M=$(pwd)
. Dalam Kbuild
, minimum yang Anda butuhkan adalah daftar modul yang Anda bangun (seringkali hanya satu) dan daftar file untuk dimasukkan dalam modul Anda, ditambah deklarasi dependensi:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h