web-dev-qa-db-fra.com

Makefile pour placer les fichiers objets des fichiers source dans différents répertoires dans un seul répertoire séparé?

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/) ?

23
Daryl Spitzer

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 $@
36
Beta