在Autotools项目中,我试图生成部分.conf文件。程序需要从$(pkgdatadir)读取,但我知道这个变量只在Makefile.in中设置,所以我代替了datadir和PACKAGE。
configure.ac:
AC_PREREQ([2.69])
AC_INIT([foo], [1.0.0], [me@foo.com])
AC_CONFIG_SRCDIR([foo.c])
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIRS([m4])
AC_SUBST(datadir)
AC_SUBST(PACKAGE)
AC_CONFIG_FILES(foo.conf)
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_MKDIR_P
AC_CONFIG_FILES([Makefile])
AC_OUTPUTfoo.conf.in:
Dir = @datadir@/@PACKAGE@由此产生的foo.conf:
Dir = ${prefix}/share/foo我希望autoconf在替换时评估${prefix},我不知道如何实现这一点。
发布于 2015-06-21 00:50:57
不幸的是,您不能在配置时替代Makefile变量,比如datadir,因为它们没有完全展开。(请参阅文档这里。)
如果您想同时执行配置时和构建时替换,那么一个不幸的解决方案是执行两步替换,从配置时的foo.conf.in.in到foo.conf.in,在构建时执行foo.conf.in到foo.conf:
在configure.ac中:
AC_SUBST([PACKAGE])
AC_PROG_SED
AC_CONFIG_FILES([foo.conf.in])在Makefile.am中:
edit_script = $(SED) \
-e 's,%datadir%,$(datadir),'g \
-e ...other build-time substitutions you might want to do... \
$(NULL)
foo.conf: foo.conf.in Makefile
$(AM_V_GEN)rm -f $@ $@.tmp && \
$(edit_script) $< >$@.tmp && \
chmod a-w $@.tmp && \
mv $@.tmp $@
CLEANFILES += foo.conf在foo.conf.in.in中:
Dir = %datadir%/@PACKAGE@我碰巧对构建时替换使用了%符号,这样我就不会将它们与@标记的配置时替换混淆起来。上面的makefile规则还使生成的foo.conf只读,这样您就不会错误地编辑它,并且会覆盖您的更改。
发布于 2015-06-19 07:11:33
第二个参数可以添加到AC_CONFIG_FILES中,它是在配置脚本中的变量上下文中运行的shell代码。
所以你可以在那里加入某种替代。例如,改变
AC_CONFIG_FILES(foo.conf)至:
AC_CONFIG_FILES([foo.conf], [sed -i -e"s/\${prefix}/$prefix/" foo.conf])如果这段代码长而笨重,无法将其放在一个单独的文件中运行,或者可能是源代码,我会做什么。
免责声明:当我试图复制您的结果时,我收到了关于--dataroot被忽略的消息,而$prefix没有出现在foo.conf第二免责声明中。我不是自行车赛的粉丝。
https://stackoverflow.com/questions/30897170
复制相似问题