gpt4 book ai didi

makefile - 树外内核模块 : Multiple module, 单个 Makefile,相同的源文件,不同的构建选项

转载 作者:行者123 更新时间:2023-12-02 19:20:22 25 4
gpt4 key购买 nike

我正在使用共享源代码构建一组 Linux 内核模块。据我了解,Makefile 必须命名为“Makefile”,因此我必须使用相同的 Makefile 来构建两个不同的模块。如何在同一个 Makefile 中使用相同的源代码但使用两个不同的构建选项构建两个不同的模块?

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

obj-m := module1.o module2.o

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

module1-objs = module1_code.o other_code.o
module2-objs = module2_code.o other_code.o

我希望从 code.c 构建 module1_code.omodule2_code.o,但使用不同的选项。具体来说,我想要一个带有宏定义的 -DPREPROCEFFOR_FLAG=1module1_code.o,以及在没有该宏的情况下构建的 module2_code.o

据我了解,Linux中使用的Makefiles系统隐式推断,对于名为“code.o”的目标文件,源文件名为“code.c”,那么我将如何实现这一点?有可能吗?有更好的方法吗?

最佳答案

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

您需要一种方法来构建 code.c具有不同 cflags的不同目标文件。可能有一种干净的方法可以做到这一点(没有机会使用 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

只需调用:

$ make KDIR=/path/to/kernel

您可以使用以下方法验证预处理器标志是否已传递到正确对象的源文件:

$ make KDIR=/path/to/kernel V=1 | grep PREPRO

如果可能的话,您还可以为每个模块设置两个单独的目录,并有一个符号链接(symbolic link) code.c每一个都指向共同的真实code.c 。然而,这仍然是黑客行为并且感觉不对。

关于makefile - 树外内核模块 : Multiple module, 单个 Makefile,相同的源文件,不同的构建选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18386182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com