2013-09-25 50 views
0

我有一個其他人寫的軟件包;我無法更改該軟件包中的文件。在該包有一個Makefile中使用了這樣的規則:GNU make:繼承另一個規則的先決條件

$(BIN)/progA: <long list of .o files> 
    $(LINK.cc) $^ -o [email protected] 

我想寫一個GNU做「包裝」周圍的Makefile建立的,而不是從.o文件相同的列表的二進制庫。理想情況下,我想是這樣的:

include package/Makefile 

$(LIB)/progA.so: <magically copy the prerequisites for $(BIN)/progA> 
    $(LD) -shared $(LDFLAGS) $^ $(LIBS) -o [email protected] 

當然,我可以只複製正粘貼列表從包裝的Makefile雷,但包裝經常更新;我更喜歡它,如果我的構建過程會自動奇蹟般地選擇對其Makefile中包的更改所做的任何更改。

我唯一的其他解決方案是複雜的:使用sed或awk或perl來掃描軟件包的Makefile,拉出.o文件列表,並將其分配給包裝器make文件中的變量。如果可以,我想避免這種情況。

+0

如果軟件包經常更新,請提交功能請求,以便它們將目標文件放入「OBJS」變量中,而不是在規則中對其進行硬編碼。 – Kaz

+0

> *我有一個由其他人寫的軟件包;我無法更改該包中的文件。* 此要求不現實。如果你有自己的電腦和一份文件,你可以做任何你想做的事情。您可以將修補程序,導入到維護您自己的分支的存儲庫等等。 – Kaz

回答

0

我對你有兩個想法:

首先,運行類似:

make -n bin/progA LINK.cc='OBJECTS:' | grep ^OBJECTS: 

然後捕獲輸出。儘管如此,你必須從結果中手動除去-o等。

另一個想法是運行「make -pn」來獲取make數據庫的副本,並用grep或其他方法解析它。

這些與直接通過makefile的好處是任何變量等都會通過make擴展。

+0

謝謝,生氣。你的解決方案有效,我正在使用它。 –

+0

如果您對解決方案感到滿意,請點擊旁邊的複選標記接受它。 – MadScientist