构建编译系统-meson.build

构建编译系统-meson

简述

管网网站

官方手册

Meson 是一个现代化、高性能、用户友好的构建系统(build system),旨在替代传统的 Autotools 和 CMake。它使用一种简洁、声明式的 DSL(领域特定语言)来描述构建逻辑,语法清晰,易于阅读和维护,并且原生支持并行构建、跨平台编译、测试集成等特性。

安装

Linux(Ubuntu/Debian)

cpp 复制代码
sudo apt install meson ninja-build

macOS(使用 Homebrew)

cpp 复制代码
brew install meson ninja

Windows

cpp 复制代码
pip install meson ninja

基本概念

  • meson.build:项目根目录下的主构建脚本(类似 CMakeLists.txt)。
  • 源码树(source tree):存放源代码。
  • 构建目录(build directory):独立于源码的输出目录(强制 out-of-source 构建)。
  • 后端(backend):默认是 Ninja,也可生成 VS/Xcode 项目。

基本流程

  • 创建编写源码文件;
  • 创建编写meson.build构建文件
  • $ meson setup builder # 配置项目
  • $ ninja -C builder # 编译(或者meson compile -C builder)
  • $ ./builder/hello # 运行

简单示例

创建并编辑main.c和meson.build文件:

main.c

cpp 复制代码
#include <stdio.h>

int main(int argc, char**argv)
{
    printf("meson.build demo1\n");

    return 0;
}

meson.build

cpp 复制代码
project('demo1', 'c')
executable('demo1', 'main.c')

执行命令:

$ meson setup build

$ ninja -C build

$ ./build/demo1

或者

$ meson setup build && cd build

$ meson compile

$ ./demo1

核心语法与功能详解

项目声明

cpp 复制代码
project(
  'myproject',								# 工程名称
  ['c', 'cpp'],                # 支持的语言
  version: '1.0.0',						# 版本号
  default_options: [					# 默认选项
    'warning_level=3',
    'c_std=c11',
    'cpp_std=c++17'
  ]
)

生成目标

  • executable():可执行文件
  • static_library():静态库
  • shared_library():动态库
bash 复制代码
# 可执行文件
exe = executable('app', 'main.cpp', 'utils.cpp')

# 静态库
lib = static_library('mylib', 'lib.c')

# 共享库
shared_lib = shared_library('mylib', 'lib.c')

依赖管理

内部依赖(子项目)

cpp 复制代码
mylib = static_library('mylib', 'lib.c')
mydep = declare_dependency(
  include_directories: include_directories('.'),
  link_with: mylib
)

# 在其他目标中使用
executable('app', 'main.c', dependencies: mydep)

外部依赖(pkg-config / CMake / 系统库)

  • 参考1
cpp 复制代码
# 使用 pkg-config
dep = dependency('openssl')

# 查找可执行程序
python = find_program('python3')

# 使用 CMake 包(如 Qt5)
qt5 = dependency('qt5', modules: ['Core', 'Widgets'])
  • 参考2
cpp 复制代码
project('tutorial', 'c')
gtkdep = dependency('gtk+-3.0')
executable('demo', 'main.c', dependencies : gtkdep)
  • 参考3
cpp 复制代码
gtkdeps = [dependency('gtk+-3.0'), dependency('gtksourceview-3.0')]

编译选项与宏定义

cpp 复制代码
# 添加编译参数
add_project_arguments('-DDEBUG', language: 'c')

# 定义预处理器宏
conf = configuration_data()
conf.set('VERSION', meson.project_version())
configure_file(
  input: 'config.h.in',
  output: 'config.h',
  configuration: conf
)

# 在源码中包含 config.h 即可使用 #define VERSION "1.0.0"

子目录

cpp 复制代码
# 根目录 meson.build
subdir('src')
subdir('tests')

在 src/meson.build 中:

cpp 复制代码
executable('myapp', 'main.c')

在 tests/meson.build 中:

cpp 复制代码
test('unit-test', executable('test_main', 'test.c'))

运行测试:

$ meson test -C builddir

安装规则

cpp 复制代码
install_headers('mylib.h')
install_data('README.md', install_dir: get_option('datadir') / 'myapp')

安装到系统:

cpp 复制代码
ninja -C builddir install   # 默认前缀为 /usr/local
# 或指定前缀
meson setup builddir --prefix=/opt/myapp

常用命令

  • $ meson --version : 查看meson版本

  • $ meson setup --help : 参考setup帮助文档,同理也可以查看其他命令帮助

  • $ meson --help :查看帮助

  • 初始化构建目录:

    $ meson setup builddir

  • 查看/修改配置选项:

    $ meson configure builddir

  • 推荐方式编译(推荐,跨平台):

    $ meson compile -C builddir

  • 传统方式编译(需安装 ninja):

    $ ninja -C builddir

  • 运行测试:

    $ meson test -C builddir

  • 安装产物:

    $ meson install -C builddir

  • 查看构建目标:

    $ meson introspect builddir --targets

交叉编译

交叉编译(Cross Compilation),创建cross-arm.txt:

bash 复制代码
[binaries]
c = 'arm-linux-gnueabihf-gcc'
cpp = 'arm-linux-gnueabihf-g++'
ar = 'arm-linux-gnueabihf-ar'

[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'armv7'
endian = 'little'

交叉编译命令:

$ meson setup builddir --cross-file cross-arm.txt

依赖管理

Wrap 依赖管理(类似 submodule)

Meson 内置依赖管理器 wrap,可自动下载第三方库(如 zlib、gtest):

$ meson wrap install zlib

然后在 meson.build 中:

$ zlib_dep = dependency('zlib')

相关推荐
a123560mh2 小时前
国产信创操作系统银河麒麟常见软件适配(MongoDB、 Redis、Nginx、Tomcat)
linux·redis·nginx·mongodb·tomcat·kylin
赖small强3 小时前
【Linux驱动开发】Linux MMC子系统技术分析报告 - 第二部分:协议实现与性能优化
linux·驱动开发·mmc
guygg883 小时前
Linux服务器上安装配置GitLab
linux·运维·gitlab
就是蠢啊3 小时前
51单片机——数码管
单片机·嵌入式硬件·51单片机
别掩3 小时前
三极管恒流电路
单片机·嵌入式硬件
百***35513 小时前
Linux(CentOS)安装 Nginx
linux·nginx·centos
花落已飘3 小时前
STM32 SDIO接口介绍
stm32·单片机·嵌入式硬件
tzhou644524 小时前
Linux文本处理工具:cut、sort、uniq、tr
linux·运维·服务器
顾安r4 小时前
11.19 脚本 最小web控制linux/termux
linux·服务器·css·flask
程序媛_MISS_zhang_01104 小时前
vant-ui中List 组件可以与 PullRefresh 组件结合使用,实现下拉刷新的效果
java·linux·ui