2012-10-02 26 views
1

在我使用autoconf和automake的項目中,我有兩個可執行文件,分別是「foo」和「bar」。假設「foo.c」看起來像在程序中使用autoconf中的「program_name_transform」

int main() 
{ 
    exec ("bar"); 
    return 0; 
} 

即「foo」使用「bar」。這個工作正常,一旦我做./configure && make && make install。但是,autoconf提供了一個轉換程序名稱的選項。例如,我可以做./configure --program-suffix=-2.0。然後,「富」與「酒吧」將代替安裝爲

/usr/bin/foo-2.0 
/usr/bin/bar-2.0 

在這種情況下,所提到的「欄」裏面的「富」是不正確的,因爲會有系統中沒有bar(應該是bar-2.0)。有什麼辦法可以讓autoconf/automake自動調整這個引用嗎?

+0

特別是如果轉換是針對不同的版本號的話,用符號鏈接'bar - > bar-2.0'命令來擴充'make install'會不會更好? – Jens

+0

這可能在某些情況下有效。但是,如果多個版本共存,那麼它將無法工作。你會有'bar-2.0'和'bar-3.0'。 – ssquidd

回答

4

在您的Makefile中,您可以運行$(program_transform_name) sed腳本來創建具有最終名稱的頭文件。

例如,假設你的程序名稱是foobar,創建一個names.h.in文件,其中包含:

#define FOO_NAME "@[email protected]" 
#define BAR_NAME "@[email protected]" 

然後裝備你的Makefile.am有規則生成names.hnames.h.in

BUILT_SOURCES = names.h 
EXTRA_DIST = names.h.in 

edit = sed \ 
    -e 's/@[email protected]/'`echo foo | sed '$(program_transform_name)'`'/g;' \ 
    -e 's/@[email protected]/'`echo bar | sed '$(program_transform_name)'`'/g;' 

names.h: $(srcdir)/names.h.in Makefile 
     $(edit) < $(srcdir)/names.h.in > [email protected] 

和最後包含names.h並在源代碼中使用FOO_NAMEBAR_NAME

+0

This Works!然而,一個小問題是:我不能再在build目錄中運行程序,因爲'fool'會代替'bar-2.0',直到安裝時纔會存在。有什麼辦法嗎? – ssquidd

+0

當一個程序調用其他程序時,我認爲它應該總是有一些設置(一個選項,一個環境變量或配置文件)在運行時覆蓋這些程序名稱。你通常會在你的測試套件中使用這樣的設置來確保本地版本的二進制文件在'make check'期間被調用。 – adl

+0

明白了。謝謝,這非常有幫助。 – ssquidd