首页 > 解决方案 > Makefile 使用 patsubst 或通配符引用依赖项?

问题描述

在这个问题和我的回答及其评论之后,我有疑问。

在 a 中引用依赖项的正确方法是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与源无关的依赖项,则可能会包括在内。

在 a 中引用依赖项的最佳方法是Makefile什么?我应该使用两个变量,一个用于运行clean,另一个用于运行include吗?

标签: makefiledependencieswildcard

解决方案


推荐阅读