|
rpmなクロスコンパイル環境の構築 |
|
●はじめにrpmベースのLinuxを使用していて、 Linux-VRなんかを触っているとrpmパッケージを利用して クロスコンパイルが出来ないものかと考えてしまいます。 rpmはあまりcrossが得意ではなさそうですが、出来ないこともないので src.rpmからcrossで対象アーキテクチャ向けのバイナリrpmパッケージを 作成する方法をツツいて見ました。 また出来れば以下の条件も考慮します
●rpmを使ってcrossコンパイルする方法rpmコマンドでは"--target"オプションで対象のアーキテクチャを指定できます。 これによってコンパイル環境を切替えることが出来ます。 しかし、実際にはビルド時に使用するconfigureスクリプトやパッケージ固有の ツールなどがうまく扱えないことが多く、素直にはいきません。 しかしconfigureはconfig.cacheをうまく使えばクリアできるので、 一般的なGNUのconfigureを使用するもので、かつビルド時に自前のバイナリなどの ツールを使わないものはコンパイルできる可能性大です。 ●クロス開発環境の準備ここでは開発環境の構築などの手順自体の説明はしません(^^。 いろいろなアーキテクチャ向けのcrossコンパイラがrpmで入手出来ますし、 gnuのツールチェインを利用すれば自力でも構築可能です。 それらをご利用ください。 なを、対象アーキテクチャ向けの以下のツールなどが必要となります。
ここでは例としてクロスツール類が <arch>-linux-<command> という形式で作成されているものとします。 <arch>にはmips, mipsel, mips64, sh4, i686などが入ります。 また、commandにはgcc, ld, stripなどが入ります。 ●mips向けコンパイラここで、私の使っている環境は、Sigmarionなので、 当然mips向けコンパイラを利用することになります。 簡単に紹介すると
基本的に対象ディストリビューションに合わせるのが良いと思います。 ●クロスでrpmファイルを作成する際の問題点以下にクロス環境でrpmファイルを作成する際の問題についてもう少し考えてみます。
●configureスクリプトの設定Linuxのバージョンが同じであれば以下の方法が楽でしょう。
とりあえずの修正点としては gcc,ld,ranlib,strip,ar,nmなどのコンパイラ、 binutils類のファイル名の設定を長い名前に書き換えます。
これで準備したconfig.cacheを適当な場所に置いておき、
等と指定します。 これで普通にGNUのconfigureを使っているものはある程度コンパイルが 通るようになります。 ●ツールの名前問題の解決 その1オブジェクトが混じる危険を避けるため、なるべくは長い名前でツールを使いたいが、 configureを使っていなかったりして、コンパイラやツールが決め打ちになっている ソースも多いため、やはり通常のツール名でもコンパイルできるようにしておいた方が いいでしょう。 ツールの実行ファイルのシンボリックリンクを適当なディレクトリに アーキテクチャ名を取り去った名前で作成します 例 /usr/bin/<arch>-linux-gcc -> /usr/local/<arch>/bin/gcc /usr/bin/<arch>-linux-strip -> strip /usr/bin/<arch>-linux-ld -> ld ... rpmのビルド前に実行パスの先頭にリンクを作成したディレクトリを指定したり specファイルに書き込んだりしたらよいでしょう。 例 set path=(/usr/local/<arch>/bin/ $path) など ●ツールの名前問題の解決 その2rpmにもツール名を指定するマクロがあります。 この設定を書き換えることでよりより長い名前対応をします。 とりあえずrpm関連でいじるところは以下の所です。
●テストビルド適当なサイトからsrc.rpmかnosrc.rpmを入手し、 例 rpm --target <arch> -ba hoge.src.rpm などとしてコンパイルして見てください。 もしコンパイル途中でエラーがでる場合,5で作成したクロス環境のパスが 先頭であるかどうかを確かめてください。 ●より完全なクロス環境へ以上、かなりごちゃごちゃとしていますが、基本的なソフトのrpmはある程度作成できるようになると思います。 ただ、いろいろなものをインストールしようとすると、どうしても他のパッケージへの依存を解決せねばならない場合があります。 ところが、当然ながらホスト環境にターゲット向けのライブラリなどが入っているわけはないので、なんとか解決しないといけません。 素直にターゲットからホストをnfs mountしてネイティブコンパイラを使えば 問題なさげですが、今時のホストとの速度差はかなり大きいので、 なんとかPC上でコンパイルしたいと思うのですが... で、現在その方策を模索中です。できるだけspecなどを書き換えずにそのままコンパイル出来ないかと思っています。 targetがVine 2.1ベース(Linux-MC)なのでホストのKondara2.0と パッケージングに違いがありなにかと不便です。 またconfigureの結果などもホストOSの側のconfigureを流用すること多いだろうから、 なるべくターゲットに近いほうがなにかと便利です。 そこでもっとも近い環境と思われるVine2.1を インストールしてやってみようと思っています。 Kondara 2.0のrpmのコンパイルも試しては見たのですが 何分環境がかなり異なります。 いずれはSGIのredhat 7.1のtoolchain(gcc 2.96)を使って Kondara環境を作ったりできないかと思ってはいるですが、これはまたいずれ。 |