1

我有一个内核模块,我想用 , , 中的任何一个来构建makemake debug其中make test每个模块之间的唯一区别是-D编译器的一个选项。这与在 Linux 2.6 驱动程序模块 makefile 中创建调试目标本质上是相同的问题,但是在尝试了其他一些事情之后,这个问题被标记为已回答,我的问题仍然存在。

我已经EXTRA_CFLAGS在我的 makefile 中尝试了不推荐使用的选项:

debug:
    $(MAKE) -C $(KDIR) M=$(PWD) EXTRA_CFLAGS="-DDEBUG" modules

以及较新的ccflags-y选项(即使在目标之外似乎也不起作用debug):

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

CFLAGS在目标之前设置debug

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中执行此操作?

4

1 回答 1

3

您应该能够使用您使用的原始版本EXTRA_CFLAGS,但只需替换EXTRA_CFLAGSccflags-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 变量。$(MAKE)在“KBuild”部分调用的 Makefile 的“正常”部分中debug:,使用您选择的自定义变量(我FOO_CFLAGS在此处使用)将目标更改为以下内容:

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

在上述规则调用的 Makefile 的“KBuild”部分中,使用以下内容将自定义 CFLAGS 附加FOO_CFLAGSccflags-y

ccflags-y += $(FOO_CFLAGS)
于 2019-01-10T15:21:39.717 回答