我有源代码:
#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传递到源代码?
答案 0 :(得分: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
请注意,CPPFLAGS
代表“C PreProcessor FLAGS”。它与C ++无关。
经过测试。这不起作用。但是有一个解决方案。内核Makefile允许(并使用)KCPPFLAGS环境变量的定义,该变量将被添加到内核Makefile中定义自己的CPPFLAGS。
你必须使用:
all:
KCPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD)
答案 1 :(得分:0)
尝试添加:
-DBUILD_NUMBER=$(BUILD_NUMBER)
给你的编译器参数。这应该与在代码中使用BUILD_NUMBER
定义#define
具有相同的效果。
答案 2 :(得分:0)
在命令行中,根据内核的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
。