解析! Borland Kylix


Borland Kylix 日本語版 ついに登場

 2001/4/17、ボーランド株式会社から、Linux向けRAD(Rapid Application Development)環境である「Borland Kylix(ボーランド・カイリックス)」日本語版を、2001/5/18より出荷すると発表がありました。(2001/12/12より、Kylix2が出荷されています)
 Kylixは、一言で表現すると「Linux用Delphi」となります。これまでgccなどをmakeやコマンドラインで操作して開発を行うのが主だったLinux上で、Windows上では既に開発手法の主流となっている、GUIによるビジュアルな開発を行えるわけです。Kylixの登場により、Linux上でのアプリケーション作成が、飛躍的に簡単になったと言えるでしょう。「Linuxには興味があるし、インストールしたマシンもあるけど、Windows上でVisualBasic、Delphi、C++ Builderを使った開発経験しかないから、どうやってソフト作ったらいいのかピンとこないんだよね」というアナタ、そんなアナタのための開発環境なんです。
 本記事では、そんなKylixの魅力の一端を、ご紹介したいと思います。
 尚、本記事を皆さんがご覧になる頃には、既に製品版が出荷されていると思いますが、本記事執筆時点ではまだですので、日本語最終β版に基づく内容になっていることをご了承下さい。
 また本記事執筆にあたり、ターボリナックス ジャパン株式会社より「ターボリナックス ワークステーション日本語版 6.0」(以下、TLWS6)を提供して頂きましたので、このディストリビューションに基づく内容になっていることも、合わせてご了承下さい。ボーランド株式会社では、Kylix動作検証済みディストリビューションに対して、その旨の表示を許可する「Kylix Ready」プログラムを実施しています。TLWS6以外の対応状況に関してはこちらを参照して下さい。(Table.1に抜粋)

Table.1 Kylix2対応Linuxディストリビューション

ターボリナックス ジャパン株式会社 Turbolinux Workstation 日本語版 6.0
  Turbolinux Workstation 日本語版 6.0 Limited Edition
  Turbolinux Server 6.1
  Turbolinux Server 6.5
Turbolinux 7 Workstation
デジタルファクトリ株式会社 Kondara MNU/Linux 2000
Kondara MNU/Linux 2.0
カルデラ株式会社 Open Linux Workstation 3.1.1
株式会社ホロン Holon Linux 2.0
Holon Linux 3.0
ミラクル・リナックス株式会社 Miracle Linux Standard Edition V1.0
  Miracle Linux Standard Editoin V1.0 Update1
  Miracle Linux Standard Edition V1.1
Miracle Linux Standard Edition V2.0
メディアラボ株式会社 Linux MLD 5
Linux MLD 6
レーザーファイブ株式会社 LASER5 Linux 6.4
LASER5 Linux 7.1
LASER5 Linux 7.2
  Meister Linux Mandrake 7.2
レッドハット株式会社 Red Hat Linux 7J
Red Hat Linux 7.1J
Red Hat Linux 7.2J
Project Vine Vine Linux 2.1
Vine Linux 2.1.4
Vine Linux 2.1.5
英語版 Linux ディストリビューション Mandrake 7
  Red Hat 6.2&7
  SuSE 7
(2002/6/13 現在)

まずはインストールしてみよう

 インストール時に目を通さなければならないテキストが、CD-ROMの/README_JA、/INSTALL、/PREINSTALLの3ファイルです。これらの記述を基にTLWS6にインストールしてみましょう。本記事では、全てのユーザでKylixを使用可能とするため、rootでのインストールを行います。まずはrootでログインして下さい。

@rootでログイン

 ログインしたらKylixのCD-ROMをドライブに入れます。TLWS6では、CD-ROMを入れると自動的にマウントされるので、CD-ROMの内容が見れるか確認して下さい。

AKylixのCD-ROMを入れる

Table.2 Kylix2動作環境

CPU Pentium II/400以上
メモリ 128MB以上
HDD 240MB以上の空き容量
その他 CD-ROMドライブ、マウスなどのポインティングデバイス
基本的 内部 条件 カーネルのバージョン2.2以上
libgtk.soのバージョン1.2以上(グラフィカルインストールの場合のみ)
libjpegのバージョン6.2(libjpeg.so.62)以上
X11R6互換のターミナルサーバー(XFree86など)
glibc 2.1.2以上(推奨2.1.3以上)

 Kylixの動作環境に関する条件はTable.2となります。この条件を満たしたLinuxシステムの上であれば、恐らく問題なくKylixを使うことができます。ここで、[基本的な内部条件]の項目の意味が分からない方が多くおられるかも知れません。これらの条件を満たしていないと、WindowsにおけるDLLのバーショニング問題と同様の理由で、条件に合わないLinuxシステムでKylixを使うことができません。「そんな条件、どうやって調べるんだよ?」というと、調べる為のツールborpretestが用意されていますので、安心して下さい。

BHDD(~/)にborpretestをコピーして、testsystemを実行
----------------------------------------
[root@turbolinux borpretest]# ./testsystem
Borland Kylix System Compatibility Test

Checking loader....FAILED
Checking kernel >= 2.2....OK
Checking libc >= 2.1.2....OK
Checking libjpeg >= 6.2.0....OK

This system is not compatible with Borland Kylix. Please see the
documents in this directory for information on how to upgrade your
system.
----------------------------------------

 borpretestによるテストの結果によると、glibcのローダーバグの問題の為に、このままの状態ではKylixを動作させられないと分かります。そこで、Kylixをインストールする前にglibcのアップグレードを行い、Kylixが動作可能な環境にしなければなりません。

CCD-ROMに収録されたパッチを適用する

 TLWS6に適用可能なglibcのパッチが、CD-ROMの/patches/glibc_turbo/6.0/RPMSに収録されていますので、ここにある6個のrpmファイルを使ってアップグレードを実行します。例えば、上の図のように、rpmファイルを選択し、マウス右ボタンクリックで現れるメニューから[Upgrade this RPM]を選択すると、そのrpmファイルを使ってアップグレードが行えます。アップグレードを行ったら、再度borpretestで確認しましょう。

----------------------------------------
[root@turbolinux borpretest]# ./testsystem
Borland Kylix System Compatibility Test

Checking loader....OK
Checking kernel >= 2.2....OK
Checking libc >= 2.1.2....OK
Checking libjpeg >= 6.2.0....OK

Looks GOOD !!!
This system should be able to run Borland Kylix!
----------------------------------------

問題が解決され、Kylix動作可能になったことを確認して下さい。
 Linuxシステムの環境整備が終わったら、次はKylix本体のインストールに進みます。インストール自体は、インストーラに従って項目を入力していけば良いので、それほど難しくありません。セットアップ用のスクリプトを起動して下さい。

Dセットアップ用スクリプトを起動する
----------------------------------------
[root@turbolinux cdrom]# sh setup.sh



BORLAND KYLIX



Would you like to use Japanese in the install?
Yes/No (Default Y) If you want to quit this setup, please hit Q)uit
----------------------------------------

日本語環境なのか聞かれますが、もちろんそうですので、「y」と答えます。

----------------------------------------
y
依存関係のチェック...
Kernel バージョン >= 2.2.0....OK
Glibc バージョン >= 2.1.2....OK
X11 Server....OK
Libjpeg バージョン >= 6.2.0....OK
----------------------------------------

すると、以降の処理は別ウィンドウが開いて、そちらで継続されます。
 最初に出るウィンドウではライセンス契約への同意を求められますので、よく読んでから[同意します]を押して次に進みます。

 次のウィンドウでは、インストールする場所と内容に関しての設問があります。インストールパスを、全てのユーザがアクセス可能な場所(この例では/usr/local/kylix)に変更しないと、全てのユーザが利用可能にならないので注意して下さい。[インストール開始]を押すと、CD-ROMからファイルのインストールが始まります。

 インストールが終了したらX Windowを再起動し(手っ取り早いのは、OS自体の再起動)、一般ユーザでログインし、メニューアイテムを開いて下さい。メニューにKylixの項目が追加され、そこからKylixを起動できることが確認できます。

何か作ってみよう

 インストールが終わったら、早速、何か作ってみることにしましょう。

 コンポーネントパレットを見てみると、DelphiやC++Builderを使っておられる方にはお馴染みの部品が並んでいます。これらはCLXと名付けられた部品群で、Delphi、C++Builderで用いられているVCLを基に、クロスプラットフォーム用に定義し直されたものです。Kylixを使えば、VCLと互換性の高いCLXを用いることで、DelphiユーザがそのままLinux用アプリケーション開発者となれるのです。

 それでは、フォームにペタペタと部品を貼り付け…、イベント毎にコードを書けば…、GUIを持ったLinuxアプリケーションが簡単に作れてしまいます。test1(ソース一式はこちらの中のtest1.tarになります)は、bmpファイルを表示したり、反転(ネガ)表示するアプリケーションですが、Pascalによって記述されたコードUnit1.pasは、たったの63行、実際に筆者が記述したのは30行程度に過ぎません。これまでにLinux上での開発経験をお持ちの方には、如何に画期的なことか、よく分かって頂けると思います。

test1のUnit1.pas
----------------------------------------
unit Unit1;

interface

uses
  SysUtils, Types, Classes, Variants, QGraphics, QControls, QForms, QDialogs,
  QExtCtrls, QStdCtrls;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.xfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := 'test1';
  OpenDialog1.Filter := 'BMP (*.bmp)';
  Button1.Caption := 'BMP読込';
  Button2.Caption := '反転';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute() = True then
  begin
    Screen.Cursor := crHourGlass;
    Image1.Picture.LoadFromFile(OpenDialog1.FileName);
    Update();
    Screen.Cursor := crArrow;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  Image1.Canvas.CopyMode := cmDstInvert;
  Image1.Canvas.CopyRect(
    Rect(0, 0, Image1.Width, Image1.Height),
    Image1.Canvas,
    Rect(0, 0, Image1.Width, Image1.Height));
  Update();
  Screen.Cursor := crArrow;
end;

end.
----------------------------------------

作ったアプリケーションの動作環境を整えてみよう

 Kylixを終了して、出来上がったアプリケーションtest1を動かそうとしてみると、

----------------------------------------
[nagalon@turbolinux test1]$ ./test1
./test1: error in loading shared libraries: libqtintf.so: cannot open shared object file: No such file or directory
----------------------------------------

とメッセージが出て、動作させることができません。これは一体、どうしたことでしょう?
 Kylixで作成されたアプリケーションでは、VisualBasicやC++Builder(デフォルト設定)などと同様に、実行形式の中に全ての実行コードが含まれているのではなく、外部の共有ライブラリ(WindowsではDLL)に依存した形になっています。このため、共有ライブラリにアクセスできるよう設定された実行環境下でないと、作成したアプリケーションが実行できないのです。

test1.sh
----------------------------------------
#!/bin/bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/kylix/bin
./test1
----------------------------------------

 Kylix作成アプリケーションの実行に必要な共有ライブラリは、Kylixをインストールしたディレクトリ以下のbinディレクトリに収められています。そこで、test1.shのように、共有ライブラリへのパスを示す環境変数LD_LIBRARY_PATHを設定してからtest1を実行するようなシェルスクリプトファイルを作成し、これを実行するようにします。

----------------------------------------
[nagalon@turbolinux test1]$ sh test1.sh
----------------------------------------

これで作成したアプリケーションをKylix上以外でも実行することができます。

作成したアプリケーションを配布してみよう

 作成したアプリケーションを、他のLinuxユーザに使ってもらうために配布することを考えましょう。Kylix作成アプリケーションの実行には、Kylix付属の共有ライブラリが必要となるので、これも一緒に配布する必要があります。どういったファイルを、どのように付ければよいのでしょう?

Table.3 再配布可能な実行時パッケージ(Desktop Developer 版)

bplbaseclx.so.6.0 <--- bplbaseclx.so.6    
bpldataclx.so.6.0 <--- bpldataclx.so.6    
bplvisualclx.so.6.0 <--- bplvisualclx.so.6    
bplvisualdbclx.so.6.0 <--- bplvisualdbclx.so.6    
libmidas.so.1.0 <--- libmidas.so.1    
libqt.so.2.2.4 <--- libqt.so.2    
libqtintf.so.2.2.4 <--- libqtintf.so.2 <--- libqtintf.so
libborunwind.so.6.0 <--- libborunwind.so.6    
libsqlib.so.1.0 <--- libsqlib.so.1    
libsqlmy.so.1.0 <--- libsqlmy.so.1    
dbxres.en.1.0 <--- dbxres.en.1    
A <--- B : BはAへのシンボリックリンク
サイ 配布 ハイフ のライセンスは、GPLおよびボーランドのナンセンスでないライセンスが 適用 テキヨウ されます。libborunwind.so.6.0に カン してはLGPLおよびボーランドのナンセンスでないライセンスが 適用 テキヨウ されます。

 CD-ROMの/DEPLOYを見ると、例えばDesktopDeveloper版のユーザなら、Table.3に挙げた共有ライブラリを、GPL(一部LGPL)およびボーランドのナンセンスでないライセンスに基づいて、作成したアプリケーションと共に再配布可能であると書かれています。使用許諾を付けた上で、Table.3に挙げたファイル群と一緒に配布すればよいでしょう。
 ここで注意しなければならないのは、実行形式から共有ライブラリが呼ばれるときに、シンボリックリンクを経由して呼び出されるということです。例えば、bplbaseclx.so.6.0へのシンボリックリンクを、bplbaseclx.so.6という名前で作っておかなければなりません。
 実行形式と共有ライブラリを全て同じディレクトリに置くような配布形態を取る場合は、カレントディレクトリの各共有ライブラリにリンクしたシンボリックリンクを作成し、一緒に配布すればよいでしょう。

配布用に作成したtest1run.tarの中身

 欲を言えば、作成したものをrpmなどの配布パッケージにするような、簡単なインストーラ作成ツールがあればよかったですね。

C/C++のソースを流用してみよう

 KylixはDelphi同様、プログラミング言語としてPascalを採用しています。しかし、多くの人は、PascalよりもC/C++を使ってプログラミングしていることが多いと思います。Windows用としては、DelphiのC/C++版であるC++Builderが販売されており、どちらかといえばC++Builderを利用しているという方も多いのではないでしょうか?
 Windows上のDelphiでは、C/C++によって書かれたコードをDLLとして利用することで、処理の一部をCによって記述することが可能でした。Linux上のKylixでも同様に、C/C++で書かれたコードを共有ライブラリとすることで、C/C++のソースを使うことができます。ゆくゆくはC++BuilderのLinux版も発売されるでしょうから、急場をしのぐテクニックでしかありません。しかし、ちょっとした工夫でKylixでC/C++のソースコードを流用することができるので、試してみることにしましょう。

cfunc.c
----------------------------------------
int cfunc1(int i) {
  int j, k = 1;

  for(j = i; j > 0; j--)
    k *= j;
  return k;
}
----------------------------------------

 まず、cfunc.cを共有ライブラリとしてコンパイルします。

----------------------------------------
[nagalon@turbolinux test2]$ gcc -shared cfunc.c -o cfunc.so
----------------------------------------

コンパイルして得られるcfunc.so内のint cfunc1(int i)を利用するためには、Kylixのコード内にexternal宣言を記述します。すると、cfunc1()を呼び出せるようになります。

test2のUnit1.pas
----------------------------------------
unit Unit1;

interface

uses
  SysUtils, Types, Classes, Variants, QGraphics, QControls, QForms, QDialogs,
  QExtCtrls, QStdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    procedure Edit1Change(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.xfm}

function cfunc1(i:integer):integer;cdecl;
  external 'cfunc.so';

procedure TForm1.Edit1Change(Sender: TObject);
var i:integer;
begin
  try
    i := StrToInt(Edit1.Text);
    i := cfunc1(i);
    Edit2.Text := IntToStr(i);
  except
    Edit2.Text := '';
  end;
end;

end.
----------------------------------------

 こうして作成したのがtest2(ソース一式はこちらの中のtest2.tarになります)です。test2.shを使って実行できることが確かめられます。

test2.sh
----------------------------------------
#!/bin/bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.:/usr/local/kylix/bin
./test2
----------------------------------------

 自分で作った共有ライブラリをKylixで利用できるように、ログイン時の環境設定でLD_LIBRARY_PATHを設定するようにした方が便利かも知れません。

Delphiのプロジェクトをコンパイルしてみよう

 Kylixでは、Delphiのプロジェクトをコンパイル可能という、大変重要な機能を持っています。CLXで代替可能なVCLのみを利用したDelphiプロジェクトであれば、それを元にLinux用アプリケーションが作れるのです。

 Delphiで作成したアプリケーションtest3(ソース一式はこちらの中のtest3win.zipになります)をコンパイルするのに必要なtest3.dpr、Unit1.pas、Unit1.dfmをLinuxに移し、Kylixでtest3.dprを開いてみます。すると、ちゃんとフォームも開き…、あ、Caption類で日本語を使っているところが消えちゃってますね。

これは、WindowsとLinuxでは使用している文字コードが違うため、Windows上でフォームのデータやソース内の文字列として使用した日本語を認識できないようです。Linuxにソース一式を移すときに文字コードの変換を行えばよいのですが、フォームのデータである.dfmファイルはバイナリ形式なので、変換ツールを作成する必要があるでしょう。できればKylixにそうしたツールが付けばいいのですが……
 とりあえず、LabelのCaptionを設定し直し、コンパイルしてみます。すると、今度はtest3.dprのuses節のところで引っかかります。これはどうしたことかとKylixで作成した場合の.dprファイルと比べてみると、uses節で指定するユニット名が、DelphiとKylixでは異なるのだと分かります。test3.dpr、Unit1.pas内のuses節の記述をKylixで作成したソースのものと同じに書き直して再度コンパイル。今度はUnit1.DFM、test3.RESが見つからないと警告されてしまいました。これはそれぞれ該当する行の拡張子の指定が大文字になっているためで、これを小文字に直せばOKです。三度目の正直でコンパイル、実行すると、動作させることができました。

 結論としては、ソースを修正すれば、CLXで代替可能なVCLのみを利用したDelphiプロジェクトをコンパイルすることが可能です。各種ファイル内の文字コード、uses節のユニット名、拡張子指定の3つを変換するコンバータがあれば、修正作業がいらなくなるので、Kylixに組み込むか、ツールとして付けてもらえるとうれしいですね。

CLXはどれくらいVCLなのか?

 先ほど同様に、Delphiで作成したアプリケーションtest4(ソース一式はこちらの中のtest4win.zipになります)をコンパイルしてみましょう。このアプリケーションは、自動的に画面上に線を描画しつつ、指定したドライブに音楽CDが入った状態で[CD]ボタンを押すと、音楽CDの操作が行えるというものです。

 先ほどの要領でLinuxにソースを移し、Kylixでtest4.dprを開きます。すると、「クラスTMediaPlayerが見つかりません。」というメッセージが出てしまいます。

KylixのCLXには、マルチメディアデバイスを操作する部品TMediaPlayerが用意されていないようです。コンポーネントパレットを探しても、やはり見当たりません。実はこのTMediaPlayerは、WindowsのAPIで、マルチメディアデバイスを統合的に操作するMCIと極めて密接な関係にあります。このため、KylixでTMediaPlayerを用意するのが後回しにされてしまったのではないかと思います。特に趣味のプログラミングをされている方などは、DelphiでTMediaPlayerを用いることが多いと思いますので、この点は少し残念ですね。
 気を取り直して、画面上に線を描画する機能だけでもKylixで実現することにします。先ほどのメッセージのところから、[無視]ボタンをクリックして先に進みます。すると、読み込まれ表示されるフォームからメディアプレーヤーが削除されていることが確認できます。

コンパイルすると「TMediaPlayerに関する宣言を削除しますか?」と聞かれるので、[はい]で先に進みます。

ソースの修正はtest3の時と同様に行い、TMediaPlayerに関する記述をコメントアウトすると、問題なくコンパイルできるようになります。

 動作させてみると上のとおり、CDは鳴らせないけど描画は行えるものがちゃんと動きます。(Kylix版test4のソース一式はこちらの中のtest4.tarになります)動きますが、ちらつきます。Kylixでは、その描画周りの機能を「Qt」というライブラリに依存しています。CLXの下にQt、Qtの下にウィンドウマネージャ(GNOMEなど)、ウィンドウマネージャの下にX11、X11の下にOSカーネル、という階層構造の上で描画を行っているのです。因みにDelphiでは、VCLの下にWin32API、Win32APIの下にOSカーネル、となっています。Windows上のDelphiに比べ、Linux上のKylixでは、描画に対するオーバーヘッドが大きくなる傾向があるので、基本的に高速な描画処理が苦手だと考えられます。このことは、Delphiでゲームを作っている人にとって、不満な点になるでしょう。CLXによる描画を高速に行う手法が確立されたり、TImageに変わる高速描画の行える部品を誰かが作るまで、この問題は頭痛の種になりそうです。
 KylixとDelphiのコンポーネントパレットを見比べると分かりますが、ボタンや入力フォームなどの一般的な部品群、DBアクセス関連部品群、インターネット関連部品群については、CLXとVCLで、名前が少し違うこともありますが、同じ機能を持った部品がほぼそろっています。その一方で、TMediaPlayerがなかったり、TcanvasにPixelsプロパティがないなど、デバイスに関連した部分に違いが見られるようです。この傾向から考えると、ビジネスアプリケーションを作るという観点から見ると高い互換性を持つが、エンターテイメント色の強いアプリケーションを作る観点から見ると少しもの足りないと言えるかも知れません。

さいごに

 配布パッケージの作成や、Delphiプロジェクトの移植、VCLとCLXの互換性に、これからの課題も見えますが、まずは期待通りの出来栄えといえるでしょう。WindowsのDelphiユーザが、そのままLinuxアプリのデベロッパに変身できるという点は、開発業務の視点からも大変意義深いところです。スキルの上積みをなしに、Windows上のDB連携アプリケーションをLinuxに持って来れるのですから、「Borlandについて来て良かった」と思ってる技術系管理職の方もおられるでしょう。Borlandさんが如何に自社ユーザを大切にしているか分かろうというものです。
 ただ、現在のDelphiユーザというと、趣味でゲームや小物(マスコットの類)を作ってるイメージがあるので、そうしたユーザにどうアピールできるかといった点も、これから考慮していただけると有難いですね。噂によるとQtに関する書籍の売上が上向きらしいのですが、ゲーム用のコンポーネントやライブラリを供給する人が出てくると、面白くなってくるでしょうね。実際、Delphiも、そうしたユーザの成果の積み重ねで環境が良くなってきたのですから、Kylixでも期待できそうです。いや、期待してないで、皆で作りましょう。
 Kylix、Delphi、C++Builderによる、これからのBorland開発環境の行く末が、ますます楽しみになってきましたね。

※本稿のサンプルプログラムのソース類はこちらになります。

※本稿で使用されているDelphiのバージョンは4です。

※本稿は2001/7にCマガジンに掲載された記事の原稿を元に構成されています。最新の情報とは異なる部分を含む可能性がある事をご了承下さい。