Meson构建系统(二)
该篇文章主要对meson官网的句法部分和对象部分进行简单摘要,具体方法的详细用法还要参考官网描述。对象部分写的相对简单,在后续文章中,会以示例的形式逐一讲解。
一、Meson句法
1.1 变量
Meson中的变量的工作方式与其他高级编程语言相同。变量可以包含任何类型的值,例如整数或字符串。变量无需预先声明,只需将其赋值即可出现。这是将值分配给两个不同变量的方法。
var1 = 'hello'
var2 = 102
Meson中变量如何工作的一个重要区别是所有对象都是不可变的。
var1 = [1, 2, 3]
var2 = var1
var2 += [4]
# var2 is now [1, 2, 3, 4]
# var1 is still [1, 2, 3]
1.2 数值
Meson仅支持整数。只需将其写出即可声明它们。支持基本的算术运算。
x = 1 + 2
y = 3 * 4
d = 5 % 3 # Yields 2.
自0.45.0版开始支持十六进制文字:
int_255 = 0xFF
自0.47.0版开始支持八进制和二进制文字:
int493 = 0o755
int_1365 = 0b10101010101
字符串可以转换为如下数字:
string_var = '42'
num = string_var.to_int()
数字可以转换为字符串:
int_var = 42
string_var = int_var.to_string()
1.3 布尔值
布尔值是true或false。
truth = true
1.4 字符串
Meson中的字符串用单引号声明。要输入文字单引号,请执行以下操作:
single quote = 'contains a \' character'
转义序列的完整列表为:
\\ 反斜杠
\' 单引号
\a 钟
\b 退格键
\f 换页
\n 新队
\r 回车
\t 水平制表符
\v 垂直标签
\ooo 具有八进制值的字符
\xhh 十六进制值hh的字符
\uxxxx 具有16位十六进制值xxxx的字符
\Uxxxxxxxx 具有32位十六进制值xxxxxxxx的字符
\N{name} Unicode数据库中名为name的字符
1.5 字符串连接
可以使用+符号将字符串连接起来以形成新的字符串。
str1 = 'abc'
str2 = 'xyz'
combined = str1 + '_' + str2 # combined is now abc_xyz
1.6 字符串路径构建
您可以使用/运算符来连接任意两个字符串以构建路径。/在所有平台上,它将始终用作路径分隔符。
joined = '/usr/share' / 'projectname' # => /usr/share/projectname
joined = '/usr/local' / '/etc/name' # => /etc/name
joined = 'C:\\foo\\bar' / 'builddir' # => C:/foo/bar/builddir
joined = 'C:\\foo\\bar' / 'D:\\builddir' # => D:/builddir
1.7 字符串跨越多行
跨越多行的字符串可以用三个单引号声明,如下所示:
multiline_string = '''#include <foo.h>
int main (int argc, char ** argv) {
return FOO_SUCCESS;
}'''
1.8 字符串格式化
可以使用字符串格式化功能来构建字符串。
template = 'string: @0@, number: @1@, bool: @2@'
res = template.format('text', 1, true)
# res now has value 'string: text, number: 1, bool: true'
1.9 其它字符串方法...
1.10 数组
数组由方括号分隔。数组可以包含任意数量的任何类型的对象。
my_array = [1, 2, 'string', some_obj]
可以通过数组索引来访问数组的元素:
my_array = [1, 2, 'string', some_obj]
second_element = my_array[1]
last_element = my_array[-1] #类似python从后往前
您可以将更多项目添加到数组中,如下所示:
my_array += ['foo', 3, 4, another_obj]
添加单个项目时,不需要将其包含在数组中:
my_array += ['something']
# This also works
my_array += 'else'
注意追加到数组将始终创建一个新的数组对象并将其分配给它,my_array而不是修改原始数组对象,因为Meson中的所有对象都是不可变的。
从0.49.0开始,您可以检查数组是否包含如下元素。
my_array = [1, 2]
if 1 in my_array
# This condition is true
endif
if 1 not in my_array
# This condition is false
endif
1.11 数组方法
为所有数组定义了以下方法:
length,数组的大小
contains,true如果数组包含作为参数给出的对象,则返回,false否则返回
get,返回给定索引处的对象,负索引从数组的后面开始计数,超出范围索引是一个致命错误。提供向后兼容性,它与数组索引相同。
1.12 辞典
字典用花括号分隔。字典可以包含任意数量的键值对。键必须是字符串,值可以是任何类型的对象。在0.53.0之前,键必须是文字字符串。
my_dict = {'foo': 42, 'bar': 'baz'}
key必须唯一:
# This will fail
my_dict = {'foo': 42, 'foo': 43}
从0.49.0开始,您可以检查字典是否包含这样的键:
my_dict = {'foo': 42, 'bar': 43}
if 'foo' in my_dict
# This condition is true
endif
if 42 in my_dict
# This condition is false
endif
if 'foo' not in my_dict
# This condition is false
endif
由于0.53.0键可以是任何求值为字符串值的表达式,不再局限于字符串。
d = {'a' + 'b' : 42}
k = 'cd'
d += {k : 43}
1.13 函数调用
Meson提供了一组可用的函数。最常见的用例是创建构建对象。
executable('progname', 'prog.c')
大多数函数只接受很少的位置参数,而接受几个关键字参数,其指定方式如下:
executable('progname',
sources: 'prog.c',
c_args: '-DFOO=1')
从0.49.0版开始,可以动态指定关键字参数。这是通过传递表示要在关键字中设置的kwargs关键字的字典来完成的。前面的示例将这样指定:
d = {'sources': 'prog.c', 'c_args': '-DFOO=1'}
executable('progname', kwargs: d)
单个函数既可以直接在函数调用中使用kwargs关键字参数,也可以通过关键字参数间接获取关键字参数。唯一的限制是,将任何特定键作为直接参数和间接参数一起传递是错误的。
d = {'c_args': '-DFOO'}
executable('progname', 'prog.c', c_args: '-DBAZ=1', kwargs: d) # This is an error!
1.14 方法调用
对象可以具有用点运算符调用的方法。它提供的确切方法取决于对象。
myobj = some_function()
myobj.do_something('now')
1.15 if语句
var1 = 1
var2 = 2
if var1 == var2 # Evaluates to false
something_broke()
elif var3 == var2
something_else_broke()
else
everything_ok()
endif
opt = get_option('someoption')
if opt != 'foo'
do_something()
endif
1.16 逻辑运算
Meson具有可在if语句中使用的标准逻辑操作范围 。
if a and b
# do something
endif
if c or d
# do something
endif
if not e
# do something
endif
if not (f or g)
# do something
endif
1.17 Foreach语句
用数组进行Foreach
这是一个示例,说明如何使用数组和foreach定义具有相应测试的两个可执行文件。
progs = [['prog1', ['prog1.c', 'foo.c']],
['prog2', ['prog2.c', 'bar.c']]]
foreach p : progs
exe = executable(p[0], p[1])
test(p[0], exe)
endforeach
带有字典的Foreach
这是一个示例,您可以迭代应根据某些配置编译的一组组件。它使用字典,自0.47.0起可用。
components = {
'foo': ['foo.c'],
'bar': ['bar.c'],
'baz': ['baz.c'],
}
# compute a configuration based on system dependencies, custom logic
conf = configuration_data()
conf.set('USE_FOO', 1)
# Determine the sources to compile
sources_to_compile = []
foreach name, sources : components
if conf.get('USE_@0@'.format(name.to_upper()), 0) == 1
sources_to_compile += sources
endif
endforeach
Foreach break和continue
从0.49.0开始break,continue关键字可以在foreach循环中使用。
items = ['a', 'continue', 'b', 'break', 'c']
result = []
foreach i : items
if i == 'continue'
continue
elif i == 'break'
break
endif
result += i
endforeach
# result is ['a', 'b']
1.18 注释
#
1.19 三元运算符
x = condition ? true_value : false_value
1.20 包含关系
大多数源树都有多个子目录要处理。这些可以通过Meson的subdir命令来处理。它将切换到给定的子目录并执行该子目录中的内容meson.build。所有状态(变量等)都往返于子目录。效果大致与将子目录的Meson文件的内容写入include命令所在的位置相同。
test_data_dir = 'data'
subdir('tests')
二、内置对象
2.1 meson对象
meson对象主要是提供系统内部的参数。
方法比较多详细参看官网。
build_root() 构建根目录,通常是xxx/build
source_root() 项目的源码目录
current_build_dir() 使用subdir深入源码目录时,build目录同步深入
current_source_dir() 当前编译到的源码目录
以上四个方法是体现了meson 源码后和构建分开的原则,假设有一个project/ 项目目录,project/build 为构建根目录, project/src 为源码根目录。当编译到 /project/src/module/时,current_source_dir()返回xxx/project/src/module/,current_build_dir()返回xxx/project/build/module/
2.2 build_machine对象
进行实际构建的机器的主机,有如下方法:
cpu_family():返回CPU族的名字(https://mesonbuild.com/Reference-tables.html#cpu-families);
cpu():返回一个更加具体的CPU名称。
system():返回操作系统的名称(https://mesonbuild.com/Reference-tables.html#operating-system-names);
endian():大端系统返回big,小端系统返回little。
2.3 host_machine对象
编译好的二进制文件运行的主机对象,方法与build_machine一致。
2.4 target_machine对象
编译好的二进制文件的输出的运行主机,仅在程序产生特定主机输出时才有效,方法与build_machine一致。
build_machine、host_machine、target_machine在交叉编译时才有效。
2.5 string对象
有如下方法:
contains(string) string对象包含参数中的string返回true
endswith(string) string对象以参数string结尾返回true
format() 格式化
join(list_of_strings) 加入划分符号
split(split_character) 按符号划分
startswith(string) string对象以参数string开始返回true
substring(start,end) 返回子串
strip() 去除whitespace
to_int() 返回整数
to_lower() 返回小写
to_upper() 返回大写
underscorify() 非字母或数字的符号全部用下划线代替
version_compare(comparison_string) 版本对比
2.6 Number对象
is_even() 偶数返回true
is_odd() 奇数返回true
to_string() 返回字符串
2.7 boolean对象
to_int() 返回1 or 0
to_string() 返回true or false 或定制bool.to_string('yes', 'no')
2.8 array对象
contains(item) 包含返回true
get(index, fallback) 根据脚标获取元素,超出返回fallback
length() 返回数据长度
2.9 dictionary对象
has_key(key) 判断key是否存在
get(key, fallback) 根据key获取value
keys() 以数组的形式返回所有的key
三、返回对象
3.1 compiler对象
由meson.get_compiler(lang)方法返回,该对象代表了指定语言的编译对象,并且可以通过 它查询相关属性。
find_library(lib_name, ...)
3.2 build target对象
build target代表构建的任何目标,包括可执行文件,动态库,静态库等。
3.3 configuration data对象
由configuration_data()返回,并且包含了生成配置文件的配置的内容。
3.4 custom target对象
由custom_target()返回。
3.5 dependency对象
由dependency()返回。
3.6 disabler对象
3.7 enternal program对象
由find_program()返回。
3.8 environment 对象
由environment()返回。
3.9 external library对象
由find_library()返回。
3.10 Feature对象
3.11 generator对象
由generator()返回。
3.12 subproject对象
由subproject()返回。
3.13 run result对象
由run_command()返回。
Meson构建系统(二)相关推荐
- 使用大型语言模(LLM)构建系统(七):评估1
今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程,我想和大家一起分享一下该门课程的一些主要内容.之前我们已经学习了下面这些知识: 使用大型语 ...
- Qt Creator使用其他构建系统
Qt Creator使用其他构建系统 使用其他构建系统 设置CMake 设置Qbs 设置一个Autotools项目 建立一个通用项目 设置Nimble 设置Meson 设置IncrediBuild 设 ...
- android系统自动构建,[系统集成] Android 自动构建系统
一.简介 android app 自动构建服务器用于自动下载app代码.自动打包.发布,要建立这样的服务器,关键要解决以下几个问题: 1. android app 自动化打包 android 的打包一 ...
- 视频教程-拼多多返利系统二-Java
拼多多返利系统二 我现在在上市公司任职,深耕互联网行业,对编程有深刻的理解,具有将近10年的丰富实战经验. 曾在上市公司任职过:亚信科技(中国)有限公司.文思海辉技术有限公司.中企动力科技股份有限公司 ...
- Nx 介绍: 基于插件的单一代码库(Monorepo)构建系统
文章目录 前言 一.Nx 设计理念 二.Nx 核心概念 1. 项目图 - Project graph 2.元数据驱动 - Metadata driven 3. 任务图 - Task graph 4.受 ...
- Ninja构建系统初探
Ninja构建系统概述 Ninja是一个专注于速度的小型构建系统.它与其他构建系统在两个主要方面有所不同:一是它被设计为由更高级别的构建系统生成.ninja文件作为其输入:二是它被设计为尽可能快地执行 ...
- xmake v2.3.1 发布, 无缝对接其他构建系统
最近对xmake内部做了不少的重构来改进,并且新增了不少实用的新特性,欢迎来体验. 项目源码 官方文档 一些新特性: 一键编译其他构建系统维护的项目,实现无缝对接,并且支持交叉编译(比如autotoo ...
- Bazel构建系统的使用以及go项目实践案例
文章目录 一.基本概念 1. `Bazel`是做什么的?使用场景 2. 什么是构建系统?种类有哪些 2.1 构建系统作用? 2.2 构建系统的目标? 2.3 为什么选择构建系统?为什么不直接使用编辑器 ...
- OpenHarmony编译构建系统详解,从零搭建windows下开发环境,巨方便!
自从OpenHarmony更新了dev-tool,就可以在windows下构建鸿蒙(轻量型)系统了,这对于进行MCU开发的朋友们,学习鸿蒙OS会友好许多!我们可以更快的构建出系统,方便快速学习和验证. ...
- android系统二次开发,Andorid系统二次开发界面
Andorid系统二次开发界面 给大家介绍完外观,下面我们一起再来看下魅族MX的系统界面.本次魅族MX仍然采用的是Andorid操作系统,并且加入了二次开发界面.UI界面整体上保持了和M9的特色,不过 ...
最新文章
- U盘安装 CentOS 7
- js实现新闻滚动-单行滚动或者多行滚动
- Object-C时间与字符串的转化 因多语言设置中造成返回Nil的解决方法
- HTML DOM那点儿事儿
- 进程中的信号赋值与变量赋值
- 负载均衡集群HAProxy安装篇
- 云图说|小云妹-DDS实例安全基本操作
- matlab2c使用c++实现matlab函数系列教程-max函数
- Android ContentProvider简单总结
- 基于Springboot实现高校社团管理系统
- 二元logistic模型案例_logistic回归分析案例
- 紧急 抢救mysql 数据库 恢复到指定时间点
- Java动态数组的实现
- maven运行Error:(3, 14) java: 程序包不存在
- 怎样学好高中数学学好高中数学的技巧
- 使用getdate()获取不同格式的日期
- 【Excel】Excel读取数据时,提示“服务器连接异常”
- 《指弹:The Sprinter》
- 开幕在即!众星齐聚八泉峡推介会 为山西加油,为二青助力!
- [matlab]获取多项式的系数,表达式的系数