Как установить зависимости между каталогами в GNU Make - PullRequest
1 голос
/ 16 ноября 2010

У меня есть общий набор правил 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

1 Ответ

2 голосов
/ 16 ноября 2010

Во-первых, чтобы справиться с исходными каталогами:

vpath %.cpp a b

$(OBJDIR)/%.o: %.cpp
    build...

Затем, если вы хотите, вы можете сгенерировать файлы зависимостей следующим образом:

# Might as well use DEPDIR, rather than "deps"

$(DEPDIR)/%.d: %.cpp 
    g++ -MM ...

# Note the wildcard. And the '-' at the beginning means
# "don't panic if there aren't any".

-include $(DEPDIR)/*.d

Но есть лучший способ, которыйописано в источнике, который вы цитируете.Не создавайте правило для файлов .d, просто создайте их в том же правиле, которое создает объектные файлы.Таким образом, вы не создадите их, если они вам действительно не нужны.

...