2013-03-15 7 views
9

mam kod źródłowy:Jak przekazać parametry z makefile do kodu źródłowego modułu jądra 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"); 
} 

i 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 

Teraz jak mam przekazać parametr BUILD_NUMBER z makefile do kodu źródłowego?

+0

czy to Twoja cała Makefile? – piokuc

+0

Plik Makefile, którego chcę użyć, jest większy, ale powyższe jest skrócone dla jasności. –

Odpowiedz

10

W systemie kompilacji systemu Linux są używane pliki Makefile, których zasadnie nie można zmienić. Proponuję umieścić twój numer wersji bezpośrednio w kodzie źródłowym zamiast w Makefile.

Istnieje możliwość pomyślenia. Możesz zdefiniować zmienną środowiskową CPPFLAGS. Powinien zostać przekazany przez plik Makefile jądra do wiersza poleceń kompilatora C. Jeśli zdefiniujesz tę zmienną CPPFLAGS jako -DVERSION=42, możesz użyć tego makro VERSION w pliku źródłowym.

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

Należy pamiętać, że CPPFLAGS oznacza "FLAGI PRZETWORNIKA C". Nie ma związku z C++.

Po przetestowaniu. To nie działa. Istnieje jednak rozwiązanie. Plik Makefile jądra pozwala (i wykorzystuje) definicję zmiennej środowiskowej KCPPFLAGS, która zostanie dodana do jądra zdefiniowanego przez Makefile jako własny CPPFLAGS.

Musisz użyć:

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

Oprócz BUILD_NUMBER chciałbym również dołączyć datę i godzinę kompilacji, co nie jest tak wygodne, że trzeba ręcznie zmienić kod źródłowy. –

+1

Tho rozwiązanie z 'KCPPFLAGS' działa. Użyj tego, aby zdefiniować swoje dwa makra za pomocą 'KCPPFLAGS =" - DVERSION = $ (BUILD_NUMBER) -DDATE = $ (data powłoki) "'. –

+1

Wielkie dzięki!Korzystając z odpowiedzi, stwierdziłem również, że następujące prace: make -C/lib/modules/$ (shell uname -r)/build M = $ (PWD) EXTRA_CFLAGS = "- DBUILD_NUMBER = $ (BUILD_NUMBER)" moduły –

0

spróbuj dodać:

-DBUILD_NUMBER=$(BUILD_NUMBER) 

do parametrów kompilatora. To powinno mieć taki sam efekt jak określenie BUILD_NUMBER z kodem #define.

+0

Nie. '-D' coś jest argumentem wiersza poleceń' gcc', nieznanym przez 'make'. –

+0

Tak - myślałem o tym - już to zmieniłem;) Przyzwyczaiłem się zbytnio do cmake pozornie ... – sonicwave

+0

Parametry kompilatora nie są tutaj podane, w tym Makefile. To nie jest takie proste! –

0

W wierszu polecenia właściwą drogę argumentów przejściu do gcc według jądra Documentation/kbuild/makefiles.txt jest ustawienie CFLAGS_MODULE.

Na przykład, aby zbudować moduły w bieżącym katalogu z BUILD_NUMBER=42:

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

Jeśli chcesz, aby zapewnić kilka -D używać apostrofów:

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

Note: to nie ogranicza się do ustanowienia makra, na przykład można użyć CFLAGS_MODULE=-O0.

Powiązane problemy