Los archivos make del kernel de Linux usan el framework Kbuild. Aunque estos son interpretados por GNU make, Kbuild consta de un gran conjunto de macros con convenciones de uso peculiares, por lo que no se aplican las pautas típicas de makefile. Lo bueno de Kbuild es que necesita muy pocas repeticiones teniendo en cuenta la complejidad de la tarea.
Kbuild está documentado en la fuente del núcleo, en Documentation/kbuild
. Como escritor de módulos, debe leer especialmente modules.txt
(y al menos leer los otros).
Lo que está haciendo ahora no funciona porque $(shell pwd)
se expande cuando EXTRA_CFLAGS
se usa la variable. Dado que el archivo MAKE se ejecuta desde el árbol fuente del núcleo en lugar del directorio de su módulo (este es uno de los muchos aspectos no obvios de Kbuild), está recogiendo el directorio incorrecto.
El idioma oficial para especificar directorios de inclusión en un módulo fuera del árbol está en §5.3 de modules.txt
. La src
variable se establece en el directorio de nivel superior de su módulo. Por lo tanto:
EXTRA_CFLAGS := -I$(src)/src/inc
Tenga en cuenta que esta declaración debe estar en un archivo llamado Kbuild
en la raíz de su árbol de módulos. (Es posible que desee considerar el src
directorio como la raíz de su árbol de módulos; si es así, colóquelo Kbuild
allí y reemplace el valor anterior por -I$(src)/inc
). También es posible ponerlos en un Makefile
, pero tenga en cuenta que esta definición (siempre que cualquier otra cosa que se aplique solo al construir un módulo de kernel) debe estar dentro de una directiva condicional ifeq ($(KERNELRELEASE),)
. Ver §4.1 de modules.txt
.
Si aún no tiene un Kbuild
archivo y desea cambiar a uno, lea §4.1 de modules.txt
. Tener un Kbuild
archivo separado es un poco más claro. No ponga nada que se aplique al kernel en su archivo MAKE principal, aparte de una regla para llamar make -C $(KERNELDIR) M=$(pwd)
. En Kbuild
, lo mínimo que necesita es la lista de módulos que está creando (a menudo solo uno) y una lista de archivos para incluir en su módulo, más una declaración de dependencia:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h