Методика сборки дистрибутива СУБД PostgreSQL 9.6 c патчами для работы с 1С:Предприятие

Методика сборки дистрибутива СУБД PostgreSQL 9.6 c патчами для работы с 1С:Предприятие для Linux x86/x86_64 и Windows 32/64-bit

Готовые пакеты с применением всех патчей публикуются на сайте фирмы "1С" в составе релиза каждой версии СУБД "Postgres".

Данная методика предназначена для тех, кто хочет применить патчи выборочно либо внести другие изменения в исходный код Postgres, но при этом собрать версию для работы с платформой 1С:Предприятие.

 

Для сборки дистрибутива СУБД PostgreSQL 9.6 применением патчей для оптимизации работы с платформой 1С:Предприятие из исходного кода необходимо скачать с сайта фирмы «1С» публикуемый в составе релиза версии PostgreSQL пакет для требуемой операционной системы:

 

https://releases.1c.ru/version_file?nick=AddCompPostgre&ver=9.6.3-1.1C&path=AddCompPostgre\9_6_3_1_1C\Patch_SUBD_PostgreSQL_9.6.3_1.1C.tar.bz2

- для Linux

 

Данная версия поддерживает дистрибутивы: RPM - CentOS 7 и Redhat 7, Debian - Ubuntu 16.04.  

Для корректной сборки и установки необходимо наличие дополнительных модулей и библиотек:

Для Debian

Для RPM:

 

https://releases.1c.ru/version_file?nick=AddCompPostgre&ver=9.6.3-1.1C&path=AddCompPostgre\9_6_3_1_1C\Patch_SUBD_PostgreSQL_9.6.3_1.1C.zip

- для Windows

 

Сборка для Debian на примере Ubuntu 16.04 Server (x86_64)

 

Сборка в данном примере будет осуществляться с помощью Pbuilder – инструмента, который осуществляет сборку пакетов с учетом зависимостей в «чистом» окружении, создаваемом индивидуально для каждой сборки (что особенно актуально в случае, если сборка осуществляется не в целевой среде и нет необходимости в реальной установке всех пакетов зависимостей).

 

1. Подготовка исходного пакета

 

Создадим в домашнем каталоге директорию /Postgres, переместим в нее загруженный пакет и распакуем:

Копировать в буфер обмена

    mkdir  ~/Postgres    mv …/Patch_SUBD_PostgreSQL_9.6.3_1.1C.tar.bz2 ~/Postgres/Patch_SUBD_PostgreSQL_9.6.3_1.1C.tar.bz2    cd  ~/Postgres    tar xfv Patch_SUBD_PostgreSQL_9.6.3_1.1C.tar.bz2

 

В директории ~/Postgres появится каталог Patch_SUBD_PostgreSQL_9.6.3-1.1C, содержащий архив с оригинальными исходными файлами PostgreSQL (.orig.tar.bz),  патчами (.patch), архив с правилами сборки (.deb.xz) и файл  .dsc с описанием пакета. Перейдем в него:

Копировать в буфер обмена

    cd  ~/postgres/Patch_SUBD_PostgreSQL_9.6.3-1.1C

 

2. Подготовка сборочного окружения

 

Выполним установку Pbuilder. Для этого можно использовать следующую команду:

   

Копировать в буфер обмена

   sudo apt-get install pbuilder debootstrap devscripts

 

Далее нужно создать сборочное окружение (chroot). 

В простейшем сценарии, когда сборка осуществляется в среде, аналогичной целевой по архитектуре (x86_64 для x86_64 в нашем примере), для формирования сборочного окружения (chroot) выполняем команду:

Копировать в буфер обмена

    sudo pbuilder --create

 

либо, если у пакета существуют зависимости, находящиеся в репозиториях, не поддерживаемых по умолчанию (как нашем случае), например, universe:

Копировать в буфер обмена

    sudo pbuilder --create --components “main universe”

 

В случае, если необходимо выполнить компиляцию для архитектуры, отличной от архитектуры сборки (или задать  отличные от дефолтных целевые каталоги,  адрес основного и дополнительного репозитория и др.) необходимо выполнить настройку pbuilder с помощью конфигурационного файла /etc/pbuilderrc (его лучше скопировать в домашний каталог - ~/.pbuilderrc) либо использовать опции команды create (или для последующих сборок update) при создании сборочного окружения. Например, если бы мы хотели собрать пакет для  x86:

Копировать в буфер обмена

    sudo pbuilder create  --debootstrapopts --arch --debootstrapopts i386

 

(подробно о возможностях использования и настройке pbuilder можно прочитать: https://wiki.ubuntu.com/PbuilderHowto).

Создание окружения необходимо выполнить один раз, в дальнейшем перед каждой следующей сборкой необходимо его обновлять, используя команду:

Копировать в буфер обмена

    sudo pbuilder --update --components “main universe” --override-config

 

3. Сборка 

 

Если мы хотим выполнить компиляцию с применением всех патчей, выполняем команду:

Копировать в буфер обмена

    pbuilder --build postgresql-9.6_9.6.3-1.1C.dsc

либо для сборки x86:

  Копировать в буфер обмена

 sudo ARCH=i386 linux32 pbuilder --build postgresql-9.6_9.6.3-1.1C.dsc

Если же патчи нужно применить выборочно, распакуем для удобства архив с правилами сборки debian в отдельный подкаталог :

Копировать в буфер обмена

 mkdir  -p  ~/Postgres/Debian  
 tar xfv postgresql-9.6_9.6.3-1.1C.debian.tar.xz -С ~/Postgres/Debian

 

В каталоге ~/Postgres/Debian/postgresql-9.6_9.6.3-1.1C.debian/debian/patches находятся сами патчи и файл series, определяющий их состав и порядок наложения – оставляем только необходимые патчи (важно: патчи, начинающиеся с цифры 9, являются штатными для сборки debian и должны быть применены в любом случае). Проверяем состав файлов .patch в соответствии со списком  в файле series. Распакуем также оригинальный архив в ~/Postgres/Debian/postgresql-9.6_9.6.3-1.1C.debian/debian и перейдем в этот каталог:

Копировать в буфер обмена

 tar xfv postgresql-9.6_9.6.3.orig.tar.bz2 -С ~/Postgres/Debian/postgresql-9.6_9.6.3-1.1C.debian/debian
 cd ~/Postgres/Debian/postgresql-9.6_9.6.3-1.1C.debian/debian

После этого выполним команду:

Копировать в буфер обмена

    pdebuild

 Информация о ходе сборки будет выводиться на экран, по окончании сборки будут автоматически запущены регрессионные тесты пакета, ход их выполнения также можно будет наблюдать в терминале. Если в процессе сборки возникнет ошибка, сборка будет остановлена.

Если она завершена без ошибок и предупреждений, тесты пройдены, готовые пакеты  .deb можно будет найти в директории:

Копировать в буфер обмена

    /var/cache/pbuilder/result

(если в конфигурационном файле не указывался иной целевой каталог). Перед началом сборки необходимо предоставить пользователю права на запись в целевой каталог.

По умолчанию в сборочном окружении имеется только локаль "C", с которой тесты после сборки PostgreSQL не могут запуститься, а сборка разваливается.

Для этого необходимо войти в сборочное окружение в режиме сохранения результатов после выхода       Копировать в буфер обмена

sudo pbuilder login --save-after-login

и сгенерировать нужные локали

Копировать в буфер обмена

locale-gen en_US.UTF-8 ru_RU.UTF-8

Список доступных для генерации локалей можно посмотреть так:  Копировать в буфер обмена

      cat /etc/locale.gen

  

Сборка для RPM на примере CentOS 7 x86_64

 

Сборка пакетов rpm будет в данном примере выполняться с помощью утилиты rpmbuild.

 

1. Подготовка сборочного окружения

Для удобства установим пакет расширений rpmdevtools с помощью команды:

Копировать в буфер обмена

   sudo yum install -y rpmdevtools

 

Создадим дерево каталогов для сборки:

Копировать в буфер обмена

   rpmdev-setuptree  

 Данная команда создаст каталог rpmbuild и подкаталоги BUILD, BUILDROOT, RPMS, SOURCES, SPECS, SRPMS с расположением «по умолчанию» в домашнем каталоге пользователя. Эти каталоги можно создать самостоятельно в другой директории с помощью команды mkdir:

Копировать в буфер обмена

 mkdir -p ~/rpmbuild/{RPMS,SRPMS,SPECS,SOURCES,BUILD}  

 

(в этом случае необходимо будет также создать файл конфигурации rpmmacros  с помощью команды $ echo '%_topdir %(echo $HOME)/rpmbuild' >~/.rpmmacros).

 

2. Подготовка исходного пакета

 

Создадим в домашнем каталоге директорию Postgres, переместим в нее загруженный пакет и распакуем:

Копировать в буфер обмена

   mkdir  ~/Postgres
   mv …/Patch_SUBD_PostgreSQL_9.6.3_1.1C.tar.bz2 ~/Postgres/Patch_SUBD_PostgreSQL_9.6.3_1.1C.tar.bz2
   cd  ~/Postgres
   tar xfv Patch_SUBD_PostgreSQL_9.6.3_1.1C.tar.bz2

 В полученных исходных файлах нас будет интересовать rpm-пакет postgresql96-9.6.3-1.1C.src.rpm

Переместим его в отдельный подкаталог и распакуем:

Копировать в буфер обмена

mkdir  ~/Postgres/Rpm
mv  ~/Postgres/postgresql96-9.6.3-1.1C.src.rpm ~/Postgres/Rpm/postgresql96-9.6.3-1.1C.src.rpm
cd ~/Postgres/Rpm
rpm2cpio postgresql96-9.6.3-1.1C.src.rpm | cpio --extract --make-directories –verbose

 

В результате в каталоге ~/Postgres/Rpm будет находиться архив с оригинальными исходниками postgresq-9.6.3.tar.bz2, патчи (.patch), прочие источники для формирования rpm-пакета и файл postgresql-9.6.3.spec –  «главный» конфигурационный файл, инструкция для сборки. В нем указывается информация об исходных файлах (Source), патчах (Patch) и зависимостях сборки (BuildRequires и Requires). Необходимо убедиться, что все файлы, перечисленные в разделе Source, присутствуют в каталоге ~/Postgres/Rpm, переместим их с помощью команды mv в каталог ~/rpmbuild/SOURCES.

Откроем для редактирования файл postgresql-9.6.3.spec и откорректируем пути к источникам, например:

Копировать в буфер обмена

Source0: ~/rpmbuild/SOURCES/postgresql-9.6.3.tar.bz2

 (для всех файлов source).

Раздел Patch необходимо редактировать только в том случае, если нужно применить только часть из них: для этого в postgresql-9.6.3.spec нужно оставить только необходимые и удалить информацию об остальных.  Патчи накладываются в порядке, определенном в файле.

Указанные в spec-файле патчи перемещаем в дерево исходных текстов в каталог ~/rpmbuild/SOURCES.

Если Вы решили применить не все патчи, во избежание возникновения сообщения о найденных, но не упакованных файлах (присутствующих в каталоге SOURCES, но не перечисленных в файле .spec), а также ошибок, связанных с обратной ситуацией, необходимо добавить начало файла .spec макроопределения:

Копировать в буфер обмена

%define _unpackaged_files_terminate_build 0
%define _missing_doc_files_terminate_build 0

 Помещаем файл в каталог ~/rpmbuild/SPECS:

Копировать в буфер обмена

mv  ~/Postgres/Rpm/postgresql-9.6.3.spec ~/rpmbuild/SPECS /postgresql-9.6.3.spec

 

Установим пакеты зависимостей сборки при помощи команд:

Копировать в буфер обмена

sudo yum-builddep ~/rpmbuild/SPECS/postgresql-9.6.3.spec
sudo yum-builddep ~/rpmbuild/SOURCES/postgresql96-9.6.3-1.1C.src.rpm

 

3. Cборка 

 

Запустим сборку следующей командой:

Копировать в буфер обмена

rpmbuild -ba ~/rpmbuild/SPECS/postgresql-9.6.3.spec

Если нужно выполнить сборку под архитектуру x86, выполняем:

Копировать в буфер обмена

rpmbuild -bb --target i386 ~/rpmbuild/SPECS/postgresql-9.6.3.spec

 

Информация о ходе сборки будет выводиться на экран. После ее завершения автоматически запустятся регрессионные тесты сформированных пакетов, статус их выполнения также будет выведен. В случае ошибки сборка будет прекращена. В случае успешного ее завершения бинарные rpm-пакеты будут находиться в директории ~/rpmbuild/RPMS, пакет postgresql96-9.6.3-1.1C.src.rpm – в ~/rpmbuild/SRPMS.

 

Сборка для Windows 32/64-bit на примере Windows 7 64-bit

 

1. Подготовка сборочного окружения

 

Сборка в данном примере выполняется инструментами, входящими в среду разработки Microsoft Visual Studio.

Подробное описание процесса компиляции в среде Windows приведено здесь: https://postgrespro.com/docs/postgresql/9.6/install-windows-full, в этой же инструкции приведен перечень необходимого программного обеспечения и источников его загрузки, нам необходимы из них:

Дополнительно необходимо скачать библиотеку ICU:

После установки проверяем, что все компоненты прописались в переменной среды PATH. Выполняем в командной строке:

  Копировать в буфер обмена

 SET PATH

Будет выведено значение переменной. В нем должны присутствовать пути ко всем установленным компонентам. Если для каких-то утилит они отсутствуют, добавляем их к значению и с помощью команды SET <значение переменной > устанавливаем новое значение.

 

2. Подготовка исходного пакета

 

Распаковываем загруженный архив Patch_SUBD_PostgreSQL_9.6.3_1.1C.zip в директорию C:\Patch_SUBD_PostgreSQL_9.6.3_1.1C.

Переходим в директорию C:\Patch_SUBD_PostgreSQL_9.6.3_1.1C\PostgreSQL\9.6.3-1.1C\Patch_SUBD_PostgreSQL_9.6.3-1.1C. Нам необходимо извлечь архив postgresql-9.6_9.6.3.orig.tar. Сделаем это в одноименный каталог.

Скопируем из директории, куда была установлена ранее ICU (в нашем примере это C:\ICU) каталоги C:\ICU\icu\icu-4.6\include\layout и C:\ICU\icu\icu-4.6\include\unicode с их содержимым в директорию C: \Patch_SUBD_PostgreSQL_9.6.3_1.1C\PostgreSQL\9.6.3-1.1C\Patch_SUBD_PostgreSQL_9.6.3-1.1C\postgresql-9.6_9.6.3.orig\postgresql-9.6.3\src\include.

Откроем каталог C:\Patch_SUBD_PostgreSQL_9.6.3_1.1C\PostgreSQL\9.6.3-1.1C\Patch_SUBD_PostgreSQL_9.6.3-1.1C\postgresql-9.6_9.6.3.orig\postgresql-9.6.3\src\tools\msvc. В нем находятся необходимые для сборки в среде Windows скрипты.

Если существует необходимость изменить пути (указать отличные от содержащихся в PATH) к сторонним библиотекам, объявленным в файле config_default.pl, необходимо в этой директории создать файл config.pl и в нем объявить пути к переменным:

Копировать в буфер обмена

$config->{python} = 'c:\python26'

 – в примере указан путь к python.

Также нужно с помощью команды SET в командной строке (либо вспомогательного файла buildenv.pl, который также необходимо создать по аналогии с config.pl) объявить переменные:

Копировать в буфер обмена

SET ICU46_LIB64= C:\ICU\icu\icu-4.6\lib

- для архитектуры 32 бита

Копировать в буфер обмена

SET ICU46_LIB= C:\ICU\icu\icu-4.6\lib64

– для архитектуры 64 бита

 

Откроем файл C:\Patch_SUBD_PostgreSQL_9.6.3_1.1C\PostgreSQL\9.6.3-1.1C\Patch_SUBD_PostgreSQL_9.6.3-1.1C\postgresql-9.6_9.6.3.orig\postgresql-9.6.3\src\tools\msvc\Mkvcbuild.pm и укажем в нем соответствующие переменные:

Копировать в буфер обмена

   my $contrib_extralibs= {'mchar' => ['$(ICU46_LIB64)\icuin.lib', '$(ICU46_LIB64)\icuuc.lib']};
   my $frontend_extralibs = {
            'initdb'     => ['ws2_32.lib'],
            'pg_restore' => ['ws2_32.lib'],
            'pgbench'    => ['ws2_32.lib'],
               'mchar' =>['$(ICU46_LIB64)\icuin.lib', '$(ICU46_LIB64)\icuuc.lib'],
            'psql'       => ['ws2_32.lib'] };

 

3. Сборка

Компиляция будет производиться из командной строки MS Visual Studio. Если мы хотим собрать 64-битную версию, необходимо запустить командную строку x64, если 32-битную – x86.

В ней выполним переход к исходному каталогу сборки:

Копировать в буфер обмена

   сd C:\Patch_SUBD_PostgreSQL_9.6.3_1.1C\PostgreSQL\9.6.3-1.1C\Patch_SUBD_PostgreSQL_9.6.3-1.1C\postgresql-9.6_9.6.3.orig\postgresql-9.6.3\src\tools\msvc  

Для применения к исходному пакету патча нужно выполнить следующую команду:

Копировать в буфер обмена

   сat C:\Patch_SUBD_PostgreSQL_9.6.3_1.1C\PostgreSQL\9.6.3-1.1C\Patch_SUBD_PostgreSQL_9.6.3-1.1C\00001-1c_FULL_96- 0.23.patch | patch -p1 --fuzz=0

Патчи необходимо накладывать в порядке возрастания их номеров. По окончании выполним команду:

Копировать в буфер обмена

     build

(запускаем build.bat), и начинается компиляция.

В случае ее успешного окончания (сборка должна закончиться без предупреждений и ошибок с соответствуем сообщением в командной строке VS) скомпилированные исполняемые файлы будут находится в директории …/release.

Запускаем выполнение регрессионных тестов с помощью vcregress.bat:

  Копировать в буфер обмена

  vcregress

 

С помощью команды:

   install <целевая директория>

(install.bat) выполняем их установку в необходимый каталог.