2010-09-16 25 views
5

Tengo dificultades para escribir Makefiles que construyan correctamente mis pruebas unitarias. A modo de ejemplo, supongamos que la estructura de archivos es el siguienteMakefile para pruebas unitarias en C++

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

Así, para construir el test_all ejecutable, que había necesidad de construir test_foo.o que a su vez depende de test_foo.cpp sino también en src/foo. o

¿Cuál es la mejor práctica en este caso? ¿Un Makefile en la carpeta principal? Un Makefile por carpeta? Si es así, ¿cómo administro las dependencias en las carpetas?

Respuesta

4

La práctica común es un Makefile para cada carpeta. Aquí es un simple Makefile.am guión de la carpeta raíz:

#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 

El correspondiente Makefile.am para el src carpeta se verá así:

AM_CPPFLAGS = -I./ 

bin_PROGRAMS = progName 

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

progName_LDADD = ../libs/ 

Makefile. am para pruebas se verán similares:

AM_CPPFLAGS = -I../src 

bin_PROGRAMS = tests 

tests_SOURCES = test_foo.cpp test_all.cpp 

Utilice automake para generar Makefile.in archivos de los archivos .am. La secuencia de comandos configure utilizará los archivos .in para generar Makefiles. (Para proyectos pequeños, le gustaría codificar directamente a mano los Makefiles).

+0

Esto no parece tener en cuenta la dependencia de test_all.cpp en src/foo.o. P.ej. qué sucede después de hacer limpio; hacer la prueba en el directorio de nivel superior? –

+0

Si las pruebas se realizan desde main.cpp, no habrá ningún problema de dependencia. –

+0

Pero main.cpp será el ejecutable de la aplicación, no conducirá las pruebas. El ejecutable que realiza las pruebas debe residir en la carpeta de pruebas. –

5

La práctica común es un Makefile por directorio. Eso es lo que habría sugerido antes de leer "Recursive Make Considered Harmfull" (http://miller.emu.id.au/pmiller/books/rmch/). Ahora recomendaría un Makefile. También consulte la generación automática de dependencias: ahora ni siquiera necesita averiguar de qué dependen sus pruebas. Todo lo que necesitas son algunos objetivos.

+0

Gracias dave por la lectura muy interesante. Sin embargo, tratar de implementar realmente un Makefile no recursivo parece ser muy complicado, como se muestra en http://www.xs4all.nl/~evbergen/nonrecursive-make.html - Esto parece ser demasiado trabajo para el pequeño - a proyectos medianos en los que participo. –

+1

Hacen mucho más en ese ejemplo que solo tener un Makefile. Configuré un archivo Makefile de alto nivel leyendo sus instrucciones sin ningún truco en aproximadamente 2 horas después de leer ese artículo (+ otras 2-4 horas antes de leer sobre make) – dave

+1

Escribí un único archivo MAKE para todo el proyecto, y es En serio, no es tan complicado, pero mi proyecto es solo un archivo .c y .h ... – MarcusJ