Когда-то давно мы научились собирать 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
# установка
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.