「その壱」でバイナリ入手編を、
「その弐」でプログラミング編とやってきて一応終了しようと思ったのですが、読んで頂ければ分かりますようにすっきりと終わっていませんでした。なので「その参」としてバイナリビルド編をお送りします。「その弐」までは公開されているバイナリファイルを利用しましたが、以下の問題がありました。
A)メモリリークが生じる
B)スタティックリンクができない
そこで今回は自分でOpenLDAPのソースからバイナリをビルドしてみようと言うことになります。まず準備とし以下のファイルを用意します。
1)openldap-2.4.32.tgz まず本体を本家ダウンロードから入手
2)mingw-get-inst-20120426.exe ビルド環境のMinGWをこちらから入手
3)mingw-libgnurx-2.5.1-bin.tar.gz regexのバイナリ
4)mingw-libgnurx-2.5.1-dev.tar.gz regexの開発環境
5)groff-1.20.1-bin.zip soelem.exeが必要なのでgroffから入手
MinGWをインストールした後に、mingw-libgnurx-2.5.1-bin.tar.gzとmingw-libgnurx-2.5.1-dev.tar.gzを上書きコピーして、groff-1.20.1-bin.zipからsoelem.exeだけでもコピーしておきます。その後でMinGW Shellを起動して、openldap-2.4.32.tgzを展開しておきます。
$ tar xvfz openldap-2.4.32.tgz
$ cd openldap-2.4.32
これでインストールの準備完了です。
早速 configure を実行しましょう。今回はクライアント用途でOpenLDAPを使うのが目的ですので必要最小限の指定です。
$ export CPPFLAGS="-I/usr/include"
$ export LDFLAGS="-L/usr/lib"
$ ./configure --disable-slapd --without-tls --enable-static --disable-shared --disable-sql --prefix=/mingw
--enable-static : スタティックリンク用ビルド
--disable-shared : ダイナミックリンクは不要
--without-tls : TLS(ldaps)はとりあえずオフ
--disable-slapd : サーバ用デーモンは不要
--disable-sql : サーバ用SQLも不要
続いてビルド…の前に幾つか修正が必要でした。
修正1:winsock2.hとws2tcpip.hによる多重定義解消
これはOpenLDAPと言うよりもMinGWの問題だと思いますがwinsock2.hとws2tcpip.hを両方インクルードすると多重定義となってしまいます。この為に以下の修正をしました。
$ vim include/ac/socket.h
-----(編集前)------------------------------------------------
#ifdef HAVE_WINSOCK2
#include <winsock2.h>
#include <ws2tcpip.h>
#elif HAVE_WINSOCK
#include <winsock.h>
#endif
-----(編集後)------------------------------------------------
#ifdef HAVE_WINSOCK2
#include <winsock2.h>
/* #include <ws2tcpip.h> /* comment by LangEdge 2012-09-08 */
#elif HAVE_WINSOCK
#include <winsock.h>
#endif
-------------------------------------------------------------
修正2:メモリリークの解消
上記の修正1だけでビルドはできるようになるのですが…
「その壱」で生じていたメモリリークは全く同じ状況でした…orz どうも最新版でもパッチが反映されていない??なので同じ場所を修正しました。
$ vim libraries/libldap/open.c
-----(編集前:161-165)------------------------------------------------
if ( gopts->ldo_defludp ) {
ld->ld_options.ldo_defludp = ldap_url_duplist(gopts->ldo_defludp);
if ( ld->ld_options.ldo_defludp == NULL ) goto nomem;
}
-----(編集後:161-168)------------------------------------------------
if ( gopts->ldo_defludp ) {
ld->ld_options.ldo_defludp = ldap_url_duplist(gopts->ldo_defludp);
ldap_free_urllist( gopts->ldo_defludp ); /* add by LangEdge 2012-09-08 */
gopts->ldo_defludp = NULL; /* add by LangEdge 2012-09-08 */
if ( ld->ld_options.ldo_defludp == NULL ) goto nomem;
}
---------------------------------------------------------------------
これでビルド開始できます。以下の順番でビルドします。
$ make depend
$ make
$ make install
生成物として以下のファイルを取得すればVisualStudioでリンクして利用が可能です。
○ includeファイル
$ cd /mingw/include
$ ls -l lber*.h ldap*.h sl*.h
-rw-r--r-- 1 miyachi Administrators 15311 Sep 8 13:24 lber.h
-rw-r--r-- 1 miyachi Administrators 1468 Sep 8 13:24 lber_types.h
-rw-r--r-- 1 miyachi Administrators 64751 Sep 8 13:24 ldap.h
-rw-r--r-- 1 miyachi Administrators 9466 Sep 8 13:24 ldap_cdefs.h
-rw-r--r-- 1 miyachi Administrators 1814 Sep 8 13:24 ldap_features.h
-rw-r--r-- 1 miyachi Administrators 9450 Sep 8 13:24 ldap_schema.h
-rw-r--r-- 1 miyachi Administrators 3468 Sep 8 13:24 ldap_utf8.h
-rw-r--r-- 1 miyachi Administrators 38351 Sep 8 13:24 slapi-plugin.h
$
○ libファイル
$ cd /mingw/lib
$ ls -l liblber.a libldap.a
-rw-r--r-- 1 miyachi Administrators 150230 Sep 8 13:24 liblber.a
-rw-r--r-- 1 miyachi Administrators 1004688 Sep 8 13:24 libldap.a
$ cd /mingw/lib/gcc/mingw32/4.6.2
$ ls -l libgcc.*
-rw-r--r-- 1 miyachi Administrators 3171438 Dec 2 2011 libgcc.a
$
いかがでしょうか?私の環境ではこれでビルドできましたし、メモリリークも無くなりました。めでたしめでたし。これで完結編!…実はまだ課題が残ってはいます(^^;; 実はTLSをオフにしているので ldaps(ポート番号:636) に未対応です。OpenSSLも一緒にビルドしてみたり色々試したのですがコンフィグ時のエラーが無くなりませんでした。ただPKIのリポジトリで ldaps ってあまり見たことが無いのでまぁとりあえず良いかなと。時間ができたら再度挑戦してみたいと思います。ひとまずはここまで。