Makefile 是否为没有扩展名的目标自动生成默认规则?
是否有一个通用的was来指定一个规则,从有扩展的东西到没有扩展的东西?(在本例中,“.in”“to”“) 我有一个使用automake的项目。我有一些配置文件模板需要在安装之前进行替换。例如,我有一个“foo.ini.in”文件,我想用它来创建“foo.ini”。我有一些分散在整个代码库中。然而,对于每一个,我都需要创建一个定制的Makefile规则来让它们工作。有更好的办法吗?我目前在Makefile.am中执行此操作:Makefile 是否为没有扩展名的目标自动生成默认规则?,makefile,autotools,automake,Makefile,Autotools,Automake,是否有一个通用的was来指定一个规则,从有扩展的东西到没有扩展的东西?(在本例中,“.in”“to”“) 我有一个使用automake的项目。我有一些配置文件模板需要在安装之前进行替换。例如,我有一个“foo.ini.in”文件,我想用它来创建“foo.ini”。我有一些分散在整个代码库中。然而,对于每一个,我都需要创建一个定制的Makefile规则来让它们工作。有更好的办法吗?我目前在Makefile.am中执行此操作: bazdir=$(libdir)/@PACKAGE_NAME@/baz
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' $< > $@
但autoconf抱怨%模式替换是一种不可移植的gnumake ism。它也不喜欢
.ini.in.ini:
sed .....
。。我不能因为它不喜欢而责备它,因为我甚至不能解析它
有办法做到这一点吗
注意:我不能使用AC_CONFIG_文件进行替换,因为在这种情况下“bazdir”没有完全展开 幸运的是,有一种更好的方法:使用配置脚本本身从模板生成“已配置”文件。正如我在评论中提到的,我看不出有任何理由试图在Makefile.am
本身中展开$bazdir
。如果有什么特别的原因,也许你可以帮我澄清一下
在configure.ac
脚本中,使用宏定义替换变量。我猜您想用$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
的末尾,指定要从其模板中生成的文件。通常,这将列出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
.ini.in
文件中的@BAZ_LIBDIR@
实例将替换为替换值。生成.ini
文件不需要神秘的sed
调用
另一个很好的特性是,您不需要将foo.ini.in
或bar.ini.in
添加到Makefile.am
中的EXTRA\code>变量中,makedistclean
将清理bar.ini
和foo.ini
文件。您能解释一下为什么bazdir
不能完全展开吗?由于$libdir
和$PACKAGE\u NAME
变量可以通过configure脚本设置?有趣。我更喜欢将bazdir的定义保留在Makefile.am的本地目录中(这是一个插件目录,任何人都会添加它..那些已经抱怨项目使用Makefile的人,更不用说自动工具了)。但是我想他们不必这么做。呵呵。谢谢
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