【问题标题】:Autoconf Produces configure with Broken Functions (ac_fn_set_status, ac_fn_exit)Autoconf 生成带有损坏功能的配置 (ac_fn_set_status, ac_fn_exit)
【发布时间】:2010-07-20 09:16:40
【问题描述】:

我正在尝试为我的项目设置 autoconf。除了在 ./configure 中找不到 ac_set_<...> 函数外,我的一切都“正常”工作。如果我直接运行它们,它们在 configure.status 中工作正常。

具体来说,我遇到了 as_fn_set_status 和 as_fn_exit 的问题。

如果我手动编辑配置文件并将这两个函数移动到配置脚本的顶部,一切正常。

为了达到这一点,我:

  1. 编写了 configure.ac
  2. 运行 autoreconf -i
  3. 运行./configure

生成的行类似于:

./configure: line 1366: as_fn_set_status: command not found

有 3-4 行发生错误。

关于什么可能产生这种效果的任何想法?这是我的 configure.ac:

##########################################
#  Autoconf Configuration File for RPDB  #
##########################################

#   RPDB: An Object-Oriented Wrapper for Oracle's Berkeley Database (BDB/libdb),
#   which is available at: http://www.oracle.com/technology/software/products/berkeley-db/index.html

###########################
#  Init Autoconf >= 2.61  #
###########################

AC_CANONICAL_SYSTEM

AC_PREREQ(2.61)
AC_INIT([rpdb], [0.1.0], [asher@ridiculouspower.com])

AC_CONFIG_AUX_DIR([.])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_FILES([Makefile])
AC_CONFIG_HEADERS([config.h])

AM_INIT_AUTOMAKE

#################################
#  Check for Library Functions  #
#################################

AC_FUNC_ERROR_AT_LINE
AC_FUNC_MALLOC
AC_CHECK_FUNCS([strdup])

################################
#  Check for Working Compiler  #
################################

AC_PROG_CC
AC_PROG_RANLIB

#########################
#  Check for Libraries  #
#########################

AC_SEARCH_LIBS([db_create], [db], [have_libdb=yes])

#######################
#  "Root Sourcefile"  #
#######################

# "Root Sourcefile" is only used nominally to specify base path

AC_CONFIG_SRCDIR([src/RPDB_Base/RPDB.h])

#######################
#  Check for Headers  #
#######################

AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h])

# If we found libdb then check for db.h - we need to have both or we throw an error
if test "x${have_libdb}" = xyes; then
  AC_CHECK_HEADERS([db.h], [], [have_libdb=no])
fi
if test "x${have_libdb}" = xno; then
  echo "------------------------------------------"
  echo " Oracle's Berkeley Database (libdb)       "
  echo " library and header file is required to   "
  echo " build RPDB. Stopping...                  "
  echo " Check 'config.log' for more information. "
  echo "------------------------------------------"
  (exit 1); exit 1;
fi

#####################################################
#  Check For Type-Related Compiler Characteristics  #
#####################################################

AC_C_CONST
AC_HEADER_STDBOOL
AC_TYPE_INT32_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_TYPE_UINT8_T

###############################
#  Generate Configure Script  #
###############################

AC_OUTPUT

【问题讨论】:

    标签: function autoconf configure


    【解决方案1】:

    您不能调用任何在 AC_INIT 之前具有非空扩展的宏。如果您将 AC_CANONICAL_SYSTEM 的调用移到 AC_INIT 之后,您的问题应该会消失。

    【讨论】:

    • 我搬到了 CMake,所以我无法轻易验证这一点,但这是有道理的,所以我会接受它。这符合我可以向上移动宏(大概是由 AC_INIT 创建的?)并且它们可以工作的事实。
    【解决方案2】:

    我有一个类似的问题让我发疯,最终发现了问题: 我试图编译一个提供自己的 m4 宏的旧项目。在包含的 m4 文件(在 config 子目录中)中,已经调用了提供第三个参数的 AC_DEFFUN。 我不明白为什么这会导致这个问题,但去掉第三个参数会有所帮助。

    【讨论】:

      【解决方案3】:

      您是否安装了不同的 autoconf。我认为该函数源自 m4 宏:m4sugar/m4sh.m4。您可以检查该文件以查看它是否具有该功能。

      它应该看起来像:

      [AS_REQUIRE_SHELL_FN([as_fn_set_status],
        [AS_FUNCTION_DESCRIBE([as_fn_set_status], [STATUS],
          [Set $? to STATUS, without forking.])], [  return $[]1])]dnl
      

      【讨论】:

      • 我没有,该功能实际上就在那里 - 并显示在配置的最终输出中。如果我手动编辑配置,它可以工作。
      • m4sh.m4 中的 cmets 提到“我们不能简单地使用“exit N”,因为有些 shell ......”。会不会跟这行有关系:(exit 1); exit 1;
      猜你喜欢
      • 1970-01-01
      • 2015-07-13
      • 2014-07-30
      • 2020-12-29
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多