2013-02-06 21 views
3

我有一個Makefile看起來大致是這樣的:

FIGURES = A1_B1_C1.eps A2_B2_C2.eps A3_B3_C3.eps 
NUMBERS = 1 2 3 

all : $(FIGURES) 

%.eps : $(foreach num, $(NUMBERS), $(subst B, $(num), %).out) 
    # my_program($+, [email protected]); 

%.out : 

的一點是,我的數字文件名包含某些信息(A,B,C),並且每個圖由my_program從幾個(在示例3)文件中創建。 雖然每個圖的文件名的格式Ax_Bx_Cx.eps,數據文件的名稱,從外觀創建的數字是這樣的:

Ax_1x_Cx.out 
Ax_2x_Cx.out 
Ax_3x_Cx.out 

所以對於每個圖,我需要用幾個文件名的動態創建的依賴列表。換句話說,我對以上示例的期望輸出爲:

#my_program(A1_11_C1.out A1_21_C1.out A1_31_C1.out,A1_B1_C1.eps);

#my_program(A2_12_C2.out A2_22_C2.out A2_32_C2.out,A2_B2_C2.eps);

#my_program(A3_13_C3.out A3_23_C3.out A3_33_C3.out,A3_B2_C3.eps);

不幸的是,subst命令似乎被忽略,對於輸出看起來是這樣的:

#MY-(A1_B1_C1.out A1_B1_C1.out A1_B1_C1.out,A1_B1_C1.eps);

#my_program(A2_B2_C2.out A2_B2_C2.out A2_B2_C2.out,A2_B2_C2.eps);

#my_program(A3_B3_C3.out A3_B3_C3.out A3_B3_C3.out,A3_B3_C3.eps);

我看了一下this possible duplicate但盤算了一下,回答也幫不了我,因爲我使用%而不是[email protected],這應該是在先決條件確定。

很明顯,我在這裏遇到了問題。任何幫助是極大的讚賞。

回答

3

要你需要花哨的前提操作至少使-3.82,支持Secondary Expansion feature

FIGURES = A1_B1_C1.eps A2_B2_C2.eps A3_B3_C3.eps 
NUMBERS = 1 2 3 

all : $(FIGURES) 

.SECONDEXPANSION: 

$(FIGURES) : %.eps : $$(foreach num,$$(NUMBERS),$$(subst B,$$(num),$$*).out) 
    @echo "my_program($+, [email protected])" 

%.out : 
    touch [email protected] 

輸出:

$ make 
touch A1_11_C1.out 
touch A1_21_C1.out 
touch A1_31_C1.out 
my_program(A1_11_C1.out A1_21_C1.out A1_31_C1.out, A1_B1_C1.eps) 
touch A2_12_C2.out 
touch A2_22_C2.out 
touch A2_32_C2.out 
my_program(A2_12_C2.out A2_22_C2.out A2_32_C2.out, A2_B2_C2.eps) 
touch A3_13_C3.out 
touch A3_23_C3.out 
touch A3_33_C3.out 
my_program(A3_13_C3.out A3_23_C3.out A3_33_C3.out, A3_B3_C3.eps) 
+0

大,非常感謝! – Jenny