我正在尝试构建Linux内核模块:
KBUILD_EXTRA_SYMBOLS := ../../Module.symvers
KBUILD_EXTRA_SYMBOLS := ../../dir0/Module.symvers
KDIR = ../../../../kernel/linux-4.9
INCLUDES = \
-I../dir1/dir2/dir3 \
-I../dir1/dir2 \
-I../dir1
EXTRA_CFLAGS += $(INCLUDES)
PWD = $(shell pwd)
TARGET = some_module
obj-m := $(TARGET).o
all: default clean
default:
make $(INCLUDES) -C $(KDIR) M=$(PWD) modules
clean:
@rm -f *.o .*.cmd .*.flags *.mod.c *.order
@rm -f .*.*.cmd *.symvers *~ *.*~ TODO.*
@rm -fR .tmp*
@rm -rf .tmp_versions
disclean: clean
@rm -f *.ko
但是它无法在相对路径中找到文件,例如像fatal error: some_header.h: No such file or directory
。当我使用绝对路径时,它可以很好地工作,但是我需要从该项目中的当前目录进行相对寻址。怎么了?抱歉,如果很明显。
Linux内核makefile使用Kbuild框架。 Documentation for Makefiles can be found here和documentation for modules can be found here。我认为您对Makefile文档第3.10节特殊规则感兴趣,该文件指出:
-3.10特殊规则
kbuild基础结构未提供所需支持时,将使用特殊规则。一个典型的例子是头文件在构建过程中生成。另一个例子是需要特定规则准备的特定于体系结构的Makefile引导映像等。特殊规则写为正常的Make规则。 Kbuild未在Makefile所在的目录中执行,因此所有特殊规则应提供前提文件的相对路径和目标文件。定义特殊规则时使用两个变量:
$(src)
$(src)
是指向Makefile所在目录的相对路径。引用位于$(src)
树中的文件时,请始终使用src
。
因此,您的Makefile应该如下所示:
KBUILD_EXTRA_SYMBOLS := $(src)/../../Module.symvers
KBUILD_EXTRA_SYMBOLS := $(src)/../../dir0/Module.symvers
KDIR = $(src)/../../../../kernel/linux-4.9
INCLUDES = \
-I$(src)/../dir1/dir2/dir3 \
-I$(src)/../dir1/dir2 \
-I$(src)/../dir1
EXTRA_CFLAGS += $(INCLUDES)
PWD = $(shell pwd)
TARGET = some_module
obj-m := $(TARGET).o
all: default clean
default:
make $(INCLUDES) -C $(KDIR) M=$(PWD) modules
clean:
@rm -f *.o .*.cmd .*.flags *.mod.c *.order
@rm -f .*.*.cmd *.symvers *~ *.*~ TODO.*
@rm -fR .tmp*
@rm -rf .tmp_versions
disclean: clean
@rm -f *.ko