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 exempleall
etmodules
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 signifieM=
?
' 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
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