調べてもなかなか情報が出てこず、使うまでにとても苦労したので、後に続く者が苦労しないよう、備忘録を残す。
環境
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コマンドを使おう。