首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AC_SUBST不展开变量

AC_SUBST不展开变量
EN

Stack Overflow用户
提问于 2015-06-17 16:23:07
回答 2查看 2.2K关注 0票数 4

在Autotools项目中,我试图生成部分.conf文件。程序需要从$(pkgdatadir)读取,但我知道这个变量只在Makefile.in中设置,所以我代替了datadirPACKAGE

configure.ac:

代码语言:javascript
复制
    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_OUTPUT

foo.conf.in:

代码语言:javascript
复制
    Dir = @datadir@/@PACKAGE@

由此产生的foo.conf:

代码语言:javascript
复制
    Dir = ${prefix}/share/foo

我希望autoconf在替换时评估${prefix},我不知道如何实现这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-21 00:50:57

不幸的是,您不能在配置时替代Makefile变量,比如datadir,因为它们没有完全展开。(请参阅文档这里。)

如果您想同时执行配置时和构建时替换,那么一个不幸的解决方案是执行两步替换,从配置时的foo.conf.in.infoo.conf.in,在构建时执行foo.conf.infoo.conf

在configure.ac中:

代码语言:javascript
复制
AC_SUBST([PACKAGE])
AC_PROG_SED
AC_CONFIG_FILES([foo.conf.in])

在Makefile.am中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
 Dir = %datadir%/@PACKAGE@

我碰巧对构建时替换使用了%符号,这样我就不会将它们与@标记的配置时替换混淆起来。上面的makefile规则还使生成的foo.conf只读,这样您就不会错误地编辑它,并且会覆盖您的更改。

票数 3
EN

Stack Overflow用户

发布于 2015-06-19 07:11:33

第二个参数可以添加到AC_CONFIG_FILES中,它是在配置脚本中的变量上下文中运行的shell代码。

所以你可以在那里加入某种替代。例如,改变

代码语言:javascript
复制
AC_CONFIG_FILES(foo.conf)

至:

代码语言:javascript
复制
AC_CONFIG_FILES([foo.conf], [sed -i -e"s/\${prefix}/$prefix/" foo.conf])

如果这段代码长而笨重,无法将其放在一个单独的文件中运行,或者可能是源代码,我会做什么。

免责声明:当我试图复制您的结果时,我收到了关于--dataroot被忽略的消息,而$prefix没有出现在foo.conf第二免责声明中。我不是自行车赛的粉丝。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30897170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档