| --- | |
| short-description: Build-time configuration options | |
| ... | |
| # Configuration | |
| If there are multiple configuration options, passing them through | |
| compiler flags becomes very burdensome. It also makes the | |
| configuration settings hard to inspect. To make things easier, Meson | |
| supports the generation of configure files. This feature is similar to | |
| one found in other build systems such as CMake. | |
| Suppose we have the following Meson snippet: | |
| ```meson | |
| conf_data = configuration_data() | |
| conf_data.set('version', '1.2.3') | |
| configure_file(input : 'config.h.in', | |
| output : 'config.h', | |
| configuration : conf_data) | |
| ``` | |
| and that the contents of `config.h.in` are | |
| ```c | |
| #define VERSION_STR "@version@" | |
| ``` | |
| Meson will then create a file called `config.h` in the corresponding | |
| build directory whose contents are the following. | |
| ```c | |
| #define VERSION_STR "1.2.3" | |
| ``` | |
| More specifically, Meson will find all strings of the type `@varname@` | |
| and replace them with respective values set in `conf_data`. You can | |
| use a single `configuration_data` object as many times as you like, | |
| but it becomes immutable after being passed to the `configure_file` | |
| function. That is, after it has been used once to generate output the | |
| `set` function becomes unusable and trying to call it causes an error. | |
| Copy of immutable `configuration_data` is still immutable. | |
| For more complex configuration file generation Meson provides a second | |
| form. To use it, put a line like this in your configuration file. | |
| #mesondefine TOKEN | |
| The replacement that happens depends on what the value and type of TOKEN is: | |
| ```c | |
| #define TOKEN // If TOKEN is set to boolean true. | |
| #undef TOKEN // If TOKEN is set to boolean false. | |
| #define TOKEN 4 // If TOKEN is set to an integer or string value. | |
| /* undef TOKEN */ // If TOKEN has not been set to any value. | |
| ``` | |
| Note that if you want to define a C string, you need to do the quoting | |
| yourself like this: | |
| ```meson | |
| conf_data.set('TOKEN', '"value"') | |
| ``` | |
| Since this is such a common operation, Meson provides a convenience | |
| method: | |
| ```meson | |
| plain_var = 'value' | |
| conf_data.set_quoted('TOKEN', plain_var) # becomes #define TOKEN "value" | |
| ``` | |
| Often you have a boolean value in Meson but need to define the C/C++ | |
| token as 0 or 1. Meson provides a convenience function for this use | |
| case. | |
| ```meson | |
| conf_data.set10(token, boolean_value) | |
| # The line above is equivalent to this: | |
| if boolean_value | |
| conf_data.set(token, 1) | |
| else | |
| conf_data.set(token, 0) | |
| endif | |
| ``` | |
| ## Configuring without an input file | |
| If the input file is not defined then Meson will generate a header | |
| file all the entries in the configuration data object. The | |
| replacements are the same as when generating `#mesondefine` entries: | |
| ```meson | |
| conf_data.set('FOO', '"string"') => #define FOO "string" | |
| conf_data.set('FOO', 'a_token') => #define FOO a_token | |
| conf_data.set('FOO', true) => #define FOO | |
| conf_data.set('FOO', false) => #undef FOO | |
| conf_data.set('FOO', 1) => #define FOO 1 | |
| conf_data.set('FOO', 0) => #define FOO 0 | |
| ``` | |
| In this mode, you can also specify a comment which will be placed | |
| before the value so that your generated files are self-documenting. | |
| ```meson | |
| conf_data.set('BAR', true, description : 'Set BAR if it is available') | |
| ``` | |
| Will produce: | |
| ```c | |
| /* Set BAR if it is available */ | |
| #define BAR | |
| ``` | |
| ## Dealing with file encodings | |
| The default Meson file encoding to configure files is utf-8. If you | |
| need to configure a file that is not utf-8 encoded the encoding | |
| keyword will allow you to specify which file encoding to use. It is | |
| however strongly advised to convert your non utf-8 file to utf-8 | |
| whenever possible. Supported file encodings are those of python3, see | |
| [standard-encodings](https://docs.python.org/3/library/codecs.html#standard-encodings). | |
| ## Using dictionaries | |
| Since *0.49.0* `configuration_data()` takes an optional dictionary as | |
| first argument. If provided, each key/value pair is added into the | |
| `configuration_data` as if `set()` method was called for each of them. | |
| `configure_file()`'s `configuration` kwarg also accepts a dictionary | |
| instead of a configuration_data object. | |
| Example: | |
| ```meson | |
| cdata = configuration_data({ | |
| 'STRING' : '"foo"', | |
| 'INT' : 42, | |
| 'DEFINED' : true, | |
| 'UNDEFINED' : false, | |
| }) | |
| configure_file(output : 'config1.h', | |
| configuration : cdata, | |
| ) | |
| configure_file(output : 'config2.h', | |
| configuration : { | |
| 'STRING' : '"foo"', | |
| 'INT' : 42, | |
| 'DEFINED' : true, | |
| 'UNDEFINED' : false, | |
| } | |
| ) | |
| ``` | |
| # A full example | |
| Generating and using a configuration file requires the following steps: | |
| - generate the file | |
| - create an include directory object for the directory that holds the file | |
| - use it in a target | |
| We are going to use the traditional approach of generating a header | |
| file in the top directory. The common name is `config.h` but we're | |
| going to use an unique name. This avoids the problem of accidentally | |
| including the wrong header file when building a project with many | |
| subprojects. | |
| At the top level we generate the file: | |
| ```meson | |
| conf_data = configuration_data() | |
| # Set data | |
| configure_file(input : 'projconfig.h.in', | |
| output : 'projconfig.h', | |
| configuration : conf_data) | |
| ``` | |
| Immediately afterwards we generate the include object. | |
| ```meson | |
| configuration_inc = include_directories('.') | |
| ``` | |
| Finally we specify this in a target that can be in any subdirectory. | |
| ```meson | |
| executable(..., include_directories : configuration_inc) | |
| ``` | |
| Now any source file in this target can include the configuration | |
| header like this: | |
| ```c | |
| #include<projconfig.h> | |
| ``` |