2022-11-17
- armhf 向けの ROS 2 リソースの検討
- ex_doc クローン続き
ros_cross_compile は armhf
指定で実行するとコケることが分かっているし、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 import
と rosdep 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-certificates
も certifi
も最新なのになぜ ? だが、 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 だった)