Ceci est une ancienne révision du document !
Makefile
Les commandes sont à indenter avec des tabulations.
Afficher ce que lance Make
make SHELL='sh -x' <commande>
ou (au moins avec cmake):
make VERBOSE=1
Mode verbeux natif de make: jouer avec l'option –debug|-d.
Règles implicites
Pour chaque truc.c, Makefile sait implicitement qu'il faut exécuter $(CC) $(CFLAGS) $< -o $@ $(LDLIBS)
Il suffit alors d'avoir ce genre de Makefile:
CC=gcc CFLAGS=-W -Wall -ansi -pedantic # pour exécuter du shell, utiliser l'anti-apostrophe LDFLAGS= # Extra flags to give to compilers when they are supposed to invoke the linker, ‘ld’, such as -L. LDLIBS= # les -lfoo EXEC=hello all: $(EXEC) clean: rm -f $(EXEC)
Voir la doc: https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
Variables internes
$@: cible$<: première dépendance$^: toutes les dépendances$?: liste des dépendances plus récentes que la cible
Règles conditionnelles
target: ifeq ($(ENV_VAR), 1) # Something else # Another thing endif
Éliminer l'extension d'une cible
Il suffit d'utiliser la commande basename provenant de coreutils (source) :
RR-babla.pdf: rr.tex rubber --pdf --jobname $(basename $@) $< # rubber adds itself the .pdf extension to the output file
Appeler une commande dans une règle
foo: echo $(shell date)