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

如何在makefile中为内核模块构建目标设置预处理器指令?,makefile,linux-kernel,linux-device-driver,kbuild,Makefile,Linux Kernel,Linux Device Driver,Kbuild,我有一个内核模块,我想用make、makedebug、maketest中的任何一个来构建,其中每个模块之间的唯一区别是编译器的-d选项。这基本上是同一个问题,但那个问题被标记为已回答,我的问题仍然存在,在尝试了其他一些事情之后 我在makefile中尝试了不推荐的EXTRA\CFLAGS选项: debug: $(MAKE) -C $(KDIR) M=$(PWD) EXTRA_CFLAGS="-DDEBUG" modules 以及较新的ccflags-y选项(即使在debug目标之外也似

我有一个内核模块,我想用
make
makedebug
maketest
中的任何一个来构建,其中每个模块之间的唯一区别是编译器的
-d
选项。这基本上是同一个问题,但那个问题被标记为已回答,我的问题仍然存在,在尝试了其他一些事情之后

我在makefile中尝试了不推荐的
EXTRA\CFLAGS
选项:

debug:
    $(MAKE) -C $(KDIR) M=$(PWD) EXTRA_CFLAGS="-DDEBUG" modules
以及较新的
ccflags-y
选项(即使在
debug
目标之外也似乎不起作用):

并在
debug
目标之前设置
CFLAGS

ccflags-y := -DDEBUG
debug:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
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\u CFLAGS
的原始版本,但只需将
EXTRA\u CFLAGS
替换为
ccflags-y

debug:
        $(MAKE) -C $(KDIR) M=$(PWD) ccflags-y="-DDEBUG" modules
ccflags-y += $(FOO_CFLAGS)
或者将其替换为
CFLAGS_main.o
以将CFLAGS应用于单个对象:

debug:
        $(MAKE) -C $(KDIR) M=$(PWD) CFLAGS_main.o="-DDEBUG" modules
编辑

正如OP Roger Dueck所提到的,在
make
命令行上设置变量具有全局效果。它覆盖makefiles中可能不需要的相同变量的任何设置,特别是对于全局使用的变量,如
ccflags-y
。要避免这种情况,请使用您自己的makefile变量。在Makefile调用“KBuild”部分上的
$(MAKE)
的“普通”部分,使用您选择的自定义变量将
debug:
目标更改为以下内容(我在这里使用了
FOO\u CFLAGS
):

在上述规则调用的Makefile的“KBuild”部分中,使用以下命令将自定义CFLAGS从
FOO\u CFLAGS
附加到
ccflags-y

debug:
        $(MAKE) -C $(KDIR) M=$(PWD) ccflags-y="-DDEBUG" modules
ccflags-y += $(FOO_CFLAGS)

使用
ccflags-y
的第一个解决方案是我尝试过的,但它对我不起作用-对你有用吗?为了进行测试,我使用
$(MAKE)-n…
,然后运行
makedebug2>&1 | grepdebug
。第二种方法有效!不过,有两件事我并不满意:(1)如果不使用
CFLAGS
(可能已经有其他选项),我无法将其全局应用于所有源代码,并且必须明确指定
main.o
,(2)这会破坏
CFLAGS\u main.o
(我还尝试了
CFLAGS\u main.o+=“-DDEBUG”
,但它仍然会覆盖而不是追加)。在接受这个答案之前,我会等待一段时间,看看是否有更好的答案。从3.16开始,我在多个内核上尝试了
ccflags-y
,它成功了,但正如您上面指出的,对
make
命令行上设置的变量的任何更改都将被忽略(除非makefile使用
override
命令对其进行更改)。请参阅我编辑的答案,了解使用您选择的自定义变量传递额外CFLAGS的方法。深入挖掘“KBuild”makefile并不是那么简单(我的makefile不包括
ccflags-y
额外CFLAGS
),但看起来似乎是让一切都完美运行的唯一方法。很高兴,我可以继续你的第一个答案,现在使用
CFLAGS\u main.o=“-DDEBUG”
。谢谢!