欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用Autoconf检测MySQL软件包的教程

程序员文章站 2024-03-31 14:21:22
在你的程序(或者工程)中,如果编译阶段需要检测当前环境中是否存在mysql客户端相关的库文件时,你可以使用autoconf来帮你完成这个工作,轻盈、优雅、无痛。阅读本文需要...

在你的程序(或者工程)中,如果编译阶段需要检测当前环境中是否存在mysql客户端相关的库文件时,你可以使用autoconf来帮你完成这个工作,轻盈、优雅、无痛。阅读本文需要了解简单gnu autoconf使用。
1. 本文的目标

目的:编译时,根据configure参数(如果有--with-mysql),选择性编译对应的mysql相关的功能。

实现:使用已经写好的m4脚本:
2. 如何利用autoconf实现

大部分你想到的事情都已经有人做过尝试了。这件事情也不例外,autoconf中有很多脚本和指令帮你做事情。这里,需要使用ax_lib_mysql.m4来帮助我们。先把放到程序/工程目录中,并在configure.ac中新增如下指令来检测mysql库文件和版本:

复制代码 代码如下:
m4_include(ax_lib_mysql.m4)
ax_lib_mysql()
am_conditional(build_mysql_support, test x$mysql_version != x)

说明:ax_lib_mysql()设置了三个变量,可以在makefile.am中直接使用,分别是mysql_cflags、mysql_ldflags、mysql_version,另外还会在config.h中预定义宏have_mysql;am_conditional(...)则会根据是否需要开启mysql支持,来设置变量build_mysql_support,这个变量可以在makefile.am中使用。

在程序源代码中一般有两种方式可以获取have_mysql宏的方式:一个是直接包含config.h;另一个是在你程序的cflags中新增-dhave_mysql。(注意:有的变量是可以在makefile.am中使用,有的则是可以在c源代码中使用)
方法一:直接include config.h

autoconf工具会将所有的预定义宏存放在config.h(默认情况)中,并在编译器选项中新增-dhave_config_h(通过@defs@)。因为文件ax_lib_mysql.m4中,包含了如下代码(如果加上--with-mysql并且找到了对应mysql_config,那么如下代码生效):

复制代码 代码如下:
ac_define([have_mysql], [1],
[define to 1 if mysql libraries are available])

所以,config.h中会有对应的宏定义:

复制代码 代码如下:
/* define to 1 if mysql libraries are available */
#define have_mysql 1

在你的源代码中(一般是头文件),新增如下代码:

复制代码 代码如下:
#ifdef have_config_h
#include >config.h<
#endif

这之后,就可以在你的源代码中,使用#ifdef have_mysql ... #endif这样的写法了
方法二:编译器选项新增-dhave_mysql

因为文件ax_lib_mysql.m4包含了变量定义mysql_cflags/mysql_ldflags/mysql_version,所以,简单的可以在makefile.am中,直接根据这些变量来新增gcc编译参数。类似如下写法:
 

复制代码 代码如下:
if mysql_version
xxx_cflages= -dhave_mysql
endif

这之后,也可以在你的源代码中,使用#ifdef have_mysql ... #endif这样的写法了

小结:上面两种方法一个需要修改makefile.am、一个需要修改头文件,可以根据个人喜好来决定怎么做。
3. 更多关于ax_lib_mysql.m4的使用
常见的configure写法

有了上面的设置,程序就可以通过如下的方式来确定是否将mysql客户端的支持编译到源代码中:
 

复制代码 代码如下:
./configure --with-mysql
...
./configure --with-mysql[=no|yes]
...
./configure --with-mysql[=/your_env_path/mysql_config] #如果mysql_config不在当前的$path中,则需要显示指定。
...

如果对最低版本有要求

另外,如果你对mysql版本有要求,例如,你希望只有检测到5.5以上的mysql客户端,才编译对mysql的支持,则可以在configure.ac中这样使用ax_lib_mysql:
ax_lib_mysql(5.5.18)
修改--with-mysql的默认行为

这里意思是说,如果在configure中没有--with-mysql选项时,则编译时不加上对mysql的支持(如果写了),也就是说如下两种写法意思相同:
 

复制代码 代码如下:
./configure --with-mysql=no
./configure

ax_lib_mysql.m4的默认行为并非如此,需要对其代码做小小的修改:

 

复制代码 代码如下:
@@ -61,7 +61,7 @@
             mysql_config="$withval"
         fi
         ],
-        [want_mysql="yes"]
+        [want_mysql="no"]
     )
     ac_arg_var([mysql_config], [full path to mysql_config program])

这样就如愿了。
4. 更一般的debug选项

其实使用autoconf这种用法更一般的是开启或者关闭debug选项。这个实现会比上面简单很多。

目标:编译时,根据configure参数(如果有--enable-debug),则执行程序中#ifdef debug ... #endif。(经常看到这样的写法吧)

相比上面的--with-mysql这个就简单多了(没有版本信息、不需要找mysql_config等),所以实现也简单多了,只需在你的configure.ac中新增如下代码:

 

复制代码 代码如下:
ac_arg_enable(debug,
as_help_string([--enable-debug],
               [enable debugging, default: no]),
[case "${enableval}" in
             yes) debug=true ;;
             no)  debug=false ;;
             *)   ac_msg_error([bad value ${enableval} for --enable-debug]) ;;
esac],
[debug=false])
am_conditional(debug, test x"$debug" = x"true")

如果configure时,带有参数--enable-debug,则设置调用am_conditional设置遍历debug。这样就可以在makefile中根据遍历debug,来选择性的新增编译参数-ddebug,所以配套的还需要再makefile.am中新增:
 

复制代码 代码如下:
if debug
xxx_cfalgs=... -ddebug
else
xxx_cfalgs=...
fi

这时,你的代码中就可以写#ifdef debug ... #endif了。

另一种包含config.h的方法跟前面类似,只不过需要将am_conditional那里换成:
 

复制代码 代码如下:
if test x"$debug" = x"true"
ac_define([have_mysql], [1],
[define to 1 if mysql libraries are available])
fi

那么程序代码中include >config.h<就可以了。