2009-12-09 49 views
11

如果在檢查工具版本時找不到某個字符串,我正在尋找一種拯救makefile的方法。如何根據grep結果條件化makefile?

grep的表達我在尋找匹配的是:

dplus -VV | grep 'build date and time: Nov 1 2009 19:31:28' 

如果安裝DPLUS的正確版本,返回匹配的行。

如何根據此表達式將條件工作到我的makefile中?

+0

這是哪一種? GNU? – Davide 2009-12-09 21:09:20

+0

是的。特別是在Cygwin中,但那只是GNU。 – 2009-12-10 14:13:22

回答

12

這裏的另一種方式在GNU Make中有效:

 
DPLUSVERSION = $(shell dplus -VV | grep 'build date and time: Nov 1 2009 19:31:28') 

target_of_interest: do_things do_things_that_uses_dplus 

do_things: 
    ... 


do_things_that_uses_dplus: 
ifeq ($(DPLUSVERSION),) 
    $(error proper version of dplus not installed) 
endif 
    ... 

這個目標可以是真實的,也可以是PHONY的真實目標。

+0

工作了一個魅力,和ifeq ... $(錯誤...)讓我發出一個錯誤消息,讓開發人員知道他們的構建被殺害。 – 2009-12-10 21:49:02

+0

警告! '$(錯誤)'在**評估**時觸發。這意味着,如果'DPLUSVERSION'觸發錯誤條件,'do_things'將**從不**運行。編輯來解決這個問題。 https://www.gnu.org/software/make/manual/html_node/Make-Control-Functions.html – gcb 2015-12-01 01:26:48

+0

@gcb:我不認爲你測試了你的解決方案。 – Beta 2015-12-01 02:38:22

3

這裏有一種方法:

.PHONY: check_dplus 

check_dplus: 
    dplus -VV | grep -q "build date and time: Nov 1 2009 19:31:28" 

如果grep的沒有找到匹配,它應該給

make: *** [check_dplus] Error 1 

然後讓你的其他目標取決於check_dplus目標。

2

如果這是gnu make,你可以做

your-target: $(objects) 
    ifeq (your-condition) 
     do-something 
    else 
     do-something-else 
    endif 

在這裏看到Makefile contionals

如果你化妝不支持條件句,你總是可以做

your-target: 
    dplus -VV | grep -q "build date and time: Nov 1 2009 19:31:28" || $(MAKE) -s another-target; exit 0 
    do-something 

another-target: 
    do-something-else