2013-03-15 62 views
9

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

#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"); 
} 

和生成文件:

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文件到源代码?

+0

它是你的整个Makefile吗? – piokuc 2013-03-15 11:23:14

+0

我想使用它的makefile文件较大,但为了清晰起见,上面的内容缩短了。 – 2013-03-15 11:42:10

回答

10

由于Linux构建系统使用内核提供的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) 
+0

除了BUILD_NUMBER之外,我还希望包含构建日期和时间,这不便于直接在源代码中手动更改。 – 2013-03-15 11:44:18

+1

“KCPPFLAGS”解决方案有效。用'KCPPFLAGS =“ - DVERSION = $(BUILD_NUMBER)-DDATE = $(shell date)”'来定义你的两个宏。 – 2013-03-15 11:46:49

+1

非常感谢!使用您的答案,我还发现以下工作:make -C/lib/modules/$(shell uname -r)/ build M = $(PWD)EXTRA_CFLAGS =“ - DBUILD_NUMBER = $(BUILD_NUMBER)”模块 – 2013-03-15 11:51:43

0

尝试增加:

-DBUILD_NUMBER=$(BUILD_NUMBER) 

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

+0

编号'-D'东西是'gcc'命令行参数,由'make'未知。 – 2013-03-15 11:25:10

+0

是的 - 想到这一点 - 我已经改变了它;)我已经习惯了很明显... – sonicwave 2013-03-15 11:25:33

+0

在这个Makefile中没有给出编译参数。它不是那么容易! – 2013-03-15 11:28:04

0

在命令行,传递参数的正确方法根据内核的Documentation/kbuild/makefiles.txt是设置CFLAGS_MODULE与gcc。

例如,要建立在当前目录模块,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