AC_SUBST 不展开变量

Posted

技术标签:

【中文标题】AC_SUBST 不展开变量【英文标题】:AC_SUBST does not expand variable 【发布时间】:2015-06-17 16:23:07 【问题描述】:

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

配置.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_OUTPUT

foo.conf.in:

    Dir = @datadir@/@PACKAGE@

生成的 foo.conf:

    Dir = $prefix/share/foo

我希望 autoconf 在替换时评估 $prefix,但我不知道如何实现。

【问题讨论】:

【参考方案1】:

不幸的是,您不能在配置时替换像 datadir 这样的 Makefile 变量,因为它们没有完全展开。 (参见文档here。)

如果您想同时进行配置时和构建时替换,不幸的解决方案是进行两步替换,在配置时从 foo.conf.in.infoo.conf.in,在配置时从 foo.conf.infoo.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 设为只读,这样您就不会误编辑它并覆盖您的更改。

【讨论】:

看起来就是这样。感谢您的聪明回应。【参考方案2】:

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

所以你可以在那里添加某种替换。比如改变

AC_CONFIG_FILES(foo.conf)

到:

AC_CONFIG_FILES([foo.conf], [sed -i -e"s/\$prefix/$prefix/" foo.conf])

如果这段代码变得又长又笨重,我该怎么办?把它全部放在一个单独的文件中并运行它,或者可能是 source 它。

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

【讨论】:

这不起作用,因为在执行AC_CONFIG_FILEScommands 参数期间未在shell 中定义$prefix。您需要添加第三个参数 (init-cmds)。此外,如果$prefix 包含斜线,而且通常是这样,那么您的sed 调用将失败。您需要用其他东西替换斜杠,例如百分号:AC_CONFIG_FILES([foo.conf], [sed -i -e "s%\$prefix%$prefix%/g" foo.conf], [export prefix=$prefix]) 见gnu.org/software/autoconf/manual/autoconf-2.69/html_node/…

以上是关于AC_SUBST 不展开变量的主要内容,如果未能解决你的问题,请参考以下文章

AC_SUBST 指定额外的源目录

环境变量并不总是在 GitHub Actions 工作流文件中展开

什么是解包变量?

不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil

如何结合 AC_SUBST 和 AC_DEFINE?

具有 NSData 变量的领域对象,在展开可选值时意外发现 nil