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

Ras*_*sen 11 linux gcc kernel module makefile

我有源代码:

#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");
}
Run Code Online (Sandbox Code Playgroud)

和一个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
Run Code Online (Sandbox Code Playgroud)

现在如何将BUILD_NUMBER参数从makefile传递给源代码?

Did*_*set 11

由于Linux构建系统使用内核提供的Makefiles,这些Makefile可以合理地不被更改.我建议将您的版本号直接放在源代码中而不是Makefile中.

有可能想到.您可以定义CPPFLAGS环境变量.它应该由内核Makefile传递给C编译器命令行.如果将此CPPFLAGS变量定义为-DVERSION=42,则可以VERSION在源文件中使用此宏.

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

注意,CPPFLAGS代表"C PreProcessor FLAGS".它与C++无关.

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

你必须使用:

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