2014-09-23 105 views
1

(GNU的Makefile)目標依賴Makefile中

我想要建立的命名約定爲lib*.so任何庫,並取決於一個變量指定目標文件列表的目標。

E.g.構建libabc.so取決於變量abc_OBJS中的.o文件。我試過lib%.so: $($(%)_OBJS),但那是不對的。

什麼是語法?

回答

1

我想你不能這樣做。 GNU讓manual明確規定:

注意擴大使用「%」的模式規則發生任何 變量或函數的擴展,它發生時,生成文件是 讀。

.SECONDEXPANSION使它工作! (注意:這不是次要的,而是秒)

以下Makefile

abc_OBJS=a.o b.o c.o 
def_OBJS=d.o e.o f.o 

%.o: 
    touch [email protected] 

.SECONDEXPANSION: 

lib%.so: $$(%_OBJS) 
    @echo [email protected] $^ 

結果你想要的!

$ make libabc.so libdef.so 
touch a.o 
touch b.o 
touch c.o 
libabc.so a.o b.o c.o 
touch d.o 
touch e.o 
touch f.o 
libdef.so d.o e.o f.o 
rm a.o b.o c.o e.o d.o f.o 

注意,如果沒有規則來創建依賴(%.o:規則),那麼該模式規則不匹配。

+0

我現在遇到了'.SECONDARYEXPANSION',它可以在目標依賴關係行上工作,但無法在目標內部工作。在編譯器步驟等內部具有二級擴展變量。 – Will 2014-09-23 08:44:05

+0

@Will它可以與'.SECONDEXPANSION'一起使用。更新了我的答案。 – 2014-09-23 09:35:09