AC_SUBST不会扩展变量

时间:2015-06-17 16:23:08

标签: autotools autoconf automake m4

在Autotools项目中,我试图生成部分的.conf文件。该程序需要从$(pkgdatadir)读取,但我知道该变量仅在Makefile.in中设置,因此我改为替换datadirPACKAGE

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_OUTPUT

foo.conf.in:

    Dir = @datadir@/@PACKAGE@

生成的foo.conf:

    Dir = ${prefix}/share/foo

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

2 个答案:

答案 0 :(得分:2)

不幸的是,您无法在配置时替换datadir之类的Makefile变量,因为它们并未完全展开。 (参见文档here。)

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

在configure.ac中:

foo.conf
Makefile.am中的

AC_SUBST([PACKAGE])
AC_PROG_SED
AC_CONFIG_FILES([foo.conf.in])

在foo.conf.in.in中:

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

我碰巧使用 Dir = %datadir%/@PACKAGE@ 符号进行构建时替换,这样我就不会将它们与%标记的配置时替换混淆。上面的makefile规则也会使生成的@只读,以便您不会错误地编辑它并覆盖您的更改。

答案 1 :(得分:1)

可以将第二个参数添加到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 没有出现在{ {1}}第二个免责声明。我不是autoconf的粉丝。