Meson构建系统(二)

2024-05-05 06:18
文章标签 系统 构建 meson

本文主要是介绍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构建系统(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960977

相关文章

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(