如何在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”
。谢谢!