通过在构建文件设置配置信息,生成头文件,例如config.h

  • 对同一个 config.h 文件,多次同时 configure_file ,会把之前config.h里面的内容覆盖。

1 如果有输入文件

输入文件名为 `config.h.in,内容如下:

#define VERSION_STR "@version@"

#mesondefine TOKEN

#mesondefine TOKEN可以替换内容如下:

#define TOKEN     // 如果 conf_data.set('TOKEN', true)
#undef TOKEN      // 如果 conf_data.set('TOKEN', false)
#define TOKEN 4   // 如果 conf_data.set('TOKEN', 4)
#define TOKEN "token" // 如果 conf_data.set('TOKEN', '"token"')
/* undef TOKEN */ // 如果 TOKEN 未设置任何值

meson.build文件内容如下(替换操作取决于 TOKEN 的值和类型):

project('my_project', 'cpp', version: '1.0')

conf_data = configuration_data()
conf_data.set('version', '1.2.3') 
conf_data.set('TOKEN', '"token"')

# 因为没有 `mesondefine BAR` 所以不会有该定义
conf_data.set('BAR', true, description : 'Set BAR if it is available')

# 有输入配置文件
configure_file(input: 'config.h.in',
               output: 'config.h',
               configuration: conf_data)

2 如果没有输入文件

配置文件到头文件对应如下:

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

config1.hconfig2.h 都是没有输入配置文件

project('my_project', 'cpp', version: '1.0')

conf_data = configuration_data()
conf_data.set('version', '1.2.3')
conf_data.set('TOKEN', '"token"')
conf_data.set('BAR', true, description : 'Set BAR if it is available')

# 有输入配置文件
configure_file(input: 'config.h.in',
               output: 'config.h',
               configuration: conf_data)

configure_file(output: 'config1.h',
               configuration: conf_data)


configure_file(output : 'config2.h',
  configuration : {
    'STRING' : '"foo"',
    'INT' : 42,
    'DEFINED' : true,
    'UNDEFINED' : false,
  }
)

executable('demo', 'main.cpp')

3 区别 set_quoted

类似于 cfg_data.set,但是会给字符串加双引号,无需 cfg_data.set('FOO', '"foo"') 加另外加 "

cfg_data.set_quoted('FOO', 'foo')