Linux内核模块Makefile不能包含相对路径

问题描述 投票:1回答:1

我正在尝试构建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。当我使用绝对路径时,它可以很好地工作,但是我需要从该项目中的当前目录进行相对寻址。怎么了?抱歉,如果很明显。

c linux makefile linux-kernel gnu-make
1个回答
0
投票

Linux内核makefile使用Kbuild框架。 Documentation for Makefiles can be found heredocumentation 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
© www.soinside.com 2019 - 2024. All rights reserved.