2014-11-04 38 views
0

我有一个使用多线程(特定为-j8)运行的Makefile。如果缺少特定的标记文件,强制清理并重新创建

如果我缺少标识编译版本的特定标记文件,我想强制执行make cleanmake all操作。 (此文件应在第二个make all之后完成制作时引入。)

我似乎无法使其正常工作。我要么陷入循环,要么根本不会发生。 (这是一个巨大的系统的一部分,所以我不能只是改变任何范例,我必须与我有什么一起工作)

这是我到目前为止的相关部分。这是不是原来的计划,但我调整了这么多事情围绕这是当前形势:

VERSION = 2.8 
.DEFAULT_GOAL := all 

.PHONY : all 
all : {some targets} | marker_file 

########################### 

.PHONY : marker_file 
marker_file : build/$(VERSION).marker 

.PHONY : check_marker 
check_marker : 
     ifeq (,$(wildcard build/$(VERSION).marker)) 
     @echo -e "\e[41mYOU ARE ON NEW PREREQUISITES $(VERSION)! FORCING MAKE CLEAN BEFORE REBUILDING\e[0m" 
     $(MAKE) clean 
     @mkdir -p build 
     @touch build/$(VERSION).marker 
     $(MAKE) $(MAKECMDGOALS) 
     endif 

# if the marker file needs generation, force clean and rebuild 
build/$(VERSION).marker : check_marker 

任何人都可以找出如何妥善规划的规则和依赖,让我能够在发生第二次文件?

回答

2

您绝对不想使用仅限订单的先决条件。这会强制始终运行先决条件,但不会使用结果来确定是否运行目标。这几乎与你想要的完全相反。

此外,您不能在配方内使用make预处理器结构(如ifeq)(由TAB缩进)。食谱被传递到shell,而shell不是make并且不理解像ifeq这样的构造。

您可以使用make的auto-re-exec功能:如果包含的文件发生变化,make会自行重新执行。所以:

VERSION = 2.8 
.DEFAULT_GOAL := all 

.PHONY : all 
all : {some targets} 

########################### 

MARKER_FILE = build/$(VERSION).marker 

$(MARKER_FILE) : 
     @echo -e "\e[41mYOU ARE ON NEW PREREQUISITES $(VERSION)! FORCING MAKE CLEAN BEFORE REBUILDING\e[0m" 
     $(MAKE) clean MARKER_FILE= 
     @mkdir -p $(@D) 
     @touch [email protected] 

include $(MARKER_FILE) 
+0

谢谢 - 这对我有用! – Arnon 2014-11-04 14:51:37

相关问题