用Autoconf檢測MySQL軟件包的教程。本站提示廣大學習愛好者:(用Autoconf檢測MySQL軟件包的教程)文章只能為提供參考,不一定能成為您想要的結果。以下是用Autoconf檢測MySQL軟件包的教程正文
在你的法式(或許工程)中,假如編譯階段須要檢測以後情況中能否存在MySQL客戶端相干的庫文件時,你可使用Autoconf來幫你完成這個任務,輕巧、優雅、無痛。浏覽本文須要懂得簡略GNU Autoconf應用。
1. 本文的目的
目標:編譯時,依據configure參數(假如有--with-mysql),選擇性編譯對應的MySQL相干的功效。
完成:應用曾經寫好的m4劇本:ax_lib_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<便可以了。