est ici un moyen de base pour le faire (même si je suis convaincu que c'est une horrible idée, voir ci-dessous):
-include CFLAGS.save
CFLAGS := -O2 -g
all: foo
CFLAGS.save:
echo 'CFLAGS_SAVE := $(CFLAGS)' > [email protected]
ifeq ($(CFLAGS),$(CFLAGS_SAVE))
%.o: %.c CFLAGS.save
gcc $(CFLAGS_SAVE) -c -o [email protected] $<
else
.PHONY: CFLAGS.save
%.o: %.c CFLAGS.save
$(MAKE) [email protected]
endif
foo: foo.o
gcc -o [email protected] $^
Voici ce qui se passe: Avant toute compilation, les CFLAGS
actuels sont écrits à CFLAGS.save
. Si CFLAGS
n'est pas égal à CFLAGS_SAVE
, l'utilisateur doit les avoir modifiés. Si c'est le cas, nous déclarons CFLAGS.save
être faux, donc make
va le reconstruire. Notez également que si CFLAGS
a changé, nous le mettrons à jour mais nous aurons toujours l'ancienne valeur en mémoire. Par conséquent, nous devons invoquer récursivement make
pour chaque fichier source. Pas cool sur un gros projet.
L'autre problème est que si vous omettez de spécifier CFLAGS
sur la ligne de commande, il reviendra et reconstruira tout avec la valeur par défaut. Vous pouvez contourner ce problème en testant le $(origin)
de CFLAGS
, mais sérieusement, non. Mon éthique professionnelle ne me permettra pas de supporter cela.
make
est censé être simple. Les distributeurs ont déjà assez de mal à comprendre les abus des outils de construction par les emballeurs (malheureusement, la plupart des reproches à automake
est dû à cela). S'il vous plaît, dites non aux systèmes de construction de Cthuloid. En outre, make clean all CFLAGS='-Whatever -foo'
fonctionnera aussi bien.
Question similaire: http://stackoverflow.com/questions/3236145/force-gnu-make-to-rebuild-objects-affected-by-compiler-definition – slowdog