在2023年末新学习了The Meson build构建系统,作为新一代的构建系统,用起来也非常的“时髦”。在构建代码项目时,可能会有不同编译选项或者数据变量,在编译前由使用者自行根据实际情况选择,Meson提供了一个option definition文件,可以用于定义这些选项options。文件需取名为meson.options或者meson_options.txt,并且位置在项目的root目录下,与顶层的meson.build文件平级。
接下来看下meson.options文件里的内容,下面是官方给出的一个例子:
option('someoption', type : 'string', value : 'optval', description : 'An option')
option('other_one', type : 'boolean', value : false)
option('combo_opt', type : 'combo', choices : ['one', 'two', 'three'], value : 'three')
option('integer_opt', type : 'integer', min : 0, max : 5, value : 3) # Since 0.45.0
option('free_array_opt', type : 'array', value : ['one', 'two']) # Since 0.44.0
option('array_opt', type : 'array', choices : ['one', 'two', 'three'], value : ['one', 'two'])
option('some_feature', type : 'feature', value : 'enabled') # Since 0.47.0
option('long_desc', type : 'string', value : 'optval',
description : 'An option with a very long description' +
'that does something in a specific context') # Since 0.55.0
option的语法是:
option('option_name', type : '', value : , description : '')
可以用description来描述option,没有指定description时,默认就是使用option_name。
option数据类型:
d = dependency('foo', required : get_option('myfeature'))
if d.found()
app = executable('myapp', 'main.c', dependencies : [d])
endif
if get_option('myfeature').enabled() # .enabled() .disabled() .auto(), used to check the value of the feature
# ...
endif
另外把feature定义为auto的好处是可以在meson setup的时候用auto-features={ auto | enabled | disabled }批量地覆盖所有options中的auto数据:
meson setup build --auto-features=enabled
需要注意的时option的值不能在其他Meson脚本中改变,需要在外部用meson configure -D命令(在build目录下使用meson configure -D)改变:
meson configure -Doption=newvalue
meson configure -Doption=[newvalue]
meson configure --auto-features=enabled
也可以直接使用meson configure来查看所有options的值,以Intel的DPDK项目为例子:
在Meson脚本meson.build中可以使用get_option()命令来获取options的值:
# Obtains the value of the [project build option](Build-options
str | int | bool | feature | list[str | int | bool] get_option(
str option_name, # Name of the option to query
)
例如在DPDK中使用的两个例子:
# in meson_options.txt
option('flexran_sdk', type: 'string', value: '', description:
'Path to FlexRAN SDK optional Libraries for BBDEV device')
# configure command
meson configure -Dflexran_sdk=<path-to-workspace>/FlexRAN-FEC-SDK-19-04/sdk/build-avx512-icc/install
# in meson.build
path = get_option('flexran_sdk')
lib4g = cc.find_library('libturbo', dirs: [path + '/lib_turbo'], required: false)
# in meson_options.txt
option('developer_mode', type: 'feature', description:
'turn on additional build checks relevant for DPDK developers')
# in meson.build
developer_mode = false
if get_option('developer_mode').auto()
if meson.version().version_compare('>=0.53') # fs module available
fs = import('fs')
developer_mode = fs.is_dir('.git')
endif
else
developer_mode = get_option('developer_mode').enabled()
endif
if developer_mode
message('## Building in Developer Mode ##')
endif
Deprecated options,在Meson 0.60版本之后options支持deprecated参数,当option的value为deprecated中的值时,会有警告消息:
# Option fully deprecated, it warns when any value is set.
option('o1', type: 'boolean', deprecated: true)
本篇博客是对Meson Build Options构建选项的介绍,Meson还有其他实用的功能,后续为大家带来。