是否有通用的是为某些内容指定规则,从具有扩展名的内容到没有扩展名的内容? (在这种情况下,'。''到'')?
我有一个使用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'没有完全展开。
答案 0 :(得分:2)
幸运的是,有一个很多更好的方法:让使用configure脚本本身从模板生成'配置'文件。正如我在评论中提到的,我认为没有任何理由尝试在$bazdir
中展开Makefile.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 /.在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.in
或bar.ini.in
添加到EXTRA_DIST
中的Makefile.am
变量 - 而make distclean
将清除{ {1}}和bar.ini
个文件。