2011-05-16 20 views
12

我想在我的makefile中啓用一個詳細的編譯,但我不知道如何製作一個條件OR有條件的或在makefile中

讓我解釋一下:我希望能夠通過設置V=1VERBOSE=1指定詳細編譯任。我想保持VERBOSE=1可用,因爲我們有一些腳本,利用它(並使用其他的makefile只知道VERBOSE

那麼其結果必然是,這兩個命令是相同的:

make all VERBOSE=1 # pain to write 
make all V=1 

現在,我的makefile文件看起來今天這個樣子:

ifdef VERBOSE 
[issue compilation commands with verbose mode] 
endif 

我想達成什麼是接近預處理器在C:

if defined(VERBOSE) || defined(V) 
[issue compilation commands with verbose mode] 
endif 

你知道該怎麼做嗎?

+0

ifeq http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or – 2016-06-24 16:56:59

回答

11

我這樣做:

ifneq "$(or $(LINUX_TARGET),$(OSX_TARGET))" "" 

endif 

類似到$(剝離方式,但使用更直觀的$(或關鍵字

+1

Niiii​​ice,這個更清晰。我不知道'或'。 – Gui13 2012-12-16 10:29:26

+0

我轉而接受你的答案,因爲它在語義上完全解決了我的問題。 – Gui13 2016-12-23 11:41:46

4

據我所知,GNU make中的有條件的東西不允許OR和ANDS。你總是可以這樣做:

ifdef VERBOSE 
DOVERBOSE = yes 
endif 
ifdef V 
DOVERBOSE = yes 
endif 

ifeq($DOVERBOSE, yes) 
    main verbose stuff here 
endif 

,但我不明白爲什麼你需要引入(幾乎沒有自我記錄)V在最初的定義。

+0

如果'ifdef V \ VERBOSE = v \ endif'並保持原樣? – Beta 2011-05-16 15:13:23

+0

@貝塔也不錯!但我更喜歡你的答案。 – Gui13 2011-05-17 07:20:40

3

我喜歡尼爾·巴特沃思的做法,但如果你真的想這樣做,在你所描述的風格,這會給你OR:

ifneq "$(strip $(VERBOSE) $(V))" "" 
[be verbose] 
endif 
+0

這是完美的:) – Gui13 2011-05-17 07:21:24

3
VERBOSE := $(or $(VERBOSE),$(V)) 

...然後...

ifeq ($(VERBOSE),1) 
#Conditional stuff 
endif 
0

好,真的遲到了,但我遇到了這一點,並想添加另一種解決方案爲別人誰正在尋找如何將邏輯添加到生成文件:基本上,在shell中執行邏輯,並以這種方式獲取輸出。

ifneq ($(shell ([ $(VERBOSE) ] || [ $(V) ]) && echo y),) 

似乎更令人費解,但如果你有一個if語句有許多細節和ORS,這提供了很大的靈活性,並且會比嵌套$(易讀.. $(或.. ))聲明。

+0

它「提供了很大的靈活性」 - 除了它限制你使用你編碼的特定shell(在你的情況下,BASH) – villapx 2016-04-25 15:47:49