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

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/. 在配置脚本中设置bazdirbazdir="$libdir/$PACKAGE_NAME/baz",并替换为:AC_SUBST(BAZ_LIBDIR, $bazdir)。或者,只需将值分配给BAZ_LIBDIR 并使用AC_SUBST 的单参数形式。 BAZ_LIBDIR 现在可以替换了...

2/.configure.ac 的末尾,使用AC_CONFIG_FILES 指定要从其&lt;file&gt;.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

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

另一个不错的功能是您无需将foo.ini.inbar.ini.in 添加到Makefile.am 中的EXTRA_DIST 变量中,而make distclean 将清理bar.inifoo.ini 文件。

【讨论】:

有趣。我更愿意将 bazdir 的定义保留在目录中 Makefile.am 的本地(这是一个插件目录,任何数量的人都会添加......那些已经抱怨该项目使用 Makefile 的人,更不用说自动工具了)。但是……我想他们不必这样做。嗯。谢谢。

以上是关于没有扩展名的目标的自动生成默认规则?的主要内容,如果未能解决你的问题,请参考以下文章

通用生成文件显示没有生成目标错误的规则

没有规则使目标'-L/usr/local/lib'

Makefile入门: 用最美味的例子

autotools -- make[1]: *** 没有将目标设为“全部”的规则。停止

make的特殊之处

weka里Apriori关联规则挖掘,我希望得到的结论是与最后一列目标属性的关系,可是总是得到的都是前边条件属