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

Установка собственных исполняемых файлов, библиотек и т. д. в Meson не сильно отличается от того, что вы можете увидеть в таких инструментах, как CMake и, особенно, Autotools.

Мы начнем с проекта startupmeson2 в качестве отправной точки и продолжим оттуда.

Выполнение установки: основные функции

Итак, что вы можете сделать при выполнении установки? Если вы посмотрите на справку Meson, вы увидите следующее:

--prefix PREFIX       Installation prefix (default: /usr/local).
  --libdir LIBDIR       Library directory (default: lib).
  --libexecdir LIBEXECDIR
                        Library executable directory (default: libexec).
  --bindir BINDIR       Executable directory (default: bin).
  --sbindir SBINDIR     System executable directory (default: sbin).
  --includedir INCLUDEDIR
                        Header file directory (default: include).
  --datadir DATADIR     Data file directory (default: share).
  --mandir MANDIR       Manual page directory (default: share/man).
  --infodir INFODIR     Info page directory (default: share/info).
  --localedir LOCALEDIR
                        Locale data directory (default: share/locale).
  --sysconfdir SYSCONFDIR
                        Sysconf data directory (default: etc).
  --localstatedir LOCALSTATEDIR
                        Localstate data directory (default: var).
  --sharedstatedir SHAREDSTATEDIR
                        Architecture-independent data directory (default:
                        com).

Это каталоги по умолчанию для установки, которые очень похожи на Autotools. В Meson у вас есть несколько функций для явной установки:

  • install_headers
  • install_man
  • install_subdir
  • install_data

Посмотрим, что они делают: install_headers install, как видно, устанавливает заголовки. Разрешения правильно установлены для того, что вы хотите с ними делать. Вы можете использовать аргумент ключевого слова subdir, если хотите, чтобы ваши заголовки были установлены в подкаталог includeir.

Функция install_man устанавливает сжатые, как обычно для справочных страниц, в каталог по умолчанию MANDIR.

Функция install_subdir установит полный подкаталог. Вы можете включать/исключать и другие параметры, чтобы настроить его поведение.

Функция install_data более гибкая, и вы можете установить разрешения, владельца и группу файлов с помощью синтаксиса, знакомого с семантикой POSIX.

Все эти функции поддерживают аргумент ключевого слова install_dir, который может изменить место установки по умолчанию. Если вы дадите ему абсолютный путь, он будет использован. Если вы используете относительный путь, он будет использоваться относительно префикса установки для типа используемой вами команды install_*. Например, если вы напишите install_data('LICENSE.txt', install_mode : 'rw-r--r--', install_dir : 'license'), ваша лицензия будет установлена ​​в DATADIR/license/LICENSE.txt.

Выполнение установки: прямая поддержка ваших исполняемых файлов и библиотек

В Meson во многих случаях вы можете просто пропустить команды install_* и использовать ключевые аргументы в ваших исполняемых файлах и библиотеках, которые будут делать то, что вам нужно.

Например, если вы хотите установить исполняемый файл, вам просто нужно использовать ключевое слово install для вашей библиотеки или исполняемого файла: executable('myprog', sources : 'mysource.cpp', install : true)и ваш исполняемый файл/библиотека будут установлены в ожидаемом каталоге по умолчанию.

Но история иногда не так проста: как насчет RPATH и тому подобного, если вы используете разделяемые библиотеки? Из соображений безопасности двоичные файлы во многих системах устанавливаются таким образом, что библиотеки, на которые они могут указывать, ограничены: это делается для того, чтобы избежать внедрения кода во время выполнения с помощью вредоносных методов, таких как изменение поиска библиотек во время выполнения и загрузка ненадежного кода.

Meson имеет прямую поддержку обработки RPATH. Meson поддерживает для этого два ключевых слова: build_rpath и install_rpath.

Аргумент ключевого слова build_rpath можно использовать для загрузки некоторой библиотеки во время выполнения при сборке перед установкой. А именно, вы можете указать на свой исполняемый файл/библиотеку где-нибудь в каталоге сборки. Обратите внимание, что этот build_rpath удаляется после установки. Обычно вам не нужно использовать это, так как Meson, по крайней мере для меня, всегда находит библиотеки после компиляции (кажется, устанавливает правильные зависимости, по крайней мере, в общих случаях), но я просто хотел упомянуть, что этот ключевой аргумент существует на случай, если вам это нужно.

Аргумент ключевого слова install_rpath используется после (и только после) установки. Обратите внимание, что LIBDIR относится к PREFIX. Rpaths обычно являются абсолютными каталогами, поэтому при его настройке явно используйте PREFIX, помимо LIBDIR:

executable('myprog', sources : 'mysource.cpp',
           install_rpath : join_paths(get_option('prefix'), get_option('libdir'))

Пользовательские сценарии установки

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

meson.add_install_script('myscript')

В этих сценариях у вас есть доступ к следующим переменным среды:

  • MESON_INSTALL_PREFIX
  • MESON_SOURCE_ROOT
  • MESON_BUILD_ROOT
  • MESON_ISNTALL_DESTDIR_PREFIX
  • МЕЗОИНТРОПЕКТ

Обратите внимание, что Meson поддерживает, насколько мне известно, синтаксический анализ shebang, включая Windows. Это означает, что вы можете оставить свой выбор языка сценария в качестве детали реализации и добавить строку shebang, и будет вызван правильный интерпретатор.

Поскольку Meson использует Python в качестве зависимости, рекомендуется использовать Python для мультиплатформенных сценариев (вместо bash), если Windows является одной из систем, которые вы должны поддерживать, потому что в любом случае Python должен быть установлен. Люди часто говорят, что зависимость от Python для системы сборки — плохая идея, но в этом случае… это может нам помочь :)

Расширенные возможности: DESTDIR

Иногда сопровождающим пакетов необходимо установить библиотеку в подготовленный каталог без запуска какого-либо кода. Это функция, которая напрямую поддерживается Meson через переменную среды DESTDIR. DESTDIR — это переменная, которая влияет на то, где что-то установлено, не влияя ни на что другое. Например, если вы выдаете следующее:

meson --prefix=/my/custom/prefix builddir
DESTDIR=/my/staging ninja -C builddir install

Это установит вещи в /my/staging/my/custom/prefix. Но это не повлияет на RPATHS или другие вещи. Это то, чего хотят сопровождающие или массовые установки: им просто нужен промежуточный каталог, но в конечном итоге все будет перемещено в /my/custom/prefix, и все будет работать. Им не нужно ничего запускать из промежуточного каталога.

Пример установки

Теперь займемся практикой. Пример, представленный в статье, начинается с проекта, созданного в предыдущем посте, который также доступен в репозитории Github под именем startupmeson2.

Мы собираемся модифицировать проект startupmeson2 и назвать его (неожиданно!) startmeson3.

Проект, помимо смены названия, будет:

  • установить исполняемый файл
  • установите зависимую библиотеку в подкаталог, чтобы принудительно установить rpath в нашем исполняемом файле
  • установить install_rpath для исполняемого файла

Соответствующие модификации заключаются в следующем. Мы хотим установить исполняемый файл, поэтому мы говорим Meson, а также сообщаем meson, куда указать rpath:

executable('startingmeson3', sources : ['startingmeson3.cpp'],
           dependencies : mylib_dep, install : true,
           install_rpath : join_paths(get_option('prefix'), get_option('libdir'), 'mylib'))

Вы также устанавливаете библиотеку как устанавливаемую и указываете каталог установки:

mylib = library('mylib', sources : ['mylib.hpp', 'mylib.cpp'],
                dependencies : [boost_dep, boost_filesystem_dep],
                install : true,
                install_dir : join_paths(get_option('libdir'), 'mylib'))

С этими двумя небольшими изменениями в staringmeson2 теперь у нас есть проект, который устанавливает исполняемый файл, зависимую библиотеку в пользовательский каталог и параметры RPATH, правильно установленные для нашего исполняемого файла.

Теперь попробуйте скомпилировать и установить. Из корня проекта:

mkdir build
meson --prefix=`pwd`/install build
ninja -C build install

Теперь у вас есть исполняемый файл в install/bin, библиотека в install/lib/mylib и все правильно настроено для запуска.

Полный пример можно найти под именем startupmeson3 в репозитории Github.

На сегодня это все и счастливого использования Meson!

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

Очередную часть этой серии вы можете найти здесь.

Спасибо за чтение!