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

标签 makefile linux-kernel linux-device-driver kbuild

我有一个内核模块,我想使用 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 "$1" 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 的“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)

关于makefile - 如何在 makefile 中为内核模块构建目标设置预处理器指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54118602/

相关文章:

c++ - 使用 boost 库编译 C++ 代码

c - 获取错误 :Too few arguments where i clearly have the correct number

c - 非零 TCP 窗口比例选项的原因

c - 从用户空间访问 i2c 扩展器的 GPIO 引脚

linux - 什么是 proc 和 sysfs 条目

linux - 如何将非自由的 ko 文件(驱动程序)编译到内核中?

makefile - 制作文件CFLAGS

c - Makefile -o,为什么需要.o

makefile - Makefile 先决条件中的目标名称

makefile - 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?