2013-04-28 19 views
0

我面臨着製作多個目標的問題,並希望避免Makefile中的代碼重複。Makefile:避免代碼重複使用循環定義和規則 - 是否有可能?

我有很多的這些:

$(TARGET1): $(OFILES1) 
    $(LD) $(LDFLAGS) $(OFILES1) -o $(TARGET1) 
... 
$(TARGET50): $(OFILES50) 
    $(LD) $(LDFLAGS) $(OFILES50) -o $(TARGET50) 

1)如何把它寫在循環,這可能嗎?

2)它會工作的定義? :

i=1 ; while [[ $$i -le $(MAX_TARGETS) ]] ; do \ 
    -include $(OFILES$(i):.o=.d); \ 
    ((i = i + 1)) ; \ 
done 

謝謝!

+0

很高興您有足夠的精力去擔心makefile中的代碼重複。我傾向於更多地關注源,我自己。 ;-) – 2013-04-28 17:10:25

+0

來源是第一位,但這也很重要:) – mike 2013-04-30 10:25:06

回答

2

讓我們先從你有什麼:

$(TARGET1): $(OFILES1) 
    $(LD) $(LDFLAGS) $(OFILES1) -o $(TARGET1) 
$(TARGET2): $(OFILES2) 
    $(LD) $(LDFLAGS) $(OFILES2) -o $(TARGET2) 
... 
$(TARGET50): $(OFILES50) 
    $(LD) $(LDFLAGS) $(OFILES50) -o $(TARGET50) 

然後用一些自動變量來減少冗餘:

$(TARGET1): $(OFILES1) 
    $(LD) $(LDFLAGS) $^ -o [email protected] 
$(TARGET2): $(OFILES2) 
    $(LD) $(LDFLAGS) $^ -o [email protected] 
... 
$(TARGET50): $(OFILES50) 
    $(LD) $(LDFLAGS) $^ -o [email protected] 

然後重新安排的事情一點點:

$(TARGET1): $(OFILES1) 
$(TARGET2): $(OFILES2) 
... 
$(TARGET50): $(OFILES50) 
$(TARGET3) $(TARGET2) ... $(TARGET50): 
    $(LD) $(LDFLAGS) $^ -o [email protected] 

在這指點你可能寫一個循環,將是e等同於前五十行,另一個是在最終規則中生成一長串目標,但首先看看如何定義這些變量是一個好主意。有可能將所有這些都歸結爲單一模式規則。

0

我同意測試版。另外,無論如何,你必須在某個地方定義所有這些make變量:爲什麼不只是創建先決條件列表呢?但是,如果你真的想這樣做,你可以使用$(eval ...)這樣的:

define PREREQ 
$(TARGET$I) : $(OFILES$I) 
ALLTARGETS += $(TARGET$I) 
endef 

ALLTARGETS := 
INDEXES := $(shell seq 1 50) 

$(foreach I,$(INDEXES),$(eval $(PREREQ))) 

$(ALLTARGETS) : 
     $(LD) $(LDFLAGS) -o [email protected] $^ 

eval功能可能會非常棘手理解,所以我建議人們避免它,除非他們真的需要它。

+0

謝謝!可能我會稍後使用它.. – mike 2013-04-29 17:17:53