2016-06-15 76 views
1

我有這樣的規則。makefile中的不同目錄的相同規則

$(OBJDIR)/%.s: %.c 
    $(CC) $(PPE-CFLAGS) $(DEFS) -S -o [email protected] $< 

我有一個像

dirs := $(OBJDIR) $(COMOBJDIR) 

因此,而不是寫重複的代碼爲每個目錄,我可以讓他們到一個列表?類似於需求迭代?

+0

歡迎來到SO。你的問題不清楚。 請參閱[如何提問](http://stackoverflow.com/help/how-to-ask)和 發佈問題makefile。如果它很大並且很複雜,那麼 會發佈一個makefile文件的[Minimal,Complete,Verifiable Example](http://stackoverflow.com/help/mcve),這個文件可以讓你更簡單。請格式化 代碼,方法是在編輯器中縮進4個空格或使用代碼格式化按鈕。 –

回答

1

你已經擊中了Make的一個弱點:它無法一次處理多個通配符。有一種方法,但它很醜。

首先把你的規則:

$(OBJDIR)/%.s: %.c 
    $(CC) $(PPE-CFLAGS) $(DEFS) -S -o [email protected] $< 

,並把它變成一個變量,轉義 '$' 符號和更換$(OBJDIR)$(1)

define myrule 
$(1)/%.s: %.c 
    $$(CC) $$(PPE-CFLAGS) $$(DEFS) -S -o [email protected] $$< 
endef 

然後你就可以使用call調用它,使用eval

$(eval $(call myrule, $(OBJDIR)) 

這對OBJDIR不夠好,而是爲一個目錄列表做同樣的,使用foreach

$(foreach dir, $(OBJDIR) $(COMOBJDIR), $(eval $(call myrule, $(dir)))) 

或者只是使用您的變量:

dirs := $(OBJDIR) $(COMOBJDIR) 
$(foreach dir, $(dirs), $(eval $(call myrule, $(dir)))) 

醜陋,但是有效。

+0

我仍然喜歡將命令移動到(canned)變量中,然後只需定義多個每個目錄規則。更多的寫作,但沒有引用'$'字符的粘性混亂。 – Dummy00001

相關問題