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?
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
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. –
@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