Makefile ссылочные зависимости с patsubst или подстановочный знак? - PullRequest
0 голосов
/ 15 января 2019

После этого вопроса и моего ответа и его комментариев у меня есть сомнения.

Как правильно ссылаться на зависимости в Makefile?

Позвольте мне привести пример, рассматривающий этот файл:

CXX = g++
CXXFLAGS = -stdlib=libc++ -std=c++17
WARNING := -Wall -Wextra

PROJDIR   := .
SOURCEDIR := $(PROJDIR)/
SOURCES   := $(wildcard $(SOURCEDIR)/*.cpp)
OBJDIR    := $(PROJDIR)/

OBJECTS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.o,$(SOURCES))
DEPENDS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.d,$(SOURCES))

# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean

all: main

clean:
    $(RM) $(OBJECTS) $(DEPENDS) main

        clean:
            $(RM) $(OBJECTS) $(DEPENDS) parking

# Linking the executable from the object files
main: $(OBJECTS)
    $(CXX) $(WARNING) $(CXXFLAGS) $^ -o $@


#include your dependencies
-include $(DEPENDS)

#create OBJDIR if not existin (you should not need this)
$(OBJDIR):
    mkdir -p $(OBJDIR)

$(OBJDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile | $(OBJDIR)
    $(CXX) $(WARNING) $(CXXFLAGS) -MMD -MP -c $< -o $@

Я могу сделать DEPENDS := $(patsubst $(SOURCEDIR)/%.cpp,$(OBJDIR)/%.d,$(SOURCES)), но также DEPENDS := $(wildcard $(OBJDIR)/*.d): не могу ли я?

Если я удалю исходный файл перед запуском make clean, соответствующий файл зависимостей останется. Во втором случае он будет удален следующим make clean, а в первом - нет. Однако, если я не запускаю make clean, могут быть включены зависимости, не связанные с источниками.

Каков наилучший способ ссылки на зависимости в Makefile? Должен ли я использовать две переменные, одну для запуска clean, а другую для include?

...