2017-10-04 103 views
0

每当其他c文件发生更改时,我想重新编译version.c。所以,我试图在其他c文件发生变化时触摸c文件。问题在于,当它正在进行c编译时,make不能识别这个变化。我认为原因是它已经更新了所有的依赖关系。有没有办法打破连锁店?makefile - 在重新编译其他c文件时总是重新编译version.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)..... 

所以我想做出立即识别更新的文件。

+0

*为什么*你想这样做? 'version.c'包含什么? – Beta

+0

关于版本信息 – Chris

回答

1

我希望每当另一个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 [email protected] 

就是这样。它说:如果version.c或任何其它源文件改变,通过执行重建version.o

$(CC) -c $(CFLAGS) version.c -o version.o 

$<扩展作为第一先决条件 - version.c - 和[email protected]作为目标 - version.o)。

注意:您使用的解决方案与正常制作策略相差甚远。您应该重新考虑所有这些,并将您的Makefile放在经典的target: pre-requisites依赖关系图上。

+0

是的,我不喜欢我的解决方案。你得到了正确的解决方案。谢谢 – Chris

0

该设备最后添加version.cOBJECTFILES,因为它取决于订单。

fileA.c 
version.c 
fileB.c 

如果碰到version.c当它编译fileA.c然后version.c是重新编译,但不是在version.c被触摸时fileB.c编译因为version.c是allready检查。因此,解决办法是:

fileA.c 
fileB.c 
... 
version.c