Durante l'apprendimento dei moduli del kernel Linux posso vedere (finora da due fonti) due modi per scrivere Makefile. Il primo è qualcosa di simile:Programmazione del modulo del kernel Linux: makefile
ifneq ($(KERNELRELEASE),)
obj-m := module.o
else
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
endif
Quest'ultima è meno complessa:
obj-m := module.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
O compilazione makefile porta a modulo compilato con successo. Il mio apprendimento è accompagnato dal libro LDD3 e quello che ho letto finora è il seguente:
Questo makefile viene letto due volte su una build tipica. Quando il makefile viene richiamato dalla riga di comando, si accorge che la variabile KERNELRELEASE non è stata impostata. Individua la directory di origine del kernel sfruttando il fatto che il collegamento simbolico creato nella directory dei moduli installati punta verso l'albero di compilazione del kernel. Se non stai effettivamente eseguendo il kernel che stai creando, puoi fornire un'opzione KERNELDIR = sulla riga di comando , impostare la variabile di ambiente KERNELDIR o riscrivere la linea che imposta KERNELDIR nel makefile. Una volta che l'albero dei sorgenti del kernel è stato trovato, il makefile richiama il default: target, che esegue un secondo comando make (parametrizzato in il makefile come $ (MAKE)) per richiamare il kernel build system come descritto in precedenza. Durante la seconda lettura, il makefile imposta obj-m, e i makefile del kernel si occupano dello che effettivamente crea il modulo.
Se il makefile viene letto due volte, il secondo approccio dovrebbe portare alla ricorsione, non è vero?
La ricorsione (in questo contesto) è definita come un'istanza di Make che richiama un'altra istanza di Make. Quindi il secondo approccio riguarda la ricorsione. Se stai chiedendo se il secondo approccio porta a un ciclo infinito, la risposta è no, perché la seconda istanza di Make ha "moduli" come target, non "tutti". Questo risponde alla tua domanda? – Beta
Beta, dovresti postarlo come risposta e non come commento. Ti avrei ingannato. Vorrei aggiungere che entrambi gli approcci utilizzano la ricorsione per funzionare, ma il primo risultato rende leggermente più ovvio che la regola "predefinita" o "tutto" non verrà chiamata al secondo passaggio. –
@Beta, puoi spiegare più dettagliatamente in che modo esattamente questo non porta alla ricorsione all'interno di make? Forse postare la tua risposta e io ti inviterò in anticipo ^^. (Guardare il codice sorgente del Makefile di kbuild non può portarmi al punto in cui riesco a capire gli interni) – mesmerizingr