没有扩展名的目标的自动默认规则?

时间:2013-05-31 18:22:12

标签: makefile autotools automake

是否有通用的是为某些内容指定规则,从具有扩展名的内容到没有扩展名的内容? (在这种情况下,'。''到'')?

我有一个使用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-ism。它也不喜欢

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

..我不能因为不喜欢而责备它,因为我甚至无法解析它。

有办法做到这一点吗?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

2 /.configure.ac结束时,使用AC_CONFIG_FILES指定要从<file>.in模板生成的文件。通常,这将列出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.in添加到EXTRA_DIST中的Makefile.am变量 - 而make distclean将清除{ {1}}和bar.ini个文件。