1

是否有一个通用的规则来为从有扩展名的东西到没有扩展名的东西指定一个规则?(在这种情况下,'.in' 到 '')?

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

bazdir=$(libdir)/@PACKAGE_NAME@/baz

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

foo.ini: foo.ini.in
     sed -e 's|@LIBDIR@|$(bazdir)|g' $< > $@

bar.ini: bar.ini.in
     sed -e 's|@LIBDIR@|$(bazdir)|g' $< > $@

这工作正常,但我需要为每个文件复制规则。我想写一条规则,将任何“ini.in”文件替换为“ini”文件。我试过了:

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

但 autoconf 抱怨 % 模式替换是一种不可移植的 gnumake 主义。它也不喜欢

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

..我真的不能因为不喜欢而责怪它,因为我什至无法解析它。

有没有办法做到这一点?

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

4

1 回答 1

2

幸运的是,有一个更好的方法:让“配置”文件使用配置脚本本身从模板生成。正如我在评论中提到的,我认为没有任何理由尝试扩展自身$bazdirMakefile.am如果有特殊原因,也许你可以为我解决这个问题。

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

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

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

假设一projectdir棵树......当然可以是任何类型的树布局:

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

@BAZ_LIBDIR@文件中的实例<file>.ini.in将被替换值替换。sed生成<file>.ini文件不需要神秘的调用。

另一个不错的功能是您不需要在 - 中添加foo.ini.inbar.ini.inEXTRA_DIST变量中,Makefile.am并且make distclean会清理bar.inifoo.ini文件。

于 2013-05-31T21:10:12.060 回答