Makefile Simple avec versions release et debug-meilleures pratiques
Je suis nouveau sur makefiles. J'ai appris la création de makefile et d'autres concepts connexes du livre "gérer des projets avec GNU make". Le makefile est prêt maintenant et je dois m'assurer que celui que j'ai créé est OK. Voici le makefile
#Main makefile which does the build
#makedepend flags
DFLAGS =
#Compiler flags
#if mode variable is empty, setting debug build mode
ifeq ($(mode),release)
CFLAGS = -Wall
else
mode = debug
CFLAGS = -g -Wall
endif
CC = g++
PROG = fooexe
#each module will append the source files to here
SRC := main.cpp
#including the description
include bar/module.mk
include foo/module.mk
OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))
.PHONY:all
all: information fooexe
information:
ifneq ($(mode),release)
ifneq ($(mode),debug)
@echo "Invalid build mode."
@echo "Please use 'make mode=release' or 'make mode=debug'"
@exit 1
endif
endif
@echo "Building on "$(mode)" mode"
@echo ".........................."
#linking the program
fooexe: $(OBJ)
$(CC) -o $(PROG) $(OBJ)
%.o:%.cpp
$(CC) $(CFLAGS) -c $< -o $@
depend:
makedepend -- $(DFLAGS) -- $(SRC)
.PHONY:clean
clean:
find . -name "*.o" | xargs rm -vf
rm -vf fooexe
Questions
- le makefile ci - dessus fonctionne bien avec les versions release et debug. Mais est-ce dans le bon format? Ou voyez-vous des défauts qui?
- au-dessus de makefile débogue la construction par défaut lorsqu'elle est invoquée à l'aide marque . Pour les versions release, faire mode=release est requis. Est-ce la bonne démarche?
- les drapeaux du compilateur de débogage et de publication fournis à g++ sont-ils corrects? Pour le debug, j'utilise -g-Wall et pour la libération, juste -Mur. Est-ce exact?
Toute aide serait géniale.
3 réponses
- c'est un format raisonnable. Il est lié spécifiquement à GNU Make, mais c'est un problème relativement mineur si vous avez choisi D'utiliser GNU Make sur chaque plate-forme.
- S'il y a un défaut, c'est que vous pourriez finir par lier des fichiers objets construits en mode débogage pour créer la version finale.
- certains pourraient prétendre qu'une option' mode=release ' n'est pas standard; ils auraient raison, mais il n'y a pas d'alternative standard dont je suis conscient. Vous avez juste besoin d'être conscient que votre convention peut-être ne convient-il pas à tout le monde (mais cela ne doit pas nécessairement vous convenir, à vous et à vos utilisateurs).
- la construction d'une version de débogage par défaut est probablement raisonnable - et plus raisonnable que la construction de la version par défaut.
- la suppression de l'indicateur
-g
pour la version release n'est pas automatiquement mauvaise, mais si votre code produit un dump core, il est plus facile de faire la tête ou la queue du dump core si le fichier programme inclut des informations de débogage. Le coût principal du débogage informations supplémentaires dans le fichier du programme qui n'ont pas besoin d'être chargées dans la mémoire du système - l'exécution de coût est faible.- vous devriez envisager d'inclure des indicateurs d'optimisation là-dedans. Avec le jeu D'outils GCC, vous pouvez utiliser à la fois
-g
et-O
. Il est plus difficile de déboguer du code optimisé, mais il vous offre des avantages de performance (souvent significatifs).
- vous devriez envisager d'inclure des indicateurs d'optimisation là-dedans. Avec le jeu D'outils GCC, vous pouvez utiliser à la fois
Je suggère les modes suivants:
for debugger: -O0 -g -Wall
for development and internal release: -O2 -g -Wall
for release outside the company: -O2 -Wall
Justification:
- Il est très important de développer et de tester le code en "mode production". Vous pouvez trouver
que dans certains cas le code qui fonctionne sans optimisation se bloque en mode optimisé parce que
du bug dans votre code. (Croyez-moi, cela arrive beaucoup) - utilisez donc
-O2
- dans la plupart des cas, vous pouvez toujours déboguer assez bien même avec du code optimisé, alors ajoutez
-g
. Cependant, si c'est trop difficile de trouver le bug dans un tel mode, vous peut compiler pour le débogueur avec-O0
- seulement si vous avez des problèmes, y compris les informations de débogage dans le code, vous devez supprimer
-g
. C'est une bonne idée d'avoir-g
pour le code dans l'environnement de production, car si quelque chose se bloque, vous pouvez obtenir beaucoup plus d'informations.
Je suivrais les conseils D'Artyom sur les drapeaux et utiliserais -O
.
Mon principal conseil serait de rendre le mode par défaut "release". Aucun utilisateur en dehors de votre entreprise ne connaîtra votre convention make mode=release
et 99,99% d'entre eux voudront qu'elle soit construite pour la publication.
J'aime que vous avez -Wall
sur tous les modes. Si vous voulez devenir vraiment pédant... -Wall -std=c++98 -pedantic -Wextra -Wconversion
est un bon début. - std = c++98 peut ne pas être nécessaire si vous êtes marié à g++, mais si vous avez des illusions de portabilité vous voulez que.