2017-02-18 24 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]) 

這是一個有點難看,因爲執行測試時的兩倍,但它似乎工作正常。