超出树内核模块:多个模块,单个Makefile,相同的源文件,不同的构建选项

Saf*_*med 6 makefile linux-device-driver linux-kernel

我正在使用共享源代码构建一组Linux内核模块.根据我的理解,Makefile必须命名为"Makefile",所以我必须使用相同的Makefile来构建两个不同的模块.如何在同一个Makefile中使用相同的源代码构建两个不同的模块,但是有两个不同的构建选项?

例如,我的模块称为module1和module2.所以我有以下行来定义它们:

obj-m := module1.o module2.o
Run Code Online (Sandbox Code Playgroud)

在其他文件中,module1和module2都需要使用相同的源文件code.c,但使用不同的构建选项构建.例如,Makefile包含以下行:

module1-objs = module1_code.o other_code.o
module2-objs = module2_code.o other_code.o
Run Code Online (Sandbox Code Playgroud)

我希望module1_code.omodule2_code.o从code.c构建,但具有不同的选项.具体来说,我想要一个module1_code.o宏定义的宏-DPREPROCEFFOR_FLAG=1,并module2_code.o建立没有宏.

根据我的理解,Linux中使用的Makefile系统隐含地推断出对于名为"code.o"的目标文件,源文件被称为"code.c",那么我该如何实现呢?有可能吗?有一个更好的方法吗?

eep*_*epp 5

你在这里遇到了一个问题,因为你code.c-DPREPROCEFFOR_FLAG=1定义时显然有不同的编译方式,但是一旦编译进去code.o,make就不会关心预处理器标志或其他因为code.o已经是最新的.

您需要一种方法来构建code.c具有不同C标志的不同目标文件.可能有一种干净的方法可以做到这一点(没有机会使用O=树模块),但这是我目前优雅而有效的解决方案:

my_modules:
    cp code.c code_noflags.c
    cp code.c code_withflags.c
    make -C $$KDIR M=$$PWD modules
    rm code_noflags.c code_withflags.c

# module objects
obj-m := module1.o module2.o

# module1 specifics
module1-y := code_withflags.o
CFLAGS_code_withflags.o := -DPREPROCEFFOR_FLAG=1

# module2 specifics
module2-y := code_noflags.o
Run Code Online (Sandbox Code Playgroud)

只需致电:

$ make KDIR=/path/to/kernel
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令验证预处理程序标志是否已传递给正确对象的源文件:

$ make KDIR=/path/to/kernel V=1 | grep PREPRO
Run Code Online (Sandbox Code Playgroud)

如果可能的话,您还可以为每个模块提供两个单独的目录,并在每个模块code.c中都有一个指向公共实体的符号链接code.c.然而,这仍然是hackish并且感觉不对.