← На главную

Памятка по сборке PostgreSQL при помощи Meson

Когда-то давно мы научились собирать PostgreSQL из исходников. Тогда в проекте использовалась система сборки Autotools. Однако в PostgreSQL 16, который на момент написания этих строк еще находится в разработке, была добавлена поддержка альтернативной системы сборки, Meson. Давайте разберемся, как ею пользоваться.

Но сначала – пара слов о Meson. Качественно, идеи все те же, что и в CMake, но с нормальным синтаксисом. Meson написан на языке Python. Но в отличие, скажем, от SCons, проекты описываются не на Python, а на собственном языке. Он похож на Python, но не является им. Данное решение имеет свои сильные стороны. В частности, можно ограничить, что можно делать на языке, а чего делать нельзя.

Вот для примера meson.build из стандартного расширения contrib/bloom:

bloom_sources = files( 'blcost.c', 'blinsert.c', 'blscan.c', 'blutils.c', 'blvacuum.c', 'blvalidate.c', ) if host_system == 'windows' bloom_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ '--NAME', 'bloom', '--FILEDESC', 'bloom access method',]) endif bloom = shared_module('bloom', bloom_sources, c_pch: pch_postgres_h, kwargs: contrib_mod_args, ) contrib_targets += bloom install_data( 'bloom.control', 'bloom--1.0.sql', kwargs: contrib_data_args, ) tests += { 'name': 'bloom', 'sd': meson.current_source_dir(), 'bd': meson.current_build_dir(), 'regress': { 'sql': [ 'bloom', ], }, 'tap': { 'tests': [ 't/001_wal.pl', ], }, }

Meson хорошо документирован. В частности, на официальном сайте вы найдете туториал, где компилируется hello world с зависимостями. Пересказывать его нет смысла. Вместо этого сосредоточимся лучше на сборке PostgreSQL.

Первым делом нужно установить Meson:

sudo apt install meson # или: pip3 install --user meson

Установка через PIP имеет смысл, если через пакеты ставится слишком старая версия. В этом случае убедитесь, что каталог ~/.local/bin прописан в $PATH.

Также нам понадобится Ninja:

sudo apt install ninja-build

Собрать, протестировать и установить PostgreSQL теперь можно так:

# удаляем все ненужное в репозитории git clean -df # настройка проекта meson setup --buildtype debug \ -Dcassert=true \ -Dssl=openssl -Dldap=disabled -Dtap_tests=enabled \ -DPG_TEST_EXTRA="kerberos ldap ssl" \ -Dprefix=/home/eax/projects/pginstall build # сборка с другим компилятором CC=clang CXX=clang++ meson setup ... # список доступных параметров meson configure build # изменение параметров meson setup build --reconfigure -Dicu=disabled # компиляция ninja -C build # прогон тестов PG_TEST_EXTRA=1 meson test -C build # список доступных наборов тестов meson test -C build --list # список тестов из заданного набора meson test -C build --suite postgresql:test_slru --list # инициализация тестов meson test -C build --suite postgresql:setup # после инициализации: запуск конкретного набора тестов meson test -C build --suite postgresql:test_slru # после инициализации: запуск конкретного теста из набора meson test -C build --suite postgresql:test_slru 'test_slru/regress' # установка meson install -C build

Определение степени покрытия кода тестами:

meson setup --buildtype debug \ -Db_coverage=true \ # остальные опции - как в предыдущем примере ninja -C build PG_TEST_EXTRA=1 meson test -C build ninja -C build coverage-html ls -la ./build/meson-logs/coveragereport/

Сборка документации:

# следующая команда нужна только на MacOS # без нее xsltproc на сможет найти требуемые стили # и упадет с "warning: failed to load external entity" export XML_CATALOG_FILES=/usr/local/etc/xml/catalog # собрать документацию ninja -C build docs # список доступных целей ninja -C build -t targets # список *всех* доступных целей ninja -C build -t targets all

Иногда бывает нужно прогнать тесты под санитайзером. Сделать это можно так:

SANITIZER_FLAGS=-fsanitize=alignment,undefined \ CFLAGS="-Og -ggdb -fno-sanitize-recover=all $SANITIZER_FLAGS" \ CXXFLAGS="$CFLAGS" \ LDFLAGS="$SANITIZER_FLAGS" \ meson setup # ... остальные параметры как в примере выше ...

Кстати, санитайзер неопределенного поведения (Undefined Behavior Sanitizer, UBSAN) был добавлен в GCC 4.9.x в 2014-м году. Много дополнительных опций к нему, включая -fsanitize=alignment, стали доступны начиная с GCC 5.1 в 2015-м году. На сегодняшний день они доступны повсеместно, даже в самых консервативных дистрибутивах Linux. Актуальную документации по санитайзерам можно найти в разделе 3.12 Program Instrumentation Options документации GCC.

Запуск PostgreSQL под Valgrind:

# предварительно собираем и устанавливаем PostgreSQL, # указав USE_VALGRIND в src/include/pg_config_manual.h # в первом терминале: rm -r /tmp/valgrind/ mkdir /tmp/valgrind/ initdb --data-checksums -D /home/eax/pginstall/data valgrind \ --leak-check=full \ --track-origins=yes \ --gen-suppressions=all \ --read-var-info=yes \ --log-file=/tmp/valgrind/%p.log \ --suppressions=src/tools/valgrind.supp \ --time-stamp=yes \ --trace-children=yes \ postgres -D /home/eax/pginstall/data \ 2>&1 | tee /tmp/valgrind/postmaster.log # во втором терминале (аналог старого `make installcheck`): meson test -C build \ --setup running \ --suite regress-running \ --timeout-multiplier 0 pg_ctl -w -D /home/eax/pginstall/data stop grep -r 'ERROR SUMMARY' /tmp/valgrind/ | grep -v 'SUMMARY: 0 errors' # или, как вариант: grep -r 'are definitely lost' /tmp/valgrind/

Одна из фишек Meson / Ninja заключается в скорости. Собрать PostgreSQL с нуля и прогнать все тесты на типичном железе занимает около пяти минут. Также по сравнению с Autotools существенно упрощается поддержка кода, особенно когда дело касается компиляции под Windows.