2017-02-18 25 views
0

我想写一个configure.ac文件来执行这些任务:如何基于PKG_CHECK_MODULES结果定义AM_CONDITIONAL和AC_DEFINE?

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

  2. 可变with_libuv应设置为yesnocheck(与check为默认值时,没有在命令行上传递)。

  3. with_libuv == "yes"强制性PKG_CHECK_MODULES检查libuv >= 1.9.0应该做,应该HAVE_LIBUV = 1成功设置(在错误configure应该退出)。

  4. with_libuv == "no"什么需要检查,

  5. with_libuv == "false"可选PKG_CHECK_MODULES检查(同一库中3)应做HAVE_LIBUV应设置为01相应。

  6. 如果with_libuv != "no" && HAVE_LIBUV == 1 AC_DEFINE应该设置为-DUSE_LIBUV并且AM_CONDITIONAL应该设置USE_LIBUV作为automake的条件。

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

我已经找到了如何做步骤1-5,但我有6个和7

这里struggeling是我当前的尝试:

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 @<:@[email protected]:>@])], 
    [], 
    [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 

下面是从配置输出的摘录:

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?

回答

3

yes失败时(步骤3),您不会中止。 AM_CONDITIONALshould always be run。第6步说-DUSE_LIBUV,但您现有的代码将添加-DUSE_LIBUV=1DEFS。便携式shell脚本认为test -abroken,所以你不应该使用它。您的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]) 
+0

PKG_CHECK_MODULES失败时的默认操作已经中止脚本,但可能它更清晰。 – Promi

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 
+0

修复了第一个错误信息(但不应该是'=='呢?)。另一个错误仍然存​​在,我现在正在查看AM_CONDITIONAL的文档。 – Promi

+0

由于某种原因,似乎AM_CONDITIONAL不能在if语句中运行。我将不得不两次写测试。 – Promi

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

这是一个有点难看,因为执行测试时的两倍,但它似乎工作正常。