关于Autoconf 如何配置enable选项和第三方库检测脚本
2013-04-28 10:15
666 查看
大家都知道在linux环境下c/c++开源项目的编译安装都是简单的三步曲configure/make/make install, 关于如何编写满足这三步的编译安装规则的脚本,网上资料不少,这里就不再重复了。
最近不少新人提到网上关于autoconf & automake的入门资料不少,但是很少提到如何在configure.ac编写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
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变量,区别就是一个全局的一个局部的。
最近不少新人提到网上关于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变量,区别就是一个全局的一个局部的。
相关文章推荐
- Zend Studio 如何配置本地apache服务器使用xdebug调试php脚本
- 关于如何使用properties读取配置文件内容问题
- 关于VisualStudio2012中使用第三方控件Infragistics如何发布
- 关于在reactjs项目中如何用webpack配置组件按需加载
- Total Commander 7.56 - Team EAT 配置选项 个性化设置备份,,,开启时如何自动最大化???
- 如何启用clr enabled配置选项 (转自killkill的Blog)
- qt中关于如何读取配置文件学习 (vs2008+qt+mysql项目)
- 关于Spring管理的事务如何配置回滚及try catch情况下的回滚
- 关于 如何配置 mac (苹果系统)jdk 的问题
- Zend Studio 如何配置本地apache服务器使用xdebug调试php脚本
- 关于Trunk封装的协议和模式。如何配置trunk
- php脚本中操作ini配置文件选项ini_get ini_set
- 关于Android 如何配置测试类
- 关于如何在myeclipse8.5中配置tmocat7的问题
- shell 脚本实--集群环境配置检测
- 如何配置Kickstart脚本以便更好的安装系统
- 如何编写LVS对Real Server的健康状态检测脚本
- 如何启用clr enabled配置选项
- centos 安装 STREAMING h264 视频的流播放 关于如何配置APACHE的STREAMING播放MP4的视频.
- 【Tomcat】Tomcat的安装配置,如何在NetBeans上创建tomcat服务器,以及关于tomcat端口被占用的解决办法