如何在 makefile 中为内核模块构建目标设置预处理器指令?
How to set preprocessor directives in makefile for kernel module build target?
我有一个内核模块,我想用 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 "" 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)
我有一个内核模块,我想用 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 "" 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)