Я получил следующую структуру каталогов:комплекс схему замещения в Makefile предпосылки
./
|- obj/
|--- debug/
|--- release/
|- bin/
|--- debug/
|--- release/
|- src/
|--- main.c
|--- libb/
|----- foo.c
|- include/
|--- libb/
|----- foo.h
Кроме того, я вручную указать зависимости отдельных объектов в моем Makefile
в следующем формате (пример):
main_DEPS = libb/foo
Теперь я хочу, чтобы иметь возможность вводить make bin/debug/main
, и это создает необходимые зависимости и целевой файл:
obj/debug/libb/foo.o
obj/debug/main.o
bin/debug/main
Как я могу это сделать? Моего текущий подход крайне запутанный и неполный:
Следующие создают объектные файлы. Однако он не создает никаких необходимых подпапок (
libb
), если они еще не существуют. Он также не отслеживает любые измененные файлы заголовков. Возможно, можно было настроить Makefile tutorial trick to generate prerequisites automatically?CFLAGS+=-I include obj/*/%.o: src/%.cpp $(CC) $(CFLAGS) $< -c -o [email protected]
Следующие попыток разрешить зависимости бинарной и построил его из всех необходимых объектных файлов. Но я не знаю, как получить эти объектные файлы из переменной
*_DEPS
..SECONDEXPANSION: bin/debug/%: obj/debug/%.o $(patsubst %,obj/debug/%.o,$($(patsubst bin/debug/%,%,[email protected])_DEPS)) $(LD) $(LDFLAGS) $< $(patsubst %,obj/debug/%.o,$($(patsubst bin/debug/%,%,[email protected])_DEPS)) -o [email protected] bin/release/%: obj/release/%.o $(patsubst %,obj/release/%.o,$($(patsubst bin/release/%,%,[email protected])_DEPS)) $(CXX) $(LDFLAGS) $< $(patsubst %,obj/release/%.o,$($(patsubst bin/release/%,%,[email protected])_DEPS)) -o [email protected]
К сожалению, это не не создает зависимостей автоматически: он просто жалуется на «объект/отладки/libb/foo.o: Нет такого файла или каталога» - но она работает достаточно странно, если бы я построил этот файл вручную с помощью
mkdir obj/debug/libb; make obj/debug/libb/foo.o
.Он также безнадежно усложняется и использует бесплатное дублирование кода (от которого я не могу избавиться, не сделав его еще более сложным).
Какое наименее сложное решение для этого? В принципе, я не против использования чего-то другого, кроме make
, если он широко доступен (autoconf ...), но я предпочитаю сдерживать усилия (и новое обучение) до минимума и от того, что я видел до сих пор, все остальные системы сборки кажутся будет значительно более сложным, чем make
.