更改 configure.ac 中的 *FLAGS 与使用子项目缓存

Irf*_*rfy 5 automake autoconf autotools cflags

假设我想CFLAGS在我的configure脚本中添加一个特定的标志,它应该传播到所有子项目的configure脚本:

CFLAGS+=" -Dfoobar"
export CFLAGS
AC_CONFIG_SUBDIRS([sub])
Run Code Online (Sandbox Code Playgroud)

这在configure被简单调用时有效。一旦发生以下情况之一:

  1. CFLAGSconfigure调用时在环境中导出
  2. CFLAGSconfigure命令行上设置
  3. 使用缓存 ( configure -C)

这种方法不再有效。在前两种情况下,exportedCFLAGS被简单地忽略了;在最后一个中,configure失败了

配置:错误:上次运行中未设置“CFLAGS”


我设法通过以下方式使其可靠地工作:

AM_CFLAGS+=" -Dfoobar"
export AM_CFLAGS
AC_SUBST([AM_CFLAGS]) # repeat this line in every configure.ac for each *FLAGS
AC_CONFIG_SUBDIRS([sub])
Run Code Online (Sandbox Code Playgroud)

考虑到有多个子项目,并且*FLAGS可能需要像这样设置多个变量,这虽然半途而废,但仍然是次优的。有没有办法通过只破解顶级来完成这项工作configure.ac

Irf*_*rfy 1

最终的解决方案是取消受影响变量的价值:

顶级configure.ac:

AC_INIT([test], [0.1])
AC_CONFIG_MACRO_DIR([m4]) # for ax_append_flag.m4
AM_INIT_AUTOMAKE([-Wall -Werror foreign])

AC_PROG_CC
AC_PROG_SED

# Modify the CFLAGS. AX_APPEND_FLAG makes sure not to add the flag if it's already there
AX_APPEND_FLAG([-Dtop-configure], [CFLAGS])

AC_DEFUN([AX_UNPRECIOUS], [
    m4_define([_AC_PRECIOUS_VARS], m4_bpatsubst(_AC_PRECIOUS_VARS, [$1
], []))
])
AX_UNPRECIOUS([CFLAGS])
export CFLAGS

AC_CONFIG_SUBDIRS([sub])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)

在幕后,CFLAGS永远不会被视为珍贵的,因此永远不会缓存或传递给子包- 它们将其专门configure视为环境变量,然后将其本身缓存在公共顶级中。config.cache

这工作得非常可靠,并且通过允许跨顶级配置运行缓存值(并且更简单)来改进我之前的解决方案。