====== 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)