====== Makefile ======
* [[https://gl.developpez.com/tutoriel/outil/makefile/]]
* [[https://renenyffenegger.ch/notes/development/make/index]]
* [[https://connect.ed-diamond.com/GNU-Linux-Magazine/glmf-247/c-est-l-histoire-d-un-make...|C’est l’histoire d’un make…]]
Les commandes sont à indenter avec des tabulations.
==== Afficher ce que lance Make ====
make SHELL='sh -x'
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 ====
[[https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_7.html|Source]]
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 ([[https://stackoverflow.com/questions/13995906/get-filename-without-extension-within-makefile|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)