🔗 Autoconf 库检测指南
此页面仍在进行中。此处记录的 autoconf 模板仍在不断完善中,稳定后将转换为宏。
🔗 行为概述
Squid 所依赖的每个库都应该定义一个 AC_WITH() 宏,以允许用户禁用、要求或替换该库。Squid 应该能够快速检测库的缺失,并且
- 当用户明确指定
--with-foo时,库的缺失是一个致命错误。 - 当用户指定
--with-foo=PATH时,将在指定的路径中检测库。 - 当用户指定
--without-foo时,将不对库执行任何测试,也不会被 Squid 使用。 - 当库缺失时,不应搜索 API 功能测试、hack 和 workaround。这可以减少 ./configure 花费在执行无用操作上的时间。
🔗 部分 1: AC_ARG_WITH()
使用此 autoconf 提供的宏来设置库的路径位置和 with_* 变量。
AC_ARG_WITH(foo,
AS_HELP_STRING([--without-foo],
[Do not use Foo. Default: auto-detect]), [
case "$with_foo" in
yes|no)
: # Nothing special to do here
;;
*)
if test ! -d "$withval" ; then
AC_MSG_ERROR([--with-foo path does not point to a directory])
fi
LIBFOO_PATH="-L$with_foo/lib"
CXXFLAGS="-I$with_foo/include $CXXFLAGS"
esac
])
AH_TEMPLATE(USE_FOO,[Foo support is available])
🔗 部分 2: 库需求检查
if test "x$with_foo" != "xno"; then
SQUID_STATE_SAVE(squid_foo_state)
LIBS="$LIBS $LIBFOO_PATH"
第三部分和第四部分放在这里
SQUID_STATE_ROLLBACK(squid_foo_state)
if test "x$with_foo" = "xyes" -a "x$LIBFOO_LIBS" = "x"; then
AC_MSG_ERROR([Required Foo library not found])
fi
if test "x$LIBFOO_LIBS" != "x" ; then
CXXFLAGS="$LIBFOO_CFLAGS $CXXFLAGS"
FOOLIB="$LIBFOO_PATH $LIBFOO_LIBS"
AC_DEFINE(USE_FOO,1,[Foo support is available])
with_foo=yes
else
with_foo=no
fi
fi
AC_MSG_NOTICE([Foo library support: ${with_foo:=auto} ${LIBFOO_PATH} ${LIBFOO_LIBS}])
AC_SUBST(FOOLIB)
- 请注意,没有使用 AC_CONDITIONAL 来设置 ENABLE_FOO。如果一项主要功能需要库 foo,那么它应该仅在执行了这些库测试并将其 $with_foo 设置为 yes/no 之后,基于
$with_foo中的设置来确定。
🔗 部分 3: pkg-config 和文件检测
优先使用 pkg-config 来定位库参数。当库作者提供这些参数时,如果构建参数发生变化,它们会自动更新,并且可以更准确地检测库版本。
PKG_CHECK_MODULES 宏创建了构建此库所需的本地变量 LIBFOO_CFLAGS 和 LIBFOO_LIBS。
- 请注意,用户的自定义路径(如果有)已包含在 CXXFLAGS 和 LIBS 中。
- 请注意,对常规 *FLAGS 或 LIBS 构建变量的任何更改,在回滚此检查状态时都会被撤销。如果需要,备用检测逻辑应重用 pkg-config 变量,以便它们可以仅为使用此库的二进制文件进行设置。
使用 PKG_CHECK_MODULES 的示例
# auto-detect using pkg-config
PKG_CHECK_MODULES([LIBFOO],[foo >= 1.0.0],,[
## something went wrong.
## try to find the package without pkg-config
## check that the library is actually new enough.
## by testing for a 1.0.0+ function which we use
AC_CHECK_LIB(foo,foo_10_function,[LIBFOO_LIBS="-lfoo"])
])
🔗 部分 4: 头文件检测
单独检查库的头文件包含。
这是必需的,因为 Squid 要求 HAVE_FOO_H 包装器定义。pkg-config 工具不会自动检查它们,并且对于其成功和失败操作而言,进行两次检查是没有意义的。
if test "x$LIBFOO_LIBS" != "x" ; then
AC_CHECK_HEADERS(foo.h)
fi
🔗 Makefile.am
使用库 Foo 的每个二进制文件都应在其 LDADD 声明中包含 ` $(FOOLIB) `,在 libcompat.la 条目之后,并且将在相关时进行链接。
导航:网站搜索,网站页面,分类,🔼 向上
为方便维护,这些 FOOLIB LDADD 条目应按字母顺序排列。