我有一个内核模块,我想使用 make
、make debug
、make test
中的任何一个来构建,唯一的区别是每个之间都有一个编译器的 -D
选项。这本质上是与Creating a debug target in Linux 2.6 driver module makefile相同的问题。 ,但那个被标记为已回答,在尝试了其他一些事情之后,我的问题仍然存在。
我在 makefile 中尝试了已弃用的 EXTRA_CFLAGS
选项:
debug:
$(MAKE) -C $(KDIR) M=$(PWD) EXTRA_CFLAGS="-DDEBUG" modules
以及较新的 ccflags-y
选项(即使在 debug
目标之外似乎也不起作用):
ccflags-y := -DDEBUG
debug:
$(MAKE) -C $(KDIR) M=$(PWD) modules
并在debug
目标之前设置CFLAGS
:
debug: CFLAGS_main.o=-DDEBUG
debug:
$(MAKE) -C $(KDIR) M=$(PWD) modules
但我发现完成我想要的任务的唯一方法是使用单独的构建脚本:
#!/bin/sh
case "$1" in
debug)
make CFLAGS_main.o=-DDEBUG
;;
*)
make
;;
esac
构建内核模块时有没有办法直接在 makefile 中执行此操作?
最佳答案
您应该能够使用使用 EXTRA_CFLAGS
的原始版本,但只需将 EXTRA_CFLAGS
替换为 ccflags-y
:
debug:
$(MAKE) -C $(KDIR) M=$(PWD) ccflags-y="-DDEBUG" modules
或将其替换为 CFLAGS_main.o
以将 CFLAGS 应用于单个对象:
debug:
$(MAKE) -C $(KDIR) M=$(PWD) CFLAGS_main.o="-DDEBUG" modules
编辑
正如 OP Roger Dueck 所提到的,在 make
命令行上设置变量具有全局效果。它会覆盖 makefile 中相同变量的任何设置,这可能是不可取的,特别是对于全局使用的变量,例如 ccflags-y 。为了避免这种情况,请使用您自己的 makefile 变量。在 Makefile 的“KBuild”部分上调用 $(MAKE)
的“正常”部分中,将 debug:
目标更改为以下内容,使用自定义变量你的选择(我在这里使用了FOO_CFLAGS
):
debug:
$(MAKE) -C $(KDIR) M=$(PWD) FOO_CFLAGS="-DDEBUG" modules
在上述规则调用的 Makefile 的“KBuild”部分中,使用以下命令将自定义 CFLAGS 从 FOO_CFLAGS
附加到 ccflags-y
:
ccflags-y += $(FOO_CFLAGS)
关于makefile - 如何在 makefile 中为内核模块构建目标设置预处理器指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54118602/