我有以下规则:
EXECS = $(sort $(patsubst %.cpp,%$(EXESUFFIX), $(patsubst %.c,%$(EXESUFFIX), $(filter-out $(IGNORESRCS), $(EXECSRCS))))) SRCS = $(sort $(filter-out $(EXECSRCS), $(filter-out $(IGNORESRCS), $(wildcard *.c) $(wildcard *.cpp) $(foreach DIR,$(SUBDIRS),$(wildcard $(DIR)/*.cpp) $(wildcard $(DIR)/*.c) ) ))) #OBJS = $(addprefix $(OBJDIR), $(patsubst %.cpp,%$(OBJSUFFIX), $(patsubst %.c,%$(OBJSUFFIX), $(SRCS)))) OBJS = $(patsubst %.cpp,%$(OBJSUFFIX), $(patsubst %.c,%$(OBJSUFFIX), $(SRCS))) RESOURCE_SRCS= $(sort $(filter-out $(IGNORESRCS), $(wildcard *.rc) $(foreach DIR,$(SUBDIRS),$(wildcard $(DIR)/*.rc) ) )) RESOURCES = $(patsubst %.rc,%$(OBJSUFFIX), $(RESOURCE_SRCS)) %$(EXESUFFIX) : %.cpp $(LIBS) $(RESOURCES) $(CXX) $(DEFINES) $(CFLAGS) $(INCLUDES) $(LIBPATH) -o $(BINDIR)/$* $< $(RESOURCES) $(LIBINCLUDES)
问题是$(RESOURCES)
并不存在于所有平台上。 %$(EXESUFFIX) : %.cpp
规则不运行,而是尝试运行g++ exec.cpp -o exec
,据我所知,这不是我在任何地方声明的规则。
如果规则是空的(如果资源不为空,则构建资源),如何使规则仍然构建?
答案 0 :(得分:1)
如果变量为空,则对规则没有影响。它应该像书面一样工作。您看到的实际错误是什么?
ETA:
您的问题很明显, $(RESOURCES)
不存在的确切含义。我的回答是假设你的意思是变量是空的。但是鉴于你的评论如下,关于makefile的行为,我现在怀疑你的意思是变量仍然设置为文件列表,但那些文件不存在。
因为它们不在那里,并且make不知道如何构建它们,所以决定根本不能使用这种模式规则,它会选择不同的规则。
如果您希望这些文件存在时只会产生任何影响,那么您可以使用$(wildcard ...)
功能仅扩展到存在的文件:
%$(EXESUFFIX) : %.cpp $(LIBS) $(wildcard $(RESOURCES))
$(CXX) ...
这里有一个关键点:$(RESOURCES)
必须的内容是源文件。它们不能是派生文件(应该由make创建的文件)。如果它们是派生的,情况要复杂得多。