Sh 如何基于PKG_CHECK_模块结果定义AM_CONDITIONAL和AC_define?
我正在尝试编写一个Sh 如何基于PKG_CHECK_模块结果定义AM_CONDITIONAL和AC_define?,sh,autotools,autoconf,automake,pkg-config,Sh,Autotools,Autoconf,Automake,Pkg Config,我正在尝试编写一个configure.ac文件来执行以下任务: configure脚本应接受一个带有libuv参数的 带有_libuv的变量应设置为yes、no或check(当命令行上没有传递任何内容时,check为默认值) 当带有=1.9.0的强制PKG\u检查\u模块检查,并在成功时设置HAVE\u libuv=1(出错时配置应中止) 当带有_libuv==“否”时,不应检查任何内容 当带有_libuv==“false”时,应执行可选的PKG_检查_模块检查(与3中的库相同),并且HAVE_
configure.ac
文件来执行以下任务:
configure
脚本应接受一个带有libuv参数的
应设置为yes
、no
或check
(当命令行上没有传递任何内容时,check
为默认值)
带有
时,应执行libuv>=1.9.0
的强制PKG\u检查\u模块检查,并在成功时设置HAVE\u libuv=1
(出错时配置
应中止)带有_libuv==“否”
时,不应检查任何内容带有_libuv==“false”
时,应执行可选的PKG_检查_模块检查(与3中的库相同),并且HAVE_libuv
应相应地设置为0
或1
与_libuv!=“否”和&HAVE_LIBUV==1
AC_DEFINE应设置-DUSE_LIBUV
,AM_CONDITIONAL应设置使用_LIBUV
作为自动生成的条件与_libuv!=“no”和HAVE_LIBUV==1
不应设置预处理器指令,而AM_条件应设置为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
以下是配置输出的摘录:
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?我认为您应该使用
=
而不是-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
我认为你应该使用
=
而不是-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
这应该可以做到:
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])
这有点难看,因为测试执行了两次,但似乎工作正常。这应该可以做到:
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])
这有点难看,因为测试执行了两次,但它似乎工作正常。如果
是
失败,您不会中止测试(步骤3)<代码>AM_条件。步骤6显示了-DUSE_LIBUV
,但您现有的代码会将-DUSE_LIBUV=1
添加到DEFS
。便携式shell脚本考虑了测试-a
,因此您不应该使用它。您的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])
当
yes
失败时,您不会中止操作(步骤3)<代码>AM_条件。步骤6显示了-DUSE_LIBUV
,但您现有的代码会将-DUSE_LIBUV=1
添加到DEFS
。便携式shell脚本考虑了测试-a
,因此您不应该使用它。您的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])
这修复了第一条错误消息(但它不应该是
=
吗?)。另一个错误仍然存在,我正在检查文档中的AM_条件。由于某种原因,AM_条件似乎无法在if语句中运行。我将不得不编写两次测试。这修复了第一条错误消息(但它不应该是=
)。另一个错误仍然存在,我正在检查文档中的AM_条件。由于某种原因,AM_条件似乎无法在if语句中运行。我将不得不编写两次测试。当PKG_CHECK_模块失败时,默认操作已经是中止脚本,但这种方式可能更清晰。当PKG_CHECK_模块失败时,默认操作已经中止脚本,但这种方式可能更清晰。