2013-05-31 43 views
1

是否有一种通用的做法是指定一个规则,用于从具有扩展名的内容到没有扩展名的内容? (在这种情况下,'.in'到'')?Automake对于没有扩展名的目标的默认规则?

我有一个使用automake的项目。我有一些配置文件模板在安装之前需要替换。例如,我有一个'foo.ini.in'文件,我想用它来创建'foo.ini'。我有一些散布在整个代码库中的。但是,对于每一个,我需要创建一个自定义的Makefile规则来使它们工作。有没有更好的办法?我目前做这Makefile.am:

bazdir=$(libdir)/@[email protected]/baz 

EXTRA_DIST = foo.ini.in bar.ini.in 
CLEANFILES = foo.ini bar.ini 

foo.ini: foo.ini.in 
    sed -e 's|@[email protected]|$(bazdir)|g' $< > [email protected] 

bar.ini: bar.ini.in 
    sed -e 's|@[email protected]|$(bazdir)|g' $< > [email protected] 

这工作得很好,但我需要复制每个文件的规则。我想写一条规则,将任何'ini.in'文件替换为'ini'文件。我试过了:

%.ini.in: %.ini 
    sed .... 

但autoconf抱怨%模式替换是不可移植的gnumake-ism。它也不喜欢

.ini.in.ini: 
    sed ..... 

..我真的不能指责它不喜欢,因为我甚至不能解析它。

有没有办法做到这一点?

注意:我不能使用AC_CONFIG_FILES来做这个替换,因为在这种情况下'bazdir'没有完全展开。

+0

你能解释一下为什么*'bazdir'不能完全展开?由于'$ libdir'和'$ PACKAGE_NAME'变量可以通过configure脚本来设置吗? –

回答

2

幸运的是,还有一个很多更好的方法:让使用配置脚本本身从模板生成'配置'的文件。正如我在评论中提到的,我没有看到任何理由尝试在Makefile.am本身中扩大$bazdir。也许你可以为我清除这个,如果有这个特殊的原因。

configure.ac脚本中,用AC_SUBST宏定义替换变量。我猜你想用$bazdir的值代替LIBDIR。请注意0​​不是一个好名字的选择,因为libdir已经在配置脚本中使用;所以让我们使用一个前缀为项目名称的变量名称:BAZ_LIBDIR

1 /。在配置脚本中设置bazdirbazdir="${libdir}/${PACKAGE_NAME}/baz",并替换为:AC_SUBST(BAZ_LIBDIR, $bazdir)。或者,只需将值分配给BAZ_LIBDIR并使用AC_SUBST的单参数形式。 BAZ_LIBDIR现在已准备好替代...

2 /。configure.ac的末尾,指定要从<file>.in模板生成的文件,并使用AC_CONFIG_FILES。通常这将列出Makefile以及数据文件,其中.in后缀是隐含的。

假设projectdir树......可以是任何类型的课程的树布局:在<file>.ini.in文件@[email protected]

BAZ_LIBDIR="${libdir}/${PACKAGE_NAME}/baz" 
AC_SUBST(BAZ_LIBDIR) 
... 
AC_CONFIG_FILES([Makefile projectdir/Makefile]) 
AC_CONFIG_FILES([projectdir/foo.ini projectdir/bar.ini]) 
... 
AC_OUTPUT 

实例将替换值代替。不需要神秘的sed调用来生成<file>.ini文件。

另一个优点是,你不需要在Makefile.am添加foo.ini.inbar.ini.inEXTRA_DIST变量 - 和make distclean将清除bar.inifoo.ini文件。

+0

有趣。我更愿意在目录中保留对Makefile.am本地化的bazdir的定义(这是一个插件目录,任何数量的人都会添加......已经抱怨项目使用Makefiles的人,更不用说autotools)。但是..我猜他们不会。呵呵。谢谢。 – clemej