調べてもなかなか情報が出てこず、使うまでにとても苦労したので、後に続く者が苦労しないよう、備忘録を残す。
環境
OSは「Ubuntu 20.04」。現時点では「runs-on: ubuntu-latest
」または「runs-on: ubuntu-20.04
」と指定することで選択される。GitHub Actionsでは他のOSを指定することもできるが、試したのはUbuntu 20.04だけ。
以下の内容は、Ubuntu 20.04以外のOSでは動作しないかもしれない。おそらく、WindowsやmacOSでは絶対に使えないだろう。
方法その1:apt-get
でインストール
調べて一番最初に出てきた方法。
jobs:
<job_id>:
runs-on: ubuntu-latest
steps:
- name: Install flatbuffers
run: sudo apt-get install -y flatbuffers-compiler
apt
コマンドでもインストールできるが、「WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
」という警告文が出る。どうやら、自動化スクリプトなどではapt-get
の使用が推奨されているらしい。
この方法では、バージョン1.11.0のflatc
コマンドがインストールされる(2021年4月15日現在)。最新版は1.12.0だから、少し古い。このせいで、例えば「開発機のMacにHomebrewでFlatBuffersをインストールしたら、バージョンが合わなくてコンパイル結果が違う」なんてことが起こる。実際起きた。おかげで散々苦労させられた。
インストールされるバージョンが古いので、おすすめしない👎。
方法その2:snap
でインストール
「flatbuffers install latest ubuntu」でググっていたら、検索結果の4番目くらいで見つけた。一番オススメ。
jobs:
<job_id>:
runs-on: ubuntu-latest
steps:
- name: Install flatbuffers
run: sudo snap install flatbuffers
この方法では、バージョン1.12.0のflatc
コマンドがインストールされる(2021年4月15日現在)。まごうことなき最新版。Snapcraftでのリリースはapt
よりも簡単らしいので、今後も最新版がリリースされ続けると期待できる。
ちなみに、snap
コマンドは最初からUbuntuに入っているらしい。実際、他に何のセットアップもせず当たり前のように使えた。神かよ。筆者はこれを見つけるまでSnapcraftの存在を知らなかったが、これからは存分に使っていきたい。
方法その3:ソースからビルドする
上述したように、最新版のflatc
コマンドはsnap
コマンドでインストールできるものの、最新版以外はインストールできない。特定のバージョンを指定したい場合は、ソースからビルドする方法が確実。ただし遅い。
jobs:
<job_id>:
runs-on: ubuntu-latest
steps:
- name: Build flatbuffers
shell: bash
run: |
readonly FLATBUFFERS_BUILD_PATH='./.flatbuffers'
git clone --depth 1 https://github.com/google/flatbuffers.git -b v1.12.0 "${FLATBUFFERS_BUILD_PATH}"
cmake -S "${FLATBUFFERS_BUILD_PATH}" -B "${FLATBUFFERS_BUILD_PATH}" -G 'Unix Makefiles' -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF
sudo make install -C "${FLATBUFFERS_BUILD_PATH}"
この例では、およそ1分でバージョン1.12.0のflatc
コマンドがビルドされる。他のバージョンが必要な場合は、GitHub上にあるタグの中から好きなものを指定すればいける思われる(未検証)。
なお、ビルドのログは長いので、ワークフローコマンドの「::group::
」と「::endgroup::
」でグループ化したほうがいい。
jobs:
<job_id>:
runs-on: ubuntu-latest
steps:
- name: Build flatbuffers
shell: bash
run: |
readonly FLATBUFFERS_BUILD_PATH='./.flatbuffers'
echo '::group::$' git clone --depth 1 https://github.com/google/flatbuffers.git -b v1.12.0 "${FLATBUFFERS_BUILD_PATH}"
git clone --depth 1 https://github.com/google/flatbuffers.git -b v1.12.0 "${FLATBUFFERS_BUILD_PATH}"
echo '::endgroup::'
echo '::group::$' cmake -S "${FLATBUFFERS_BUILD_PATH}" -B "${FLATBUFFERS_BUILD_PATH}" -G '"Unix Makefiles"' -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF
cmake -S "${FLATBUFFERS_BUILD_PATH}" -B "${FLATBUFFERS_BUILD_PATH}" -G 'Unix Makefiles' -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF
echo '::endgroup::'
echo '::group::$' sudo make install -C "${FLATBUFFERS_BUILD_PATH}"
sudo make install -C "${FLATBUFFERS_BUILD_PATH}"
echo '::endgroup::'
いろいろな試行をしたので、ざっと箇条書きすると:
-
FlatBuffersのソースは
.flatbuffers
ディレクトリ内にダウンロードし、ビルドする。ディレクトリのパスは読み取り専用のFLATBUFFERS_BUILD_PATH
変数を定義して参照する。本来は、リポジトリ内ではなく、テンポラリディレクトリなどに展開するほうがいい。今回はリポジトリ内に.flatbuffers
ディレクトリが存在せず、上書きの心配が無かったため使った、 -
git clone
コマンドの--depth 1
オプションは、commitを1つだけダウンロードするための指定。デフォルトでは全てのcommitをダウンロードしようとするため遅くなる。ただビルドするだけなので、commitは1つで十分。 -
git clone
コマンドの-b
オプションで、ダウンロード対象のタグ、ブランチ、commit hashを選択できる。実は好きなバージョン以外に、好きなcommitも選べてしまう。詳しくはググれ。 -
cmake
コマンドでは、-S
オプションでソース・ディレクトリを、-B
オプションでビルド結果のディレクトリを指定する。こうすることでcd
コマンドを使う必要が無くなり、また、cmake
コマンドが実行時に以下の警告文を表示しなくなる。CMake Warning: No source or binary directory provided. Both will be assumed to be the same as the current working directory, but note that this warning will become a fatal error in future CMake releases.
ソース・ディレクトリとビルド結果のディレクトリは分けたほうが良いらしいが、今回は
flatc
コマンドを使うためだけにビルドするので、同じディレクトリでも支障はない。 -
cmake
コマンドに指定している-DFLATBUFFERS_ホニャララ=OFF
オプションは、CMakeLists.txt
ファイル内で定義されているオプションのうち、不要なのにデフォルト値がON
になっているものを無効化している。書式は-D{オプション名}={値}
。以下のオプションはおそらく必要:-
FLATBUFFERS_INSTALL
- 無効化すると、ビルドしたコマンドが/usr/local/bin
にインストールされない。つまりflatc
コマンドが使えない。自力で環境変数PATH
にflatc
ファイルのパスを追加すれば使えそうだが、わざわざやるメリットはない。 -
FLATBUFFERS_BUILD_FLATC
- 無効化は試していないが、CMakeLists.txt
の内容を見るに、これがflatc
コマンドをビルドするためのフラグ。たぶん、無効化したらflatc
コマンドのバイナリファイルそのものが作成されない。 -
FLATBUFFERS_LIBCXX_WITH_CLANG
- 「Force libc++ when using Clang」と書かれている。たぶん、いじらないほうがいいやつ。
これ以外は全て要らないので、全部無効化で良い気がする。この工夫をしないと、ビルドに3分はかかる。
-
-
cmake
コマンドの後に、ビルド用のmake install
コマンドを実行している。実はcmake
がやっているのは、make
コマンドのためのMakefile
ファイルの作成で、ちゃんとビルドするためにはcmake
のあとにmake
を実行しなければならない。これを知らなかったせいで、ずいぶん苦労した。 -
make
コマンドのinstall
キーワードは必須。横着して試しに取ったところ、ビルドは成功したがflatc
コマンドが使えなかった。自力で環境変数PATH
にflatc
ファイルのパスを追加すれば使えそうだが、せっかくやってくれるのだから大人しくinstall
キーワードを指定しよう。 -
cmake --install
コマンドはmake install
コマンド相当のことをやってくれるらしいが、試したところエラーが発生したので止めた。大人しくmake install
コマンドを使おう。