In this tutorial, you will learn how to build your projects using pre-compiled packages.
The requirements for this tutorial are the same as in the Managing dependencies between projects tutorial.
You should have:
The goal of this tutorial is to manage to compile hello, using a pre-compiled binary of world.
Generating a package for the world project is done with:
$ qibuild package world
This will create a package named hello.tar.gz in QI_WORK_TREE/package/hello.tar.gz (or hello.zip on windows)
Inside the package, you will have:
world
|__ include
|__ world
|__ world.h
lib
|__ libworld.so
share
cmake
|__ world-config.cmake
Note
The archive generated by qibuid always contain a properly named top directory. This is annoying only when using the build-in zip extractor of Windows, you will end up with world/world/ ...), so get over it or just use 7zip.
The LFS hierarchy is still preserved, and it is the same as in build/sdk.
The world-config.cmake is a standard CMake file, but it can be used even after installing the world package, because it only uses relative paths.
So the world package is usable anywhere.
Note
The world-config.cmake does not even requires qibuild to be used by an other CMake project, all it does is calling standard CMake functions.
First, you have to create a toolchain for qibuild to use:
$ qitoolchain create <TOOLCHAIN_NAME> --default
Not that you can choose any name for your toolchain, but is advised to choose between this set of configurations:
Here we will assume you chose linux32
Here we used the --default option. If you don’t use --default, you will have to use -c linux32 for every qibuild command.
The only thing the default option does is to set QI_WORK_TREE/.qi/qibuild.cfg so that it looks like:
[general]
config = linux32
So it’s easy to change your mind later.
This will create a directory looking like: ~/.local/share/qi/toolchains/linux32/
This is where every packages corresponding will be put. put.
You can check that your toolchain has been created with:
$ qitoolchain status
Toolchain linux32
No feed
No packages
Now you can use:
$ qitoolchain add-package -c linux32 world /path/to/worktree/package/world.tar.gz
You can check that your package has been added with:
$ qitoolchain status
Toolchain linux32
No feed
Packages:
foo
in /home/user/.local/share/qi/toolchains/linux32/world
This will simply:
When resolving dependencies of the hello project, qibuild will see that you use a toolchain called linux32 and that this toolchain provides the world project, so it’s enough to set CMAKE_MODULE_PATHS to path/to/linux/toolchain/world
The world project will not be built when you use qibuild make hello, unless you specify it explicitly on the command line:
$ qibuild configure world hello
Now, that you have a nice local toolchain, and a world package, you may want other people to be able to use the world package, without them having to recompile it from source.
So here we are going to create a remote configuration file, so that other developpers can simply download the world package from a server
We will assume you have access to a FTP or a HTTP sever.
First, upload the world package, so that is accessible with the url: http://example.com/packages/world.tar.gz
Next, create a fee.xml accessible with the url: http://example.com/feed.xml, looking like
<toolchain>
<package
name="world"
url = "http://example.com/packages/world.tar.gz"
/>
</toolchain>
Then, from an other machine, run
$ qitoolchain create linux32 http://example.com/feed.xml
Getting package world from http://example.com/packages/world.tar.gz
Toolchain linux32: adding package world
You can see that the feed has been store in qibuild configuration:
$ qitoolchain status
Toolchain linux32
Using feed from http://example.com/feed.xml
Packages:
foo
in /home/user/.local/share/qi/toolchains/linux32/world
The full sepcifcation can be found in the Toolchain feed syntax section
You can always add something like
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../xsl/toolchain.xsl"?>
With an xsl looking like
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<body >
<h2> Packages </h2>
<ul>
<xsl:for-each select="toolchain/package">
<li>
<a>
<xsl:attribute name="href">
<xsl:value-of select="@url" />
</xsl:attribute>
<xsl:value-of select="@name" />
</a>
</li>
</xsl:for-each>
</ul>
<h2> Feeds </h2>
<ul>
<xsl:for-each select="toolchain/feed">
<li>
<a>
<xsl:attribute name="href">
<xsl:value-of select="@url" />
</xsl:attribute>
<xsl:value-of select="@url" />
</a>
</li>
</xsl:for-each>
</ul>
</body>
</html>