2016-11-11 81 views
0

我有一個使用模式特定變量和目標特定變量來控制編譯設置的makefile。單個目標可以指定特定於目標的變量來覆蓋更一般的編譯設置。然而,有些設置是互斥的,我受制於如何在makefile中添加條件來調整基於另一個的設置,已針對配方設置了目標特定的變量。如何在設置目標特定變量後執行條件?

我的生成文件上的IBM i(GNU讓4.0),其中有許多人不熟悉運行,所以這裏是一個製造的例子,希望能更有意義,最:

.PHONY: all 
all: object1.o object2.o 

%.o: TYPE = solid 
%.o: ITEM = stone 

%.o: %.c 
    compile_command -type $(TYPE) -item $(ITEM) 

object1.o: ITEM = helium 
object1.o: object1.c 

object2.o: ITEM = water 
object2.o: object2.c 

模式特定

對於所有 .o文件,變量爲 TYPEITEM設置默認值。 object1.o重設 ITEM爲「氦氣」。如何插入條件以便如果 ITEM等於「氦氣」,那麼 TYPE可以自動設置爲「氣體」?同樣,如果 ITEM等於「水」,那麼我們如何自動將 TYPE設置爲「液體」?目標是避免必須明確指定 TYPE作爲目標特定變量;它應該能夠由規則導出。

回答

1

你可以這樣做:

GASSES = helium argon 
LIQUIDS = water 
derive_type = $(or $(if $(filter $(ITEM),$(GASSES)),gas),$(if $(filter $(ITEM),$(LIQUIDS)),liquid),$(TYPE)) 

%.o: %.c 
     compile_command -type $(derive_type) -item $(ITEM) 

基本上,or功能是短路,並返回傳入的列表是非空的第一個項目,和filter函數返回一個匹配值。因此,這表示如果$(GASSES)變量中存在ITEM的值,則返回第一個值爲「gas」的值,如果$(LIQUIDS)liquid的值同時存在,並且所有其他值都失敗,則返回值爲$(TYPE)的值。

如果您想允許TYPE成爲第一個被選中的設置,那麼可能需要做一些與默認值相關的工作。

+0

所以這聽起來像我的變量需要在配方中使用,這是當你做這個過程 - 因爲那時所有的目標特定變量已經設置。是否可以在條件內設置其他變量的值?我得到,你可以說'x = $(some_expression_that_calculates_x)',但是有沒有辦法來粘貼一個條件,基本上說'如果x ='some_value'然後設置y 3和z 4'? – smeep

+0

你可以用'eval'來做到這一點,但這並不容易。它也可能不是做事的最佳方式:例如,您可能會考慮使用計算的變量名稱。這聽起來不像你上面要問的同一個問題,而且對於評論來說答案太複雜。我建議你開始一個不同的SO問題,詢問你想要的真實信息,如果這個問題沒有真正反映這個問題。 – MadScientist

相關問題