Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rosdep cannot install package if manifest.xml has <rosdep> and <depend> #301

Closed
garaemon opened this issue Mar 10, 2014 · 18 comments
Closed

Comments

@garaemon
Copy link
Member

manifest.xmlにrosdepとdependタグの両方を書くと、rosdepでパッケージがインストールされない気がします

たとえばmanifest.xmlを以下のようにすると

<package>
  <description brief="opt_camera">

     opt_camera

  </description>
  <author>Kei Okada</author>
  <license>BSD</license>
  <review status="unreviewed" notes=""/>
  <url>http://ros.org/wiki/opt_camera</url>
  <rosdep name="image_proc" />

  <depend package="sensor_msgs"/>
  <depend package="driver_base"/>
  <depend package="image_proc"/>
  <depend package="dynamic_reconfigure"/>
  <depend package="camera_calibration_parsers" />
  <depend package="compressed_image_transport"/>
  <rosdep name="image_proc" />
</package>
$ rosdep install opt_camera                                                                    
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
opt_camera: Missing resource image_proc
ROS path [0]=/opt/ros/groovy/share/ros
ROS path [1]=/opt/ros/groovy/share
ROS path [2]=/opt/ros/groovy/stacks
ROS path [3]=/home/jskuser/ros/hydro/src

いっぽうで以下のようにすると

<package>
  <description brief="opt_camera">

     opt_camera

  </description>
  <author>Kei Okada</author>
  <license>BSD</license>
  <review status="unreviewed" notes=""/>
  <url>http://ros.org/wiki/opt_camera</url>
  <rosdep name="image_proc" />

  <depend package="sensor_msgs"/>
  <depend package="driver_base"/>
  <depend package="image_proc"/>
  <depend package="dynamic_reconfigure"/>
  <depend package="camera_calibration_parsers" />
  <depend package="compressed_image_transport"/>
</package>
$ rosdep install opt_camera                                    
executing command [sudo apt-get install ros-groovy-image-proc]
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  ros-groovy-image-proc
0 upgraded, 1 newly installed, 0 to remove and 18 not upgraded.
Need to get 0 B/183 kB of archives.
After this operation, 722 kB of additional disk space will be u
Selecting previously unselected package ros-groovy-image-proc.
(Reading database ... 578511 files and directories currently in
Unpacking ros-groovy-image-proc (from .../ros-groovy-image-proc+0000_amd64.deb) ...
Setting up ros-groovy-image-proc (1.10.13-0precise-20140208-064
@garaemon
Copy link
Member Author

If we use a script like below, it is solved however ...

#!/bin/bash

packages=`rospack depends opt_camera`
db_packages=`rosdep db`
for pkg in $packages
do
    if [ "`echo $db_packages | grep -c $pkg`" != "0" ]; then
        sudo apt-get install `rosdep db | grep $pkg | cut -d" " -f3`
    fi
done

@garaemon
Copy link
Member Author

rosdepを直すべきか

@garaemon
Copy link
Member Author

いくつかの問題がごっちゃになってますね

  1. rosdepではmanifest.xmlがpackage.xmlよりも優先される
  2. package.xmlはrosのパッケージ名とaptのパッケージ名をうまく扱える
  3. manifest.xmlはrosのパッケージ名はdepend, aptのパッケージ名にはrosdepを使うように作られてる.
    つまり、rosdepで指定されたパッケージはrosのパッケージとみなされないので、rosmakeがリンカフラグなどを取得しようとしない

@garaemon
Copy link
Member Author

とりあえずの解決案として、

  1. manifest.xmlにrosdepとdependの両方を書いて、上のようなスクリプトでその場を濁す
  2. rosdepにissueをきって解決を待つ

というのが良いのではと思いますがどうでしょうか @k-okada

@k-okada
Copy link
Member

k-okada commented Mar 10, 2014

ros-infrastructure/rospkg#55

rosdep的な解決は上の経緯でなさそうです

manifest.xmlをリネームしておいてインストールしちゃうかどうかが判断になりそうですが

リネームしないなら

  1. インストール時のrosdep install 時にはmanifest.xmlを一時的に回避してpackage.xmlを使う.
    これはjsk.rosbuildに書いておく
  2. catkin でインストールするときはmanifest.xmlをリネームしてもらう

リネームしちゃうなら

  1. jsk.rosbuildでrosbuildならrosdep後にmanifest.xmlにもどす

後者でしょうか?

@garaemon
Copy link
Member Author

こんなかんじのスクリプトで対応するのはなしでしょうか?

find . -name manifest.xml | xargs -n 1 dirname | xargs -n 1 basename | xargs -n 1 rospack rosdep | cut -f2 -d" " | xargs -n 1 rosdep resolve | sed -e "s/^#.*//g" | xargs -n 1 sudo apt-get install

@garaemon
Copy link
Member Author

jsk.rosbuildだけではなくて、.travis.ymlの話もありますね。

jsk.rosbuildではリネーム作戦ありだとおもいます。
travisでもそうすればいいんでしょうかね。

ですがそのいっぽうで、何も考えずにcatkinとしてコンパイルしたい人もいるかもですが...

結局manifest.xmlをディレクトリに存在させる限り、

  1. rename
  2. 不思議ワンライナー

のどちらかしかないですね

@garaemon
Copy link
Member Author

逆に、manifest.xmlをデフォルトではmanifest.xml.deprecatedとかにしておく、という作戦もありそうな気がします(まだ早いですが)

@garaemon
Copy link
Member Author

とりあえず、各レポジトリのtravis.ymlはrename作戦でいくことにします。

@k-okada
Copy link
Member

k-okada commented Mar 10, 2014

逆に、manifest.xmlをデフォルトではmanifest.xml.deprecatedとかにしておく、という作戦もありそうな気がします(まだ早いですが)

はい。僕の意見はこれです。rosmakeメインユーザからは反論があるかもしれません。

@tnaka
Copy link
Contributor

tnaka commented Mar 10, 2014

rosmakeされたときに ln -sf manifest.xml.depreciated manifest.xml するようにしておけば良いような気がしますがどうでしょうか。
rosbuild_initする前にexecute_processで上のコマンドを入れておけば間に合いそうな気がします。

二回目にrosdepしたときにのみ動かない、という奇妙なことになりますが、そこは旧バージョンを使っているので消す手間を取るか移行してくださいということでどうでしょうか。

@garaemon
Copy link
Member Author

今後、rosbuildを使っていくのはどうあっても無理なので、以下の手順で進めるのがgithub/travisに移行した利点が生かせるのではないでしょうか

  1. manifest.xmlリネーム作戦でどうにかする環境を作る (hydro/groovy catkin/rosbuildのテスト環境を作る)
  2. catkin化されてないパッケージに関してチケットを切りまくる (皆が作業したらcatkinへの苦手意識もへるはず)
  3. チケットが全部なくなったらmanifest.xml.deprecatedにrename

@garaemon
Copy link
Member Author

@tnaka rosmakeのcmakeが走る前にrospackとか走って問題にならないでしょうか?

@garaemon
Copy link
Member Author

いや、rosbuildでやるひとは一番初めに一回だけln -sf manifest.xml.deprecated manifest.xml
すればいいんですかね

@tnaka
Copy link
Contributor

tnaka commented Mar 10, 2014

なるほど、rosmakeは各ディレクトリでcmakeする前にパッケージの依存関係を調べるのでrosmake時にはmanifest.xmlは必要そうですね。
rosmakeする前にスクリプトか何かでlnするのが良さそうです。

ところで、fuerteなどで古いrosdepを使っている人はmanifest.xmlに書く方法で問題ないですよね?
表記が変わっていてだめということでないのならば、rosdepの古いバージョンを入れておけば解決することはあるでしょうか。

@garaemon
Copy link
Member Author

メモ

manifest.xmlとpackage.xmlを両方持ってるパッケージ一覧

$ find . -name package.xml -exec dirname {} \; | xargs -n 1 -i find {} -name manifest.xml -exec basename {} \;

manifest.xmlとpackage.xmlを両方持ってたらmanifest.xml.deprecatedにrename

$ find . -name package.xml -exec dirname {} \; | xargs -n 1 -i find {} -name manifest.xml | xargs -n 1 -i mv {} {}.deprecated

manifest.xml.deprecatedをmanifest.xmlにln

$ find . -name manifest.xml.deprecated | xargs -n 1 -i dirname {} | xargs -n 1 -i ln -sf `pwd`/{}/manifest.xml.deprecated `pwd`/{}/manifest.xml

@garaemon
Copy link
Member Author

ところで、fuerteなどで古いrosdepを使っている人はmanifest.xmlに書く方法で問題ないですよね?
表記が変わっていてだめということでないのならば、rosdepの古いバージョンを入れておけば解決することはあるでしょうか。

rosdepはいつのバージョンからか、 https://github.com/ros/rosdistro/ をみるようになってるので、古いバージョンにしてもそれが参照するパッケージのリストは最新のものになる気がします

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants