Les makefiles du noyau Linux utilisent le framework Kbuild. Bien que celles-ci soient interprétées par GNU make, Kbuild se compose d'un large ensemble de macros avec des conventions d'utilisation particulières, donc les directives typiques de makefile ne s'appliquent pas. La bonne chose à propos de Kbuild est que vous avez besoin de très peu de passe-partout compte tenu de la complexité de la tâche.
Kbuild est documenté dans la source du noyau, dans Documentation/kbuild
. En tant que rédacteur de module, vous devez particulièrement lire modules.txt
(et au moins parcourir les autres).
Ce que vous faites maintenant ne fonctionne pas car il $(shell pwd)
est développé lorsque la EXTRA_CFLAGS
variable est utilisée. Étant donné que le makefile s'exécute à partir de l'arborescence des sources du noyau plutôt qu'à partir du répertoire de votre module (c'est l'un des nombreux aspects non évidents de Kbuild), il prend le mauvais répertoire.
L'idiome officiel pour spécifier les répertoires d'inclusion dans un module hors arborescence est au §5.3 de modules.txt
. La src
variable est définie dans le répertoire de niveau supérieur de votre module. Donc:
EXTRA_CFLAGS := -I$(src)/src/inc
Notez que cette déclaration doit se trouver dans un fichier appelé Kbuild
à la racine de votre arborescence de modules. (Vous voudrez peut-être considérer le src
répertoire comme la racine de votre arborescence de modules; si c'est le cas, placez Kbuild
-le et remplacez la valeur ci-dessus par -I$(src)/inc
). Il est également possible de les mettre dans un Makefile
, mais gardez à l'esprit que cette définition (tant que toute autre chose qui s'applique uniquement lors de la construction d'un module de noyau) devrait être dans une directive conditionnelle ifeq ($(KERNELRELEASE),)
. Voir §4.1 de modules.txt
.
Si vous ne possédez pas déjà un Kbuild
fichier et que vous souhaitez en changer, lisez le §4.1 de modules.txt
. Avoir un Kbuild
fichier séparé est légèrement plus clair. Ne mettez rien qui s'applique au noyau dans votre makefile principal, autre qu'une règle à appeler make -C $(KERNELDIR) M=$(pwd)
. Dans Kbuild
, le minimum dont vous avez besoin est la liste des modules que vous construisez (souvent juste celui-ci) et une liste de fichiers à inclure dans votre module, plus une déclaration de dépendance:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h