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 -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

# установка
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.

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

EnglishRussianUkrainian