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



我有源代码:

#include <linux/module.h>   
#include <linux/kernel.h>   
int init_module(void)
{
    printk(KERN_INFO "Hello world %in", 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传递到源代码?

由于Linux构建系统使用内核提供的makefile文件,因此可以合理地不进行更改。我建议把你的版本号直接放到源代码中,而不是放在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) 

在命令行中,根据内核的Documentation/kbuild/makeffiles .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

尝试添加:

-DBUILD_NUMBER=$(BUILD_NUMBER)

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

最新更新