Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile gmake忽略依赖于-包含文件的文件_Makefile_Gnu Make - Fatal编程技术网

Makefile gmake忽略依赖于-包含文件的文件

Makefile gmake忽略依赖于-包含文件的文件,makefile,gnu-make,Makefile,Gnu Make,为了用实际使用make的东西来替换从另一个项目继承的杂乱无章的独立make文件,正如中所述,我遇到了一个相当不寻常的情况,gmake3.81忽略了它无法生成或无法找到的文件 下面是一个演示问题的简短示例文件: # Remove ALL default rules .SUFFIXES: (%): % %.out: % %.c: %.w %.ch %.tex: %.w %.ch %:: %.v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% SOURCES =

为了用实际使用make的东西来替换从另一个项目继承的杂乱无章的独立make文件,正如中所述,我遇到了一个相当不寻常的情况,gmake3.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。不允许升级或修补。 完整的makefile构建了调试版本和发布版本,因此依赖项是单独生成的,一次完成。事实证明,这样做更简单。 在这里使用静态模式规则似乎很愚蠢,但在大型makefile中它解决了许多问题。 在实际系统中,依赖项的实际生成要复杂得多,使用我编写的Perl脚本再次对Intel编译器套件的等效输出进行处理,这是一个有用的需求。 我曾考虑过对每个文件的存在性进行预测试,但在生成依赖文件之前,并非所有文件都是已知的。目前,只有这一个文件而目录中没有其他文件,就不会执行任何shell命令。
这似乎是gmake 3.81及更高版本中的一个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)

所有:$DEPFILES$EXE可能吗?强制依赖项文件成为其他文件的先决条件,而不仅仅是-include指令,该指令根据定义忽略命名文件的不存在。这可能适用于此简化示例,但是,找出在复杂的MaX文件中添加潜在的几十个不同目标的前提可能不是那么容易。“JoeeWelw考虑使用以帮助您交互式地确定先决条件可能去哪里。我很愿意,”洛基,但是我们不允许添加未经批准的软件。此外,make-d的输出显示make很可能忽略了-include文件的先决条件,而忘记了注意到正确的目标先决条件关系。如果我被允许,我会检查这是否在4.1中得到了修复,但是,同样,这是一个安全问题。