この記事はROS/ROS2アドベントカレンダー2020の18日目の記事です
こんな経験はありませんか?
ROS2のCMakeLists.txtを書いていてこんな経験はありませんか?
- package.xmlで依存関係を変えたらCMakeも書き換えないといけない...
- ROS2のコンポーネント指向,便利だけどCMake書くのが面倒...
- 毎回同じような内容を書く割には抜け漏れが起こりやすい...
その悩み,”ament_cmake_auto”が解決します!
ament_cmake_autoを使うとROS2のCMakeを簡潔に書くことが出来るようになります*1.
では,実際にどれくらい簡潔に書けるのかを見ていきます.
ament_cmake_autoを使ったCMakeLists.txt
最小限のサンプルがこちらになります.
cmake_minimum_required(VERSION 3.5) project(example) find_package(ament_cmake_auto REQUIRED) ament_auto_find_build_dependencies() ament_auto_add_library(${PROJECT_NAME} SHARED src/example.cpp include/example.hpp) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) ament_lint_auto_find_test_dependencies() endif() ament_auto_package()
あれ?依存関係は??
exportしなくていいの???
installは????
まともにROS2のCMakeを書いたことがある人なら頭の中がはてなマークでいっぱいになると思います.
でも大丈夫,"ament_cmake_auto"がぜ〜んぶやってくれます.
関数群
具体的にどのようなことをやってくれているのかを関数ごとに見ていきます.
詳しくは実装*2をご覧ください.
ament_auto_add_executable
実行ファイル生成に関して
- add_executable
- target_include_directories
- target_link_libraries
- ament_target_dependencies
をまとめてやってくれます
ament_auto_add_library
ライブラリ生成に関して
- add_library
- target_include_directories
- target_link_libraries
- ament_target_dependencies
をまとめてやってくれます
ament_auto_find_build_dependencies
package.xmlから依存を読み取ってfind_packageしてくれます.
ament_auto_generate_code
メッセージのファイルを探してヘッダーなどを自動生成してくれるようですが,未実装のようです.
今後に期待
ament_auto_package
- ament_export_include_directories
- ament_export_libraries
- install
export,install関係を全部やってくれます
最後に
ros2に標準でついてくるament_cmake_autoですが, 非常に便利なのに使っている人も文献も少ないように思えた*3ので今回記事にしてみました.
*1:ROS1でもcatkin_simpleというCMakeを簡単に書くためのパッケージがあります
*2:https://github.com/ament/ament_cmake/tree/master/ament_cmake_auto/cmake
*3:使われているのをAutowareのROS2バージョンであるAutoware.Auto以外に見たことがない...