meson 概述-程序员宅基地

技术标签: meson  ninja  调试技巧  

meson是一个构建系统,类似于 CMake 或者GNU Autotools. meson只是负责配置构建,后台默认是用ninja来编译的(当然也支持其它后台)。ninja是一个小型的致力于编译速度优化的编译系统,相当于make的替代物。所以meson+ninja相当于Cmake+make。

meson设计目标是好用,同时保持高性能。它采用了一种自定义语言,号称简单、清晰和简洁性。很多灵感来自于Python编程语言,具有较好的易读性。

meson的另一个设计目标,是为现代编程工具提供辅助的支持,包括单元测试、代码覆盖报告、预编译头文件等。所有这些特性用于任何meson的项目,用户不需要另外使用第三方宏或编写shell脚本。

Meson遵循其他流行编译系统(如CMake和GNU Autotools)的整体结构,编译被分为两个独立的步骤: 配置步骤和编译步骤。
第一步检查系统,检查依赖关系,并执行配置编译所需的所有其他步骤。然后生成实际的编译系统。
第二步是简单地执行这个生成的编译系统。最终的结果是一堆编译目标,通常是可执行文件、共享库和静态的库。

包含源代码的目录称为源目录。相应地,编译输出的目录称为编译目录。
在其他编译系统中,这两个目录通常是相同的,编译系统创建的所有文件都放在编译目录中。这被称为源内编译
Meson编译目录和代码目录是分离的,称为源外编译
源外编译有几个好处:生成的文件不会影响源代码,更重要的是可以创建多个编译目录,生成多个编译版本,比如调试版、发布版或者我们想要的任何其它差异。这时候源码目录都是不需要改动的,我们只需要在不同编译目录去编译对应的版本即可。
在编译源代码时,通常会运行一组单元测试,他们确保程序正常运行。测试通过就安装编译结果,然后就可以使用了。

1.运行Meson

有两种不同的方式来调用Meson。

  • 使用命令/path/到/source/meson.py从源树中直接运行。
  • 安装Meson,使用meson命令来运行。
    为简单起见,本手册仅使用后一种格式。

1.1示例代码

你可以通过以下命令取得一个工程示例。该示例会生成一个testproject.c、meson.build:

$ meson init --name testproject
Using "testproject" (project name) as name of executable to build.
Defaulting to generating a C language project.
Sample project created. To build it run the
following commands:

meson setup builddir
meson compile -C builddir
$ ll
total 16
drwxr-xr-x 2 e0005055 ibu 4096 1014 09:56 ./
drwxr-xr-x 3 e0005055 ibu 4096 1014 09:37 ../
-rw-r--r-- 1 e0005055 ibu  176 1014 09:56 meson.build
-rw-r--r-- 1 e0005055 ibu  254 1014 09:56 testproject.c

配置编译目录

假设我们已经有了上述的源代码,意思是顶层目录有一个meson.build文件。运行下面的命令来配置编译选项:

meson setup builddir ./

meson基础语法是:meson [command] [arguments] [options].
setup 命令接受编译目录和源码目录 setup builddir srcdir .
如果没有指定源码目录,那么meson会把当前目录和meson.build所在的目录作为源码目录。此外setup是meson默认命令,可以省略。因此我们可以直接运行:

meson builddir 

这将在builddir生成编译目录和配置文件。

$ ./builddir/
meson-info/    meson-logs/    meson-private/ testproject.p/ 

编译工程

meson compile -C [编译目录]

$ meson compile -C builddir
ninja: Entering directory `builddir'
[2/2] Linking target testproject

builddir下会生成可执行文件testproject,我们可以查看并运行程序testproject:

$ ./builddir/
meson-info/    meson-logs/    meson-private/ testproject    testproject.p/ 
$ ./builddir/testproject
This is project testproject.

你也可以用ninja直接编译:

ninja -C builddir

运行测试

meson test -C builddir

同样可以用ninja直接调用:

ninja -C builddir test

安装程序

meson install -C builddir

文件默认安装到/usr/local,可以用–prefix /your/prefix或者DESTDIR 环境变量自定义路径:

DESTDIR=/path/to/staging meson install -C builddir

同样可以用ninja直接调用:

ninja -C builddir install

1.2编译类型

默认情况下,meson使用调试编译类型,该模式下会打开debug和警告,并不会进行优化。–buildtype命令可以更改编译类型:

  • plain 用户指定编译选项,一般用于发行包
  • debug 默认模式,生成调试和警告并不做任何优化
  • debugoptimized 生成调试和警告,但优化编译 (-g -O2)
  • release 全体优化编译,没有调试信息

1.3声明共享库,给其他模组使用

可以用declare_dependency,将当前编译的库文件提供给其他模组使用。
通过include_directories来添加头文件路径,这样就可以直接在此目录中查找头文件。
在这里插入图片描述
注意此时source必须填写,否则会提示找不到对应的引用。
之后,其他模组只需要在依赖中添加es_cjson_dep就可以了。

1.4添加第三方共享库依赖

通过include_directories来声明头文件路径,
通过find_library查找库,并添加到dependencies 之中。

cc = meson.get_compiler('c')
cxx = meson.get_compiler('cpp')

libm = cc.find_library('m', required : false)
configinc = include_directories('../3rd/include')

gstavtp = library('gstavtp',
  avtp_sources,
  c_args : gst_plugins_bad_args,
  include_directories : [configinc],
  dependencies : [gstaudio_dep, gstvideo_dep, avtp_dep, libm],
  install : true,
  install_dir : plugins_install_dir,
)

当第三方库不在默认路径时,可以通过dirs添加绝对路径来指定(老版本不支持,请升级):
在这里插入图片描述
注意,include_directories指定头文件时,可以使用相对路径,但find_library指定库文件必须使用绝对路径(不排除后续支持相对路径的可能)。

1.5指定其它编译后台

meson后台默认是用ninja来编译。如果要使用其它后台来编译,在配置的时候加上–backend命令。例如,后台想用vs编译:

meson builddir  --backend=vs

1.6生成代码发布包

meson dist

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yuangc/article/details/120745438

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签