2013-03-15 4 views
9

zu Linux-Kernel-Modul Quellcode Parameter zu übergeben habe ich den Quellcode:Wie aus Make-Datei

#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"); 
} 

und eine Make-Datei:

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 

Nun, wie gehe ich den BUILD_NUMBER Parameter aus der Make-Datei zum Quellcode?

+0

ist es Ihr ganzes Makefile? – piokuc

+0

Das Makefile, für das ich es verwenden möchte, ist größer, aber das obige wird zur besseren Übersichtlichkeit gekürzt. –

Antwort

10

Da das Linux-Build-System Kernel-Makefiles verwendet, die vernünftigerweise nicht geändert werden können. Ich würde vorschlagen, Ihre Versionsnummer direkt in den Quellcode anstatt in das Makefile zu legen.

Es gibt eine Möglichkeit zu denken. Sie können eine Umgebungsvariable CPPFLAGS definieren. Es sollte vom Kernel-Makefile an die C-Compiler-Befehlszeile übergeben werden. Wenn Sie diese Variable CPPFLAGS als -DVERSION=42 definieren, können Sie dieses Makro VERSION möglicherweise in Ihrer Quelldatei verwenden.

all: 
    CPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

Beachten Sie, dass CPPFLAGS steht für "C PreProcessor FLAGS". Es hat nichts mit C++ zu tun.

Nach dem Test. Das funktioniert nicht. Es gibt jedoch eine Lösung. Das Kernel-Makefile erlaubt (und verwendet) die Definition der KCPPFLAGS-Umgebungsvariablen, die dem Kernel-Makefile hinzugefügt wird, das eigene CPPFLAGS definiert.

Sie haben zu verwenden:

all: 
    KCPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD) 
+0

Zusätzlich zu BUILD_NUMBER möchte ich auch ein Build-Datum und eine Zeit angeben, die nicht so einfach manuell im Quellcode geändert werden müssen. –

+1

Die Lösung mit 'KCPPFLAGS' funktioniert. Verwenden Sie das, um Ihre zwei Makros mit 'KCPPFLAGS =" - DVERSION = $ (BUILD_NUMBER) -DDATE = $ (Shell-Datum) "' zu definieren. –

+1

Vielen Dank!Mit Ihrer Antwort fand ich auch, dass das folgende funktioniert: make -C/lib/modules/$ (shell uname -r)/build M = $ (PWD) EXTRA_CFLAGS = "- DBUILD_NUMBER = $ (BUILD_NUMBER)" Module –

0

Versuchen Zugabe:

-DBUILD_NUMBER=$(BUILD_NUMBER) 

Um die Compiler-Parameter. Das sollte die gleiche Wirkung haben wie die Definition von BUILD_NUMBER mit einer #define in Ihrem Code.

+0

Nein. '-D' ist ein' gcc' Kommandozeilenargument, unbekannt nach 'make'. –

+0

Yep - dachte selbst daran - schon geändert;) Ich bin zu sehr gewöhnt geworden, um scheinbar zu ... – sonicwave

+0

Die Compiler-Parameter sind hier nicht angegeben, in diesem Makefile. Es ist nicht so leicht! –

0

Auf der Kommandozeile, die richtige Art und Weise Argumente des Führens nach gcc an den Kernel Documentation/kbuild/makefiles.txt der ist CFLAGS_MODULE einzustellen.

Zum Beispiel Module im aktuellen Verzeichnis bauen mit BUILD_NUMBER=42:

make CFLAGS_MODULE=-DBUILD_NUMBER=42 M="$PWD" modules 

Wenn Sie mehr -D zur Verfügung stellen mögen, verwenden Sie einfache Anführungszeichen:

make CFLAGS_MODULE='-DBUILD_NUMBER=42 -DSOME_OTHER_MACRO' M="$PWD" modules 

Hinweis: das ist nicht beschränkt auf Einstellung Makros, zum Beispiel könnten Sie CFLAGS_MODULE=-O0 verwenden.