检查给定包的存在通常不是一个好主意,因为它依赖于特定的发行版(例如Fedora)和特定的软件包名称(例如libc6-dev-i386
);其他发行版(或相同发行版的其他版本)将具有不同的软件包名称和工具来与软件包管理器进行交互(例如apt
vs rpm
vs ...)
成熟的autotools方法是运行测试(例如,包含给定的头文件),而不是检查可能提供您需要的东西(例如某个包)的东西 -
eg如果您的实际代码需要包含features.h
,那么您应该测试(在预构建步骤中)是否可以包含此文件而没有错误。
如果不能使用features.h
,以下autotools示例将停止并显示错误;它允许用户在开始耗时的构建过程之前通过安装正确的软件包(例如在README中暗示)来解决问题。
#snippet from configure.ac
#stop configure process if we cannot use foo.h
AC_CHECK_HEADERS([foo.h],,AC_ERROR([cannot include foo.h - try installing libfoo-dev])
如果不是失败的配置步骤中,您宁愿简单地禁用您构建的部分,你可能想要做这样的事情:
configure.ac:
have_bar_h="no"
AC_CHECK_HEADERS([bar.h],[have_bar_h="yes"])
AM_CONDITIONAL([BAR]) [ test "x${have_bar_h}" = "yes" ]
和Makefile .am
if BAR
# only do the 32bit build if we have bar.h
bin_PROGRAMS+=coolapp32
ebduf
对不起,这个答案是非常autotools具体的,但我敢肯定,waf
有类似的方法;查看WAF文档中有关Configuration helpers的部分。
也许[这个](http://serverfault.com/questions/54736/how-to-check-if-a-library-is-installed)会有帮助吗? – Glapa