2012-10-02 24 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