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.build(类似CMake的CMakelists.txt)。下面为一个简单的Meson工程样例,首先是工程的结构:
与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完全支持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