Edited at

どうしてもaptで入るROSパッケージに一時パッチを当てたい時

More than 1 year has passed since last update.


注意

あまり詳しくない人はやらないほうがいいと思います.


まえがき

ROSのパッケージを使うとapt-getで必要なパッケージ・機能がビルド済みの状態でインストールすることができる反面,新しい機能やバグフィクスなどを利用したいときは次のリリースを待つか,最新のソースを自分でビルドする必要があります.

自分でビルドするためにはワークスペースをオーバーレイする必要があり,この作業自体は簡単にできますが,roslaunchrosrunに相当する作業をupstartやsystemdに登録してコンピュータの起動時にROSのノードを起動するときなどに変更しなければならないファイルが増えてしまい,複数人で共有するコンピュータ(ロボット実機含む)の場合面倒になってしまいます.

そこで一時的にオレオレバージョンを作ってローカルにインストールすることで次のリリースまで凌ぐことを目的にします.


debパッケージを作るインストーラを作る



  • まず必要なパッケージをインストールします.

    sudo apt install python-bloom fakeroot dpkg-dev debhelper
    



  • 一時的にパッチを当てたいパッケージに移動

    roscd awesome_pkg
    


  • ソースを変更する(パッチを当てる)



  • debパッケージを作るためのインストーラを作成

    bloom-generate rosdebian --os-name ubuntu --os-version xenial --ros-distro kinetic
    

    xenialkineticなどのdistroは各自の環境によって変更してください

    コマンド実行後にdebianというフォルダができます.

    $ ls debian
    
    changelog compat control rules source



  • バージョンをオレオレ仕様に変更

    このままだと普通にaptで入るバージョンと競合するので,changelogファイルを編集してオレオレバージョンに変更します.

    ここで,コツとして,現在のリリースバージョンより大きく,次にリリースされる予定のバージョンより小さいバージョンにしておくと,次にリリースされたタイミングでapt-get upgradeをしたときに,このパッチから自動でアップグレードされるようにすることができます.

    (もちろん次のリリースではこのパッチが不要になっているはずという前提)

    $ diff debian/changelog
    
    # 最初の行
    - ros-kinetic-awesome-pkg (2.2.26-0xenial) xenial; urgency=high
    + ros-kinetic-awesome-pkg (2.2.99-0xenial) xenial; urgency=high

    ここでは次のリリースで2.3以降がリリースされることとします.




  • debファイルの作成

    debファイルをビルドします.

    $ fakeroot debian/rules binary
    
    # <中略>
    dpkg-deb: building package 'ros-kinetic-awesome-pkg' in '../ros-kinetic-awesome-pkg_2.2.99-0xenial_amd64.deb'.

    現在のディレクトリから1つ上のディレクトリにdebファイルができているはずです.

    あとはこれをパッチを当てたい環境に持って行き,dpkg -iでインストールすれば終わりです.