libqi
1.14
|
go to the qi::path API reference.
The main idea of the qibuild-based project is that you always end up with the same layout.
For instance, right after having built you project, you end up with a directory looking like this:
Here we assume you have a foo
executable which:
bar
dynamic libraryfoo.data
foo.cfg
src |__ foo |__ data |___ foo.data |__ etc |__ foo.cfg build |___ sdk |__ lib |___ libbar.so |__ bin |__ foo
When everything is installed, you have something like:
prefix |__ lib |__ libbar.so |__ bin |__ foo |__ share |__ foo |__ foo.data |__ etc |__ foo |__ foo.cfg
Here is a list of common requirements:
foo/foo.cfg
, foo/foo.data
in a clean, simple way, while making sure the solution works whereas the project is built or installedfoo
may need to write or update its configuration files or data but we need to make sure nothing will be written inside the installed directoryfoo.cfg
files, we need to be able to process then in a correct order.Here is how it works:
/path/to/build/sdk
, when something is installed, the prefix is the DESTDIR
plus the installation prefix.Then we make sure the layout in the build prefix and in the install prefix is always the same. For instance, we will have CMake rules to be sure that whenever the foo project is configured, a copy of foo.cfg
is placed in build/sdk/foo/foo.cfg
(same thing for data)
argv0
. For instance, if argv0
is /path/to/build/sdk/bin/foo
, we can assume the prefix is /path/to/build/sdk
.qi::path documentation.
The API of qi::path always make sure that:
For this to work, we must make sure that
Have a look on the API of qi::path for more details
Writing a configuration file is very different from reading one.
Let's assume the foo
executable want to make sure that SPAM=42
in foo.cfg
.
Here is how it works:
foo.cfg
foo.cfg
is foundfoo.cfg
filefoo.cfg
file.You can see that we ask for a list of paths when reading, but that we always write to one file.
Let's go through these steps again, assuming foo
is installed in /usr/bin/foo
, and foo.cfg
in /usr/share/foo/foo
.cfg, and that there is nothing else on the machine where foo
is running.
foo.cfg
using qi::path::getConfigurationPaths [~/.config/foo/foo.cfg, /usr/share/foo/foo.cfg]
.config/foo/foo.cfg does not exist, we read /usr/share/foo/foo
.cfg SPAM=42
to ~/
.config/foo/foo.cfgThen each time a piece of code will ask for the foo.cfg
path, it will get a list starting with ~/
.config/foo/foo.cfg, so we are sure the setting SPAM=42
will be used.
qi::path documentation.