catkin_makeで特定のパッケージをコンパイルの対象から外す方法と、外したパッケージを再びコンパイル対象にする方法のメモです。
catkin_makeで特定のパッケージを除外する方法と注意点
catkin_make時に特定のパッケージを除外する方法はシンプルです。
catkin_makeのあとにキャッシュ変数”DCATKIN_BLACKLIST_PACKAGES”を宣言すればできます。
コマンドは以下の通り。
$ catkin_make -DCATKIN_BLACKLIST_PACKAGES="package_name"
“package_name”に除外したいパッケージを指定してください。
これで特定のパッケージをコンパイルから除外できますが、注意点があります。
それは、「除外設定はずっと残っている」ということです。
キャッシュ変数は、宣言と同時にキャッシュファイルに保存されます。
つまり、キャッシュファイルを消すか、値を書き換えるまでは一度設定した値が残り続けしまうのです。
従って、”package_name”を除外した場合、その後いくらcatkin_makeを実行しても、”package_name”がコンパイルされることはありません。
それで困らない状態であれば問題ないのですが、除外設定を解除したいことも当然あります。
除外設定を解除したい場合は次のコマンドです。
$ catkin_make -DCATKIN_BLACKLIST_PACKAGES=""
単に、DCATKIN_BLACKLIST_PACKAGESを空で定義すればOKということですね。
これで私のように「なんでコンパイルされてへんねん……」と1時間潰すこともないはずです。
特定のパッケージをコンパイルされないようにしたくなるとき
ありませんか?
以下は、私がなぜDCATKIN_BLACKLIST_PACKAGESを使うに至ってしまったかの話です。
ROSには様々なメッセージ型が用意されており、たいていの場合はそれを活用すれば済みます。すごくありがたい。
しかし自作デバイスをROSで使うとなった場合などには、既存のメッセージでは対応しきれなかったり、各要素にちゃんと名前を付けたくなることがあります。
そういったときには自分でメッセージファイルを作って、includeして使うということが簡単にできます。これも大変便利な仕組みです。
自作メッセージファイルを作る場合には、それを使用するパッケージとは別に、メッセージ用のパッケージを用意することが推奨されています。つまり、
- my_package
- my_package_msgs
という2つのパッケージができるわけですね。
当然、”my_package”は”my_package_msgs”に依存しています。
例えば、my_package_msgsを先に完成させてコンパイルしておけば何も問題は無いのですが、2つを同時に完成させて「さて、catkin_makeするか」となったときに、エラーとなることがあります。
依存関係をちゃんと書いている(つもり)状態でもエラーになるので困ったものです。
いや、もしかしたら私の依存関係の書き方が間違ってるだけで、ちゃんと書いたらちゃんとやってくれるのかもしれませんが()
今回はメッセージ型とそれを利用するノードを一気に作ってcatkin_makeした結果、メッセージをコンパイルする前にノードがコンパイルされてしまって、その際に「そんなメッセージ.hないんですけど?」と怒られてしまいました。
まぁ、ノード作る前にちゃんとある程度は設計して、必要なメッセージ型は先に作っておきましょう、ということですね。
コメント