У меня есть общий набор правил make, используемых в нескольких каталогах. Каждая марка очень проста:
BASEDIR:=../..
TARGET:=theTarget
include Makefile.include
Если не переопределено, у меня есть значение по умолчанию для исходного кода:
SRC:= $(wildcard *.cpp)
Мы хотим построить объектные файлы в каталоге (не с источниками), поэтому:
OBJDIR:= ../obj
BARE:= $(foreach f,$(SRC),$(notdir $(f) )
OBJ:= $(foreach o,$(BARE),$(OBJDIR)/$(o).o )
Итак, у меня есть файлы .o, но мне нужно, чтобы каждый запускал правило, основанное на .cpp.
Пока каталог известен, это легко:
$(OBJDIR)/%.o: %.cpp
но в некоторых каталогах есть произвольно сгруппированные файлы в подкаталогах. Я временно обошел это, жестко закодировав их все в моем центральном make-файле:
$(OBJDIR)/%.o: a/%.cpp
build...
$(OBJDIR)/%.o: b/%.cpp
build...
Но я хотел бы иметь возможность указывать каталоги сборки в переменной, если это возможно. Есть ли способ настроить зависимости
$(OBJDIR)/x.o: a/x.cpp
$(OBJDIR)/y.o: a/y.cpp
и
$(OBJDIR)/z.o: b/z.cpp
без необходимости вручную перечислять зависимости?
Кстати, у меня также есть файлы зависимостей (.d)
$(DEPDIR)/%.d: $(SRC)
Я хочу установить зависимости на основе того, что находится в источнике.
Например:
.deps / x.d: a / x.cpp
g ++ -MM -MT $ (objdir) / $ (notdir $ @) $ <-o $ (DEPDIR) / $ (notdir $ @) </p>
Есть ли простой способ создать эти правила, не записывая их для каждого каталога?
Вот откуда я взял информацию о генерации файлов .d:
http://mad -scientist.net / сделать / autodep.html # расширенный
В итоге цель состоит в том, чтобы включить все файлы .d и создать из них дерево зависимостей, автоматически сгенерированное. Но это последняя часть. Я не знаю, как использовать .d файлы. Я просто включаю их всех?
include $(DEPDIR)/%.d
не работает.
Я могу объединить их всех в правило:
cat $ (DEP)> $ (DEPDIR) /deps.inc
, а затем
include deps.inc