2022-11-17

  • armhf 向けの ROS 2 リソースの検討
  • ex_doc クローン続き

ros_cross_compilearmhf 指定で実行するとコケることが分かっているし、arm32v7/ros は docker hub にない(ROS 2 は 32bit 対応を切っている)ので別の方法が必要。

armhf のマシンでソースビルドができることは確認されているので、それを Docker 上でできるか試す。

2 つハマりポイントがあったがそれぞれ解決して、無事コンパイルできるようになった。
これ何気にいい仕事なのでは ? (この Docker Image は需要がありそう)

ex_doc クローンの続きは plus, minux ボタンでの tree menu の開閉アクションをつけた。 liquid(compiletime) と alpine(runtime) が同じファイルに載るのでちょっと複雑になる。

Dockerfile 作成

ハマりポイント 1

vcs importrosdep init

root@8bf88c4a5cfe:~/ros2_foxy# vcs import --input https://raw.githubusercontent.com/ros2/ros2/${ROS_DISTRO}/ros2.repos src
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)>

でコケる。 ca-certificatescertifi も最新なのになぜ ? だが、 certifi の更新は必要なく、update-ca-certificates を実行してやる必要があった。

おそらく、 dependencies の一環で ca-certificates がインストールされるのだが、その後 /etc/ssl/certs 配下の symlink update-ca-certificates で更新してやる必要があるのだと思う。

update-ca-certificates --fresh

requests は上記をしなくても問題なく動作するのが、 urllib は動作しなかった(テストスクリプトを書いて確認した)。

refs. https://stackoverflow.com/questions/35569042/ssl-certificate-verify-failed-with-python3

ハマりポイント 2

colcon build を走らせると以下が起きる。

#0 16.80 --- stderr: cyclonedds
#0 16.80 CMake Error at /usr/share/cmake-3.16/Modules/CMakeCompilerIdDetection.cmake:26 (list):
#0 16.80   list sub-command REMOVE_ITEM requires two or more arguments.
#0 16.80 Call Stack (most recent call first):
#0 16.80   /usr/share/cmake-3.16/Modules/CMakeDetermineCompilerId.cmake:211 (compiler_id_detection)
#0 16.80   /usr/share/cmake-3.16/Modules/CMakeDetermineCompilerId.cmake:230 (CMAKE_DETERMINE_COMPILER_ID_WRITE)
#0 16.80   /usr/share/cmake-3.16/Modules/CMakeDetermineCompilerId.cmake:32 (CMAKE_DETERMINE_COMPILER_ID_BUILD)
#0 16.80   /usr/share/cmake-3.16/Modules/CMakeDetermineCCompiler.cmake:116 (CMAKE_DETERMINE_COMPILER_ID)
#0 16.80   CMakeLists.txt:13 (project)

検索して、 https://gitlab.kitware.com/cmake/cmake/-/issues/20568 が関連してそうなのでスレッドを読むと amd64 の host で Docker を使い armhf のソースを cmake でコンパイルする場合に起きる現象のようだ。 cmake を 3.18 以上にすると解決するようなので、 latest(3.25.0) を使えるように Dockerfile を修正したらコンパイルできるようになった。(修正前の Docker で使用していた cmake は Ubuntu focal の 3.16.3 だった)