ROS2のコピーライトのあれこれ

概要

ament_copyrightを改良することで、独自のコピーライトを作ってテストを通すことができます。
コマンドラインツールを使用して、コピーライトをあとからまとめて挿入できます。

動機

ROS2のパッケージを作るとき、コピーライトを書かなければなりませんが、いちいちコピペするのが面倒で書き忘れてエラーが出たりしてました。
また仕事でROS2のパッケージを作るときは企業独自のコピーライトを書きたいってときがあるのですが、独自のコピーライトでは、デフォルトのament_copyrightを使うとテストで引っかかってしまいます。
どうにかならないかと思い、いろいろ調べていると、ament_copyrightをを改良することで独自のコピーライトを作成できるということがわかりました。
以下のリポジトリをクローン→編集でできます。

github.com

やり方

  1. 上のリポジトリをクローン
  2. 次のファイルを書き換える。
    • mycompany_ament_copyright/template/mycompany_contributing.txt
      • コントリビューターへ伝えたいことを書く。
    • mycompany_ament_copyright/template/mycompany_header.txt
      • 各ファイルのヘッダー部分に必要なコピーライトを書く。
    • mycompany_ament_copyright/template/mycompany_license.txt
      • ライセンスファイルの記述を書く。
    • setup.py
      • 4行目と28~30行目を編集する。
    • \mycompany_ament_copyright/__init__.py
      • 18, 19行目を編集する。
    • mycompany_ament_copyright/copyright_names.py
      • 18行目を編集する。
    • mycompany_ament_copyright/licenses.py
      • 40行目を編集する。
    • test/cases/mycompany_license/case.py
  3. colcon build & source install/setup.bashを実行する。

使い方

package.xmlに以下を追加する。

<test_depend>mycompany_ament_copyright</test_depend>

C++の場合はCMakeLists.txtに以下を追加する。

find_package(mycompany_ament_copyright REQUIRED)

colcon testでテストを実行して、コピーライトが通っていることを確かめる。

コマンドラインツール

作成したmycompany_ament_copyrightはコマンドライトして使用できます。ヘルプは以下のような感じ。

$ mycompany_ament_copyright --help
usage: mycompany_ament_copyright [-h] [--exclude [filename [filename ...]]] [--add-missing COPYRIGHT_NAME LICENSE] [--add-copyright-year [ADD_COPYRIGHT_YEAR [ADD_COPYRIGHT_YEAR ...]]]
                                 [--list-copyright-names] [--list-licenses] [--verbose] [--xunit-file XUNIT_FILE]
                                 [paths [paths ...]]

Check code files for copyright and license information.

positional arguments:
  paths                 The files or directories to check. For directories files ending in '.c', '.cc', '.cpp', '.cxx', '.h', '.hh', '.hpp', '.hxx', '.cmake', '.py' will be considered
                        (except directories starting with '.' or '_' and 'setup.py' files beside 'package.xml' files). (default: ['.'])

optional arguments:
  -h, --help            show this help message and exit
  --exclude [filename [filename ...]]
                        The filenames to exclude. (default: None)
  --add-missing COPYRIGHT_NAME LICENSE
                        Add missing copyright notice and license information using the passed copyright holder and license (default: None)
  --add-copyright-year [ADD_COPYRIGHT_YEAR [ADD_COPYRIGHT_YEAR ...]]
                        Add the current year to existing copyright notices (default: None)
  --list-copyright-names
                        List names of known copyright holders (default: False)
  --list-licenses       List names of known licenses (default: False)
  --verbose             Show all files instead of only the ones with errors / modifications (default: False)
  --xunit-file XUNIT_FILE
                        Generate a xunit compliant XML file (default: None)

この中で便利なのが--add-missingオプションです。コピーライトがないすべてのファイルにコピーライトを追加してくれます。
ワークスペースで以下を実行するとワークスペース内のパッケージにヘッダーを追記します。

$ mycompany_ament_copyright --add-missing mycompany mycompany

開発中はコピーライトを書かず、リリースする際に一括でコピーライトを追記する、といったことが可能です。

ちなみにcolcon testでコピーライトのテストを回避するには、
C++の場合、CMakeLists.txtのテストの項目に以下を追記します。

set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)

pythonの場合はros2 pkg create ...で自動生成されるtestフォルダのtest_copyright.pyを削除すればいいです。