AC_SUBST不展开变量
AC_SUBST does not expand variable
在 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_OUTPUT
foo.conf.in:
Dir = @datadir@/@PACKAGE@
结果foo.conf:
Dir = ${prefix}/share/foo
我希望 autoconf 在替换时评估 ${prefix}
,但我不知道如何实现。
可以将第二个参数添加到 AC_CONFIG_FILES
,它是 shell 代码 运行 在 configure 中变量的上下文中脚本。
所以你可以在那里添加某种替代。例如改变
AC_CONFIG_FILES(foo.conf)
至:
AC_CONFIG_FILES([foo.conf], [sed -i -e"s/${prefix}/$prefix/" foo.conf])
如果这段代码变得又长又笨拙,无法将其全部放在一个单独的文件中,然后 运行 或者 source ,我该怎么办。
免责声明: 当我尝试复制您的结果时,我收到有关 --dataroot
被忽略和 $prefix 的消息没有出现在 foo.conf
第二个免责声明中。我不喜欢 autoconf。
不幸的是,您不能在配置时替换像 datadir
这样的 Makefile 变量,因为它们没有完全展开。 (请参阅文档 here。)
如果您想同时进行配置时和构建时替换,不幸的解决方案是进行两步替换,在配置时从 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
只读,这样您就不会错误地编辑它并覆盖您的更改。
在 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_OUTPUT
foo.conf.in:
Dir = @datadir@/@PACKAGE@
结果foo.conf:
Dir = ${prefix}/share/foo
我希望 autoconf 在替换时评估 ${prefix}
,但我不知道如何实现。
可以将第二个参数添加到 AC_CONFIG_FILES
,它是 shell 代码 运行 在 configure 中变量的上下文中脚本。
所以你可以在那里添加某种替代。例如改变
AC_CONFIG_FILES(foo.conf)
至:
AC_CONFIG_FILES([foo.conf], [sed -i -e"s/${prefix}/$prefix/" foo.conf])
如果这段代码变得又长又笨拙,无法将其全部放在一个单独的文件中,然后 运行 或者 source ,我该怎么办。
免责声明: 当我尝试复制您的结果时,我收到有关 --dataroot
被忽略和 $prefix 的消息没有出现在 foo.conf
第二个免责声明中。我不喜欢 autoconf。
不幸的是,您不能在配置时替换像 datadir
这样的 Makefile 变量,因为它们没有完全展开。 (请参阅文档 here。)
如果您想同时进行配置时和构建时替换,不幸的解决方案是进行两步替换,在配置时从 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
只读,这样您就不会错误地编辑它并覆盖您的更改。