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

时间:2013-03-15 11:13:26

标签: linux gcc module makefile kernel

我有源代码:

#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传递到源代码?

3 个答案:

答案 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