2017-02-18 2 views
0

나는이 작업을 수행하기 위해 configure.ac 파일을 작성하는 것을 시도하고 다음 configure 스크립트가 --with-libuv 매개 변수를 받아 들여야PKG_CHECK_MODULES 결과에 따라 AM_CONDITIONAL 및 AC_DEFINE을 정의하는 방법은 무엇입니까?

  1. .

  2. 가변 with_libuv

    은 (아무것도 커맨드 라인에 통과하지 않은 경우 check 기본값 인 상태) yes, no 또는 check로 설정되어야한다.
  3. with_libuv == "yes" 필수 PKG_CHECK_MODULES가 libuv >= 1.9.0 확인

    이 완료되어야하며 HAVE_LIBUV = 1이 성공을 설정해야합니다 (오류 configure가 중단해야 ON). with_libuv == "no" 아무것도 확인되지 않아야

  4. , (3에서와 같은 라이브러리) 옵션 PKG_CHECK_MODULES 검사가 수행해야 with_libuv == "false"HAVE_LIBUV 그에 따라 0 또는 1로 설정해야

  5. .

  6. with_libuv != "no" && HAVE_LIBUV == 1 AC_DEFINE이 -DUSE_LIBUV을 설정해야하고 AM_CONDITIONAL는 automake에 대한 조건부로 USE_LIBUV을 설정해야합니다.

  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 

이 문제가있는 부분이있다 :

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 

는 출력 구성에서 발췌 한 것이다
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

이렇게하면 첫 번째 오류 메시지가 수정됩니다 ('==')?). 다른 오류가 남아, 지금 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]) 

그것은 조금 추한.

관련 문제