Makefile 编译内核模块以包含树源文件

Posted

技术标签:

【中文标题】Makefile 编译内核模块以包含树源文件【英文标题】:Makefile to compile kernel module to include out of tree source files 【发布时间】:2013-10-02 10:18:22 【问题描述】:

我不熟悉使用 makefile 编译内核模块以包含树外源文件。我已经阅读了一些教程,但仍然不足。在没有太详细的情况下,我创建了一个场景来描述问题和生成的生成文件。

dir1/main.c

dir2/subdir2/file.c
dir2/subdir2/include/file.h

下面是生成的makefile

obj-m:=main.o
main-y := ../dir2/include/file.o
KDIR := /home/userid/rowboat-android/kernel/
PWD := $(shell pwd)


default:
      $(MAKE) ARCH=arm CROSS_COMPILE=/home/userid/rowboat-android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-  -C $(KDIR) SUBDIRS=$(PWD) modules

clean
      $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean

根据所描述的场景,这个 Makefile 是否正确?

参考资料讲ccflags-y和EXTRA_CFLAGS。有人能解释一下这些开关的用途吗?

我的主要参考来源是

    Building External Modules Linux Kernel Makefiles *** 上的问题和解答

提前感谢您的宝贵时间

【问题讨论】:

【参考方案1】:

根据Linux documentation:

ccflags-y 指定使用 $(CC) 编译的选项。

     Example:
             # drivers/acpi/Makefile
             ccflags-y := -Os
             ccflags-$(_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT

ccflags-obj 会将指定的任何标志传递给 $(CC) 当 make 构建 obj.o。如果您使用 ccflags-y,那么这将充当一种通配符并将该标志传递给由 makefile 构建的所有对象。通常这与树外模块无关,但如果您的 Makefile 调用其他 Makefile,这些标志的效果是递归的。

同样的文档说 EXTRA_CFLAGS 是做同样事情的旧方法,你不应该使用它。

【讨论】:

感谢您的回复。因此,根据第 4.3 节,Building External Modules 的几个子目录通过定义 ccflags-y := -I$(src)../dir2/subdir2/include/file.h 将包含听到的文件。 几乎! -I 的工作方式略有不同。 -I 告诉编译器在哪里查找源文件使用#include "file.h" 格式包含的包含文件。所以你的声明应该是ccflags-y := -I$(src)../dir2/subsir2/include/,在main.cfile.c里面你应该有一个#include "file.h"声明。 我以前从未使用过 $(src),但根据Linux Kernel Makefiles 的第 3.10 节,应该将其设置为与您的 Makefile 相同的文件夹。

以上是关于Makefile 编译内核模块以包含树源文件的主要内容,如果未能解决你的问题,请参考以下文章

linux内核模块编译makefile -2

Linux模块文件如何编译到内核和独立编译成模块?

linux内核模块编译makefile

实验二 内核模块编译

编译驱动的Makefile详解

不修改Linux内核文件,直接用makefile编译驱动,是否要先把内核编译一遍?