LINUX.ORG.RU

Сборка переносимого PostgreSQL-client

 , , , ,


0

2

Необходимо собрать PostgreSQL-client для нескольких архитектур.

Я использую DEBIAN 12, подготовка к сборке:

sudo apt-get build-dep postgresql-client-15 ;
LDFLAGS=-static CFLAGS=-static CPPFLAGS=-static CXXFLAGS=-static ;
export LDFLAGS CFLAGS CPPFLAGS CXXFLAGS ;
sudo apt-get source postgresql-client-15 ;
cd p*/ ;
./configure ;
make ;

Для архитектур i368 и x86_64 сборка проходит, но не для ARMHF. В какой-то момент GCC пытается собрать несколько разделяемых библиотек (*.so файлы), в каждой команде присутствуют взаимоисключающие флаги, а именно предуказанный «-static» и необходимый для динамической библиотеки «-shared». Пример одной из таких команд:

gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -static -fPIC -shared -o cyrillic_and_mic.so cyrillic_and_mic.o  -L../../../../../../src/port -L../../../../../../src/common  -static  -Wl,--as-needed   
make[3]: Leaving directory '/home/user/test/postgresql-15-15.7/src/backend/utils/mb/conversion_procs/cyrillic_and_mic'

Решить это в лоб не получается. Изменение «-shared» в файлах сборки приводит к каскаду других ошибок (при компановке).

В качестве решения пробовал кросс-компиляцию - она проходит успешно, но при настройке я вынужден отключить ReadLine и ZLib ( чего не хочется делать по ряду причин).

Подскажите, как собрать «static»-версию или как добавить ReadLine и ZLib в кросс-компилятор, чтобы собрать из i368 или x86_64.

Спасибо!

★★

Ответ на: комментарий от ahdenchik

Я не первый, кто наступил на эти грабли.

Авторы PostgreSQL уже дали свой ответ: они не заинтересованы в статичных сборках ПО и официально не поддерживают оные. Если кто-то хочет, то пусть собирает и поддерживает сам.

Я понимаю, что отсутствие статики продиктовано, скорее, сервером СУБД, но клиента, по идее, можно собирать статически. По крайней мере для пары архитектур это удаётся без проблем.

zzdnx ★★
() автор топика

Решить это в лоб не получается. Изменение «-shared» в файлах сборки приводит к каскаду других ошибок (при компановке).

Явно где-то ручками -shared прописано или -static не прописано

но при настройке я вынужден отключить ReadLine и ZLib

В них не прописано ли?

Тут нет никакой магии, где-то ошибка в пробросе флагов, обычный баг

ahdenchik
()
Последнее исправление: ahdenchik (всего исправлений: 1)
Ответ на: комментарий от ahdenchik

В них не прописано ли?

apt-get source postgresql-client-15 ;
cd postgresql-15-15.7
make clean
LDFLAGS=-static CFLAGS=-static CPPFLAGS=-static CXXFLAGS=-static ./configure --without-zlib --without-readline --with-system-tzdata=/usr/share/zoneine
LDFLAGS=-static CFLAGS=-static CPPFLAGS=-static CXXFLAGS=-static make

Ошибка в том же месте - postgresql-15-15.7/src/backend/snowball. Похоже, что проблема не в ReadLine / ZLib, от того и странно.

Есть вариант транслировать нужные библиотеки в кросс-компилятор? Или подскажите, как можно отдебажить сборщик, так как моих познаний SH не хватает.

zzdnx ★★
() автор топика
Ответ на: комментарий от zzdnx

Или подскажите, как можно отдебажить сборщик, так как моих познаний SH не хватает.

Заставьте его выводить применяемые им для компиляции и линковки команды:

#!/usr/bin/env bash

set -euox pipefail
...

Посмотрите на команду на которой он упадёт, там будет куча объектников и возможно он конкретно скажет какой не может слинковать

Если нет то все эти объектники проверить на предмет статические они или динамические. Кто окажется динамическим на того смотреть как он получается. И так рекурсивно пока все не исправите

ahdenchik
()
Ответ на: комментарий от ahdenchik

Нашёл DLSUFFIX в файлах конфигурации, поправил «.so» на «.a».

Всюду, где было указано «-shared» заменил на «-static».

По итогу grep показал отсутствие «.so» и «-shared» в системе сборки.

Выполнение «./configure» успешно, но сборка всё равно падает на том же месте из-за «-shared».

Помог config.log. Оказывается, мой текущий компилятор gcc собран с «–enable-shared»:

gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/12/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Raspbian 12.2.0-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-12/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-12 --program-prefix=arm-linux-gnueabihf- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-sjlj-exceptions --with-arch=armv6+fp --with-float=hard --disable-werror --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.2.0 (Raspbian 12.2.0-14+rpi1) 

Подскажите, это действительно должно влиять на процесс сборки при явно указанном «-static»?

zzdnx ★★
() автор топика

<Оффтоп>

Есть https://github.com/xo/usql

Это попытка сделать клиент максимально близкий к psql на go.

go изначально собирает статически и с кросскомпиляцией норм, поэтому в релизах уже лежат бинарники для amd64 и arm64.

</Оффтоп>

Belkrr
()
Ответ на: комментарий от Belkrr

Благодарю за наводку на этот вариант, но размеры готовых исполняемых файлов прямо таки впечатляют…

У меня весь проект без psql-клиента укладывается в 17MB, при этом в нём уже присутствуют WEB-сервер и внутренний сайт.

Не хотелось бы раздувать проект в разы одним только usql… Потому я и пытаюсь собрать миниатюру.

zzdnx ★★
() автор топика
Ответ на: комментарий от zzdnx

Так надо применить build tags, дабы ограничить набор поддерживаемых драйверов и размер уменьшится.

Там прям в ридми табличка есть с тегами

aol ★★★★★
()