您的位置:首页 > 其它

关于Autoconf 如何配置enable选项和第三方库检测脚本

2013-04-28 10:15 666 查看
大家都知道在linux环境下c/c++开源项目的编译安装都是简单的三步曲configure/make/make install, 关于如何编写满足这三步的编译安装规则的脚本,网上资料不少,这里就不再重复了。

最近不少新人提到网上关于autoconf & automake的入门资料不少,但是很少提到如何在configure.ac编写enable选项和第三方库检测脚本, 下面举些例子:

1、enable选项。

先看下宏定义:

AC_ARG_ENABLE(feature,help-string,[action-if-given],[action-if-not-given])

有四个参数:

feature  : 即选项名,在运行configure命令时的选项参数格式为--enable-feature 或者 --disable-feature ,就是打开或者关闭选项。

help-string :运行configure --help 的时候的提示信息。

action-if-given :在给出选项的时候会执行这个shell命令。

action-if-not-given :没给出选项的时候会执行这个shell命令。

返回值 enableval

AC_ARG_ENABLE之后可以通过$enableval获取结果,$enableval的值如下:

输入选项                     返回值

--enable-feature       $enableval=yes

--disable-feature      $enableval=no

无                                 $enableval=’’

配置debug选项的例子:

AC_ARG_ENABLE([debug], [AC_HELP_STRING([--enable-debug], [compile for debugging])], [CXXFLAGS="-DDEBUG -g -O0"], [CXXFLAGS="-O2 -minline-all-stringops -    fomit-frame-pointer"]) 

因为debug选项只要输入--enable-debug即表示打开调试开关,没输入这个选项就表示关闭,所以这里不做$enableval返回值检查,只需要简单的配置后两个参数即可。

AC_HELP_STRING宏是用于帮助格式化输出提示信息,这里输出后的字符串格式为 --enable-debug             compile for debugging

2、第三方库。

先看下宏定义:

AC_ARG_WITH (package, help-string, [action-if-given], [action-if-not-given])

有四个参数定义跟AC_ARG_ENABLE一样:

package : 即包名,在运行configure命令时的选项参数格式为--with-package 或者 --without-package 

help-string :运行configure --help 的时候的提示信息。

action-if-given :在给出选项的时候会执行这个shell命令。

action-if-not-given :没给出选项的时候会执行这个shell命令。

返回值 withval

AC_ARG_WITH之后可以通过$withval获取结果。

例如:--with-libcurl=/usr/local

则$withval=/usr/local

配置google protocol buffer 的例子:

#初始化安装路径设置

libpb_prefix="/usr/local"

AC_ARG_WITH([protobuf], [AC_HELP_STRING([[--with-protobuf[=DIR]]], [Specify path to protobuf installation])],,[withval="no"])

#运行configure时的提示信息。

AC_MSG_CHECKING([check for protobuf installation]) 

#下面是参数是否输入的检查脚本

if test "$withval" != "no" -a "$withval" != ""; then

    libpb_prefix="$withval"

else

#提示信息

AC_MSG_RESULT([no])

#提示信息,并且终止configure.

    AC_MSG_ERROR([please specify protobuf install path])

fi

#下面是初始化一些库路径,并简单检查库的目录是否存在

libpb_include="$libpb_prefix/include"

libpb_lib="$libpb_prefix/lib"

libpb_ok="yes"

pb_ldflag=""

if test -d "$libpb_prefix"; then

    if test ! -d "$libpb_include"; then

        libpb_ok="no"

    fi

else

    libpb_ok="no"

Fi

#下面是检测后的处理

if test "$libpb_ok" == "yes"; then

AC_MSG_RESULT([yes])

#下面两个是配置c++的编译参数

    CPPFLAGS="$CPPFLAGS -I$libpb_include"

    LDFLAGS="$LDFLAGS -L$libpb_lib"

#注意下面两行处理,这里把库连接选项放在一个变量里面,并且用AC_SUBST设置输出变量,目的就是为了能够在makefile.am文件里面使用这个变量。

    pb_ldflag="-lprotobuf"

    AC_SUBST(pb_ldflag)

else

    AC_MSG_RESULT([no])

    AC_MSG_ERROR([protobuf not found])

fi

下面看下Makefile.am的配置片段:

bin_PROGRAMS = serverd

serverd_SOURCES = server.cpp

serverd_LDADD =  $(pb_ldflag)  #这里引用configure输出的变量。

PS: 实际上,可以把连接选项配置在configure.ac里面的LIBS变量,区别就是一个全局的一个局部的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息