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

19 декабря 2022

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

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

Метки: , , , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.