2013-03-15 61 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