如何在 makefile 中为内核模块构建目标设置预处理器指令?

How to set preprocessor directives in makefile for kernel module build target?

我有一个内核模块,我想用 makemake debugmake 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 "" 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 的 "normal" 部分调用 "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)