11

我有源代码:

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

4

3 回答 3

11

由于 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 PreProcessor FLAGS”。它与 C++ 无关。

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

你必须使用:

all:
    KCPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD) 
于 2013-03-15T11:24:07.150 回答
4

在命令行中,根据内核的D​​ocumentation/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.

于 2016-12-15T11:08:53.087 回答
0

尝试添加:

-DBUILD_NUMBER=$(BUILD_NUMBER)

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

于 2013-03-15T11:22:54.877 回答