# qiBuild CMake framework design ¶

## General design decisions ¶

qiBuild CMake framework is designed around a few principles:

• Staying close to the standards
• Trying to follow CMake best practices (from CMake wiki or in /usr/share/cmake-2.8/Modules/readme.txt)
• Do not get into the developer’s way
• Play nice with other build frameworks:
• Every custom CMake function is prefixed with  qi_ 
• Every custom CMake files is in a  qibuild  subdirectory
• Generated CMake code is always pure, standard CMake code
• Absolutely NO environment variable is required, except for  PATH  and  PYTHONPATH 

## qiBuild CMake Concepts ¶

SDK
A directory containing files used to compile other code. A SDK always has a layout , following POSIX and cmake conventions.

Here is an example of a SDK containing the  bar  executable, a  bar.cfg  configuration file for  bar,  a  foo  library with the  foo-config.cmake  file, and the  foo.h  header:



<sdk>
|__ include
|__ foo
|__ foo.h
|__ lib
|__  libfoo.a
|__  libfoo.a
|__  foo.lib
|__ bin
|__ bar
|__ foo.dll
|__ bar.exe
|__ cmake
|__ foo
|__ foo-config.cmake
|__ etc
|__ bar
|__ bar.cfg

The root of a SDK can safely be added to CMAKE_FIND_ROOT_PATH
variable.


package

A package is simply an archive containing the one or several SDKs. If always has a  .tar.gz  extension on UNIX, and a  .zip  extension on windows.

All files are in the same top dir, so it is safe to extract it everywhere.

Some packages may also need a toolchain file.

toolchain file
Usually, your are supposed to use a toolchain file when cross-compiling with CMake, with the  CMAKE_TOOLCHAIN_FILE  variable.

For qiBuild, we extend the usage of the toolchain file a little bit.

In a toolchain file, you may:

• Force a compiler (which is the main purpose of a toolchain file)
• Set some CMake flags (for instance CMAKE_OSX_ARCHITECTURES)
• Or set some CMake variables like CMAKE_FIND_ROOT_PATH

A package can be associated to a toolchain file.

For instance, you may have a simple package  foobar  containing the result of the installation of the  bar  executable and the  foo libaray  , requiring no toolchain file at all, or a complex package name  geode-ctc  containing some libs in  ctc/sysroot/usr/lib  , and a cross-compiler in  ctc/cross  , and a toolchain file forcing the compiler to be  ctc/cross/bin/gcc  , and setting CMAKE_FIND_ROOT_PATH to  ctc/sysroot  .

toolchain
A toolchain is simply a collection of packages
feed
A feed is a simple XML file describing a toolchain: its location, and the packages that are in it.

## Overviews ¶

You can read the following sections if you want to understand deeply how qibuild works, under the hood.