<<TableOfContents(4)>>

== Goal ==

''Configure a regular ros package to be ready for a mingw cross compile.''

Even if you're looking to create qt apps, this is still necessary if your msg/srv packages are kept separate (recommended). You may however want to skip to the [[mingw_cross/Tutorials/Mingw Packages|qt tutorial]] and come back to this one.

== Create the Package ==

Set up your package as you would usually do for rosbuild1 somewhere in your source tree, e.g.

{{{
> roscreate-pkg foo
}}}

Confirm that you can build natively (rosbuild1 style) with the usual `make` command. 

== Configuring for Rosbuild2 ==

The next step is to make the package rosbuild2 compatible. 

=== Manifest ===

This involves adding a small excerpt to your `manifest.xml` which deals with:

 * ros package dependencies
 * system dependencies (rosdeps)
 * msg/srv exports 

An example (from [[qt_tutorials]]):

{{{
<rosbuild2>
   <!-- private dependencies -->
   <depend package="qt_build"/>
   <!-- ros dependencies -->
   <depend package="roscpp"/>
   <depend package="std_msgs"/>
   <!-- system dependencies -->
   <rosdep name="qt4"/>
   <!-- msg/srv's -->
   <srvs>srv/TwoInts.srv</srvs>
</rosbuild2>
}}}

=== CMake ===

You'll need an alternative CMakeLists.txt for when your project detects rosbuild2.

The usual method is to insert an alternative call at the top of your `CMakeLists.txt`:

{{{
if(ROSBUILD)  
  # This is the rosbuild2 path
  include(rosbuild.cmake OPTIONAL)
  return()
endif()

# CMake for rosbuild1 should follow this as normal.
}}}

In `rosbuild.cmake` put the rosbuild2 compatible cmake. Most of the function calls are essentially the same - the only really big difference is that msg and srv generation is no longer needed in the cmake itself - it's automatic.

Most of the fundamental ros packages have this embedded already - browse the `CMakeLists.txt` and `rosbuild.cmake` in packages such as cpp_common, rostime, roscpp for examples. Keep in mind that the cmake for rosbuild2 is stored in the cmake stack, not rosbuild.

== Building ==

If everything is all ok, you should be able to build a native version in the source tree (rosbuild1)

{{{
> roscd foo
> make
}}}

and a mingw compiled version in the rosbuild2 parallel build directory (refer to the [[mingw_cross/Tutorials/Mingw Build Environment|mingw build environment tutorial]]. 

{{{
> cd ~/mingwros/build
> cmake .      # cmake has to rerun to discover your new package
> cd foo
> make -j5     # -jx for number of parallel jobs
}}}