Os makefiles do kernel Linux usam o framework Kbuild. Embora estes sejam interpretados pelo GNU make, o Kbuild consiste em um grande conjunto de macros com convenções de uso peculiares, portanto, as diretrizes típicas do makefile não se aplicam. O legal do Kbuild é que você precisa de muito pouco clichê considerando a complexidade da tarefa.
O Kbuild está documentado na fonte do kernel, em Documentation/kbuild
. Como um redator de módulo, você deveria especialmente ler modules.txt
(e pelo menos folhear os outros ).
O que você está fazendo agora não está funcionando porque $(shell pwd)
é expandido quando a variável EXTRA_CFLAGS
é usada. Já que o makefile é executado a partir da árvore fonte do kernel ao invés do diretório do seu módulo (este é um dos muitos aspectos não óbvios do Kbuild), ele está pegando o diretório errado.
O idioma oficial para especificar diretórios include em um módulo fora da árvore está em §5.3 de modules.txt
. A variável src
está definida para o diretório de nível superior do seu módulo. Portanto:
EXTRA_CFLAGS := -I$(src)/src/inc
Note que esta declaração deve estar em um arquivo chamado Kbuild
na raiz da sua árvore de módulos. (Você pode considerar o diretório src
como a raiz da árvore de módulos; se estiver, coloque Kbuild
e substitua o valor acima por -I$(src)/inc
). Também é possível colocá-los em Makefile
, mas lembre-se que essa definição (desde que qualquer outra coisa que se aplique somente ao construir um módulo do kernel) deve estar dentro de uma diretiva condicional ifeq ($(KERNELRELEASE),)
. Veja §4.1 de modules.txt
.
Se você não tiver um arquivo Kbuild
e quiser mudar para um, leia §4.1 de modules.txt
. Ter um arquivo Kbuild
separado é um pouco mais claro. Não coloque nada que se aplique ao kernel em seu makefile principal, além de uma regra para chamar make -C $(KERNELDIR) M=$(pwd)
. Em Kbuild
, o mínimo que você precisa é a lista de módulos que você está construindo (geralmente o único) e uma lista de arquivos para incluir em seu módulo, além de uma declaração de dependência:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h