2017-07-13 1 views
0

Voici un exemple de Makefile qui utilise le mot-clé modules deux fois (à l'exception de ceux qui apparaissent dans le chemin et PHONY).À quoi les "modules" font-ils référence dans ce Makefile?

# Path to the kbuild Makefile of the kernel to compile against 
export KERNEL_BUILD_PATH := /lib/modules/$(shell uname -r)/build 
# Name of this kernel module 
export KERNEL_MODULE  := hello 
# List of kernel headers to include (e.g.: "linux/netdevice.h") 
export KERNEL_INCLUDE := 
# Path to the directory where kernel build artifacts should be stored 
export BUILD_DIRECTORY := build 
# List of C files to compile into this kernel module 
export C_FILES   := $(wildcard src/*.c) 
# List of all Rust files that will be compiled into this kernel module 
export RUST_FILES  := $(wildcard src/*.rs) 
# Base directory of the Rust compiler 
export RUST_ROOT   := /usr 

# Rust compiler settings 
export CARGO  = $(RUST_ROOT)/bin/xargo 
export CARGOFLAGS = 
export RCFLAGS = 
export RELEASE = 

-include ./config.mk 


# Top-level project directory 
export BASE_DIR := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST))))) 


# Prevent command echoing, unless the (Kbuild-style) `V=1` parameter is set 
ifneq "$(V)" "1" 
.SILENT: 
endif 


all modules: ${BUILD_DIRECTORY}/Makefile 
    @$(MAKE) -C "${KERNEL_BUILD_PATH}" M="${BASE_DIR}/${BUILD_DIRECTORY}" modules 
    cp "${BUILD_DIRECTORY}/${KERNEL_MODULE}.ko" "${KERNEL_MODULE}.ko" 

# Make sure there always is a target `Makefile` for kbuild in place 
${BUILD_DIRECTORY}/Makefile: kbuild.mk 
    @mkdir -p "${BUILD_DIRECTORY}/src" 
    cp "kbuild.mk" "${BUILD_DIRECTORY}/Makefile" 

insmod: 
    sudo insmod "${KERNEL_MODULE}.ko" 
    dmesg | tail 

rmmod: 
    sudo rmmod "${KERNEL_MODULE}" 
    dmesg | tail 

clean: 
    rm -rf "${BUILD_DIRECTORY}" 
    $(CARGO) clean 

test: ${KERNEL_MODULE}.ko 
    sudo insmod "${KERNEL_MODULE}.ko" 
    sudo rmmod "${KERNEL_MODULE}" 
    dmesg | tail -3 

.PHONY: all modules clean insmod rmmod test 

Mes questions sont les suivantes:

  • Dans la ligne 35, est-all modules référence à deux cibles distinctes par exemple all et modules ensemble? Si oui, pourquoi nommons-nous la même règle avec deux noms différents? La règle ne devient-elle pas récursive?
  • A la ligne 36, quelle est la signification du mot-clé module qui apparaît à la fin? À la ligne 36, que signifie M=?

Répondre

0
all modules 

est le nom tout à fait regrettable de la cible. Il sera appelé chaque fois que Makefile est "exécuté" sans qu'aucune cible ne soit spécifiée. Il sera également appelé lorsque vous appelez make -f Makefile modules. Je n'appellerais pas une cible de cette façon.

all modules: 
    @echo "Hello" 

.PHONY: all modules 

si vous exécutez celui-ci

> make 
Hello 

Quant à M =

value: 
    @echo $(M) 

M = passe simplement variable qui sera visible à l'intérieur Makefile

> make M=hohoho -f Makefile value 
hohoho 
+0

' tous les modules' est n ot le nom d'une cible. Cela signifie que deux cibles complètement différentes sont définies, 'all' et' modules', et elles ont toutes les deux la même recette. Donc, si vous lancez 'make all' ou' make modules', la même recette sera exécutée. C'est exactement la même chose que d'écrire la règle entière deux fois, une fois avec une cible 'all' et une fois avec une cible' modules'. Sauf, moins de frappe. – MadScientist

+0

Oui, vous avez raison. J'ai écrit "nom malheureux de la cible" dans un sens qu'il serait plus clair de faire "tous: modules" et ensuite créer des modules cibles. Mais tu as raison. Ce n'est pas une seule cible, mais deux séparées. – mko