DockerによるFirefoxのビルドについて [供養]🙏
試行錯誤の末、Dockerfileはこうなった
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
ENV SHELL /bin/bash
ENV PATH="/root/.cargo/bin:${PATH}"
RUN apt-get update \
&& apt-get install -qqy --no-install-recommends \
wget \
python3-pip \
clang llvm \
python3-dev \
gcc
RUN pip3 install Mercurial
RUN wget https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py -O bootstrap.py --no-check-certificate
RUN python3 bootstrap.py --application-choice=browser --no-interactive
RUN apt-get -y clean \
&& rm -rf /var/lib/apt/lists/*
COPY ./mozconfig mozconfig
ENV MOZCONFIG /mozconfig
WORKDIR /mozilla-unified
(正確には動いたものから少し剪定しているので何か間違ったたらごめんね・・・)
bootstrap.py
実行中に依存関係の自動解決が行われ、そこでaptが使用されるためaptのリストをクリアするのはその後としている。
Dockerfileと同じディレクトリにあるmozconfigファイル(ビルドオプションを記述する)をコピーして、その場所をコンテナ内環境変数MOZCONFIG
にセットすると、ビルド時にオプションを適用することができる。必要ない場合はCOPY ./mozconfig mozconfig
を消すか、空のファイルを用意しておく。
ビルドは例えばdocker build -t ffbuildenv .
のようにする。
ビルド完了後、コンテナ内の/mozilla-unified
以下にセットアップ済みソースコードが残されている。
ここで引っ張ってきてセットアップしているソースコードはmozilla-central
と呼ばれる最新の一応は安定しているというソースコードで、ビルドは通るもののα版扱い。安定している別のソースコードを持ってくる場合は内部にマウントしていくつか手順が必要。
例えば、Dockerfileと同じディレクトリにsrc
というディレクトリを作ってその中にソースコードを配置した時
$ docker run -it -v $(PWD)/src:/src ffbuildenv
$ cd /src
$ ./mach bootstrap --application-choice=browser --no-interactive
$ ./mach build
(これは試してないので不確実だけれど)ビルド前に./mach bootstrap
を行わないとダメらしい、String.h
がねーよとか言われる。ここでのbootstrapはさっきのbootstrap.pyと同じことをしているっぽい
セットアップ済ソースでビルドする場合は以下
$ docker run -it ffbuildenv
$ cd /mozilla-unified
$ ./mach build
ビルドはそこそこ時間がかかる。
ビルド成功後、成果物は/mozilla-unified/obj-x86_64-pc-linux-gnu/dist/bin
ディレクトリにある。
この/mozilla-unified/obj-x86_64-pc-linux-gnu
ディレクトリをobjdirとか呼ぶらしい。objdirは環境によって変わると思う。
出来たものを取り出し可搬にするためにtarballにまとめることができる。
ビルド完了後のコンテナ内で
$ cd /mozilla-unified/obj-x86_64-pc-linux-gnu
$ make -C browser/installer/
とすると、/mozilla-unified/obj-x86_64-pc-linux-gnu/dist
の直下にfirefox-89.0a1.en-US.linux-x86_64.tar.bz2
のようなものができる。これを持ち出して展開すると展開さきでfirefoxが使える。
ここには依存関係がほとんど含まれているようだ。
なおこの時、外と繋がってるディレクトリが無いと取り出すのが難しそう。私はVSCodeのDocker拡張を使って起動中のコンテナのファイルシステムにアクセスして取り出した・・・
もう少し自動化とかできそうだけど、用済みになってしまったのでここで終わり。