2014/04/28 (Mon) 23:38
今回はChromium OSにもともとインストールされていないソフトウェアを後から組み込む方法を試してみます。
今回追加するのはgnu binutilsとp7zipです。
binutilsに含まれているarコマンドとp7zipに含まれる7zコマンドがChromium OSに入っているとUbuntuなどのDebian系で使われているパッケージ形式であるdebファイルをChromium OS上で直接展開できるようになります。
これができるようになると、Chromeブラウザの最新版をgoogleから直接Chromium OS上にダウンロードして、そこからFlashとPDFのプラグインを抜き出してインストールすることができるようになります。
・・・まあ、スクリプトが公開されているんでそれ使ったほうが早いですがw
Flashの話はとりあえず今回はおいておいてパッケージの追加の話だけ書きます。
組み込む方法といっても方法はいくつか考えられます。
一番手っ取り早いのは普通にソースをダウンロードしてきてconfigureしてmakeする、という方法です。
もう一つはChromium OSのSDKにパッケージを追加してSDKの流儀で組み込む方法です。
このほかにDev Serverを使う方法があります。Dev serverについてはこちらの記事でまとめています。
今回はbinutilsを最初の方法、p7zipを2番目の方法でインストールしていきます。ただ、前者の方法は軽く触れるだけにして、後者をメインに書いていきます。
なお、今回も既にChromium OSのビルド環境が手元にあることを前提にして書いていきます。ビルド環境の構築方法はこちらの記事で書いています。
また、パッケージの追加・置換は手順を間違えると最悪ビルド環境が壊れてしまうので、バックアップやVMを使っているならスナップショットの作成を行って作業前に戻せるようにしておくことをお勧めします。
実はx86アーキテクチャ用のarコマンドは
/build/x86-generic/usr/i686-pc-linux-gnu/binutils-bin/2.22/ar
においてあります。なので、別にビルドしなくてもこれをコピーすれば終わりだったりしますが、物は試しということでbinutilsのmakeをやってみます。
といっても、基本的には普通にconfigureしてmakeするだけですのであまり難しいことはありません。ただ、Chromium OS用バイナリをビルドする際の注意点はいくつかあるのでそれを書いておきます。
Chromium OSのビルド環境はUbuntu12.04 LTS 64bitですので、普通にビルドするとビルド環境であるUbuntu 64bit用のバイナリができてしまいます。このブログでターゲットにしているのはx86なのでそれだと困ります。
Chromium OS用のバイナリをビルドするにはターゲットアーキテクチャ向けにクロスコンパイルを行う必要があるので、Configureなどでビルドの設定をする際にはx86用のクロスコンパイラが使われるように指定してあげる必要があります。
そのため、普通にConfigure/makeする場合でも、やはりcros_sdkを使ってchroot環境に移行して、そのchroot環境の中で作業する必要があります。
そのうえでx86用のコンパイラである
が使われるように設定します。
gnu binutilsを手動でビルドする場合は、configureを実行する際に以下のように指定します。
./configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=i686-pc-linux-gnu
p7zipのようにconfigureがないようなソフトの場合は、makefileを開いてCXXやCCなどのコンパイラ名を指定している変数を探して、該当箇所を上に書いたコンパイラ名に書き換えます。
このあと普通にmakeすれば、うまくいけばx86アーキテクチャのChromium OS用バイナリが出来上がります。
もう一点注意すべきことは、当然ですが
make installしてはいけない
ということです。特にbinutilsのようなビルド処理に直接かかわるツールをmake installすると最悪ビルド環境が壊れてしまいます。
手動でビルドした場合、バイナリはChromium OSのイメージには取り込まれませんので手動でバイナリをChromium OSがインストールされている実機にコピーする必要があります。ただし、コピー先にも注意があります。
Chromium OSではホームディレクトリに置いたバイナリは実行できないようにガードがかかっています。Chromium OSはルートパーティションがリードオンリーでマウントされているので、バイナリはSTATEパーティションにある/usr/local/binに置くのが簡単です。単に
sudo cp ~ /usr/local/bin
とすればOKです。
ここまでの内容を踏まえて、x86アーキテクチャ向けのChromium OS用binutilsのビルド手順は以下のような感じになります。
あとは、Chromium OSインストールマシンからscpなどでarをコピーし、/usr/local/binにコピーすればOKです。
今回の内容は本家サイト"The Chromium Project"以下の各ページを参考にしています。
Chromium OSの情報源は英語ばかりなのでまた間違って理解している可能性があります。詳しいことはこれらの本家サイトをご覧ください。
Chromium OSのパッケージシステムはGentoo Linuxというディストリビューションで使われているPortageというものです。Portageでは各ソフトのダウンロード・ビルド方法を拡張子がebuildのファイルに書いておき、これを実行することでソフトウェアのインストールを行います。debやrpmと違ってバイナリパッケージではなく、基本的にはソースアーカイブをネット経由でダウンロードしてから逐次ビルドするところに特徴があります(バイナリパッケージもあるようですが)。
Chromium OSのSDKでは、このebuildファイルが置かれている場所が大きく分けて以下の2つあります。
~/trunk/src/third_party/chromiumos_overlay
~/trunk/src/third_party/portage_stable
前者はChromium OSの中核をなすパッケージや、Chromium OSに取り込むにあたってカスタマイズが施されているようなソフトのパッケージが置かれているようです。なので、ここにパッケージがあるときは下手に置き換えないほうが得策です。
こっちにおいてあるパッケージでChromium OSに取り込まれていないものはあまり多くないと思いますが、binutilsはこちらにパッケージがあるけどデフォルトではChromium OSに取り込まれないものの1つです。
これに対して、一般に配布されているオープンソースソフトウェアをそのまま取り込むようなケースではportage_stableにあるパッケージが使われます。ここにはGentoo Linuxのパッケージツリーからそのまま持ってきただけと思われるものが多数置いてありますが、必ずしも最新のパッケージになっているというわけではありません。
また、portage_stableには、実際にはChromium OSのイメージに取り込まれないようなパッケージもいくつかおいてあったりします。今回扱うものでは、p7zipがこちらに当てはまります。
上記2つのディレクトリの下には、ソフトウェアのカテゴリを表すサブディレクトリがたくさん作られています。これらのカテゴリを表すサブディレクトリのさらに下に各ソフトウェアのディレクトリが作られ、その中にebuildファイルをはじめとするパッケージの構成ファイルが入っています。
このカテゴリとソフトウェアの対応は、Gentoo Linuxの構成がそのまま踏襲されています。
今回インストールするプログラムはgnu binuitlsとp7zipですが、"binutils ebuild"とか"p7zip ebuild"などでググればGentoo Linuxのパッケージツリーが置いてあるサイトが真っ先に引っかかるので、これらのソフトのパッケージがどこに置かれるべきかはすぐわかります。
結論から言うと、p7zipはapp-archというアーカイバ関係のカテゴリ、binutilsはsys-develという開発ツール関係のカテゴリに含まれます。
p7zipとbinutilsが現状のChromium OS SDKでどこに置かれているかを一応確認しておきます。まずportage_stable配下の現状を見るとこのようになっています。
p7zipのほうは既にパッケージが存在していますが、バージョンが9.13とちょっと古いようです(記事作成時点では9.20が最新)。現状Chromium OSにはp7zipは含まれていませんので使われていないにも関わらずパッケージだけは置いてあるようです。
binutilsのほうはパッケージがありません。
一方、chromiumos-overlayのほうは結論だけ書きますが、p7zipについてはp7zip自体も、その上位カテゴリのapp-archもありません。それに対してbinutilsのほうはsys-develカテゴリの中にパッケージが存在しています。
これらをふまえてパッケージの追加を行っていきます。
p7zipは既にパッケージが存在していますが、バージョンが古いです。この古いバージョンでビルドを試みましたがコンパイルエラーになりました。
p7zipはchromiumos-overlaysのほうにパッケージがないので、思い切ってバージョンをあげてしまいます。
Chromium OS SDKにはパッケージの更新を行うための専用のコマンドが用意されているので、そのコマンドで更新をかけます。
一応、Chromium SDKを起動するところから手順を書いてきます。
今回は~/trank/src/third_party/portage_stableで作業をするので、ここにブランチを作ります。
続けてcros_portage_upgradeというコマンドを実行します。これが上流サイトから最新のパッケージをダウンロードして置き換えるためのコマンドです。
黄色い文字で警告が表示されます。これは、--boardオプションでx86-genericだけを指定したためです。--boardオプションは:で区切って複数のアーキテクチャを指定できますが、私が使っている環境がx86しかセットアップしていないので1つだけ指定しています。 この警告ではパッケージの置換は他のアーキテクチャにも影響を与えるため、1つだけ指定すると他のアーキテクチャでビルドできなくなるかもしれないよ、というようなことを言っているようです。ここはとりあえずyesを入力して先に進みます。
冒頭に
Cloning origin/gentoo at /tmp/portage as upstream reference.
と表示されていますが、要するにリモートのパッケージツリーからパッケージをダウンロードしてきて/tmp/potargeに一旦置いた後に、依存関係などをチェックしながら最終的に~/trunk/src/third_party/portage_stableの下のパッケージを置き換えています。
出力内容からp7zipが9.13から9.20.1-r4に置き換わったことが分かります。
ちなみにChromium OS SDKでは上流のパッケージサイトのURLは
https://chromium.googlesource.com/chromiumos/overlays/portage
になります。
このcros_portage_upgradeコマンドは、コマンド名こそupgradeですが、portage_stableにないパッケージでも上流サイトにあれば持ってくることができます。
一度実行すると/tmp/portageに上流サイトのパッケージツリーのクローンができるので、ここにできるパッケージはとりあえず持ってきてビルドにチャレンジすることはできると思います。うまくいくかどうかはやってみないとわかりませんが。
持ってきたパッケージがそのままコンパイルできるとは限りません。とくにGUI系のツールは多分無理だと思います。今回はコマンドラインツールなので十分期待できます。
コンパイルだけを実行する場合はebuild-${BOARD}というコマンドに引数としてebuildファイル名とオプション"compile"を指定して実行します。
${BOARD}はターゲットアーキテクチャを表す文字列です。今回の場合はx86-genericなのでコマンドはebuild-x86-genericです。GentooLinuxで使われているのebuildコマンドを直接使うことは基本的にはありません。
うまくコンパイルできたようです。
ちなみにパッケージそのものにはソースコードは含まれておらず、ビルド時にリモートからダウンロードするようになっています。ダウンロードしたソースコードは
/build/${BOARD}/tmp/portage/の下に置かれます。
ここまででp7zipのパッケージをコンパイルしましたが、これだけではChromium OSにビルド結果が取り込まれません。取り込まれるようにするためには、~/trunk/src/third_party/chromiumos_overlay/chromeos-baseの下にある以下のいずれかのパッケージのebuildファイルを編集して、追加するパッケージ名を依存関係の一覧に追記する必要があります。
前者に追加した場合、バイナリはChromium OSの/usr/binや/usr/libにインストールされます。後者に追加した場合は/usr/local配下にバイナリが置かれます。
特段の必要がなければ基本的にはchromeos-devのほうにパッケージを追加したほうが簡単です。
chromeosのほうに追加する場合は、以下の2点に気を使う必要があります。
a. ルートパーティションの容量
b. シェアードライブラリの依存関係
まずパーティションの容量ですが、/usr/binはルートパーティションに置かれます。Chromium OSのルートパーティションはデフォルトで1.2GB程度しか確保されていません。そのためあまりこちらにものを入れすぎるとルートパーティションが足りなくなる可能性があります。/usr/localが置かれるSTATEパーティションは他のパーティションを確保した後の残容量全部が割り当てられるため、あまり容量の心配をする必要はありません。
次のシェアードライブラリの依存関係ですが、ルートパーティションにインストールするパッケージは、build_imageでディスクイメージを作成する時にシェアードライブラリの依存関係がチェックされます。このチェックで依存する.soファイルが見つからないとエラーでイメージ作成が失敗してしまいます。
で、このチェックには厄介な問題があります。
シェアードライブラリはプログラムローダーが認識できるようにld.so.confに書かれているパスのいずれかに配置されるのが普通ですが、一部のプログラムではそこにはシンボリックリンクを置いておき、実体をほかの場所に置くことがあります。このシンボリックリンクのリンク先が絶対パス表記になっているとこの依存関係チェックがうまくできずにエラーになってしまうのです。
実はbinutilsのパッケージを/usr/binにインストールしようとするとこの条件に引っかかってエラーになってしまうという問題があります。chromeos-devに依存関係を足して/usr/localにインストールすることは可能ですが、binutilsのパッケージはシンボリックリンクを絶対パスで/usr/binや/usr/libに作るためリンク切れが起きてしまいます。
今回パッケージでインストールするp7zipの場合はどちらでもいいですが、今回はchromeos-devの方に追加してみます。
chromiumos_overlayの方も編集に先立ってrepo startでブランチを作っておく必要があります。
それからchromiumos_overlay/chromeos-base/chromeos-devに移動して、そこにある ebuildファイルに依存関係を追加します。追加するのはRDEPENDという変数です。
ここで、chromeosの下には
chromeos-0.1.0-r94.ebuild
chromeos-0.1.0.ebuild
の2つのファイルがあり、前者は後者へのシンボリックリンクになっています。
編集を加えた後は、ビルドシステムが変更を認識できるようにシンボリックのリビジョン番号をカウントアップします。
ビルドがうまくいったようなので、続けてbuild_imageします。
build_packagesでビルドを行うと、各パッケージのバイナリは
/build/${BOARD}/package/パッケージカテゴリ名
の下にtbz2形式で圧縮されて格納されます。この中から必要なものがbuild_imageの実行時に展開されてディスクイメージの中にコピーされるようになっています。
終わったらイメージをマウントして中を確認し、追加したコマンドが含まれているか確認します。作成したビルドイメージのルートパーティションは/tmp/mにマウントされるので、確認する場所は/tmp/m/usr/local/binになります。ここに7*で始まるファイルがあるかチェックします。
うまくできていたようです。確認が終わったらイメージはアンマウントします。
CPV: chromeos-base/chromeos-dev-0.1.0-rXX
という文字列を検索します。XXはebuildファイルをリネームしたときに指定したリビジョン番号です。すると以下のような内容が見つかるはずです。
このDEPEND:の後に取り込まれるパッケージがずらずら書いてありますので、この中に自分が追加したパッケージが確かに含まれていることを確認します。含まれていない場合はどこかにミスがあります。
うまくいかないケースではリビジョンをあげ忘れて前のリビジョンしかヒットしない場合が多いのではないかと思います。
binutilsはp7zipと違って~/trunk/src/third_party/portage_stableの下にパッケージが置かれていませんが、chromiumos_overlaysの中にはパッケージが存在しています。
このbinutilsパッケージはChromium OSにインストールするためにあるものではなく、SDKのビルド環境を作成するために存在しています。なので、このbinutilsパッケージに対して細工を加えると正しくChromium OSがビルドできなくなります。
emerge-x86-generic binutils --unmerge
などとしてパッケージを削除してしまうと、ビルドに使うldコマンドが消えてしまってバイナリが作れなくなります。上で書いたcros_portage_upgradeコマンドを実行して更新をかけるのも避けるべきです。
どうしてもbinutilsパッケージをChromium OSのイメージに取り込みたいときは、以下のようにbuiild_imageコマンドで引数にdevではなくtestを指定するするのが簡単です。
./build_image --board=${BOARD} --noenable_rootfs_verification test
こうするとビルド環境で使われているbinutilsパッケージがChromium OSに取り込まれます。ただ、この方法ではchromiumos-overlay/chromeos-base/chromeos-testというパッケージに書かれているすべてのパッケージがChromium OSに取り込まれます。いろいろ有益なツールもあるのでこれでもいいかと思います。
この方法で追加されるパッケージはchromeos-devに依存関係を追記したときと同じで/usr/local配下にインストールされます。上でも書いたように/usr/local配下にbinutilsをインストールするとシンボリックリンクが壊れるので後で手作業で直さないといけません。 ということで、binutilsについては今のところスマートにインストールする方法はないみたいです。
[関連記事]
[悲報] Chrome R44でffmpegsumoが消えた
Dev serverによるChromium OSのアップデート
最近のChromium OS R35がVAIO Type Pで動かない件への対策
安定版ソースを使ってChromium OSをビルドする
勝手ビルド版Chromium OSとGoogleドライブの連携
Chromium OSをKVMで動かす
勝手ビルド版Chromium OSをVirtualBoxで動くようにする
Chromium OSのカーネルをVAIO Type P向けに再構築する
Chromium OSのビルド環境を作る
Hexxeh版Chromium OSをVAIO Type Pにインストールしようとして挫折した話
VAIO Type PでChromium OSをUSBメモリからブートするときのメモ
今回追加するのはgnu binutilsとp7zipです。
binutilsに含まれているarコマンドとp7zipに含まれる7zコマンドがChromium OSに入っているとUbuntuなどのDebian系で使われているパッケージ形式であるdebファイルをChromium OS上で直接展開できるようになります。
これができるようになると、Chromeブラウザの最新版をgoogleから直接Chromium OS上にダウンロードして、そこからFlashとPDFのプラグインを抜き出してインストールすることができるようになります。
・・・まあ、スクリプトが公開されているんでそれ使ったほうが早いですがw
Flashの話はとりあえず今回はおいておいてパッケージの追加の話だけ書きます。
組み込む方法といっても方法はいくつか考えられます。
一番手っ取り早いのは普通にソースをダウンロードしてきてconfigureしてmakeする、という方法です。
もう一つはChromium OSのSDKにパッケージを追加してSDKの流儀で組み込む方法です。
このほかにDev Serverを使う方法があります。Dev serverについてはこちらの記事でまとめています。
今回はbinutilsを最初の方法、p7zipを2番目の方法でインストールしていきます。ただ、前者の方法は軽く触れるだけにして、後者をメインに書いていきます。
なお、今回も既にChromium OSのビルド環境が手元にあることを前提にして書いていきます。ビルド環境の構築方法はこちらの記事で書いています。
また、パッケージの追加・置換は手順を間違えると最悪ビルド環境が壊れてしまうので、バックアップやVMを使っているならスナップショットの作成を行って作業前に戻せるようにしておくことをお勧めします。
Configure/makeする
実はx86アーキテクチャ用のarコマンドは
/build/x86-generic/usr/i686-pc-linux-gnu/binutils-bin/2.22/ar
においてあります。なので、別にビルドしなくてもこれをコピーすれば終わりだったりしますが、物は試しということでbinutilsのmakeをやってみます。
といっても、基本的には普通にconfigureしてmakeするだけですのであまり難しいことはありません。ただ、Chromium OS用バイナリをビルドする際の注意点はいくつかあるのでそれを書いておきます。
Chromium OSのビルド環境はUbuntu12.04 LTS 64bitですので、普通にビルドするとビルド環境であるUbuntu 64bit用のバイナリができてしまいます。このブログでターゲットにしているのはx86なのでそれだと困ります。
Chromium OS用のバイナリをビルドするにはターゲットアーキテクチャ向けにクロスコンパイルを行う必要があるので、Configureなどでビルドの設定をする際にはx86用のクロスコンパイラが使われるように指定してあげる必要があります。
そのため、普通にConfigure/makeする場合でも、やはりcros_sdkを使ってchroot環境に移行して、そのchroot環境の中で作業する必要があります。
そのうえでx86用のコンパイラである
- i686-pc-linux-gnu-gcc
- i686-pc-linux-gnu-g++
が使われるように設定します。
gnu binutilsを手動でビルドする場合は、configureを実行する際に以下のように指定します。
./configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=i686-pc-linux-gnu
p7zipのようにconfigureがないようなソフトの場合は、makefileを開いてCXXやCCなどのコンパイラ名を指定している変数を探して、該当箇所を上に書いたコンパイラ名に書き換えます。
このあと普通にmakeすれば、うまくいけばx86アーキテクチャのChromium OS用バイナリが出来上がります。
もう一点注意すべきことは、当然ですが
make installしてはいけない
ということです。特にbinutilsのようなビルド処理に直接かかわるツールをmake installすると最悪ビルド環境が壊れてしまいます。
手動でビルドした場合、バイナリはChromium OSのイメージには取り込まれませんので手動でバイナリをChromium OSがインストールされている実機にコピーする必要があります。ただし、コピー先にも注意があります。
Chromium OSではホームディレクトリに置いたバイナリは実行できないようにガードがかかっています。Chromium OSはルートパーティションがリードオンリーでマウントされているので、バイナリはSTATEパーティションにある/usr/local/binに置くのが簡単です。単に
sudo cp ~ /usr/local/bin
とすればOKです。
ここまでの内容を踏まえて、x86アーキテクチャ向けのChromium OS用binutilsのビルド手順は以下のような感じになります。
chromium@Ubuntu12:~/chromiumR35$ ./chromite/bin/cros_sdk [sudo] password for chromium: (cr) (release-R35-5712.B/(696ce08...)) chromium@Ubuntu12 ~/trunk/src/scripts $ cd .. (cr) chromium@Ubuntu12 ~/trunk/src $ mkdir mypackage (cr) chromium@Ubuntu12 ~/trunk/src $ cd mypackage (cr) chromium@Ubuntu12 ~/trunk/src/mypackage $ wget http://ftp.gnu.org/gnu/binutils/binutils-2.24.tar.gz (cr) chromium@Ubuntu12 ~/trunk/src/mypackage $ tar zxvf binutils-2.24.tar.gz (cr) chromium@Ubuntu12 ~/trunk/src/mypackage $ cd binutils-2.24 (cr) chromium@Ubuntu12 ~/trunk/src/mypackage/binutils-2.24 $ ./configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=i686-pc-linux-gnu (cr) chromium@Ubuntu12 ~/trunk/src/mypackage/binutils-2.24 $ make
あとは、Chromium OSインストールマシンからscpなどでarをコピーし、/usr/local/binにコピーすればOKです。
Chromium OSのパッケージシステム
今回の内容は本家サイト"The Chromium Project"以下の各ページを参考にしています。
Chromium OSの情報源は英語ばかりなのでまた間違って理解している可能性があります。詳しいことはこれらの本家サイトをご覧ください。
Chromium OSのパッケージシステムはGentoo Linuxというディストリビューションで使われているPortageというものです。Portageでは各ソフトのダウンロード・ビルド方法を拡張子がebuildのファイルに書いておき、これを実行することでソフトウェアのインストールを行います。debやrpmと違ってバイナリパッケージではなく、基本的にはソースアーカイブをネット経由でダウンロードしてから逐次ビルドするところに特徴があります(バイナリパッケージもあるようですが)。
Chromium OSのSDKでは、このebuildファイルが置かれている場所が大きく分けて以下の2つあります。
~/trunk/src/third_party/chromiumos_overlay
~/trunk/src/third_party/portage_stable
前者はChromium OSの中核をなすパッケージや、Chromium OSに取り込むにあたってカスタマイズが施されているようなソフトのパッケージが置かれているようです。なので、ここにパッケージがあるときは下手に置き換えないほうが得策です。
こっちにおいてあるパッケージでChromium OSに取り込まれていないものはあまり多くないと思いますが、binutilsはこちらにパッケージがあるけどデフォルトではChromium OSに取り込まれないものの1つです。
これに対して、一般に配布されているオープンソースソフトウェアをそのまま取り込むようなケースではportage_stableにあるパッケージが使われます。ここにはGentoo Linuxのパッケージツリーからそのまま持ってきただけと思われるものが多数置いてありますが、必ずしも最新のパッケージになっているというわけではありません。
また、portage_stableには、実際にはChromium OSのイメージに取り込まれないようなパッケージもいくつかおいてあったりします。今回扱うものでは、p7zipがこちらに当てはまります。
上記2つのディレクトリの下には、ソフトウェアのカテゴリを表すサブディレクトリがたくさん作られています。これらのカテゴリを表すサブディレクトリのさらに下に各ソフトウェアのディレクトリが作られ、その中にebuildファイルをはじめとするパッケージの構成ファイルが入っています。
このカテゴリとソフトウェアの対応は、Gentoo Linuxの構成がそのまま踏襲されています。
今回インストールするプログラムはgnu binuitlsとp7zipですが、"binutils ebuild"とか"p7zip ebuild"などでググればGentoo Linuxのパッケージツリーが置いてあるサイトが真っ先に引っかかるので、これらのソフトのパッケージがどこに置かれるべきかはすぐわかります。
結論から言うと、p7zipはapp-archというアーカイバ関係のカテゴリ、binutilsはsys-develという開発ツール関係のカテゴリに含まれます。
p7zipとbinutilsが現状のChromium OS SDKでどこに置かれているかを一応確認しておきます。まずportage_stable配下の現状を見るとこのようになっています。
(cr) (release-R35-5712.B/(bc67084...)) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable $ cd app-arch/ (cr) (release-R35-5712.B/(bc67084...)) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable/app-arch $ ls bzip2 cpio libarchive makeself p7zip pigz sharutils tar unzip zip cabextract gzip lzop metadata.xml pbzip2 rpm2targz snappy unrar xz-utils (cr) (release-R35-5712.B/(bc67084...)) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable/app-arch $ ls p7zip Manifest files metadata.xml p7zip-9.13.ebuild (cr) (release-R35-5712.B/(bc67084...)) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable/app-arch $ cd ../sys-devel/ (cr) (release-R35-5712.B/(bc67084...)) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable/sys-devel $ ls autoconf automake bc binutils-config crossdev flex gettext libperl m4 metadata.xml smatch autoconf-wrapper automake-wrapper bin86 bison dev86 gcc-config gnuconfig libtool make patch
p7zipのほうは既にパッケージが存在していますが、バージョンが9.13とちょっと古いようです(記事作成時点では9.20が最新)。現状Chromium OSにはp7zipは含まれていませんので使われていないにも関わらずパッケージだけは置いてあるようです。
binutilsのほうはパッケージがありません。
一方、chromiumos-overlayのほうは結論だけ書きますが、p7zipについてはp7zip自体も、その上位カテゴリのapp-archもありません。それに対してbinutilsのほうはsys-develカテゴリの中にパッケージが存在しています。
これらをふまえてパッケージの追加を行っていきます。
p7zipのChromium OSへの追加
p7zipは既にパッケージが存在していますが、バージョンが古いです。この古いバージョンでビルドを試みましたがコンパイルエラーになりました。
p7zipはchromiumos-overlaysのほうにパッケージがないので、思い切ってバージョンをあげてしまいます。
Chromium OS SDKにはパッケージの更新を行うための専用のコマンドが用意されているので、そのコマンドで更新をかけます。
一応、Chromium SDKを起動するところから手順を書いてきます。
chromium@Ubuntu12:~$ cd ~/chromiumR35 chromium@Ubuntu12:~/chromiumR35$ ./chromite/bin/cros_sdk [sudo] password for chromium: (cr) (release-R35-5712.B/(696ce08...)) chromium@Ubuntu12 ~/trunk/src/scripts $ export BOARD=x86-generic
今回は~/trank/src/third_party/portage_stableで作業をするので、ここにブランチを作ります。
(cr) (release-R35-5712.B/(696ce08...)) chromium@Ubuntu12 ~/trunk/src/scripts $ cd ~/trunk/src/third_party/portage-stable/ (cr) (release-R35-5712.B/(bc67084...)) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable $ repo start my-portage . (cr) (release-R35-5712.B/my-portage) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable $
続けてcros_portage_upgradeというコマンドを実行します。これが上流サイトから最新のパッケージをダウンロードして置き換えるためのコマンドです。
(cr) (release-R35-5712.B/my-portage) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable $ cros_portage_upgrade --board=${BOARD} --upgrade p7zip You have selected boards for archs ['x86'], which does not cover all standard archs ['amd64', 'arm', 'x86'] If you continue with this upgrade you may break builds for architectures not covered by your boards. Continue only if you have a reason to limit this upgrade to these specific architectures. Do you want to continue anyway? (yes/No)? yes
黄色い文字で警告が表示されます。これは、--boardオプションでx86-genericだけを指定したためです。--boardオプションは:で区切って複数のアーキテクチャを指定できますが、私が使っている環境がx86しかセットアップしていないので1つだけ指定しています。 この警告ではパッケージの置換は他のアーキテクチャにも影響を与えるため、1つだけ指定すると他のアーキテクチャでビルドできなくなるかもしれないよ、というようなことを言っているようです。ここはとりあえずyesを入力して先に進みます。
Cloning origin/gentoo at /tmp/portage as upstream reference. Cloning into 'portage'... remote: Sending approximately 1.04 GiB ... (略) Running with board x86-generic. Resolved "p7zip" to "app-arch/p7zip-9.13" (local) and "app-arch/p7zip-9.20.1-r4" (upstream). Copying app-arch/p7zip-9.20.1-r4 from upstream. Editing u'/mnt/host/source/src/third_party/portage-stable/app-arch/p7zip/p7zip-9.20.1-r4.ebuild' to mark it stable for everyone Confirmed that all upgraded packages can be emerged on x86-generic after upgrade. Keeping upstream cache at /tmp/portage. [my-portage fbe5285] p7zip: upgraded package to upstream 9 files changed, 119 insertions(+), 150 deletions(-) delete mode 100644 app-arch/p7zip/files/9.04-kde4.patch rename app-arch/p7zip/files/{p7zip-9.13-QA.patch => p7zip-9.20.1-QA.patch} (91%) create mode 100644 app-arch/p7zip/files/p7zip-9.20.1-execstack.patch create mode 100644 app-arch/p7zip/files/p7zip-9.20.1-long_rar_pwd.patch rename app-arch/p7zip/{p7zip-9.13.ebuild => p7zip-9.20.1-r4.ebuild} (56%) delete mode 100644 metadata/md5-cache/app-arch/p7zip-9.13 create mode 100644 metadata/md5-cache/app-arch/p7zip-9.20.1-r4 Upgrade changes committed (see above), but message needs edit BY YOU: cd /mnt/host/source/src/third_party/portage-stable; git commit --amend; cd - To remove any individual file above from commit do: cd /mnt/host/source/src/third_party/portage-stable; git reset HEAD~ <filepath>; rm <filepath>; git commit --amend -C HEAD; cd - If you wish to undo all the changes to portage-stable: cd /mnt/host/source/src/third_party/portage-stable; git reset --hard HEAD~; cd -
冒頭に
Cloning origin/gentoo at /tmp/portage as upstream reference.
と表示されていますが、要するにリモートのパッケージツリーからパッケージをダウンロードしてきて/tmp/potargeに一旦置いた後に、依存関係などをチェックしながら最終的に~/trunk/src/third_party/portage_stableの下のパッケージを置き換えています。
出力内容からp7zipが9.13から9.20.1-r4に置き換わったことが分かります。
ちなみにChromium OS SDKでは上流のパッケージサイトのURLは
https://chromium.googlesource.com/chromiumos/overlays/portage
になります。
このcros_portage_upgradeコマンドは、コマンド名こそupgradeですが、portage_stableにないパッケージでも上流サイトにあれば持ってくることができます。
一度実行すると/tmp/portageに上流サイトのパッケージツリーのクローンができるので、ここにできるパッケージはとりあえず持ってきてビルドにチャレンジすることはできると思います。うまくいくかどうかはやってみないとわかりませんが。
コンパイルできるかチェックする
持ってきたパッケージがそのままコンパイルできるとは限りません。とくにGUI系のツールは多分無理だと思います。今回はコマンドラインツールなので十分期待できます。
コンパイルだけを実行する場合はebuild-${BOARD}というコマンドに引数としてebuildファイル名とオプション"compile"を指定して実行します。
${BOARD}はターゲットアーキテクチャを表す文字列です。今回の場合はx86-genericなのでコマンドはebuild-x86-genericです。GentooLinuxで使われているのebuildコマンドを直接使うことは基本的にはありません。
(cr) (release-R35-5712.B/my-portage) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable/app-arch/p7zip $ ebuild-x86-generic p7zip-9.20.1-r4.ebuild compile >>> Downloading 'https://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/p7zip_9.20.1_src_all.tar.bz2' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 curl: (22) The requested URL returned error: 404 Not Found >>> Downloading 'https://commondatastorage.googleapis.com/chromeos-mirror/gentoo/distfiles/p7zip_9.20.1_src_all.tar.bz2' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 3745k 100 3745k 0 0 2190k 0 0:00:01 0:00:01 --:--:-- 2195k * p7zip_9.20.1_src_all.tar.bz2 SHA256 SHA512 WHIRLPOOL size ;-) ... [ ok ] * Running stacked hooks for pre_pkg_setup * sysroot_build_bin_dir ... [ ok ] * Running stacked hooks for pre_src_unpack * python_multilib_setup ... [ ok ] >>> Unpacking source... >>> Unpacking p7zip_9.20.1_src_all.tar.bz2 to /build/x86-generic/tmp/portage/app-arch/p7zip-9.20.1-r4/work >>> Source unpacked in /build/x86-generic/tmp/portage/app-arch/p7zip-9.20.1-r4/work >>> Preparing source in /build/x86-generic/tmp/portage/app-arch/p7zip-9.20.1-r4/work/p7zip_9.20.1 ... * Applying p7zip-9.20.1-execstack.patch ... [ ok ] * Applying p7zip-9.20.1-QA.patch ... [ ok ] * Applying 9.04-makefile.patch ... [ ok ] >>> Source prepared. >>> Configuring source in /build/x86-generic/tmp/portage/app-arch/p7zip-9.20.1-r4/work/p7zip_9.20.1 ... >>> Source configured. >>> Compiling source in /build/x86-generic/tmp/portage/app-arch/p7zip-9.20.1-r4/work/p7zip_9.20.1 ... (略) make[1]: Leaving directory `/build/x86-generic/tmp/portage/app-arch/p7zip-9.20.1-r4/work/p7zip_9.20.1/CPP/7zip/UI/Console' >>> Source compiled. (cr) (release-R35-5712.B/my-portage) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable/app-arch/p7zip $
うまくコンパイルできたようです。
ちなみにパッケージそのものにはソースコードは含まれておらず、ビルド時にリモートからダウンロードするようになっています。ダウンロードしたソースコードは
/build/${BOARD}/tmp/portage/の下に置かれます。
ビルドしたp7zipをChromium OSに組み込む
ここまででp7zipのパッケージをコンパイルしましたが、これだけではChromium OSにビルド結果が取り込まれません。取り込まれるようにするためには、~/trunk/src/third_party/chromiumos_overlay/chromeos-baseの下にある以下のいずれかのパッケージのebuildファイルを編集して、追加するパッケージ名を依存関係の一覧に追記する必要があります。
- chromeos
- chromeos-dev
前者に追加した場合、バイナリはChromium OSの/usr/binや/usr/libにインストールされます。後者に追加した場合は/usr/local配下にバイナリが置かれます。
特段の必要がなければ基本的にはchromeos-devのほうにパッケージを追加したほうが簡単です。
chromeosのほうに追加する場合は、以下の2点に気を使う必要があります。
a. ルートパーティションの容量
b. シェアードライブラリの依存関係
まずパーティションの容量ですが、/usr/binはルートパーティションに置かれます。Chromium OSのルートパーティションはデフォルトで1.2GB程度しか確保されていません。そのためあまりこちらにものを入れすぎるとルートパーティションが足りなくなる可能性があります。/usr/localが置かれるSTATEパーティションは他のパーティションを確保した後の残容量全部が割り当てられるため、あまり容量の心配をする必要はありません。
次のシェアードライブラリの依存関係ですが、ルートパーティションにインストールするパッケージは、build_imageでディスクイメージを作成する時にシェアードライブラリの依存関係がチェックされます。このチェックで依存する.soファイルが見つからないとエラーでイメージ作成が失敗してしまいます。
で、このチェックには厄介な問題があります。
シェアードライブラリはプログラムローダーが認識できるようにld.so.confに書かれているパスのいずれかに配置されるのが普通ですが、一部のプログラムではそこにはシンボリックリンクを置いておき、実体をほかの場所に置くことがあります。このシンボリックリンクのリンク先が絶対パス表記になっているとこの依存関係チェックがうまくできずにエラーになってしまうのです。
実はbinutilsのパッケージを/usr/binにインストールしようとするとこの条件に引っかかってエラーになってしまうという問題があります。chromeos-devに依存関係を足して/usr/localにインストールすることは可能ですが、binutilsのパッケージはシンボリックリンクを絶対パスで/usr/binや/usr/libに作るためリンク切れが起きてしまいます。
今回パッケージでインストールするp7zipの場合はどちらでもいいですが、今回はchromeos-devの方に追加してみます。
chromiumos_overlayの方も編集に先立ってrepo startでブランチを作っておく必要があります。
それからchromiumos_overlay/chromeos-base/chromeos-devに移動して、そこにある ebuildファイルに依存関係を追加します。追加するのはRDEPENDという変数です。
(cr) (release-R35-5712.B/my-portage) chromium@Ubuntu12 ~/trunk/src/third_party/portage-stable/app-arch/p7zip $ cd ../../../chromiumos-overlay (cr) (release-R35-5712.B/(49baa0f...)) chromium@Ubuntu12 ~/trunk/src/third_party/chromiumos-overlay $ repo start my-overlay . (cr) (release-R35-5712.B/my-overlay) chromium@Ubuntu12 ~/trunk/src/third_party/chromiumos-overlay $ cd chromeos-base/chromeos-dev (cr) (release-R35-5712.B/my-overlay) chromium@Ubuntu12 ~/trunk/src/third_party/chromiumos-overlay/chromeos-base/chromeos-dev $ ls chromeos-dev-0.1.0-r94.ebuild chromeos-dev-0.1.0.ebuild (cr) (release-R35-5712.B/my-overlay) chromium@Ubuntu12 ~/trunk/src/third_party/chromiumos-overlay/chromeos-base/chromeos-dev $ vi chromeos-dev-0.1.0-r94.ebuild (略) RDEPEND="${RDEPEND} pam? ( app-admin/sudo ) app-admin/sysstat app-arch/gzip app-arch/tar app-arch/p7zip ←追加 profile? ( (略)
ここで、chromeosの下には
chromeos-0.1.0-r94.ebuild
chromeos-0.1.0.ebuild
の2つのファイルがあり、前者は後者へのシンボリックリンクになっています。
編集を加えた後は、ビルドシステムが変更を認識できるようにシンボリックのリビジョン番号をカウントアップします。
(cr) (release-R35-5712.B/my-overlay) chromium@Ubuntu12 ~/trunk/src/third_party/chromiumos-overlay/chromeos-base/chromeos-dev $ mv chromeos-dev-0.1.0-r94.ebuild chromeos-dev-0.1.0-r95.ebuildこれでChromium OSに取り込まれるはずなので、build_packagesします。
(cr) (release-R35-5712.B/my-overlay) chromium@Ubuntu12 ~/trunk/src/third_party/chromiumos-overlay/chromeos-base/chromeos-dev $ cd ../../../../scripts/ (cr) (release-R35-5712.B/(696ce08...)) chromium@Ubuntu12 ~/trunk/src/scripts $ ./build_packages --board=${BOARD} ChromeOS version information: CHROME_BRANCH=35 CHROME_VERSION= CHROMEOS_VERSION_STRING=5712.32.2014_04_28_2221 CHROME_BASE= INFO : Elapsed time (run_chroot_version_hooks): 0m0s (略) Calculating deps... Deps calculated in 0m18.5s [ebuild N ] app-arch/p7zip-9.20.1-r4 to /build/x86-generic/ USE="pch -doc -kde -rar -static -wxwidgets" 0 kB [ebuild U ] chromeos-base/chromeos-dev-0.1.0-r95::chromiumos [0.1.0-r94::chromiumos] to /build/x86-generic/ USE="X opengl pam profile usb -cras -tpm" 0 kB Total: 2 packages (1 upgrade, 1 new), Size of downloads: 0 kB (略) Merge complete Done Builds complete INFO : Elapsed time (build_packages): 1m27s Done
ビルドがうまくいったようなので、続けてbuild_imageします。
(cr) (release-R35-5712.B/(696ce08...)) chromium@Ubuntu12 ~/trunk/src/scripts $ ./build_image --board=${BOARD} --noenable_rootfs_verification dev ChromeOS version information: CHROME_BRANCH=35 CHROME_VERSION= CHROMEOS_VERSION_STRING=5712.32.2014_04_28_2223 CHROME_BASE= (略) INFO : Elapsed time (build_image): 8m21s To copy the image to a USB key, use: ./image_to_usb.sh --from=../build/images/x86-generic/R35-5712.32.2014_04_27_2201-a1 To convert it to a VMWare image, use: ./image_to_vm.sh --from=../build/images/x86-generic/R35-5712.32.2014_04_27_2201-a1 --board=x86-generic
build_packagesでビルドを行うと、各パッケージのバイナリは
/build/${BOARD}/package/パッケージカテゴリ名
の下にtbz2形式で圧縮されて格納されます。この中から必要なものがbuild_imageの実行時に展開されてディスクイメージの中にコピーされるようになっています。
終わったらイメージをマウントして中を確認し、追加したコマンドが含まれているか確認します。作成したビルドイメージのルートパーティションは/tmp/mにマウントされるので、確認する場所は/tmp/m/usr/local/binになります。ここに7*で始まるファイルがあるかチェックします。
(cr) (release-R35-5712.B/(696ce08...)) chromium@Ubuntu12 ~/trunk/src/scripts $ ./mount_gpt_image.sh --board=${BOARD} -f $(./get_latest_image.sh --board=${BOARD}) 1+0 レコード入力 1+0 レコード出力 1 バイト (1 B) コピーされました、 0.000261486 秒、 3.8 kB/秒 Setting up symlinks for /usr/local for /tmp/s/dev_image INFO : Image specified by /mnt/host/source/src/build/images/x86-generic/R35-5712.32.2014_04_28_2223-a1 mounted at /tmp/m successfully. (cr) (release-R35-5712.B/(696ce08...)) chromium@Ubuntu12 ~/trunk/src/scripts $ ls /tmp/m/usr/local/bin/7* /tmp/m/usr/local/bin/7z /tmp/m/usr/local/bin/7za /tmp/m/usr/local/bin/7zr
うまくできていたようです。確認が終わったらイメージはアンマウントします。
(cr) (release-R35-5712.B/(696ce08...)) chromium@Ubuntu12 ~/trunk/src/scripts $ ./mount_gpt_image.sh --board=${BOARD} -u INFO : Unmounting image from /tmp/s and /tmp/m Cleaning up /usr/local symlinks for /tmp/s/dev_imageもしうまく取り込まれないようであれば、/build/${BOARD}/package/Packageファイルを開いて、
CPV: chromeos-base/chromeos-dev-0.1.0-rXX
という文字列を検索します。XXはebuildファイルをリネームしたときに指定したリビジョン番号です。すると以下のような内容が見つかるはずです。
CPV: chromeos-base/chromeos-dev-0.1.0-r95 DEFINED_PHASES: - DEPEND: app-benchmarks/i7z dev-util/turbostat sys-apps/dmidecode sys-apps/pciutils (略)
このDEPEND:の後に取り込まれるパッケージがずらずら書いてありますので、この中に自分が追加したパッケージが確かに含まれていることを確認します。含まれていない場合はどこかにミスがあります。
うまくいかないケースではリビジョンをあげ忘れて前のリビジョンしかヒットしない場合が多いのではないかと思います。
binutilsはパッケージを使ったインストールを避けたほうが良い
binutilsはp7zipと違って~/trunk/src/third_party/portage_stableの下にパッケージが置かれていませんが、chromiumos_overlaysの中にはパッケージが存在しています。
このbinutilsパッケージはChromium OSにインストールするためにあるものではなく、SDKのビルド環境を作成するために存在しています。なので、このbinutilsパッケージに対して細工を加えると正しくChromium OSがビルドできなくなります。
emerge-x86-generic binutils --unmerge
などとしてパッケージを削除してしまうと、ビルドに使うldコマンドが消えてしまってバイナリが作れなくなります。上で書いたcros_portage_upgradeコマンドを実行して更新をかけるのも避けるべきです。
どうしてもbinutilsパッケージをChromium OSのイメージに取り込みたいときは、以下のようにbuiild_imageコマンドで引数にdevではなくtestを指定するするのが簡単です。
./build_image --board=${BOARD} --noenable_rootfs_verification test
こうするとビルド環境で使われているbinutilsパッケージがChromium OSに取り込まれます。ただ、この方法ではchromiumos-overlay/chromeos-base/chromeos-testというパッケージに書かれているすべてのパッケージがChromium OSに取り込まれます。いろいろ有益なツールもあるのでこれでもいいかと思います。
この方法で追加されるパッケージはchromeos-devに依存関係を追記したときと同じで/usr/local配下にインストールされます。上でも書いたように/usr/local配下にbinutilsをインストールするとシンボリックリンクが壊れるので後で手作業で直さないといけません。 ということで、binutilsについては今のところスマートにインストールする方法はないみたいです。
[関連記事]
[悲報] Chrome R44でffmpegsumoが消えた
Dev serverによるChromium OSのアップデート
最近のChromium OS R35がVAIO Type Pで動かない件への対策
安定版ソースを使ってChromium OSをビルドする
勝手ビルド版Chromium OSとGoogleドライブの連携
Chromium OSをKVMで動かす
勝手ビルド版Chromium OSをVirtualBoxで動くようにする
Chromium OSのカーネルをVAIO Type P向けに再構築する
Chromium OSのビルド環境を作る
Hexxeh版Chromium OSをVAIO Type Pにインストールしようとして挫折した話
VAIO Type PでChromium OSをUSBメモリからブートするときのメモ
ランキングに参加してみました。クリックしていただければ嬉しいです。
にほんブログ村 |
パソコン ブログランキングへ |
PR
Comment
プロフィール
HN:
zui
性別:
非公開
カテゴリー
最新記事
(09/28)
(09/03)
(08/26)
(07/23)
(05/24)
PR
忍者カウンター