はじめに
Google が開発する軽量クロスプラットフォームアプリケーションフレームワーク Cobalt は、主にスマートテレビやセットトップボックス向けに使用されています。現在は Chromium ベースへの移行が進められていますが、本記事ではその移行前に提供されていたバージョンのひとつ 25.lts.1+ に注目し、Ubuntu Linux (x86_64) と Raspberry Pi 2 (ARM) の両プラットフォームでのビルドを試みます。
目的は、Cobalt のビルド手順の検証と、ビルド後に生成されるバイナリサイズの比較です。Chromium ベースと比較して「軽量」とされる Cobalt の実態を確認します。
まとめ
ビルドして確認したファイルサイズは以下のとおりです。
x86_64 向けの cobalt
実行ファイルは、strip 後でも 64bit バイナリとして わずか 41MB に収まり、Chromium ベースと比較して非常に小さなサイズです。
一方、ARM 向けの libcobalt.so
は cobalt_roader
が追加が必要になるが、それを除いて 33MB に収まっており、ChromiumなどのWebブラウザの搭載が難しい組み込み機器向けとして十分に実用的なサイズであることがわかります。
バイナリサイズ比較
プラットフォーム | ビルド種別 | サイズ(strip 前) | サイズ(strip 後) |
---|---|---|---|
x86_64 Linux | cobalt 実行ファイル | 176MB | 41MB |
Raspberry Pi 2 (ARM) | libcobalt.so | 148MB | 33MB |
ファイル形式情報
プラットフォーム | ファイル名 |
file コマンド出力(要約) |
---|---|---|
x86_64 Linux | cobalt | ELF 64-bit LSB pie executable, x86-64, dynamically linked |
Raspberry Pi 2 (ARM) | libcobalt.so | ELF 32-bit LSB shared object, ARM, dynamically linked |
ビルド環境
本記事では以下の環境で検証を行いました:
uname -a
Linux ubuntu 6.11.0-17-generic #17~24.04.2-Ubuntu SMP PREEMPT_DYNAMIC Mon Jan 20 22:48:29 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
- OS: Ubuntu 24.04 LTS (x86_64)
- Cobalt:
25.lts.1+
- clang バージョン: version 17.0.0
- Python: 3.12
公式リファレンス
Cobalt のビルド手順については、以下の公式ガイドを参考にしています
1. ビルド準備(共通)
depot_tools の取得
まず Chromium 系のビルドツール depot_tools
を取得して PATH
に追加します。
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PWD/depot_tools:$PATH"
パッケージのインストール
sudo apt update && sudo apt install -qqy --no-install-recommends \
bison clang libasound2-dev libgles2-mesa-dev libglib2.0-dev \
libxcomposite-dev libxi-dev libxrender-dev nasm ninja-build \
python3-venv
筆者の環境で追加で必要だったパッケージ
sudo apt install python3.12-dev generate-ninja
ccache によるビルド高速化
ビルドの高速化を有効にするために ccache をインストールします。
ビルド高速化はデフォルトで有効になっており、ccache をインストールしない場合は無効にする必要があります。
sudo apt install -qqy --no-install-recommends ccache
ccache --max-size=20G
Node.js のセットアップ(nvm 使用)
export NVM_DIR=~/.nvm
export NODE_VERSION=12.17.0
curl --silent -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
. $NVM_DIR/nvm.sh \
&& nvm install --lts \
&& nvm alias default lts/* \
&& nvm use default
2. ソースコードの取得と環境構築
git clone -b 25.lts.1+ --depth 1 https://github.com/youtube/cobalt.git
cd cobalt
export COBALT_SRC=${PWD}
export PYTHONPATH=${PWD}:${PYTHONPATH}
Python 仮想環境と依存パッケージ
python3 -m venv ~/.virtualenvs/cobalt_dev
source ~/.virtualenvs/cobalt_dev/bin/activate
pip install -r requirements.txt
Git フックの初期化は cobalt の開発が chromium ベースに移ったため実行してはいけない
# 実行不要
pre-commit install -t post-checkout -t pre-commit -t pre-push --allow-missing-config
git checkout -b test2 origin/master
Clang ダウンロード
./starboard/tools/download_clang.sh
${HOME}/starboard-toolchains/x86_64-linux-gnu-clang-chromium-17-init-8029-g27f27d15-3/bin/clang
に保存される
3. x86_64 Linux 向けビルドとバイナリサイズ
ビルドコマンド
python cobalt/build/gn.py -c gold -p linux-x64x11
ninja -C out/linux-x64x11_gold cobalt
バイナリ情報の確認
ファイル概要:
$ file ./out/linux-x64x11_gold/cobalt
ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked,
interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0,
with debug_info, not stripped
バイナリサイズの確認:
$ du -h ./out/linux-x64x11_gold/cobalt
176M ./out/linux-x64x11_gold/cobalt
strip
後のバイナリサイズ:
$ strip ./out/linux-x64x11_gold/cobalt
$ du -h ./out/linux-x64x11_gold/cobalt
41M ./out/linux-x64x11_gold/cobalt
Cobaltの実行:
out/linux-x64x11_debug/cobalt
実行環境によっては X11 ディスプレイが必要です。
4. Raspberry Pi 2 向けビルドとバイナリサイズ
必要パッケージのインストール:
sudo apt install -qqy --no-install-recommends g++-multilib \
wget xz-utils libxml2 binutils-aarch64-linux-gnu \
binutils-arm-linux-gnueabi libglib2.0-dev
ツールチェインの取得:
echo $RASPI_HOME
/home/raiko/raspi_tools
mkdir -p $RASPI_HOME
curl -O https://storage.googleapis.com/cobalt-static-storage-public/cobalt_raspi_tools.tar.bz2
tar xvpf cobalt_raspi_tools.tar.bz2
ビルドコマンド
Cobaltのソースディレクトリのルートに移動する
cd <COBALT_SRC>
export COBALT_SRC=${PWD}
export PYTHONPATH=${PWD}:${PYTHONPATH}
cobalt/build/gn.py -p raspi-2 -C gold
ninja -C out/raspi-2_gold cobalt_install
バイナリ情報の確認
$ file out/raspi-2_gold/libcobalt.so
out/raspi-2_gold/libcobalt.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=d8c6ad5eb501ba10e6044103c86bc18f186cd7d1, with debug_info, not stripped
バイナリサイズ:
$ du -h out/raspi-2_gold/libcobalt.so
148M out/raspi-2_gold/libcobalt.so
strip 後のファイルサイズ:
$ arm-linux-gnueabi-strip ./out/raspi-2_gold/libcobalt.so
$ du -h out/raspi-2_gold/libcobalt.so
33M out/raspi-2_gold/libcobalt.so
蛇足
ビルドした Cobalt を Raspberry Pi 2 の仮想環境で動作させようと試みたが残念ながらGPUの問題でうまくいかなかった。