Linux内核模块Makefile不能包含相对路径 [英] Linux kernel module Makefile can't include relative paths

查看:17
本文介绍了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 heredocumentation 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 文件:

   --> 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文件的位置。话虽如此,但不建议这样做 练习。

对于头文件,必须明确告知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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆