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.c
和file.c
里面你应该有一个#include "file.h"
声明。
我以前从未使用过 $(src),但根据Linux Kernel Makefiles 的第 3.10 节,应该将其设置为与您的 Makefile 相同的文件夹。以上是关于Makefile 编译内核模块以包含树源文件的主要内容,如果未能解决你的问题,请参考以下文章