Linux内核模块Makefile不能包含相对路径 [英] Linux kernel module Makefile can't include relative paths
本文介绍了Linux内核模块Makefile不能包含相对路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试构建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
推荐答案内核使用KBuild创建模块。该框架不同于常规的Makefile约定,因此虽然GNU make对它们都进行了解释,但需要注意其中的差异。Documentation for Makefiles using Kbuild can be found here和documentation for building external kernel modules can be found here。
下面引用了文档中与您的问题相关的几个要点。
发件人makefiles.txt
:
-3.10特别规则
当kBuild基础设施不提供所需支持时,使用特殊规则。一个典型的例子是头文件 在生成过程中生成。另一个例子是 需要特殊规则才能准备的特定于体系结构的生成文件 启动镜像等。特殊规则作为正常的制定规则写入。KBuild没有在Makefile所在的目录中执行,因此所有 特殊规则应提供先决条件文件的相对路径 和目标文件。定义特殊规则时使用两个变量:~
$(src)
~
$(src)
是指向生成文件所在目录的相对路径。引用src
树中的文件时,请始终使用$(src)
。~
$(obj)
~
$(obj)
是指向保存目标的目录的相对路径。引用生成的文件时,请始终使用$(obj)
。
发件人modules.txt
:
-4.3多个子目录
KBuild可以处理分布在多个目录中的文件。 请考虑以下示例:. |__ src | |__ complex_main.c | |__ hal | |__ hardwareif.c | |__ include | |__ hardwareif.h |__ include |__ complex.h
要构建模块Complex.ko,我们需要以下kbuild 文件:
如您所见,kBuild知道如何处理位于 其他目录。诀窍是指定相对于 Kbuild文件的位置。话虽如此,但不建议这样做 练习。--> filename: Kbuild obj-m := complex.o complex-y := src/complex_main.o complex-y += src/hal/hardwareif.o ccflags-y := -I$(src)/include ccflags-y += -I$(src)/src/hal/include
对于头文件,必须明确告知kBuild在哪里查找。 当kBuild执行时,当前目录始终是 内核树("-C"的参数),因此绝对路径为 需要的。
$(src)
通过指向 当前执行的kBuild文件所在的目录。
因此,您的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
这篇关于Linux内核模块Makefile不能包含相对路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文