Skip to content
stonier edited this page Mar 30, 2013 · 45 revisions

Overview

We have two wrappers around wstool and catkin_xxx to help setup builds. I did this because ros currently doesn't have anything yet to help much in three different cases:

  1. Multiple underlays (have to repeatedly source setup.bash scripts)
  2. Handling the increasing number of cmake variables (use cmake caches!)
  3. Cross compiling

Installation

> sudo pip install -U yujin_tools
> sudo apt-get install g++-arm-linux-gnueabi g++-arm-linux-gnueabihf

Using the tools is a three step process, 1) init workspace, 2) init build, 3) make

Workspace Initialisation

Regular wstool style initialisation with url's:

> yujin_init_workspace ~/ecl_lite https://raw.github.com/stonier/ecl_core/groovy-devel/ecl_lite.rosinstall

You can also set and use a rosinstall database (e.g. yujin's database. These are subdivided by track/rosdistro):

# use set instead of get to configure the following
> yujin_tools_settings --get-rosinstall-database-uri  
> yujin_tools_settings --get-default-track
> yujin_init_workspace --track=groovy --list-rosinstalls
> yujin_init_workspace ~/ecl_lite ecl_lite

Build Cases

For the following, we assume an ecl_lite workspace initialisation as above:

Single Build Folder

The default ros style for 99% of people. Key concept here is the creation of build directories - alot of customisation goes into this build directory which needs to be isolated from other builds and is constant from compile to compile, hence the separate yujin_init_build command.

> yujin_init_workspace ~/ecl_lite ecl_lite
> cd ~/ecl_lite
> yujin_init_build .
# Edit your config.cmake
> yujin_make
> yujin_make --tests
> yujin_make --run_tests  # currently broken awaiting a bugfix.
> yujin_make --install
> yujin_make --pre-clean  ```

Note that you don't have to reset the configuration when pre-cleaning. It reuses the `cache in config.cmake`.

### Parallel Build Folder

yujin_init_workspace ~/ecl_lite ecl_lite cd ~/ecl_lite yujin_init_build native cd native; yujin_make


### Cross Compiling

Toolchains and platform flags are selectable from a list (stored in the python module) or directories in `~/.yujin_tools/toolchains`, `~/.yujin_tools/platforms`. 

yujin_init_workspace ~/ecl_lite ecl_lite cd ~/ecl_lite yujin_init_build native cd native; yujin_make yujin_init_build --list-toolchains yujin_init_build --list-platforms cd ~/ecl_lite yujin_init_build --toolchain=ubuntu/arm-linux-gnueabihf --platform=arm/arm1176jzf-s arm cd arm; yujin_make


## Underlays

If you want to modularise your workspaces you can set up underlays to the current workspace (note we don't do any `setup.bash` sourcing here, all the information necessary comes from the underlay list). Example below assumes I've got the usual rosinstalls floating around in ~, but url's could also be used.

yujin_init_workspace ~/ecl ecl.rosinstall yujin_init_workspace ~/kobuki kobuki.rosinstall yujin_init_workspace ~/turtlebot turtlebot.rosinstall cd /ecl yujin_init_build .; yujin_make cd /kobuki yujin_init_build --underlays="/ecl/debug/devel" .; yujin_make cd /turtlebot yujin_init_build --underlays="/kobuki/debug/devel;/ecl/debug/devel" . yujin_make


You can also underlay to the individual or even a shared install space rather than the devel spaces.

yujin_init_workspace ~/ecl ecl yujin_init_workspace ~/kobuki kobuki cd ~/ecl yujin_init_build --install=/opt/yujin/groovy . yujin_make --install cd ~/kobuki yujin_init_build --install=/opt/yujin/groovy --underlays="/opt/yujin/groovy" . yujin_make --install

Further workspaces can also use the shared /opt/yujin/groovy underlay as well.


## Conveniences

The yujin init build function also sets up our usual `gnome-terminal`, `konsole` and `eclipse` launch scripts. These source the devel workspace's `setup.bash` if it is ready. Use them as launchers.

## Other Notes

**Rosinstalls**

Previously, we used to fix fuerte or groovy information in the rosinstalls. e.g.

[ {'setup-file': {'local-name': '/opt/ros/groovy/setup.sh'}}, {'other': {'local-name': '/opt/ros/groovy/share/ros'}}, {'other': {'local-name': '/opt/ros/groovy/share'}}, {'other': {'local-name': '/opt/ros/groovy/stacks'}}, {'git': {'local-name': 'rocon_multimaster', 'version': 'master', 'uri':'https://github.com/robotics-in-concert/rocon_multimaster.git'}}, {'git': {'local-name': 'rocon_msgs', 'version': 'master', 'uri': 'https://github.com/robotics-in-concert/rocon_msgs.git'}} ]


This is no longer needed. `wstool` is purely concerned about source directories and source directories only, so it should now be:

[ {'git': {'local-name': 'rocon_multimaster', 'version': 'master', 'uri':'https://github.com/robotics-in-concert/rocon_multimaster.git'}}, {'git': {'local-name': 'rocon_msgs', 'version': 'master', 'uri': 'https://github.com/robotics-in-concert/rocon_msgs.git'}} ]


If you think about it, this makes sense. Suppose you want to native and cross-compile - the same sources should be usable, but `/opt/ros/groovy` is totally not usable for the cross compile. Such configuration should be in the build directory, not the source directory. Also note - the former rosinstall file is no longer compatible with newer versions of `wstool`.

## Cross Compiling

Basic idea is to create a mini-repo of cmake toolchain and platform modules, and then list/bring them in when calling `yujin_init_build`.

Awaiting a bugfix on `catkin_make`: https://github.com/ros/catkin/issues/376

List available toolchain and platform modules

yujin_init_build --list-toolchains yujin_init_build --list-platforms


yujin_init_workspace ecl ecl.rosinstall cd ecl

Native build

yujin_init_build debug cd debug make build cd ..

Arm build (moves cmake modules into the parallel build directory)

yujin_init_build --toolchain=arm-linux-gnueabi --platform=Arm1176jzf-s arm

Finally compile as usual

cd arm make build

Clone this wiki locally