試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

ReactOS Build Environment(RosBE)のMandriva Linux向けRPMパッケージを作成

以前「ReactOS 0.3.3-RC1をビルドする」でReactOSをビルドするための環境(RosBE)を作成する流れを書いているが、今回バージョン1.4をMandriva Linux向けのRPMパッケージにしてみた。ここではその際に起こった問題点のメモも書いておく。

  1. パッケージ作成の過程において発生した問題
    1. 非対話化
    2. インストール先の指定
    3. クロスコンパイラが参照するヘッダファイルの場所に関する問題
    4. ランチャの作成スクリプトについて
  2. 条件によって実行してほしくない処理が行われるのを回避
  3. パッケージ
  4. ReactOS 0.3.8の動作について少しだけ

パッケージ作成の過程において発生した問題

非対話化
一般的に、.specファイルを用いてディストリのパッケージを作成する作業は完全に自動化され、非対話的でなければならない。ところがこのパッケージはビルドスクリプトRosBE-Builder.shにおいて途中でユーザからの入力を受け付けることになるため、その処理の部分を変更して、入力作業を回避しつつインストール先などの情報を予めその中に指定しておく必要があった。
具体的には、入力作業の回避には「read」の部分を消し、変数installdirには「%{buildroot}/%{_prefix}/RosBE」が入るようにした。

インストール先の指定
RPMパッケージを作成する流れは

  1. 「%setup」によりソースが%{_builddir}(既定は/usr/src/rpm/BUILD/[ホームディレクトリ]/.rpmmacrosにより変更可能)の下に展開される
  2. configureスクリプトなどでインストール先接頭辞(prefix)に「%{_prefix}」(通常は「/usr」に展開される)を指定・通常は「%configure」などのマクロを記述してその中で指定される形
  3. ビルド作業を普通に行う
  4. %{buildroot}(.specファイル内で指定可・多くは%{_tmppath}(/var/tmp/)の下)に、システムへインストールされるのと同じレイアウトでファイルをインストールしていく・makeを使用するパッケージでは「%makeinstall」などを使用するか「make install DESTDIR=%{buildroot}*1」でコピー先をconfigure時の%{_prefix}ではなく%{buildroot}以下のディレクトリツリーの中にずらす
  5. %{buildroot}のディレクトリ以下のファイルが「%files」の記述にもとづいてパッケージにまとめられる

のようになるが、RosBEのビルドスクリプトRosBE-Builder.shではconfigureスクリプトで指定しているインストール先接頭辞(/usr)の下に直接書き込みを試みてしまうため、%{buildroot}以下へのインストール段階においてDESTDIRとINSTALLROOT*2を指定するように修正した。また、configureスクリプトの実行時について、変数installdirがインストール先接頭辞(prefix)として使用されてしまうとシステムへのインストール後に問題が起こるため、インストール先接頭辞についてはきちんと「%{_prefix}」の下を指定するように変更をした。

ロスコンパイラが参照するヘッダファイルの場所に関する問題
GCCのビルド中(正確にはコンパイラ本体のビルド後)に、ターゲットのアーキテクチャ(win32)のヘッダファイルを見つけられずにエラーとなってしまう現象が起こった。configure時には--with-headersオプションが付けられるようにスクリプトが書かれてはいるのだが、「sys-include」という名前のディレクトリを要求するのでうまくいかなかった。
この問題にはかなり苦労したが、最終的には

  • MinGWランタイムとw32apiのパッケージのみを別パッケージとして分離してあらかじめシステムにインストールしておく(RosBEを実行するアーキテクチャに無関係なファイルなので、この部分はアーキテクチャ非依存なRPMパッケージにもできるという利点も)
  • RosBE本体のビルド時にはこれらを除いたパッケージのみを処理するようにしつつ、GCCのソースを展開した後で「sys-include」という文字列を「include」に置換する

の2つで回避することができた(もしかすると邪道な方法だったのかもしれないが...)。

ランチャの作成スクリプトについて
本体に付属するcreateshortcut.shというスクリプトを実行し、ReactOSのソースツリー(の最上位ディレクトリ)とランチャの作成先ディレクトリを指定すると、RosBEを起動する(ReactOSをビルドするための幾つかの設定を行った端末シェルに入る)ためのランチャ(.desktopファイル)を書き出す。
このスクリプトにおける既定の出力ディレクトリは[ホームディレクトリ]/Desktop/になっていたが
www.atmarkit.co.jp/flinux/rensai/linuxtips/a077changelang.html
のようにして英語にしている場合はよいが、日本語のディレクトリ名で使用しているとそのままではデスクトップ上にはアイコンが出てこないため、xdg-user-dirにより取得したデスクトップのディレクトリ名を使用するように修正した。
xdg-user-dirコマンドに「DESKTOP」を付けると

$ xdg-user-dir DESKTOP
/home/[ユーザ名]/デスクトップ

のようにデスクトップのディレクトリの絶対パスが得られる。

条件によって実行してほしくない処理が行われるのを回避

if [ 条件 ]; then
(実行してほしくない処理)
fi

のようにif文で分岐している中に実行してほしくない処理が書かれているときに「if」の後ろの角括弧とその中身の部分を「false」にしてしまう手法を用いた。
置換後は

if false; then
(ここは実行されない)
fi

のようになり、falseコマンドは必ず1を返して終了するため、then以下は実行されない。

パッケージ

パッケージは別館の配布ページで公開している。
先述の事情から、パッケージは

の2つに分割してある。最適化オプションなどは付けないようにしてある(ビルドスクリプトRosBE-Builder.shが指定するものを使用)。
バージョン0.3.8のソースをビルドし、インストールディスクイメージReactOS.isoを作成できることを確認済み。
(2014/10/12)配布ページは削除済み。

ReactOS 0.3.8の動作について少しだけ

インストールについては特に問題はないが、Sun xVM VirtualBoxでは通信をしようとすると確実にtcpip.sysでSTOPエラーが起こってしまい、VMware Playerではダウンローダによるパッケージダウンロードはうまくいったものの、Firefoxのインストールは失敗した(ダウンロード後か展開中にウィンドウが消える)。どちらの仮想化ソフトウェアでもゲストOSはWindows XPとして設定している。
日本語表示についてはid:firewood氏のパッチ(http://reactos.2chv.net/wiki/?ReactOS%A4%F2%C6%FC%CB%DC%B8%EC%B2%BD%A4%B9%A4%EB にアップロードされているファイルをCR+LF改行にしたもの)を適用後ipagui-mona.ttfmedia/fonts/ディレクトリに入れて行い、以前独自に試したときと同様、インストール後半から日本語が表示されていることを確認した。

使用したバージョン:

*1:この書き方により、「install」ターゲットを指定してインストール処理をするときにDESTDIRの値のディレクトリをシステムの最上位ディレクト/に相当するディレクトリとみなす

*2:DESTDIRと同様だがnasmだけはこちらの指定が必要だった