CMake Changes

We tried hard keep CMake backward compatibility, but despite all our efforts, there may be some little glitches. Anyway it’s a good idea to upgrade from the old t001chain/cmake code to the brand new and documented qibuild CMake framework.

You can find a full tutorial to do that in the Porting code to 1.12 tutorial

Below is a list of all the modifications you should do to use the new qiBuild CMake framework.

creating NAOqi modules

This concerns the create_module and configure_src_module functions.

The code looked like:

include(${CMAKE_CURRENT_SOURCE_DIR}/bootstrap.cmake)
use(NAOQI-PLUGINS-TOOLS)

create_module(foo)

configure_src_module(foo foomain.cpp foo.cpp foo.h)

This code still works, but there are a few subtle changes:

  • create_module(foo) used to call project(foo). This is not done anymore because it confuses calling cmake –build. You must now explicitely call project(foo)
  • configure_src_module(foo) creates a library if FOO_IS_REMOTE was ON, else an executable. This has not changed, but configure_src_module used to create a dynamic library by default, and now we create an executable by default (which is nicer, because your code is ready to run!)

You can go back to the old behavior by using:

create_module(foo DEFAULT_REMOTE_OFF)

Note: most of the time you won’t need to have your code being able to be both a remote process and a local module on the robot depending on a CMake variable.

In this case, simply use:

project(foo)
qi_create_bin(foo main.cpp foo.cpp foo.h)

If you want a remote process, or:

project(foo)
qi_create_lib(foo main.cpp foo.cpp foo.h)

Warning

if you choose to do this, you will have to clean the main.cpp file of your module to get rid of the FOO_IS_REMOTE_ON or FOO_IS_REMOTE_OFF defines.

Note

Since those functions were very confusing, we no longer use them in our examples.

CMake Functions

The names of the functions have changed too.

All of them are now prefixed with qi, thus preventing conflicts with other functions.

We also implemented new functions, causing API changes.

See qibuild documentation for all the details.

You can set QI_WARN_DEPRECATED to ‘ON’ to see the deprecated warning messages and fix your code. (it’s OFF by default)

install_ functions

old:

install_header(FOO SUBFOLDER foo foo.h)

new:

qi_install_header(foo/foo.h SUBFOLDER foo)

# or

qi_install_header(foo/foo.h KEEP_RELATIVE_PATHS)

Previously, you had to pass a ‘prefix’ parameter has first argument, matching the name of a staged target. This is no longer necessary.

Same thing for:

  • install_data
  • install_conf
  • install_cmake

staging and using libraries

Assumming you have a bar executable depeding on the foo library:

old:

create_lib(foo foo/foo.cpp foo/foo.h)
stage_lib(foo FOO)

create_bin(bar bar/main.cpp)
use_lib(bar FOO)

new:

qi_create_lib(foo foo/foo.cpp foo/foo.h)
qi_stage_lib(foo)

qi_create_bin(bar bar/main.cpp)
qi_use_lib(bar foo)

Previously, you could had to specify a ‘staged name’ as a second argument in stage_lib, and make sure to use the same name in the calls of use_lib

In qibuild, you can just use the name of the target, which is much simpler :)

Renamed libraries

Old name New name
ALMEMORYFASTACCESS ALMEMORY_FAST_ACCESS
LIBSHM ALSHM
LIBLAUNCHER ALLAUNCHER
LIBCORE ALCORE
TOOLS ALTOOLS
LIBVISION ALVISION
SHMPOOL ALSHMPOOL
LIBFILE ALFILE
LIBAUDIO ALAUDIO
LIBBEHAVIORINFO ALBEHAVIORINFO
LIBRESOURCE ALRESOURCE
LIBTHREAD ALTHREAD

This is just for consistency. We made sure names where not too generic, and that any Aldebaran library should start with ‘AL’

old:

use_lib(foo LIBAUDIO)

new:

use_lib(foo ALAUDIO)

Private libraries

We made a clear distinction between private and public libraries. Lots of libraries that where available in previous release wont in new release, they are still available for backward compatibility, but you should update your code to not rely on them. Most of the time you have nothing to do as you should not have been using those libraries.

Library Reason
RTTOOLS private
ALLOGREMOTE private, no need when using altoolsmain
ALFILE, LIBFILE private, use qi::path and boost::filesystem instead
ALLAUNCHER, LIBLAUNCHER private, use qi::os::spawn instead
ALSOAP private
ALAUTOMATICTEST private
ALBONJOURDISCOVERY private
ALMOTION private
ALMODELUTILS private
ALTTS private
ALAUDIODEVICES private
ALASR private
ALAUDIOTOOLBOX private
SCRIPTWRAPPER private
ALPYTHONTOOLS private
ALBEHAVIOR private
ALBEHAVIORINFO private
ALBOXLIBRARY private
ALPROJECT private
ALSERIAL private
ALRESOURCE private
ALSHM, LIBSHM private
ALSHMPOOL, SHMPOOL private
LIBFACTORY private

Most of the time you only need to use ALCOMMON or ALEXTRACTOR.

This is an example:

old:

create_bin(foo)
use_lib(foo ALTOOLS ALCOMMON)

new:

qi_create_bin(foo)
qi_use_lib(foo ALCOMMON)