2017-02-18 29 views
0

私は、これらのタスクを実行するconfigure.acファイルを記述しようとしています:PKG_CHECK_MODULESの結果に基づいてAM_CONDITIONALとAC_DEFINEを定義する方法は?

  1. configureスクリプトが--with-libuvパラメータを受け入れる必要があります。

  2. 変数with_libuvは(checkが何もコマンドラインに渡されていないデフォルト値である)yesnoまたはcheckのいずれかに設定する必要があります。 (エラーconfigureで中止すべきである)必須PKG_CHECK_MODULESがlibuv >= 1.9.0をチェックwith_libuv == "yes"が行われるべきであるとHAVE_LIBUV = 1が成功した場合に設定する必要があります

  3. with_libuv == "no"何をチェックすべきではない

  4. 、(3と同じライブラリー用)オプションのPKG_CHECK_MODULESチェックが行われる必要がありますwith_libuv == "false"HAVE_LIBUVはそれに応じて0または1のいずれかに設定する必要があります

  5. with_libuv != "no" && HAVE_LIBUV == 1 AC_DEFINEには-DUSE_LIBUVを設定し、AM_CONDITIONALにはautomakeの条件としてUSE_LIBUVを設定する必要があります。

  6. 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 

問題の部分はこれです:

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 

は、configureの出力からの抜粋です。

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に追加されます。移植可能なシェルスクリプトは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

これは、最初のエラーメッセージを修正します(ただし、 '=='ではなく?)。もう1つのエラーは残っています。私はAM_CONDITIONALのドキュメントを今チェックしています。 – Promi

+0

何らかの理由でAM_CONDITIONALをif文の中で実行できないようです。私はテストを2回書く必要があります。 – 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]) 

テストが2回実行されるので、少し醜いですが、正常に動作するようです。

関連する問題