Meson (система сборки)

Meson (МФА ; ) —  это кроссплатформенная консольная утилита, автоматизирующая процесс сборки программного обеспечения из исходного кода. Meson имеет открытый исходный код и распространяется под лицензией Apache. Основная идея Meson — совершать максимально быструю сборку и не затрачивать ни капли времени на отладку и тестирование, а так же на ожидание начала самого процесса компиляции. Утилита также имеет и более длинное, полное название — «The Meson build system» (Система сборки Мезон). Но, несмотря на то, что Meson официально позиционируется как система сборки, на самом деле таковой не является, так как в своей основе использует другую утилиту — систему сборки Ninja и ряд некоторых других утилит.

История

Создание 
Первая версия Meson появилась в период рождественских праздников 2012 года и была разработана финским физиком-программистом Юсси Пакканеном. Разработчик был удручён тем, в каком состоянии прибывали на тот период времени системы автоматизации сборки. Многие не  понравились ему тем, что работали слишком медленно, некоторые были слишком сложны в практическом применении, а другие имели слишком переусложнённый и неясный синтаксис. Не найдя желаемой системы сборки, Юсси решился потратить своё свободное время в эти праздничные выходные и создать свою собственную систему сборки, которая удовлетворяла бы его потребности.

Этимология 
Название утилиты подбиралось с учётом того, что оно не должно было совпадать с названием какого-либо пакета из базы пакетного менеджера  системы Debian или с каким-либо проектом в базе SourceForge. Так как Юсси физик-программист, в какой-то момент он решил использовать в качестве названия имя элементарной частицы — Глюон (англ. Gluon, от слова glue — клей), подразумевая, что «глюоны — это элементарные частицы, которые удерживают протоны и нейтроны вместе, подобно тому, как задача системы сборки состоит в том, чтобы взять фрагменты исходного кода и компилятора, а затем связать их в единое целое». Но, увы, данное имя уже было занято, затем, перебрав несколько оставшихся субатомных частиц, он выяснил, что имя частицы мезон оказалось свободным.

Возможности 
Заявленной целью Meson является содействие современным методам разработки. Таким как использование метода «», сборки с покрытием кода тестами, LTO оптимизации (link time optimization) и т. д. Без необходимости программиста писать для этого поддержку.

Переносимость 
Будучи написанным на Python, Meson изначально работает в Unix-подобных операционных системах, включая macOS, а также Microsoft Windows и в ряде других операционных систем.

Meson поддерживает языки Си, C++, CUDA, D, Objective-C, Фортран, Java, C#, Rust, Vala
и имеет механизм обработки зависимостей, так называемый «Wrap».

Meson поддерживает GNU Compiler Collection, Clang, Microsoft Visual C++ и другие компиляторы, включая нетрадиционные компиляторы, такие как Emscripten и Cython.
При этом, Meson самостоятельно принимает решение о том, какой компилятор и с какими параметрами следует использовать. А кросс-компиляция проектов требует дополнительной конфигурации, которую Meson поддерживает в виде отдельного файла, который может быть внешним по отношению к проекту Meson.

Meson использует Ninja в качестве основной системы сборки, но также может использовать Microsoft Visual Studio или Xcode.

Подпроекты 
Meson может автоматически находить и использовать внешние зависимости с помощью pkg-config, CMake и поиска по конкретным проектам, но это позволяет находить только установленные зависимости, с которыми Meson ничего не может поделать. В качестве альтернативы или в качестве запасного варианта, зависимость может быть предоставлена в виде подпроекта — проекта Meson внутри другого, либо содержащегося в виде ссылки для внешней загрузки, возможно с патчами.
Это позволяет Meson разрешить «ад зависимостей» ради удобства обыкновенных пользователей, которые хотят скомпилировать проект, но также может способствовать раздуванию ПО в размерах, если вместо этого можно было использовать общую установленную зависимость. Таким образом, предпочтительный режим использования пакетов Linux уходит на второй план.

Meson помимо собственной системы подпроектов, поддерживает и систему подпроектов CMake. Файл сборки Meson может также ссылаться на службу Wrap DB.

Интеграция с ИСР 
Meson изначально имеет встроенную поддержку Visual Studio и XCode, но для упрощения интеграции с самыми разными ИСР, было разработано специальное API решающие данную проблему. Для этого, каждый раз при запуске сборки Meson создаёт папку «meson-info» и помещает в ней информационные файлы формата JSON. С помощью данных файлов любая программа может получит подробную информацию о собираемых проектах.

Язык 
Синтаксис файлов описания сборки Meson (язык Meson) заимствован от Python, но сам не является языком Python. Он был создан таким образом, что его можно повторно реализовать на любом другом языке. Например, Meson++ является реализацией на языке C++, зависимость от языка Python является лишь деталью реализации.

Язык Meson целенаправленно не является тьюринг-полным и следовательно не может выражать произвольную программу. Вместо этого произвольные этапы сборки, выходящие за рамки компиляции поддерживаемых языков, могут быть представлены в виде пользовательских целей.

Язык Meson строго типизирован, так что встроенные типы, такие как библиотека, исполняемый файл, строки и их списки, не являются взаимозаменяемыми. Переменные не имеют видимого типа, что также делает Meson динамически типизированным. В отличие от того же Make, тип списка не разделяет строки на пробелы.

Пример 
Создадим «Hello, World!» проект на языке Си, файл будет называться «main.c».
#include <stdio.h>

int main()
{
    puts("Hello, World!");
    return 0;
}

Далее рядом с ним создаём файл — «meson.build».

project('tutorial', 'c')      # tutorial — имя проекта,
                              # c — язык программирования

executable('demo', 'main.c')  # demo — имя исполняемого файла,
                              # «main.c» — файл исходного кода

Для начала инициализируем проект.

$ meson setup builddir

Появится каталог «builddir», перейдём в него и соберём наш проект.

$ cd builddir
$ meson compile

Исполняемый файл готов, осталось лишь запустить.

$ ./demo

Программные проекты использующие Meson 
Из списка программных проектов можно отметить наиболее значимые и влиятельные:

См. также 
 Автоматизация сборки
 Make
 Ninja
 CMake
 Premake

Примечания

Ссылки 

 Официальный сайт
 Руководство
 Репозиторий проекта
 Часто задаваемые вопросы
 Список проектов использующих Meson

Инструменты компиляции
Автоматизация сборки
Свободные системы автоматизации сборки
Программное обеспечение с лицензией Apache Software License
Свободное программное обеспечение, написанное на Python
Кроссплатформенное программное обеспечение