中古格安SunサーバでFirebirdに挑戦!
 エラーメッセージとの戦いの果てに……


Firebird日本ユーザー会
アナハイムテクノロジー株式会社
はやし つとむ
2008/12/26


続々出現、エラーメッセージとの戦い

 シェルのテストコマンドが失敗しているようです。いろいろ調べた結果、以下のように二重引用符で囲まないと駄目なようです。ちなみに、先頭行の/bin/shを/bin/bashにするだけでも問題が解決します。

(1)autogen.shを修正する

$cd Firebird-2.0.4.13130-1
$vi autogen.sh

---autogen.sh---
#!/bin/sh
#
# Run this to generate all the initial makefiles, etc.
#
# $Id: autogen.sh,v 1.12 2005/05/27 22:14:40 asfernandes Exp $

PKG_NAME=Firebird2
SRCDIR=`dirname $0`
DIE=0

if [ -z $AUTOCONF ]  ←ここを"$AUTOCONF"と二重引用符で囲む
then
AUTOCONF=autoconf
fi
if [ -z $LIBTOOL ]   ←ここを"$AUTOCONF"と二重引用符で囲む
then
LIBTOOL=libtool
fi
if [ -z $LIBTOOLIZE ] ←ここを"$AUTOCONF"と二重引用符で囲む
then
LIBTOOLIZE=libtoolize
fi
……
---autogen.sh---

 さて、これでautogen.shを実行すると、いつものconfigureスクリプトが走って、ずらずらとビルド環境の設定が行われていきます。取りあえず何もオプションを付けないで実行したので、デフォルトのClassicServerとなっています。

 では、makeしてみましょう……。またまたエラーです。今度は、libeditの辺りでエラーが出ています。Firebird Foundationのボス、Paul Beachがブログ(http://paulbeachsblog.blogspot.com/)で「Solarisのlibeditが駄目なんで、別途コンパイルしたライブラリを静的にリンクした」とか書いていたので、ここは取りあえず地雷を踏まないように、autogen.hsのオプションでよけてしまいます。

(2)libeditに問題あり

$ make clean
$ ./autogen.sh --with-editline=no

 さあ、これでどうだと再開したところ、今度はintl関連のモジュール、つまり多言語対応の辺りでエラーが出ています。INT_MAXが定義されていないということですが、該当の個所を見るとWindows環境でも同じような状況だったようで、対応がされていたため、同じようにして回避します。

(3)src/intl/lc_iso8859_1.cppを修正する

<---iso8859_1.patch--->
*** lc_iso8859_1.cpp.org 2008年 11月 27日 ((木))
--- lc_iso8859_1.cpp 2008年 11月 27日 ((木))
***************
*** 30,35 ****
--- 30,38 ----
#include <limits.h>
#endif

+ #ifdef SOLARIS
+ #include <limits.h>
+ #endif

static ULONG fam2_str_to_upper(TEXTTYPE obj, ULONG iLen, const BYTE* pStr, ULONG iOutLen
, BYTE *pOutStr);
static ULONG fam2_str_to_lower(TEXTTYPE obj, ULONG iLen, const BYTE* pStr, ULONG iOutLen
, BYTE *pOutStr);
<---iso8859_1.patch--->

 ここまできたらどうだ、といいたいところですが、まだエラーが続きます。今度は、jrd/common.hの辺りでSFIOが定義されてないから駄目だといっているようです。

 うーむ……。いろいろ見ていくと、-Dフラグを定義してあげればよいようです。どこに書けばよいかは勘で探したところ、builds/posixの中にプラットフォーム依存関係の定義があるので、ここに追加してみたところうまくいきました。

(4)builds/posix/prefix.solarisを修正する

<---prefix.solaris.patch--->
*** prefix.solaris.org 2008年 11月 27日 ((木))
--- prefix.solaris 2008年 11月 27日 ((木))
***************
*** 9,15 ****
# 30-Dec-2002 nmcc FB2 initial working build on Solaris8 with gcc 3.2.1
# 18-apr-2005 kkuznetsov FB2 Solaris 32 bits update (only gcc) as Ray Holme story talks
# Firebird defines specific to Solaris (and x86) build
! CFLAGS_COMMON= -DSOLARIS -DSOLARIS_MT -DBSD_COMP -Dsparc

# compile flags for GCC compiler
COMMON_GCC_FLAGS= -MMD -fPIC -m32
--- 9,15 ----
# 30-Dec-2002 nmcc FB2 initial working build on Solaris8 with gcc 3.2.1
# 18-apr-2005 kkuznetsov FB2 Solaris 32 bits update (only gcc) as Ray Holme story talks
# Firebird defines specific to Solaris (and x86) build
! CFLAGS_COMMON= -DSOLARIS -DSOLARIS_MT -DSFIO -DBSD_COMP -Dsparc

# compile flags for GCC compiler
COMMON_GCC_FLAGS= -MMD -fPIC -m32
<---prefix.solaris.patch--->

 最後におまけですが、今回の環境では問題が起きませんでしたが、実はサン・マイクロシステムズのT2でFirebirdをビルドしたときには、ビルドの途中でサンプルデータベースを生成するところでデッドロックが発生してしまいフリーズしたので、FirebirdプロジェクトのAlex Peshkovに相談して解決したことがあります。V210では問題が起きないようですが、念のためパッチを当てておきましょう。

(5)src/lock/lock.cppを修正する

<---lock.patch--->
*** lock.cpp.org 2008年 4月 2日 ((水))
--- lock.cpp 2008年 11月 27日 ((木))
***************
*** 4096,4101 ****
--- 4096,4104 ----
                event_t* event_ptr = LOCK_owner->own_wakeup;
                SLONG value = ISC_event_clear(event_ptr);

+               /* Tell the scheduler to allow AST's to run */
+               AST_ENABLE();
+
                /* wait for AST thread to start (or 5 secs) */
                startupSemaphore.tryEnter(5);

***************
*** 4103,4111 ****
                ISC_event_post(LOCK_owner->own_blocking);
                ISC_event_post(LOCK_owner->own_stall);

-               /* Tell the scheduler to allow AST's to run */
-               AST_ENABLE();
-
                /* Wait for the AST thread to finish cleanup or for 10 seconds */
                ISC_event_wait(1, &event_ptr, &value, 10 * 1000000,
lock_alarm_handler, event_ptr);
--- 4106,4111 ----
<---lock.patch--->

$ cd src/lock
$ patch < ../../lock.patch
  新しい形式のコンテキスト diff のようです。
終了

 さて、それではビルドしてみましょう。今回はprefixオプションも付けて、Firebirdのインストール先をデフォルトの/usr/local/firebirdから/usr/local/firebird204csに変更します。そうしておくと、あとで別のバージョンを入れるときに分かりやすいですからね(笑)。

$ ./autogen.sh --with-editline=no --prefix=/usr/local/firebird204cs
$ make

 さて、ここでいつものとおりmake installとするわけですが、またまたこれがうまくいきません。トラブルシューティングが好きな人でないと、こんなことまでして使いたくないよ、といわれてしまうかもしれませんね。

前のページ
2/3
次のページ

Index
中古格安SunサーバでFirbirdに挑戦!
 エラーメッセージとの戦いの果てに……
  Page 1
 GNUビルド環境の整備
 Firebirdのビルド
  Page 2
 続々出現、エラーメッセージとの戦い
  Page 3
 いざ、インストール
 SPARCサーバで脱! 非モテ!

Linux Square全記事インデックス


 Linux Squareフォーラム 仮想化技術関連記事
連載:実践! Xenで実現するサーバ統合
有力な仮想化技術として注目を集めるようになった「Xen」。このXenを活用してサーバ統合を実践していく手順を具体的に紹介します
特集:サーバの仮想化技術とビジネス展開の可能性
jailからUML/VMwareまで
1台のマシンで複数のサーバを動かす「仮想化技術」。VMwareやUMLの登場により、WebサイトだけでなくOS自体を仮想化できるようになった
特集:仮想化技術のアプローチと実装
VMwareから要注目技術Xenまで

1台のサーバで複数の仮想マシンを実行する仮想化技術は、空間コストを引き下げる可能性を持つ。最新の仮想化技術を概観してみよう
特集:仮想OS「User Mode Linux」活用法
技術解説からカーネルカスタマイズまで
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
特集:仮想化技術の大本命「Xen」を使ってみよう
インストール & Debian環境構築編

高いパフォーマンスで本命の1つとなった仮想マシンモニタ「Xen」。日本語による情報が少ないXenを、実際に動かしてみよう
特集:仮想化技術の大本命「Xen」を使ってみよう
Xen対応カスタムカーネル構築編

Xen環境およびその上で動作する仮想マシン用カーネルを自分で構築しよう。これにより、自由にカスタマイズしたカーネルを利用できる
特集:IPv6、UML、セキュリティ機能の統合
全貌を現したLinuxカーネル2.6[第4章]

今回は、これまでに紹介し切れなかった機能を一気に紹介する。これを読めば、カーネル2.6の正式リリースが楽しみになるだろう
Linux Squareプロダクトレビュー VMware Workstation 4
PC/AT互換機エミュレータとして不動の地位を築いたVMware。その新バージョンがリリースされた。新機能を早速試してみよう
古くて新しい「サーバ仮想化技術」の行方
サーバ仮想化を実現するための技術がソフトウェア、ハードウェアの両面で出そろってきた。ハイパーバイザーのさらなる高速化に向けた動きを紹介する
Linux Squareフォーラム全記事インデックス


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間