Памятка по сборке PostgreSQL при помощи Meson
19 декабря 2022
Когда-то давно мы научились собирать PostgreSQL из исходников. Тогда в проекте использовалась система сборки Autotools. Однако в PostgreSQL 16, который на момент написания этих строк еще находится в разработке, была добавлена поддержка альтернативной системы сборки, Meson. Давайте разберемся, как ею пользоваться.
Но сначала — пара слов о Meson. Качественно, идеи все те же, что и в CMake, но с нормальным синтаксисом. Meson написан на языке Python. Но в отличие, скажем, от SCons, проекты описываются не на Python, а на собственном языке. Он похож на Python, но не является им. Данное решение имеет свои сильные стороны. В частности, можно ограничить, что можно делать на языке, а чего делать нельзя.
Вот для примера meson.build из стандартного расширения contrib/bloom:
'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:
# или:
pip3 install --user meson
Установка через PIP имеет смысл, если через пакеты ставится слишком старая версия. В этом случае убедитесь, что каталог ~/.local/bin прописан в $PATH
.
Также нам понадобится Ninja:
Собрать, протестировать и установить PostgreSQL теперь можно так:
git clean -dfx
# настройка проекта
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
# список доступных параметров
meson configure build
# компиляция
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
Определение степени покрытия кода тестами:
-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/
Сборка документации:
# без нее 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
Иногда бывает нужно прогнать тесты под санитайзером. Сделать это можно так:
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.
Одна из фишек Meson / Ninja заключается в скорости. Собрать PostgreSQL с нуля и прогнать все тесты на типичном железе занимает около пяти минут. Также по сравнению с Autotools существенно упрощается поддержка кода, особенно когда дело касается компиляции под Windows.
Метки: C/C++, PostgreSQL, Кроссплатформенность, СУБД.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.