今更github actionsでcmake + boost unit_test_framework

今更すぎる。

自作の粗視化分子動力学エンジンのPRのチェック項目にTravisが表示されなくなっているのに気づいて、どうせならActionsでCI流すかと思って始めたのだがクッソもたついた。

何度かActionsは(C++, CMake, Boost.unit_testの組み合わせで)使ったことがあったはずなのだが、以下のようなエラーは見たことがなかった。

CMake Error at /usr/local/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
  Could NOT find Boost (missing: unit_test_framework) (found suitable version
  "1.72.0", minimum required is "1.67.0")

Ubuntu-18.04を使っているのだが、公式のドキュメントにはかなり新しいCMakeとBoostが入っていると書かれている。実際入っている。

github.com

こちらの設定もどうということはないどころか、actions/checkout@v2を使ってcheckoutしたあとmkdir build && cd build && cmake ..するだけなので、何か自分がミスったというよりは環境が思ってたのと違うというふうに思えた。find_package(Boost REQUIRED COMPONENTS unit_test_framework)はできる限りいじりたくない。travisやgitlab ciやlocalではなんの問題もなく動いているので。

1時間くらいググり倒して見つけたフラグを何も考えずに全部ぶち込んだら動いた。

リンクを貼ろうとは思ったんだけど全部閉じてしまってた上に履歴が長くなりすぎていて何が何かわからなくなっていたので諦めた。

普通にaptでboost入れた環境なら落ちないしもう別にいいでしょ、github actionsでだけ必要な修正なんてそんなもんで。どうせ向こうの構成変わったらまたググり倒す羽目になるんだし。

というわけで解決策は以下の通り。

$ cmake .. -DNANKA_HOKANO_FLAGS=ON     \
    -DBoost_USE_MULTITHREADED=ON       \
    -DBoost_ARCHITECTURE=-x64          \
    -DBoost_ADDITIONAL_VERSIONS=1.72.0 \
    -DBoost_NO_BOOST_CMAKE=ON          \
    -DBOOST_ROOT=${BOOST_ROOT_1_72_0}

何でこんなことになってるのか確信を持ててはいないけれど、掴んでるヒントは書いておこうと思う。

以下は途中で溜め込んだフラストレーションをBoostの入っているであろうディレクトリへのlsに変えてpushした結果からの抜粋。

$ ls ${BOOST_ROOT_1_72_0}/lib
...
libboost_unit_test_framework-mt-d-x64.a
libboost_unit_test_framework-mt-d-x64.so
libboost_unit_test_framework-mt-d-x64.so.1
libboost_unit_test_framework-mt-d-x64.so.1.72
libboost_unit_test_framework-mt-d-x64.so.1.72.0
libboost_unit_test_framework-mt-s-x64.a
libboost_unit_test_framework-mt-sd-x64.a
libboost_unit_test_framework-mt-x64.a
libboost_unit_test_framework-mt-x64.so
libboost_unit_test_framework-mt-x64.so.1
libboost_unit_test_framework-mt-x64.so.1.72
libboost_unit_test_framework-mt-x64.so.1.72.0
...

続いてこっちは-DBoost_DEBUG=ONにしたときのCMakeの出力のうち、unit_test_frameworkを探しているところ。

-- [ /usr/local/share/cmake-3.17/Modules/FindBoost.cmake:2024 ] Searching for UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE: boost_unit_test_framework-gcc9-mt-1_72;boost_unit_test_framework-gcc9-mt;boost_unit_test_framework-gcc9-mt;boost_unit_test_framework-mt-1_72;boost_unit_test_framework-mt;boost_unit_test_framework-mt;boost_unit_test_framework-mt;boost_unit_test_framework
-- [ /usr/local/share/cmake-3.17/Modules/FindBoost.cmake:2079 ] Searching for UNIT_TEST_FRAMEWORK_LIBRARY_DEBUG: boost_unit_test_framework-gcc9-mt-d-1_72;boost_unit_test_framework-gcc9-mt-d;boost_unit_test_framework-gcc9-mt-d;boost_unit_test_framework-mt-d-1_72;boost_unit_test_framework-mt-d;boost_unit_test_framework-mt-d;boost_unit_test_framework-mt;boost_unit_test_framework

思うに、github actionsではいろいろな環境のためのライブラリを別名で用意していて特定のVMからは対応したやつだけ見えるみたいなことになってるんじゃないだろうか。そしてしっかり環境を表す名前をつけた結果、デフォルトではCMakeが見つけられなくなってるのかな?

だから多分、上で書いたフラグのうち重要なのは-DBoost_ARCHITECTURE=-x64なんだと思う。これで探しているライブラリの名前に必要なsuffixが付け加わり、見つかるように鳴るという寸法ではないだろうか。

ちなみにフラグのうち後ろの2つは、FindBoostの仕様変更への対応策なのでこれは多分消せない。