没有扩展名的目标的自动生成默认规则?
Posted
技术标签:
【中文标题】没有扩展名的目标的自动生成默认规则?【英文标题】:Automake default rule for targets with no extension? 【发布时间】:2013-05-31 18:22:11 【问题描述】:是否有一个通用的规则来为从有扩展名的东西到没有扩展名的东西指定一个规则? (在这种情况下,'.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' 没有完全展开。
【问题讨论】:
你能解释一下为什么bazdir
不能完全展开吗?既然$libdir
和$PACKAGE_NAME
变量可以通过configure脚本设置?
【参考方案1】:
幸运的是,有一个更好的方法:让“配置”文件使用配置脚本本身从模板生成。正如我在评论中提到的,我认为没有任何理由尝试在 Makefile.am
本身中扩展 $bazdir
。如果有什么特殊原因,也许你可以帮我解决这个问题。
在configure.ac
脚本中,替换变量是使用AC_SUBST 宏定义的。我猜你想用$bazdir
的值替换LIBDIR
。请注意,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
<file>.ini.in
文件中的@BAZ_LIBDIR@
实例将被替换值替换。生成 <file>.ini
文件不需要神秘的 sed
调用。
另一个不错的功能是您无需将foo.ini.in
或bar.ini.in
添加到Makefile.am
中的EXTRA_DIST
变量中,而make distclean
将清理bar.ini
和foo.ini
文件。
【讨论】:
有趣。我更愿意将 bazdir 的定义保留在目录中 Makefile.am 的本地(这是一个插件目录,任何数量的人都会添加......那些已经抱怨该项目使用 Makefile 的人,更不用说自动工具了)。但是……我想他们不必这样做。嗯。谢谢。以上是关于没有扩展名的目标的自动生成默认规则?的主要内容,如果未能解决你的问题,请参考以下文章