MesonBook

Советую посмотреть вот эту презентацию чтобы лучше понимать зачем стоит использовать Meson. https://youtu.be/SCZLnopmYBM

Features

  • multiplatform support for Linux, macOS, Windows, GCC, Clang, Visual Studio and others

  • supported languages include C, C++, D, Fortran, Java, Rust, Vala, C#

  • build definitions in a very readable and user friendly non-Turing complete DSL

  • cross compilation for many operating systems as well as bare metal

  • optimized for extremely fast full and incremental builds without sacrificing correctness

  • built-in multiplatform dependency provider that works together with distro packages

  • fun!

Вообщем лучше всего Meson описывает третий пункт, это DSL для сборок.

Hello world

Начнем с самого простого, у вас 1 файл, который является программой которую можно запустить, а не библиотекой.

source

#include<stdio.h>

int main(int argc, char **argv) {
  printf("Hello there.\n");
  return 0;
}

meson.build

project('simple', 'c')
executable('myexe', 'source.c')

Даже не уверен стоит ли тут что-то пояснять, в этом вся суть Meson.

project

C этой строчки начинается любой проект, первый аргумент название проекта а затем перечисление языков которые используются в проекте (Например так как Vala компилируется в C для нее перечислены оба языка)

executable

executable это цель этого билд скрипта, в одном билдскрипте их может быть сколько угодно. Первый аргумент название, второй список файлов.

Build

Это всё, теперь мы готовы забилдить наше приложение. Сначала нам нужно инициализировать сборку, перейдя в исходный каталог и выполнив: meson build

Мы создаем отдельный каталог сборки, чтобы содержать весь вывод компилятора. Meson отличается от некоторых других систем сборки тем, что он не допускает in-source builds. Вы всегда должны создать отдельный каталог сборки. Общепринятой нормой считается размещение build каталога в корневой директории вашего проекта.

❯ meson build
The Meson build system
Version: 0.54.1
Source dir: /home/gavr/Dev/Meson
Build dir: /home/gavr/Dev/Meson/build
Build type: native build
Project name: simple
Project version: undefined
C compiler for the host machine: cc (gcc 9.3.0 "cc (Arch Linux 9.3.0-1) 9.3.0")
C linker for the host machine: cc ld.bfd 2.34
Vala compiler for the host machine: valac (valac 0.48.5)
Host machine cpu family: x86_64
Host machine cpu: x86_64
Found pkg-config: /usr/bin/pkg-config (1.6.3)
Run-time dependency glib-2.0 found: YES 2.64.2
Build targets in project: 1

Found ninja-1.10.0 at /usr/bin/ninja

ninja -C build

Meson использует ninja в качестве бэкенда.

Ninja - это небольшая система сборки с акцентом на скорость. Она отличается от других систем сборки в двух основных аспектах: она предназначен для того, чтобы её входные файлы создавались системой сборки более высокого уровня, и она предназначен для запуска сборок с максимальной скоростью.

По сути, Ninja предназначена для замены Make, которая медлителен при выполнении инкрементных (или no-op) сборок. Это может значительно замедлить работу разработчиков над большими проектами, такими как Google Chrome, который компилирует 40 000 входных файлов в один исполняемый файл. На самом деле Google Chrome - это основной пользователь и мотивация для создания ninja. Она также используется для сборки Android и большинством разработчиков, работающих над LLVM.

❯ ninja -C build
ninja: Entering directory `build'
[3/3] Linking target myexe

Флаг -C указывает название директории, аналогично cd build && ninja

Несколько файлов

project('manyfiles', 'c')
src = ['source1.c', 'source2.c', 'source3.c']
executable('myexe', src)

src является переменной, которая содержит массив файлов, затем мы передаем его в executable.

Аргументы могут быть именованными, чаще всего люди используют их именно так

exe = executable('myexe', sources : src, dependencies: deps)

Тесты

test('simple test', exe)

Первый аргумент название теста, второй executable target.

Команда ninja -C build test запустит все тесты проекта

Meson не заставляет использовать какой-либо конкретный тест-фреймворк. Вы можете свободно использовать GTest(GLib), Boost Test, Check или даже пользовательские исполняемые файлы.

Зависимости

Просто выводить текст в консоль слишком скучно, переключаемся на GTK.

source

#include<gtk/gtk.h>

int main(int argc, char **argv) {
  GtkWidget *win;
  gtk_init(&argc, &argv);
  win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_tiну tle(GTK_WINDOW(win), "Hello from C!");
  g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show(win);
  gtk_main();                            //run gtk main loop
}

meson.build

project('gtkapp', 'c')
src = ['app.c']
gtk = dependency('gtk+-3.0')
exe = executable('demo', 'app.c', dependencies : gtk)
test('test', exe)

Объяснять буквально нечего, dependencies работают также как sources.

После того как вы настроили свой каталог сборки в первый раз, вам больше никогда не нужно будет запускать команду meson. Meson автоматически определит, когда вы внесли изменения в определения сборки, и позаботится обо всем, чтобы пользователям не пришлось беспокоиться.

Last updated