如何在makefile中有一个空的依赖?

时间:2013-11-15 22:04:17

标签: makefile

我有以下规则:

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,据我所知,这不是我在任何地方声明的规则。

如果规则是空的(如果资源不为空,则构建资源),如何使规则仍然构建?

1 个答案:

答案 0 :(得分:1)

如果变量为空,则对规则没有影响。它应该像书面一样工作。您看到的实际错误是什么?

ETA:

您的问题很明显, $(RESOURCES)不存在的确切含义。我的回答是假设你的意思是变量是空的。但是鉴于你的评论如下,关于makefile的行为,我现在怀疑你的意思是变量仍然设置为文件列表,但那些文件不存在。

因为它们不在那里,并且make不知道如何构建它们,所以决定根本不能使用这种模式规则,它会选择不同的规则。

如果您希望这些文件存在时只会产生任何影响,那么您可以使用$(wildcard ...)功能仅扩展到存在的文件:

%$(EXESUFFIX) : %.cpp $(LIBS) $(wildcard $(RESOURCES))
        $(CXX) ...

这里有一个关键点:$(RESOURCES) 必须的内容是源文件。它们不能是派生文件(应该由make创建的文件)。如果它们是派生的,情况要复杂得多。