2013-10-14 107 views
0

我在我的Makefile這個規則,來響應標誌我傳:的Makefile:規則匹配多個模式

$(BUILD_DIR)/disable_%: 
    mkdir -p $(BUILD_DIR) 
    touch $(BUILD_DIR)/disable_$* 
    rm -f $(BUILD_DIR)/enable_$* 
    cd $(BUILD_DIR) && rm -f Makefile 

$(BUILD_DIR)/enable_%: 
    mkdir -p $(BUILD_DIR) 
    touch $(BUILD_DIR)/enable_$* 
    rm -f $(BUILD_DIR)/disable_$* 
    cd $(BUILD_DIR) && rm -f Makefile 

這意味着,改變標誌時,我調用生成文件,我可以觸發一些可能依賴於這些標誌的重新編譯。
上面提供的代碼有點多餘:您看到我刪除了一個文件,觸摸另一個文件並在兩種情況下都刪除了一個Makefile。唯一改變的是我觸摸/刪除的​​文件的名稱,它們是相關的。

例如,

make clean 
make enable_debug=yes enable_video=no # will compile from zero 
make enable_debug=no enable_video=no # flag change detected -> recompile some submodules that depend on this flag 

只要這兩個規則([en|dis]able)之間唯一改變的,我想是隻有1條通用的規則,這樣的事情:

# match 2 parts in the rule 
$(BUILD_DIR)/%ble_%: 
    mkdir -p $(BUILD_DIR) 
    touch $(BUILD_DIR)/(???)ble_$* # should be [email protected] 
    rm -f $(BUILD_DIR)/(???)able_$* # should be disable if [email protected] is enable and inverse 
    cd $(BUILD_DIR) && rm -f Makefile 

這可能嗎?

PS:對不起,如果我沒有正確得到標題,我無法想象如何更好地解釋它。

回答

1
$(BUILD_DIR)/enable_% $(BUILD_DIR)/disable_%: 
    mkdir -p $(BUILD_DIR) 
    rm -f $(BUILD_DIR)/*able_$* 
    touch [email protected] 
    cd $(BUILD_DIR) && rm -f Makefile 

不是字面上你想要什麼(多通配符被禁止在make中),但是完全相同。

+0

你確定'make enable_toto = yes'會執行'rm -f disable_toto' &&'touch enable_toto'嗎? – Gui13

+0

我編輯了你的代碼以使其工作。使用rm,我可以刪除以前的文件! – Gui13

+0

當你刪除其他的東西時,你可以'rm -f $(BUILD_DIR)/ Makefile'; 'rm'需要多個文件參數,'cd'是完全多餘的。 – tripleee