2010-10-22 32 views
3

Il y a longtemps, je me souviens d'utiliser Solaris make, et ils avaient une option ingénieuse qui détecterait automatiquement quand les options du compilateur avaient changé, et reconstruirait toutes les règles de manière appropriée. Par exemple, supposons que je passe de:comment puis-je faire dépendre un makefile des options de construction

g ++ -O3

à

g ++ -g

Ensuite, tous les fichiers doivent être recompilés. J'utilise gnu make, et je n'ai trouvé aucune fonctionnalité comme celle-ci, et je me demandais si quelqu'un avait un moyen de le faire fonctionner.

+0

Question similaire: http://stackoverflow.com/questions/3236145/force-gnu-make-to-rebuild-objects-affected-by-compiler-definition – slowdog

Répondre

4

Un simplegmake est d'écrire les options gcc dans un fichier. Ensuite, dans le Makefile, lisez ces options dans une variable, utilisez cette variable dans la ligne de commande gcc, puis ajoutez la dépendance pour tous les fichiers objet à ce fichier d'option (peut être effectuée dans la règle de modèle).

+0

Ou mieux, utilisez le contenu de ce fichier pour régler le Variable 'CFLAGS' (ou' CXXFLAGS' pour C++). –

+0

La définition de la variable 'CFLAGS' a le problème que vous remplacez la variable d'environnement shell du même nom. –

+1

Cette solution est simple et élégante. Je ne comprends pas le commentaire du CFLAGS. Cependant, il ne suffit pas de simplement écrire le fichier, vous devez comparer si les nouveaux arguments sont différents, et seulement écrire le fichier s'il est changé. Sinon, le fichier change toujours et les règles seront toujours activées. Comment faire pour comparer le contenu du fichier avec la variable, et si c'est différent, écrire dans le fichier?Quelque chose comme: COMPILE: = g ++ $ (debug) $ (OPT) LASTCOMPILE: = 'cat si $ (COMPILE) = $ (LASTCOMPILE)
echo $ (COMPILE)> .compile.txt est-ce si proche? – Dov

1

Faites votre cible dépendra du makefile lui-même:

all: a.out 

a.out: boo.c Makefile 
     cc -O3 -g boo.c 
+0

C'est une force très brute. Changez n'importe quoi dans le makefile, même un espace, et tout recompile. Ce n'est pas très bon. – Dov

+0

Hmm, vous ne recompilez pas lorsque vous modifiez vos makefiles? Pourquoi les changez-vous alors? –

+0

Eh bien, l'ajout d'un seul fichier source ne devrait vraiment déclencher qu'une compilation de ce fichier et un lien vers une bibliothèque ou un binaire. Il n'a pas à reconstruire _everything_ pour être correct. –

1

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.

+1

Merci pour l'expression "systèmes de construction cthuloidoïde", je l'adore :-) Voici une variante de votre solution qui évite l'invocation make récursive: http://stackoverflow.com/questions/3236145/force-gnu-make-to -rebuild-objets-affectés-par-compilateur-définition/3237349 # 3237349 – slowdog