2013-06-12 14 views
8

Beim Lernen Linux Kernel-Module kann ich sehen (so weit von zwei Quellen) zwei Möglichkeiten zum Schreiben Makefile. Die erste ist, so etwas wie:Linux-Kernel-Modul Programmierung: Makefile

ifneq ($(KERNELRELEASE),) 
     obj-m := module.o 
else 
default: 
     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules 
endif 

Letzteres ist weniger komplex:

obj-m := module.o 
all: 
     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules 

Entweder Make-Datei Kompilierung führt zu erfolgreich kompilierte Modul. Mein Lernen wird vom LDD3-Buch begleitet und das, was ich bisher gelesen habe, ist das nächste:

Dieses Makefile wird in einem typischen Build zweimal gelesen. Wenn das Makefile von der Befehlszeile aus aufgerufen wird, bemerkt es, dass die Variable KERNELRELEASE nicht festgelegt wurde. Es findet das Kernel-Quellverzeichnis, indem es die Tatsache ausnutzt, dass der symbolische Link, der im Verzeichnis der installierten Module erstellt wurde, auf den Kernel-Build-Baum verweist. Wenn Sie den Kernel, für den Sie erstellen, nicht ausführen, können Sie eine KERNELDIR = -Option auf der -Befehlszeile angeben, die KERNDIR-Umgebungsvariable setzen oder die Zeile, die KERNELDIR im Makefile setzt, neu schreiben. Sobald der Kernel-Quellbaum gefunden wurde, ruft das Makefile den Standard: target auf, der einen zweiten make-Befehl ausführt (parametrisiert in das Makefile als $ (MAKE)), um das Kernel-Build-System wie zuvor beschrieben aufzurufen. Beim zweiten Lesen setzt das Makefile obj-m, und die Kernel-Makefiles kümmern sich um tatsächlich das Modul zu bauen.

Wenn das Makefile zweimal gelesen wird, sollte der zweite Ansatz zur Rekursion führen, oder?

+5

Rekursion (in diesem Kontext) ist als eine Instanz von Make definiert, die eine andere Instanz von Make aufruft. Der zweite Ansatz beinhaltet Rekursion. Wenn Sie fragen, ob der zweite Ansatz zu einer Endlosschleife führt, lautet die Antwort nein, da die zweite Instanz von Make "Module" als Ziel hat und nicht "alle". Beantwortet das deine Frage? – Beta

+1

Beta, sollten Sie das als Antwort und nicht als Kommentar posten. Ich habe dich aufgezogen. Ich würde hinzufügen, dass beide Ansätze Rekursion verwenden, um zu arbeiten, aber das erste Ergebnis macht es etwas offensichtlicher, dass die Regel "Standard" oder "alle" nicht beim zweiten Durchlauf aufgerufen wird. –

+0

@Beta, können Sie genauer erklären, wie genau dies nicht zu Rekursion innerhalb führt? Möglicherweise posten Sie Ihre Antwort und ich werde Sie auf den neuesten Stand bringen ^^. (Wenn ich den Quellcode von kbuilds Makefile beobachte, kann ich nicht zu dem Punkt kommen, an dem ich die Interna herausfinden kann) – mesmerizingr

Antwort

3

Wenn Sie das Makefile zum ersten Mal aufrufen, indem Sie auf der Konsole #make eingeben, übergeben Sie kein Ziel. So wird es standardmäßig den Zielnamen all: im Makefile aufrufen.

Innerhalb der all: Ziel übergeben Sie das Ziel als Module.So, diesmal wird es die Module statt all: Ziele zu bauen.

SO wird es nicht unendlich Rekursion sein.