.. _cmake-config-files:

Managing configuration files
============================

Let's assume the foo executable needs to read a config file named ``foo.cfg``

You may want to:

* Put ``foo.cfg`` into version control

* Configure ``foo.cfg`` with CMake (maybe the contents of foo.cfg depends on wether
  you are on windows or on linux ...)

Also, it could be convenient if there was a unique way for the foo executable
to find foo.cfg.

A possible solution is to make sure you always have the following layout::

  <prefix>
  |__ bin
      |__ foo
      etc
      |__ foo
          |__ foo.cfg

And then, to find ``foo.cfg,`` you just have to use ``argv[0]`` and it always work,
whereas you just have built ``foo``, or if is installed.

One way to achieve this with CMake would be to use something like this:
(assuming that ``foo.cfg`` is in ``foo/foo.cfg``)

.. code-block:: cmake

  qi_create_bin(foo main.cpp)

  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/foo.cfg
    ${QI_SDK_DIR}/${QI_SDK_CONF}/foo/foo.cfg
    COPY_ONLY)

  qi_install_conf(foo.cfg SUBFOLDER foo)

Right before starting to build, the ``foo.cfg`` will be copied by CMake using
``configure_file`` into the correct location, and then you can add an install rule
to install the file to the correct location.