为了替换我们从另一个项目继承的独立makefile的混乱,实际上使用了make
的内容(如this question中所述),我遇到了一个相当不寻常的gmake 3.81
忽略无法生成也无法找到的文件的情况。
这是一个演示问题的简短示例文件:
# Remove ALL default rules
.SUFFIXES:
(%): %
%.out: %
%.c: %.w %.ch
%.tex: %.w %.ch
%:: %.v
%:: RCS/%,v
%:: RCS/%
%:: s.%
%:: SCCS/s.%
SOURCES = a.c b.c
OBJS = $(SOURCES:%.c=%.o)
DEPFILES = $(SOURCES:%.c=%.c.d)
EXE = a
.PHONY: all
all: $(EXE)
$(DEPFILES): %.c.d : %.c
@echo "Determining dependencies for $(<F)"
@$(CC) -E -MM -MF$@ -MP $<
$(OBJS): %.o: %.c
@echo "Compiling $(<F)"
@$(CC) -c $< -o $@
$(EXE): $(OBJS)
@echo "Linking $(@F)"
@$(CC) $+ -o $@
# This seems to be the troublemaking line!
-include $(DEPFILES)
如果缺少一个或多个源文件,则不会按预期生成相应的.d
文件,但源文件未标记为缺失。如果我使用简单的make
命令运行此命令,则输出无,退出状态为2.
有什么方法可以解决这个问题吗?
哦,虽然在这个例子中看起来很傻,但我在这个项目中确实有几个限制:
gmake 3.81
。不允许升级或修补。答案 0 :(得分:0)
这似乎是gmake 3.81及更高版本中与this bug相关的错误。我已经报告了this specific bug,因为它略有不同。
我选择使用的解决方法受上述链接的启发,如下所示:
# Remove ALL default rules
.SUFFIXES:
(%): %
%.out: %
%.c: %.w %.ch
%.tex: %.w %.ch
%:: %.v
%:: RCS/%,v
%:: RCS/%
%:: s.%
%:: SCCS/s.%
SOURCES = a.c b.c
# WORKAROUND: check for existence of files here
EXISTING_SOURCES = $(wildcard $(SOURCES))
MISSING_SOURCES = $(filter-out $(EXISTING_SOURCES),$(SOURCES))
ifneq "" "$(MISSING_SOURCES)"
$(error Missing source files: $(MISSING_SOURCES))
endif
# END WORKAROUND
OBJS = $(SOURCES:%.c=%.o)
DEPFILES = $(SOURCES:%.c=%.c.d)
EXE = a
.PHONY: all
all: $(EXE)
$(DEPFILES): %.c.d : %.c
@echo "Determining dependencies for $(<F)"
@$(CC) -E -MM -MF$@ -MP $<
$(OBJS): %.o: %.c
@echo "Compiling $(<F)"
@$(CC) -c $< -o $@
$(EXE): $(OBJS)
@echo "Linking $(@F)"
@$(CC) $+ -o $@
# This seems to be the troublemaking line!
-include $(DEPFILES)