Makefile do umieszczania plików obiektowych z plików źródłowych różnych katalogów w jednym, osobnym katalogu?

Używam UnitTest++, aby umożliwić mi tworzenie testów jednostkowych dla kodu C++ (który powinien być zbudowany na Linuksie lub Mac OS X). Mam taką strukturę katalogów:

src
- Foo.cpp
- Bar.cpp
test
- FooTest.cpp
- BarTest.cpp
- Main.cpp
- Makefile
UnitTest++
- libUnitTest++.a

I ten plik Makefile (zaadaptowany z UnitTest++ Makefile) działa ładnie (z 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,$<)
[[2]} ale chcę umieścić wszystkie .o pliki w podkatalogu " obj "katalogu " test". Jak zmodyfikować ten plik Makefile, aby to zrobić?

Próbowałem dodać "obj/" do zmiennych objects i test_objects, ale Nie wiem, jak zmodyfikować %.o rule więc wie, gdzie .o pliki są i odnosi się do poprawnych .pliki cpp. Czy muszę tworzyć dwie oddzielne reguły, po jednej dla każdego zestawu.pliki cpp?

Czy byłoby prościej, gdyby zamiast definiowania zmiennych src i test_src, po prostu mam Makefile build a .o (w OBJ/) dla wszystkich.pliki cpp (zarówno w tym samym katalogu co plik Makefile, jak i w ../src/)?

Author: Daryl Spitzer, 2010-11-05

1 answers

Jest więcej niż jeden sposób, aby to zrobić, ale ten jest całkiem dobry (naprawdę powinienem mieć ten hotkeyed).

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
Author: Beta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-19 22:32:18