2010-09-16 4 views
5

J'ai du mal à écrire des Makefiles qui construisent correctement mes tests unitaires. À titre d'exemple, supposons que la structure du fichier ressemble à ceMakefile pour les tests unitaires en C++

src/foo.cpp 
src/foo.hpp 
src/main.cpp 
tests/test_foo.cpp 
tests/test_all.cpp 

Ainsi, pour construire l'exécutable test_all, je dois construire test_foo.o qui à son tour dépend de test_foo.cpp mais aussi src/foo. o.

Quelle est la meilleure pratique dans ce cas? Un Makefile dans le dossier parent? Un Makefile par dossier? Si oui, comment puis-je gérer les dépendances entre les dossiers?

Répondre

4

La pratique courante est un Makefile pour chaque dossier. Voici un script Makefile.am simple pour le dossier racine:

#SUBDIRS = src tests 
all: 
    make -C ./src 
    make -C ./tests  
install: 
    make -C ./src install 
uninstall: 
    make -C ./src uninstall 
clean: 
    make -C ./src clean 
test: 
    make -C ./tests test 

Le correspondant Makefile.am pour le dossier src ressemblera à ceci:

AM_CPPFLAGS = -I./ 

bin_PROGRAMS = progName 

progName_SOURCES = foo.cpp main.cpp 
LDADD = lib-to-link 

progName_LDADD = ../libs/ 

Makefile . suis pour tests ressemblera:

AM_CPPFLAGS = -I../src 

bin_PROGRAMS = tests 

tests_SOURCES = test_foo.cpp test_all.cpp 

Utilisez automake pour générer les fichiers Makefile.in à partir des fichiers .am. Le script configure utilisera les fichiers .in pour produire les Makefiles. (Pour les petits projets, vous voudriez directement coder manuellement les Makefiles).

+0

Cela ne semble pas tenir compte de la dépendance de test_all.cpp sur src/foo.o. Par exemple. ce qui arrive après le rendre propre; faire un test dans le répertoire de premier niveau? –

+0

Si les tests sont générés à partir de main.cpp, il n'y aura aucun problème de dépendance. –

+0

Mais main.cpp sera l'exécutable de l'application, ne conduisant pas les tests. L'exécutable effectuant les tests doit résider dans le dossier des tests. –

5

La pratique courante est un Makefile par répertoire. C'est ce que j'aurais suggéré avant de lire "Recursive Make Considered Harmfull" (http://miller.emu.id.au/pmiller/books/rmch/). Maintenant, je recommanderais un Makefile. Jetez également un coup d'œil sur la génération automatique des dépendances - vous n'avez même plus besoin de déterminer ce dont vos tests dépendent. Tout ce dont vous avez besoin, c'est de cibles.

+0

Merci dave pour la lecture très intéressante. Cependant, essayer de vraiment implémenter un Makefile non-récursif semble être très compliqué, comme montré sur http://www.xs4all.nl/~evbergen/nonrecursive-make.html - Cela semble être trop de travail pour les petits - Pour les projets de taille moyenne, je suis impliqué. –

+1

Ils font beaucoup plus dans cet exemple que juste avoir un Makefile. J'ai mis en place un Makefile de niveau supérieur en lisant leurs instructions avec toutes les cloches et les sifflets dans environ 2 heures après avoir lu cet article (+ encore 2-4 heures avant de lire sur make) – dave

+1

J'ai écrit un seul makefile pour tout mon projet, et c'est sérieusement pas si compliqué, mais mon projet est juste un seul fichier .c et .h ... – MarcusJ