003
28.11.2010, 18:21 Uhr
Pablo
Supertux (Operator)
|
das ist eine Makefile, um kernel Modules zu bauen.
Die Makefile in Linux (damit sind die Makefile im Source Code gemeint) deklarieren die Variablen obj-m, die eine Liste von Objekten hat, die kompiliert werden müssen.
PWD := $(shell pwd) ist nicht anders als PWD = /der/path/von/wo/du/make/ausführst
mit make -C /usr/src/linux SUBDIRS=$(PWD) modules kompilierst du die Sachen.
Die -C Option sagt, dass nicht die Makefile vom aktuellen Verzeichnis (default) sondern die in /usr/src/linux nehmen soll.
SUBDIRS=$(PWD) ist die Deklaration einer internen Variablen, die in /usr/src/linux/Makefile verwendet wird.
'modules' ist der Target, der von 'make' gebaut werden soll. Makefiles können verschiedene Targets haben:
Code: |
default: @echo "Ich bin default target"
kernel: @echo "Ich bin kernel target"
modules: @echo "Ich bin modules target"
clean: @echo "Ich bin clean target"
|
Die folgenden Befehle
Code: |
$ make $ make clean $ make kernel $ make modules
|
erzeugen folgenden Output
Code: |
Ich bin default target Ich bin clean target Ich bin kernel target Ich bin modules target
|
make -C /usr/src/linux SUBDIRS=$(PWD) modules "ruft" also den Target 'modules' in /usr/src/linux/Makefile auf. Da SUBDIRS=/der/path/von/wo/du/make/ausführst deklariert ist, weiß /usr/src/linux/Makefile, von wo aus die Source Dateien sich befinden und kann sie kompilieren.
Eigentlich sollte eine Makefile für externe Modules eher so aussehen
Code: |
ifneq ($(KERNELRELEASE),)
obj-m := module.o
else
# ermittle den Pfad vom running-kernel KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
endif
|
/usr/src/linux/Makefile deklariert die Variable KERNELRELEASE. Wenn du außerhalb des Kernel 'make' ausführst, dann ist KERNELRELEASE Variable leer und alles nach dem else wird ausgeführt. Wenn der make -C ... modules Befehl ausgeführt wird, wird dann der Target 'modules' von /usr/src/linux/Makefile ausgeführt. Dieses deklariert KERNELRELEASE und includiert die $(SUBDIRS)/Makefile Datei (die ursprüngliche) und in diesem Fall wird das vor dem else ausgeführt. obj-m ist gesetzt und module.c wird dann mit den richtigen Flags kompiliert und gelinkt.
Es ist ein cleveres System, um Sachen außerhalb des Kernels zu kompilieren, aber am Anfang dauert es ein bisschen, bis man verstanden hat, wie das alles funktioniert. -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 28.11.2010 um 18:25 Uhr von Pablo editiert. |