2012-04-05 89 views
1

我也做了下面的Makefile檢查CMake的運行make目標

之前
.PHONY: check 
check: 
    @[ -f `which cmake` ] || $(error Install cmake first) 

.PHONY: check2  
check2: 
    @[ -f `which cmake` ] || echo "Install cmake first" 

.PHONY: exec 
exec: check 
    @echo "Compiling executable ..." 
    @[ -d ./build ] || mkdir ./build 
    @cd ./build; cmake ../src; make 

雖然目標CHECK2作品(時cmake的存在,我沒有得到消息「第一次安裝CMake」,當它不,我收到消息),目標檢查即使在cmake存在時總是退出。

所以我不能使用目標檢查目標exec。我必須使用目標check2,當然,會使退出,因爲它找不到cmake。

我想使退出之前它開始回聲「編譯可執行文件...」。

回答

1

當make決定需要重建一個目標時,它所做的第一件事就是展開配方中的所有make宏(變量)和函數。然後它將生成的擴展文本發送到shell。

在「檢查」規則中,您正在使用make函數$(error ...),因此只要make決定構建該目標,它就會擴展配方,其中包括擴展$(error ...) )功能並退出。外殼不可能運行命令的一部分(如[ -f ... ],然後以某種方式指示它應該或不應該調用make函數)

如果你想使所有你不得不做的是有你的食譜失敗你check2配方顯示一條消息,但它仍然成功了,所以它不會停止持續的使你可以這樣做:。

.PHONY: check2  
check2: 
     @[ -f `which cmake` ] || { echo "Install cmake first"; exit 1; } 

.PHONY: exec 
exec: check2 
     @echo "Compiling executable ..." 
     @[ -d ./build ] || mkdir ./build 
     @cd ./build; cmake ../src; make 

或者你可以只把考不上執行目標本身:

.PHONY: exec 
exec: 
     @[ -f `which cmake` ] || { echo "Install cmake first"; exit 1; } 
     @echo "Compiling executable ..." 
     @[ -d ./build ] || mkdir ./build 
     @cd ./build; cmake ../src; make 

如果你不需要它在其他地方。

相關問題