J'utilise UnitTest ++ pour me permettre de créer des tests unitaires pour du code C++ (qui devrait s'appuyer sur Linux ou Mac OS X). J'ai une structure de répertoires comme celle-ci:
src
- Foo.cpp
- Bar.cpp
test
- FooTest.cpp
- BarTest.cpp
- Main.cpp
- Makefile
UnitTest++
- libUnitTest++.a
Et ce Makefile (adapté du MakeFile UnitTest ++) fonctionne bien (avec GNU make):
test = TestFooAndBar
src = ../src/Foo.cpp \
../src/Bar.cpp
test_src = Main.cpp \
FooTest.cpp \
BarTest.cpp
lib = ../UnitTest++/libUnitTest++.a
objects = $(patsubst %.cpp,%.o,$(src))
test_objects = $(patsubst %.cpp,%.o,$(test_src))
.PHONY: all
all: $(test)
@echo Running unit tests...
@./$(test)
$(test): $(lib) $(test_objects) $(objects)
@echo Linking $(test)...
@$(CXX) $(LDFLAGS) -o $(test) $(test_objects) $(objects) $(lib)
.PHONY: clean
clean:
-@$(RM) -f $(objects) $(test_objects) $(test) 2> /dev/null
%.o : %.cpp
@echo $<
@$(CXX) $(CXXFLAGS) -c $< -o $(patsubst %.cpp,%.o,$<)
Mais je veux mettre tous les fichiers .o dans un sous-répertoire "obj" du répertoire "test". Comment puis-je modifier ce Makefile pour le faire?
J'ai essayé d'ajouter "obj /" aux objets et aux variables test_objects, mais je ne sais pas comment modifier la règle% .o pour qu'il sache où se trouvent les fichiers .o et se réfère aux fichiers .cpp corrects. Dois-je créer deux règles distinctes, une pour chaque ensemble de fichiers .cpp?
Serait-ce plus simple si au lieu de définir les variables src et test_src, je demandais juste au Makefile de construire un .o (dans obj /) pour tous les fichiers .cpp (à la fois dans le même répertoire que le Makefile et dans ../src/) ?
Il y a plus d'une façon de le faire, mais celle-ci est plutôt bonne (je devrais vraiment avoir ce raccourci clavier).
vpath %.cpp ../src
src = Foo.cpp Bar.cpp
test_src = Main.cpp FooTest.cpp BarTest.cpp
objects = $(patsubst %.cpp,obj/%.o,$(src))
test_objects = $(patsubst %.cpp,obj/%.o,$(test_src))
$(objects): | obj
obj:
@mkdir -p $@
obj/%.o : %.cpp
@echo $<
@$(CXX) $(CXXFLAGS) -c $< -o $@