我正在尝试编写configure.ac
文件来执行这些任务:
configure
脚本应接受--with-libuv
参数。
变量with_libuv
应设置为yes
,no
或check
(默认值为check
时未传递任何内容在命令行上。)
with_libuv == "yes"
必须对libuv >= 1.9.0
执行强制性PKG_CHECK_MODULES检查,并且成功时应设置HAVE_LIBUV = 1
(错误configure
应该中止)。
当with_libuv == "no"
无法检查时,
当with_libuv == "false"
选择PKG_CHECK_MODULES检查时(对于与3中相同的库),HAVE_LIBUV
应设置为0
或{{1}相应的。
如果1
AC_DEFINE设置为with_libuv != "no" && HAVE_LIBUV == 1
,则AM_CONDITIONAL应将-DUSE_LIBUV
设置为automake的条件。
如果不是USE_LIBUV
,则不应设置预处理程序指令,并且应将AM_CONDITIONAL设置为with_libuv != "no" && HAVE_LIBUV == 1
。
我已经想出了如何进行第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?
答案 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])
这有点难看,因为测试执行了两次,但似乎工作正常。