[①Meson]: Meson构建系统简介

前言

Meson是一个比较时髦的构建系统,它的全称是The Meson Build System,是一个基于Python实现的开源项目。它与Ninja工具配合使用,Meson负责构建项目依赖关系,Ninja进行编译。Meson除了构建速度快,另一个主要设计目的是为现代编程工具提供优秀的支持,其中包括一些特性如:单元测试(unit test)、代码覆盖率报告(code coverage reporting)和头文件预编译(precompiled headers)等,基于中文资料比较少,大家可以参考Meson的官方网站:https://mesonbuild.com/
在Ubuntu 18.04下安装Meson和Ninja的方法:

sudo apt install meson ninja

例如Intel的DPDK(Data Plane Development Kit)项目就是用Meson + Ninja构建的,下面介绍项目编译的方法:

mkdir build
meson build   	# 或者 meson setup build
cd build
meson compile 	# 或者直接输入ninja进行编译,如果不进入build文件夹也可以使用ninja -C build
meson test 		# run uni-test

Meson工程样例

Meson构建描述文件为meson.build(类似CMake的CMakelists.txt)。下面为一个简单的Meson工程样例,首先是工程的结构:
[①Meson]: Meson构建系统简介_第1张图片
与src文件夹平级的是顶层meson.build文件,内容如下:

# project
project('box_training', 'cpp',
        version: '0.0')

# set up some global vars for compiler, platform, configuration, etc.
cc = meson.get_compiler('cpp')
project_source_root = meson.current_source_dir()
project_build_root = meson.current_build_dir()

message(cc.get_id())
message(project_source_root)
message(project_build_root)

# add subdirectory
subdir('src')

project()命令用于指定项目名称,也可以添加版本号。如果为C的项目可以写成:project(‘box_training’, ‘c’)。
meson.get_compiler(‘cpp’)用于获得compiler的属性。
message()命令用于打印输出。
subdir()命令将下级的meson.build文件包含进来,类似于CMake的add_subdirectory()。

接下来看下src文件夹下的meson.build文件:

# inlcude directorie
global_inc = include_directories('.')

# add subdirectory
subdir('math')
subdir('app')

include_directories()命令用于引入头文件路径。

math文件夹下的meson.build文件:

# add source files
sources = files('math.cpp')
# create static lib
libbox_math = static_library('box_math', sources)

用static_library()命令将math下的内容编译成静态库,然后被可执行文件所链接。

app文件夹下的meson.build文件:

# check external libs
deps = cc.find_library('boost_program_options', required: true)

sources = files('main.cpp')

# add executable
executable('box_test', 
           sources, 
           dependencies: deps,
           link_with : libbox_math,
           include_directories: global_inc)

因为程序要使用boost_program_options的外部库,所以用cc.find_library()命令将这个外部库找到。最后用executable()命令生成可执行文件。使用meson build_meson命令会有如下类似的输出:
[①Meson]: Meson构建系统简介_第2张图片
附上整个工程样例的下载链接Meson。

Cross Compliation

Meson完全支持cross compliation。以riscv64-linux-gcc为例子,首先要准备类似(riscv64_andes_linux.txt)的文件:

[binaries]
c = '/opt/andes/toolchains/nds64le-linux-glibc-v5d/bin/riscv64-linux-gcc'
cpp = '/opt/andes/toolchains/nds64le-linux-glibc-v5d/bin/riscv64-linux-g++'
ar = '/opt/andes/toolchains/nds64le-linux-glibc-v5d/bin/riscv64-linux-ar'
strip = '/opt/andes/toolchains/nds64le-linux-glibc-v5d/bin/riscv64-linux-strip'

[host_machine]
system = 'linux'
cpu_family = 'riscv64'
cpu = 'rv64gc'
endian = 'little'

[properties]
vendor_id = 'generic'
arch_id = 'generic'
sys_root = '/opt/andes/toolchains/nds64le-linux-glibc-v5d/sysroot'

[built-in options]
c_args = ['-Og', '-g3', '-mcmodel=medium', '-fmessage-length=0']
c_link_args = ['-Og', '-static', '-mcmodel=medium', '-mvh']

其中在[binaries]下指定使用的toolchain,在[built-in options]下为compiler和linker添加选项。然后再配置build文件夹时添加–cross-file,命令如下:

meson setup riscv64_build --cross-file riscv64_andes_linux.txt
ninja -C riscv64_build 

在控制台会看到如下的输出:
在这里插入图片描述
参考配置Meson cross compliation的网页:
https://mesonbuild.com/Cross-compilation.html
https://doc.dpdk.org/guides/linux_gsg/cross_build_dpdk_for_riscv.html
https://docs.mesa3d.org/meson.html

你可能感兴趣的:(笔记,linux)