如何从makefile传递参数给Linux内核模块源代码

11

我有源代码:

#include <linux/module.h>   
#include <linux/kernel.h>   

int init_module(void)
{
    printk(KERN_INFO "Hello world %i\n", BUILD_NUMBER);
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}

以及一个 makefile:

obj-m += hello-1.o

BUILD_NUMBER := 42

# How to pass BUILD_NUMBER to hello-1.c ???

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

现在我该如何将BUILD_NUMBER参数从makefile传递到源代码中?


这是您的整个Makefile吗? - piokuc
我想要使用的makefile更大,但上面的内容为了清晰起见而缩短了。 - Rasmus Friis Kjeldsen
3个回答

11

由于Linux构建系统使用内核提供的Makefiles,这些Makefiles通常不会更改。我建议直接将您的版本号放入源代码中,而不是放在Makefile中。

但也有一种可能性。您可以定义一个CPPFLAGS环境变量,内核Makefile应该将其传递给C编译器命令行。如果您将此CPPFLAGS变量定义为-DVERSION=42,那么您可能可以在源文件中使用VERSION宏。

all:
    CPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

请注意,CPPFLAGS代表“C预处理器标志”,与C ++无关。

经过测试,这不起作用。但是有一个解决方案。内核Makefile允许(并使用)定义KCPPFLAGS环境变量,该变量将添加到内核Makefile定义的自己的CPPFLAGS中。

您必须使用:

all:
    KCPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD) 

除了BUILD_NUMBER之外,我还想包含一个构建日期和时间,直接在源代码中手动更改并不方便。 - Rasmus Friis Kjeldsen
1
使用 KCPPFLAGS 的解决方案可行。使用它来定义您的两个宏,命令为 KCPPFLAGS="-DVERSION=$(BUILD_NUMBER) -DDATE=$(shell date)" - Didier Trosset
1
非常感谢!使用您的答案,我还发现以下命令可以工作:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) EXTRA_CFLAGS="-DBUILD_NUMBER=$(BUILD_NUMBER)" modules - Rasmus Friis Kjeldsen
要使用DATE,必须使用大量的shell转义。以下将把DATE定义为字符串:KCPPFLAGS="-DDATE=\""$(shell date)"\"" - Rasmus Friis Kjeldsen
KCPPFLAGS解决方案会发出警告:“警告:将环境中的$KCPPFLAGS([cut out])附加到内核$CPPFLAGS”。而EXTRA_CFLAGS解决方案则不会。 - Rasmus Friis Kjeldsen
确实,KCPPFLAGS会发出警告(在我看来这是一件好事),但至少它能够工作。使用EXTRA_CFLAGS(或EXTRA_CPPFLAGS)是不起作用的。宏定义没有传递给编译器。 - Didier Trosset

4
在命令行中,根据内核的 Documentation/kbuild/makefiles.txt,传递参数给 gcc 的正确方法是设置 CFLAGS_MODULE
例如,要在当前目录下使用 BUILD_NUMBER=42 构建模块:
make CFLAGS_MODULE=-DBUILD_NUMBER=42 M="$PWD" modules

如果您想提供多个-D,请使用单引号:
make CFLAGS_MODULE='-DBUILD_NUMBER=42 -DSOME_OTHER_MACRO' M="$PWD" modules

注意:这不仅限于设置宏,例如您可以使用CFLAGS_MODULE=-O0

0

尝试添加:

-DBUILD_NUMBER=$(BUILD_NUMBER)

将它添加到您的编译器参数中。这应该具有与在代码中使用#define定义BUILD_NUMBER相同的效果。


没有-D这个东西是make不认识的gcc命令行参数。 - Didier Trosset
是的-我自己考虑过了-已经改过了;) 显然我用惯cmake了... - sonicwave
编译器参数在这个Makefile中没有给出。这并不容易! - Didier Trosset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接