每当其他 c 文件发生更改时,我想重新编译version.c
。因此,每当其他 c 文件发生变化时,我都尝试触摸 c 文件。问题是make在进行c编译时无法识别更改。我认为原因是它已经更新了所有依赖项。有没有办法打破锁链?
例如:
$(TARGET): $(OBJECTFILES) $(TARGET).a
$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR)
$(if $(filter $(VERSION_BUILD),0),$(shell touch $(PROJECT_ROOT_PFAD)/$(VERSION_FILE)))
#When VERSION_FILE then VERSION_BUILD is set to 1
$(CC).....
所以我想立即识别更新的文件。
每当其他 c 文件发生更改时,我想重新编译 version.c。
因此,您必须声明编译version.c
的结果取决于其他 C 源文件。下面计算其他 C 源文件的列表并将其分配给 make 变量:
OTHER_C_SOURCES := $(filter-out version.c,$(wildcard *.c))
编译version.c
的结果是version.o
.因此,您需要的规则是:
version.o: version.c $(OTHER_C_SOURCES)
$(CC) -c $(CFLAGS) $< -o $@
就是这样。它说:如果version.c
或任何其他源文件发生更改,请通过执行以下命令重建version.o
:
$(CC) -c $(CFLAGS) version.c -o version.o
($<
扩展为第一个先决条件 -version.c
-$@
作为目标 -version.o
)。
注意:您使用的解决方案与正常的make策略相去甚远。您可能应该重新考虑所有这些,并将 Makefile 基于经典的target: pre-requisites
依赖关系图。
你是在最后添加version.c
到OBJECTFILES
,因为这完全取决于顺序。
fileA.c
version.c
fileB.c
如果在编译时触摸version.c
fileA.c
则version.c
被重新编译,但在编译fileB.c
时触摸version.c
时不会,因为 version.c 已全部就绪。所以解决方案是:
fileA.c
fileB.c
...
version.c