CFLAGS, CCFLAGS, CXXFLAGS-que contrôlent exactement ces variables?

J'utilise GNU make pour compiler mon code C++, et j'aimerais comprendre comment rendre mes compilations personnalisables.

, j'ai lu à différents endroits que CFLAGS, CCFLAGS et CXXFLAGS sont utilisés à cette fin. Alors, comment dois-je utiliser? Si j'ai des arguments de ligne de commande supplémentaires pour le compilateur, devrais-je les ajouter à CFLAGS ou les ajouter? Est-il une pratique courante?

Pourquoi les trois variables différentes? Je suppose que le compilateur C devrait obtenir CFLAGS et CCFLAGS, tandis que le C++ compilateur doit obtenir CFLAGS et CXXFLAGS - ai-je raison?

L'utilisateur humain est-il censé définir ces variables? Faire des outils automatiques(automake, autoconf, etc) les définir? Le système linux que je suis censé utiliser ne définit aucune de ces variables - est-ce typique?

Actuellement, mon Makefile ressemble à ceci, et je pense que c'est un peu sale:

ifdef code_coverage
    GCOV_FLAG := -fprofile-arcs -ftest-coverage
else
    GCOV_FLAG :=
endif

WFLAGS := -Wall

INC_FLAGS := -Istuff -Imore_stuff -Ietc

CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS)

... (somewhere in the makefile, the command-line for compilation looks like this)
    $(CC) $(CCFLAGSINT) -c $< -o $@

... (somewhere in the makefile, the command-line for linking looks like this)
    $(CC) $(GCOV_FLAG) $(CCFLAGSINT) $(OBJLIST) $(LDFLAGS) -o $@

Je suis sûr qu'il n'y a pas de bugs ici; le Makefile fonctionne très bien. Mais y a t il quelque chose qui va à l'encontre conventions (comme CCFLAGSINT - devrais-je simplement écraser CCFLAGS à la place? Ou CXXFLAGS? FUD!)

Désolé pour tant de questions; vous n'y répondrez évidemment pas toutes, mais j'espère que les réponses m'aideront à comprendre l'idée générale derrière ces paramètres.

58
demandé sur anatolyg 2011-04-04 21:14:31

2 réponses

Comme vous l'avez remarqué, ce sont des Makefile {macros ou variables}, pas des options de compilation. Ils mettent en œuvre un ensemble de conventions. (Macros est un ancien nom pour eux, encore utilisé par certains. GNU make doc appelle les variables.)

La seule raison pour laquelle les noms comptent est les règles make par défaut, visibles via make -p, qui en utilisent certaines.

Si vous écrivez toutes vos propres règles, vous pouvez choisir tous vos propres noms de macros.

Dans une marque GNU vanille, il N'y a pas de CCFLAGS. Y sont CFLAGS, CPPFLAGS, et CXXFLAGS. CFLAGS pour le compilateur C, CXXFLAGS, pour le C++, et CPPFLAGS pour les deux.

Pourquoi CPPFLAGS est-il dans les deux? Classiquement, c'est la maison des drapeaux du préprocesseur(-D, -U) et c et c++ les utilisent. Maintenant, l'hypothèse que tout le Monde veut le même environnement de définition pour c et c++ est peut-être discutable, mais traditionnel.


P.S. comme l'a noté James Moore , certains projets utilisent CPPFLAGS pour les drapeaux du compilateur C++, pas les drapeaux du C préprocesseur. Le NDK Android, pour un exemple énorme.

71
répondu bmargulies 2018-04-22 09:54:01

Selon le manuel GNU make:

CFLAGS: drapeaux supplémentaires à donner au compilateur C.
CXXFLAGS: drapeaux supplémentaires à donner au compilateur C++.
Cppflags: drapeaux supplémentaires à donner au préprocesseur C et aux programmes qui l'utilisent (les compilateurs C et Fortran).

Src: https://www.gnu.org/software/make/manual/make.html#index-CFLAGS
note: PP signifie préprocesseur (et non Plus Plus), c'est-à-dire

CPP: programme pour exécuter le C préprocesseur, avec des résultats à la sortie standard; par défaut '$(CC) - E'.

Ces variables sont utilisées par les règles implicites de make

Compilation des programmes C
N. o est fait automatiquement à partir de N. c avec une recette de la forme
‘$(CC) $(CPPFLAGS) $(CFLAGS) -c".

Compilation des programmes C++
N. o est fait automatiquement à partir de n.cc, n.cpp, ou N. C avec une recette de la forme
‘$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c".
Nous vous encourageons à utiliser le suffixe ‘.cc " pour les fichiers source C++ au lieu de ‘.C’.

Src: https://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules

3
répondu Mizux 2018-09-05 08:52:41