如何根据PKG_CHECK_MODULES结果定义AM_CONDITIONAL和AC_DEFINE?

时间:2017-02-18 12:47:22

标签: sh autotools autoconf automake pkg-config

我正在尝试编写configure.ac文件来执行这些任务:

  1. configure脚本应接受--with-libuv参数。

  2. 变量with_libuv应设置为yesnocheck(默认值为check时未传递任何内容在命令行上。)

  3. with_libuv == "yes"必须对libuv >= 1.9.0执行强制性PKG_CHECK_MODULES检查,并且成功时应设置HAVE_LIBUV = 1(错误configure应该中止)。

  4. with_libuv == "no"无法检查时,

  5. with_libuv == "false"选择PKG_CHECK_MODULES检查时(对于与3中相同的库),HAVE_LIBUV应设置为0或{{1}相应的。

  6. 如果1 AC_DEFINE设置为with_libuv != "no" && HAVE_LIBUV == 1,则AM_CONDITIONAL应将-DUSE_LIBUV设置为automake的条件。

  7. 如果不是USE_LIBUV,则不应设置预处理程序指令,并且应将AM_CONDITIONAL设置为with_libuv != "no" && HAVE_LIBUV == 1

  8. 我已经想出了如何进行第1-5步,但我对6和7感到兴奋。

    这是我目前的尝试:

    0

    问题在于:

    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
    

    以下是配置输出的摘录:

    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
    

    如何以实际有效的方式实施步骤6和7?

3 个答案:

答案 0 :(得分:3)

yes失败时您不会中止(步骤3)。 AM_CONDITIONAL should always be run。第6步说-DUSE_LIBUV,但您现有的代码会将-DUSE_LIBUV=1添加到DEFS。便携式shell脚本考虑test -a broken,因此您不应该使用它。您的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])

答案 1 :(得分:1)

我认为您应该使用=代替-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

答案 2 :(得分:1)

这应该可以解决问题:

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])

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