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

Makefile 是否为没有扩展名的目标自动生成默认规则?,makefile,autotools,automake,Makefile,Autotools,Automake,是否有一个通用的was来指定一个规则,从有扩展的东西到没有扩展的东西?(在本例中,“.in”“to”“) 我有一个使用automake的项目。我有一些配置文件模板需要在安装之前进行替换。例如,我有一个“foo.ini.in”文件,我想用它来创建“foo.ini”。我有一些分散在整个代码库中。然而,对于每一个,我都需要创建一个定制的Makefile规则来让它们工作。有更好的办法吗?我目前在Makefile.am中执行此操作: bazdir=$(libdir)/@PACKAGE_NAME@/baz

是否有一个通用的was来指定一个规则,从有扩展的东西到没有扩展的东西?(在本例中,“.in”“to”“)

我有一个使用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' $< > $@
但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