2014-11-04 16 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

相關問題