Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sh 如何基于PKG_CHECK_模块结果定义AM_CONDITIONAL和AC_define?_Sh_Autotools_Autoconf_Automake_Pkg Config - Fatal编程技术网

Sh 如何基于PKG_CHECK_模块结果定义AM_CONDITIONAL和AC_define?

Sh 如何基于PKG_CHECK_模块结果定义AM_CONDITIONAL和AC_define?,sh,autotools,autoconf,automake,pkg-config,Sh,Autotools,Autoconf,Automake,Pkg Config,我正在尝试编写一个configure.ac文件来执行以下任务: configure脚本应接受一个带有libuv参数的 带有_libuv的变量应设置为yes、no或check(当命令行上没有传递任何内容时,check为默认值) 当带有=1.9.0的强制PKG\u检查\u模块检查,并在成功时设置HAVE\u libuv=1(出错时配置应中止) 当带有_libuv==“否”时,不应检查任何内容 当带有_libuv==“false”时,应执行可选的PKG_检查_模块检查(与3中的库相同),并且HAVE_

我正在尝试编写一个
configure.ac
文件来执行以下任务:

  • configure
    脚本应接受一个带有libuv参数的

  • 带有_libuv的变量
    应设置为
    yes
    no
    check
    (当命令行上没有传递任何内容时,
    check
    为默认值)

  • 带有
    时,应执行
    libuv>=1.9.0
    的强制PKG\u检查\u模块检查,并在成功时设置
    HAVE\u libuv=1
    (出错时
    配置
    应中止)

  • 带有_libuv==“否”
    时,不应检查任何内容

  • 带有_libuv==“false”
    时,应执行可选的PKG_检查_模块检查(与3中的库相同),并且
    HAVE_libuv
    应相应地设置为
    0
    1

  • 如果
    与_libuv!=“否”和&HAVE_LIBUV==1
    AC_DEFINE应设置
    -DUSE_LIBUV
    ,AM_CONDITIONAL应设置
    使用_LIBUV
    作为自动生成的条件

  • 如果不是
    与_libuv!=“no”和HAVE_LIBUV==1
    不应设置预处理器指令,而AM_条件应设置为
    0

  • 我已经想出了如何做步骤1-5,但我正在努力与6和7

    以下是我目前的尝试:

    AC_INIT(
      [mumble-pluginbot-plusplus],
      [0.5],
      [https://github.com/promi/mumble-pluginbot-plusplus/issues],
      [],
      [https://github.com/promi/mumble-pluginbot-plusplus])
    
    AC_CONFIG_MACRO_DIR([m4])
    AM_INIT_AUTOMAKE([foreign])
    AM_SILENT_RULES([yes])
    
    AC_PROG_CXX
    LT_INIT
    
    # Make sure that pkg-config is installed!
    # The PKG_CHECK_MODULES macro prints a horrible error message when
    # pkg-config is not installed at autogen time.                   
    #
    # It is also required when the first PKG_CHECK_MODULES is inside a conditional
    PKG_PROG_PKG_CONFIG
    
    PKG_CHECK_MODULES(OPUS, [opus >= 1.1])
    PKG_CHECK_MODULES(OPENSSL, [openssl])
    PKG_CHECK_MODULES(PROTOBUF, [protobuf])
    PKG_CHECK_MODULES(MPDCLIENT, [libmpdclient])
    
    AC_ARG_WITH(
      [libuv],
      [AS_HELP_STRING([--with-libuv], [support efficient MPD status polling @<:@default=check@:>@])],
      [],
      [with_libuv=check])
    
    # if     --with-libuv    -> it must be installed
    # elseif --without-libuv -> do nothing
    # else                   -> check whether it is installed
    AS_CASE(
      ["$with_libuv"],
      [yes], [PKG_CHECK_MODULES(UV, [libuv >= 1.9.0], [HAVE_LIBUV=1])],
      [no],  [],
             [PKG_CHECK_MODULES(UV, [libuv >= 1.9.0], [HAVE_LIBUV=1], [HAVE_LIBUV=0])])
    
    if test "$with_libuv" != no -a "x$HAVE_LIBUV" -eq x1; then
       AM_CONDITIONAL([USE_LIBUV], [1])
       AC_DEFINE([USE_LIBUV], [1], [Define when libuv should be used.])
    else
       AM_CONDITIONAL([USE_LIBUV], [0])
    fi
    
    #AC_CONFIG_HEADERS([src/config.h])
    AC_CONFIG_FILES([Makefile])
    
    AC_OUTPUT
    
    以下是配置输出的摘录:

    checking pkg-config is at least version 0.9.0... yes
    checking for OPUS... yes
    checking for OPENSSL... yes
    checking for PROTOBUF... yes
    checking for MPDCLIENT... yes
    checking for UV... yes
    ./configure: line 16467: test: x1: integer expression expected
    ./configure: line 16480: 0: command not found
    checking that generated files are newer than configure... done
    

    如何以实际可行的方式实施步骤6和7?

    我认为您应该使用
    =
    而不是
    -eq
    -eq
    是整数之间的关系,
    x1
    不是整数

    if test "$with_libuv" != no -a "x$HAVE_LIBUV" -eq x1; then
    
    取代

    if test "$with_libuv" != no -a "x$HAVE_LIBUV" = x1; then
    

    我认为你应该使用
    =
    而不是
    -eq
    -eq
    是整数之间的关系,
    x1
    不是整数

    if test "$with_libuv" != no -a "x$HAVE_LIBUV" -eq x1; then
    
    取代

    if test "$with_libuv" != no -a "x$HAVE_LIBUV" = x1; then
    

    这应该可以做到:

    if test "$with_libuv" != no -a "x$HAVE_LIBUV" == x1; then
       AC_DEFINE([USE_LIBUV], [1], [Define when libuv should be used.])
    fi
    AM_CONDITIONAL([USE_LIBUV], [test "$with_libuv" != no -a "x$HAVE_LIBUV" == x1])
    

    这有点难看,因为测试执行了两次,但似乎工作正常。

    这应该可以做到:

    if test "$with_libuv" != no -a "x$HAVE_LIBUV" == x1; then
       AC_DEFINE([USE_LIBUV], [1], [Define when libuv should be used.])
    fi
    AM_CONDITIONAL([USE_LIBUV], [test "$with_libuv" != no -a "x$HAVE_LIBUV" == x1])
    

    这有点难看,因为测试执行了两次,但它似乎工作正常。

    如果
    失败,您不会中止测试(步骤3)<代码>AM_条件
    。步骤6显示了
    -DUSE_LIBUV
    ,但您现有的代码会将
    -DUSE_LIBUV=1
    添加到
    DEFS
    。便携式shell脚本考虑了
    测试-a
    ,因此您不应该使用它。您的
    no
    案例相当于搜索失败的
    check
    (或
    false
    )案例

    AS_CASE(
       ["$with_libuv"],
       [yes], [PKG_CHECK_MODULES(UV, [libuv >= 1.9.0], [HAVE_LIBUV=1],
                                [AC_MSG_ERROR("libuv >= 1.9.0 is not installed")])],
       [no],  [HAVE_LIBUV=0],
       [PKG_CHECK_MODULES(UV, [libuv >= 1.9.0], [HAVE_LIBUV=1],[HAVE_LIBUV=0])])
    
    AS_IF([test "x$HAVE_LIBUV" = x1], [AC_DEFINE([USE_LIBUV])])
    AM_CONDITIONAL([USE_LIBUV], [test "x$HAVE_LIBUV" = x1])
    

    yes
    失败时,您不会中止操作(步骤3)<代码>AM_条件
    。步骤6显示了
    -DUSE_LIBUV
    ,但您现有的代码会将
    -DUSE_LIBUV=1
    添加到
    DEFS
    。便携式shell脚本考虑了
    测试-a
    ,因此您不应该使用它。您的
    no
    案例相当于搜索失败的
    check
    (或
    false
    )案例

    AS_CASE(
       ["$with_libuv"],
       [yes], [PKG_CHECK_MODULES(UV, [libuv >= 1.9.0], [HAVE_LIBUV=1],
                                [AC_MSG_ERROR("libuv >= 1.9.0 is not installed")])],
       [no],  [HAVE_LIBUV=0],
       [PKG_CHECK_MODULES(UV, [libuv >= 1.9.0], [HAVE_LIBUV=1],[HAVE_LIBUV=0])])
    
    AS_IF([test "x$HAVE_LIBUV" = x1], [AC_DEFINE([USE_LIBUV])])
    AM_CONDITIONAL([USE_LIBUV], [test "x$HAVE_LIBUV" = x1])
    

    这修复了第一条错误消息(但它不应该是
    =
    吗?)。另一个错误仍然存在,我正在检查文档中的AM_条件。由于某种原因,AM_条件似乎无法在if语句中运行。我将不得不编写两次测试。这修复了第一条错误消息(但它不应该是
    =
    )。另一个错误仍然存在,我正在检查文档中的AM_条件。由于某种原因,AM_条件似乎无法在if语句中运行。我将不得不编写两次测试。当PKG_CHECK_模块失败时,默认操作已经是中止脚本,但这种方式可能更清晰。当PKG_CHECK_模块失败时,默认操作已经中止脚本,但这种方式可能更清晰。