我有源代码:
#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
具有相同的效果。