Всем привет. Увидев, как управлять основными зависимостями в 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, которые я оставил позади, потому что язык довольно прост. Я также планирую написать о кросс-компиляции, но с этим придется немного подождать.
Очередную часть этой серии вы можете найти здесь.
Спасибо за чтение!