ROS同様、ROS 2もソースコードはパッケージの形で提供され、それら複数の相互に依存し合うパッケージ群を正しい順番でビルドしていく必要があります。 このビルド作業を便利に行うROS 2のパッケージビルドシステムをamentと呼びます。ROSのパッケージビルドシステムであったcatkinの改良版です。

本日はこのamentの記事を取り上げ、catkinとの違いを含め、日本語に要約します。

http://design.ros2.org/articles/ament.html

amentとは

amentは二つの主要な要素で構成されています。

  • 単一のパッケージの構成、ビルド、インストールを行うビルドシステム
  • 各パッケージを相互依存関係の順序に沿ってビルドするツール

依存性やビルド形式に関するメタ情報は、ROSでもおなじみのpackage.xmlで定義します。 現在はビルドシステムにCMakeとPython setuptoolsしかサポートしていませんが、autotoolsやMakefileも将来的に追加していく予定です。

ament_tools

コマンドラインツールamentを提供し、パッケージのビルド、テスト、インストール、アンインストールを行うことができます。 これはROSのcatkin_toolsに似ています。

ament_cmake

CMakeLists.txtを記述する際に、便利関数を提供するCMakeパッケージです。

ament_python

これまではPythonのみを使うパッケージでもCMakeLists.txtを書く必要がありましたが、ROS 2ではsetup.pyを書いてPython標準のsetuptoolsでビルドできるようになります。

環境変数

インストールされたパッケージは、それらが必要とするライブラリなどを見つけるために、環境変数を設定する必要があります。 例えば、環境変数は実行ファイルならPATH、PythonコードならPYTHONPATHになります。

各パッケージはビルド時に、そのパッケージが必要とする環境変数を設定するシェルスクリプトを生成します。local_setup.*という名前のファイルです。

パッケージ群のルートディレクトリに生成される同名のシェルスクリプトlocal_setup.*は、それら各パッケージをpackage.xmlの依存性に従って再帰的にディレクトリを探索し、各パッケージのlocal_setup.*を読み込んでいきます。

シンボリックリンクを使ったインストール

ソースコードの変更、ビルド、インストールの開発サイクルを最大限効率化することは大切です。 一般的にはインストール作業は最終的なインストールディレクトリ(/usr/localなど)にリソースをコピーすることを含みます。

amentは(プラットフォームがサポートすれば)コピーする代わりに、--symlink-installオプションを付けて、シンボリックリンクで代用することができます。 これにより、開発者はインストール作業を大半のケースで省略することができるようになります。

catkinとの違い

catkinはROSで最初から使われてきたrosbuildを置き換えるために、ROS Groovyから導入されました。 そのため、catkinはrosbuildと似た特徴が残っています。

catkinはrosbuildに比べて、ソースコードディレクトリ外でのビルド、CMake構成ファイルの自動生成、柔軟なインストールなど、利点がありました。 しかし、catkinの欠点も叫ばれるようになり、その欠点を補うツール(catkin_simple, catkin_tools)も開発されました。

このため、catkinを再構築し、amentと呼ぶ新しいツールを開発することにしました。

catkinは単一のモノシリックなパッケージですべての機能を提供してきましたが、mentはモジュール構造になっていて、すべての機能は別々のパッケージとして提供され、オプションとして使うことができます。

ただし、ROS 2はROSを完全に置き換えるものではないため、amentも同様にcatkinとは共存できるようにするため、違うビルドシステムとして導入されることになりました。