Looking some more into these dramatic speed differences, I got suspicious. After all, the bulk of the electric build time is spent on building roscpp, and a make call in there should not be faster in catkin than with rosmake.
I believe this is due to a bug in rosmake:
https://code.ros.org/trac/ros/ticket/4036which cause rosmake never to run make with multiple jobs per package. If true, that would mean a lot of wasted waiting time.
I listed other possible causes for speed differences in the catkin review:
http://www.ros.org/wiki/catkin/Reviews/2012-08-01_API_Review#On_configuration_.26_build_speed
One that may also be interesting now is the lack of distinction between configure, runtime and build time dependencies.
E.g. consider the ROS package rosout, which just creates an executable. roslaunch depends on rosout at runtime, but not at build time. So rosmake could invoke make in those two in parallel, but does not because roslaunch manifest says it depends on rosout. The same goes for anything that depends on roslaunch, because roslaunch only contains python code. This chain of packages goes on.
I believe this is interesting even with catkin, as moving forward with catkin one day we might consider more isolated builds.
So what are other people's thoughts on extending the manifest to declare the lifecycle stages of dependencies?
I believe a backwards-compatible way would be like:
<depend package="roslaunch" at="runtime"/>, with default being depending in all phases.
I know n catkin's current design, that would not make a difference, so for catkin manifests that could be confusing (as an attribute without effect) but changing the catkin design one day is a distinct possibility.
cheers,
Thibault