====== Инструкция по сборке Psi+ в ОС MS Windows (MinGW) ======
===== Необходимый инструментарий =====
1. **[[http://www.cmake.org/|CMake build system]]** -- версию 3.7.2 можно взять [[https://cmake.org/files/v3.7/cmake-3.7.2-win32-x86.msi|здесь]] //~14 MB//
2. **[[https://github.com/git-for-windows/git/releases|Git for Windows]]** - набор утилит для работы с [[http://ru.wikipedia.org/wiki/Git|Git]] //~33 MB//
3. **[[http://www.openssl.org/source/|OpenSSL]]** -- архив с исходным кодом пакета программ для поддержки шифрования и криптографии (версия > 1.0.0) //~4 MB//
4. **[[http://www.gnu.org/software/libidn/|GNU IDN Library (LibIDN)]]** -- скомпилированную версию (v1.28) можно взять [[http://ftp.gnu.org/gnu/libidn/libidn-1.28-win32.zip|здесь]]
5. **[[http://www.zlib.net/|Zlib for Windows]]**
8. **[[http://gpg4win.org/|GnuPG (Package for Windows)]]** - свежий win32-инсталлятор можно взять [[http://files.gpg4win.org/gpg4win-2.2.1.exe|здесь]]
**__Опционально__:**
* **[[https://github.com/zdenop/hunspell-mingw|Hunspell for MinGW]]** - библиотека проверки орфографии
===== Компиляция OpenSSL Toolkit v1.x.x =====
__**Важно!**__ Данный алгоритм справедлив для версий OpenSSL выше v1.x.x.
* Создаём рабочую папку **C:\build\openssl**
* Распаковываем архив с исходниками OpenSSL v1.x.x (из **[[http://www.openssl.org/source/|Пункта №5]]** необходимого инструментария) в папку **C:\build\openssl**
* Запускаем __от имени Администратора__ **Git Bash** (идёт в комплекте с **[[https://github.com/git-for-windows/git/releases/download/v2.11.0.windows.3/Git-2.11.0.3-32-bit.exe|Git]]**) в папке **C:\build\openssl** и последовательно выполняем следующие команды. Сначала конфигурируем проект:
MAKE=mingw32-make PERL=perl.exe ./config --prefix=/c/OpenSSL shared
По завершении конфигурации выполняем команду:
mingw32-make
mingw32-make install
В результате компиляции и инсталляции пакета **OpenSSL Toolkit v1.x.x** получаем скомпилированные библиотеки **libeay32.dll** и **ssleay32.dll** в папке **C:\OpenSSL\bin**, а также заголовочные файлы в папке **C:\OpenSSL\include\openssl** и служебные библиотеки для линковки в папке **C:\OpenSSL\lib**.
Теперь пакет **OpenSSL Toolkit v1.x.x** готов для линковки и сборки Psi+. Временную папку сборки **C:\build\openssl** можно удалить.
===== Компиляция Qt Cryptographic Architecture (QCA) =====
* Запускаем __от имени Администратора__ **CMD** в рабочей папке **C:\build**
* Скачиваем исходный код QCA из официального **[[https://github.com/KDE/qca.git|git-репозитория]]**:
C:\Git\bin\git clone git://anongit.kde.org/qca.git
* Переходим в папку **C:\build\qca** и конфигурируем проект перед сборкой:
cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="C:/Qt/QCA" -DCMAKE_BUILD_TYPE=Release -DUSE_RELATIVE_PATHS=ON -DBUILD_PLUGINS=ossl;gnupg
Где "C:/Qt/QCA" - путь по которому будет установлена библиотека QCA (у вас может быть другой)
* После успешного конфигурирования проекта запускаем сборку командой:
mingw32-make
* Теперь запускаем установку компонентов **QCA** в заданную при конфигурировании папку:
mingw32-make install
* В каталоге **C:\Qt\QCA** появится полностью собранная библиотека QCA
Теперь комплект **QCA** готов для конфигурирования и сборки проекта Psi+.
===== Компиляция zlib =====
* Скачиваем исходный код zlib-1.2.8 **[[http://zlib.net/zlib-1.2.8.tar.gz|отсюда]]**
* Распаковываем содержимое архива **zlib-1.2.8.tar.gz** во временную рабочую папку **C:\build\zlib**
* Запускаем __от имени Администратора__ **Git Bash** в папке **C:\build\zlib**
* Выполняем команду:
mingw32-make -f win32/Makefile.gcc
В результате компиляции наблюдаем в рабочей папке **C:\build\zlib** готовую к употреблению библиотеку **zlib1.dll**, а также служебные файлы **zconf.h**, **zlib.h**, **libz.a** и **libz.dll.a**
Копируем из папки **C:\build\zlib** следующие файлы:
* **zlib1.dll** в папку **C:\Qt\zlib\bin**
* **zconf.h** и **zlib.h** в папку **C:\Qt\zlib\include**
* **libz.a** и **libz.dll.a** в папку **C:\Qt\zlib\lib**
После этого временную рабочую папку **C:\build\zlib** можно удалить.
Теперь комплект **zlib** готов для конфигурирования и сборки проекта Psi+.
===== Компиляция библиотеки Hunspell =====
* Скачиваем при помощи Git исходники из [[https://github.com/zdenop/hunspell-mingw|github репозитория]]:
C:\Git\bin\git clone https://github.com/zdenop/hunspell-mingw.git
* Переходим в каталог исходников
cd hunspell-mingw
* Создаем каталог для теневой сборки и переходим в него:
mkdir build
cd build
* Выполняем конфигурацию исходников:
cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="C:/Hunspell" ..
Где C:/Hunspell - путь куда будет установлена библиотека libhunspell после сборки
* Если конфигурация прошла успешно, запускаем сборку библиотеки и установку:
mingw32-make
mingw32-make install
Если сборка прошла успешно, то по адресу C:\Hunspell будет установлена библиотека libhunspell
===== Способ сборки Psi+ при помощи кросс-компиляции из OS Linux (рекомендовано) =====
==== Настройка и сборка окружения для кросс-компиляции MXE ====
* Инструкция по скачиванию доступна на официальном сайте проекта [[https://mxe.cc/#download|https://mxe.cc/#download]]
cd ~
mkdir -p github
cd ~/github
git clone https://github.com/mxe/mxe.git
cd mxe
* После скачивания МХЕ в заранее созданном каталоге **~/github**, создаем в корневом каталоге исходных кодов **~/github/mxe** файл **settings.mk** с таким содержимым:
# This variable controls the number of compilation processes
# within one package ("intra-package parallelism").
JOBS := 4
# This variable controls where intermediate files are created
# this is necessary when compiling inside a virtualbox shared
# directory. Some commands like strip fail in there with Protocol error
# default is the current directory
#MXE_TMP := /tmp
# This variable controls the targets that will build.
MXE_TARGETS := i686-w64-mingw32.shared x86_64-w64-mingw32.shared
# This variable controls which plugins are in use.
# See plugins/README.md for further information.
# override MXE_PLUGIN_DIRS += plugins/gcc9
# This variable controls the download mirror for SourceForge,
# when it is used. Enabling the value below means auto.
#SOURCEFORGE_MIRROR := downloads.sourceforge.net
# The three lines below makes `make` build these "local
# packages" instead of all packages.
LOCAL_PKG_LIST := qtbase qtmultimedia qtimageformats qttools qtwebkit qtwinextras qtkeychain \
qttranslations hunspell libotr tidy-html5 minizip \
gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad opus
.DEFAULT_GOAL := local-pkg-list
local-pkg-list: $(LOCAL_PKG_LIST)
__Особое внимание нужно уделить переменным:__
- **MXE_TARGETS** где нужно указать цели сборки МХЕ, подробнее про это можно почитать в каталоге **docs** или кратко в файле **README.md**. //В примере окружение МХЕ будет компилироваться для 2х целей: i686-w64-mingw32.shared - 32х битная среда, динамические бибилиотеки (*.dll) на выходе; x86_64-w64-mingw32.shared - 64х битная среда, динамические бибилиотеки (*.dll) на выходе.//
- **MXE_TMP** - каталог где будет происходить сборка окружения MXE, если у вас много оперативной памяти (>=32Гб) и каталог **/tmp** монтируется как файловая система **tmpfs**, то данную строчку можно раскомментировать для ускорения сборки
- **LOCAL_PKG_LIST** - список пакетов, которые будут компилироваться по-умолчанию. //В примере показан минимальный список необходимый для сборки полного комплекта Psi+//
- **JOBS** - количество потоков сборки, используется для ускорения сборки на многоядерных системах, значение обычно ставят из соображения **количество ядер процессора + 1**
- **override MXE_PLUGIN_DIR** - в примере эта строка закомментирована. Таким образом можно указать версию компилятора или указать какой-то специфический набор опций (обязательно загляните в каталог plugins). //В примере указан gcc9 как компилятор, а по-умолчанию версия может быть старее или новее.//
* Закончив с настройкой окружения, запускаем его сборку командой:
make
Подробнее об опциях сборки пакетов [[https://mxe.cc/#usage|https://mxe.cc/#usage]]
**ВНИМАНИЕ** Сборка указанных в примере пакетов для 2х целей будет длиться приблизительно 6 часов, в зависимости от мощности вашего сборочного компьютера.
**СОВЕТ 1** Делайте резервные копии каталога mxe/usr перед каждым обновлением сборочного окружения, особенно если собираете MXE из master
* После окончания сборки окружения МХЕ можно приступать к сборке Psi+
==== Сборка Psi+ в окружении MXE ====
* Создаем общий каталог сборки и скачиваем исходные коды программы Psi+ при помощи утилиты **git**
mkdir -p ~/github/build
cd ~/github
git clone https://github.com/psi-plus/psi-plus-snapshots.git
* Настраиваем окружение для сборки
unset `env | \
grep -vi '^EDITOR=\|^HOME=\|^LANG=\|MXE\|^PATH=' | \
grep -vi 'PKG_CONFIG\|PROXY\|^PS1=\|^TERM=' | \
cut -d '=' -f1 | tr '\n' ' '`
export PATH=~/github/mxe/usr/bin:$PATH #тут лучше прописать полный путь к МХЕ
* Запускаем симейк к исполнению для конкретной цели, например:
cd ~/github/build
i686-w64-mingw32.shared-cmake -DDEV_MODE=ON -DBUNDLED_IRIS_ALL=ON -DENABLE_PLUGINS=ON -DBUILD_PSIMEDIA=ON -DCHAT_TYPE=webkit ../psi-plus-snapshots
тут вместо **i686-w64-mingw32.shared-cmake** нужно указывать конкретный симейк для конкретной цели. Для варианта из примера это может быть также **x86_64-w64-mingw32.shared-cmake**.
Эта команда запустит конфигурацию Psi+ для сборки самой Psi+ чатлогом на движке QtWebkit, а также всех плагинов и плагина psimedia
* Запускаем команду сборки и подготовки собранных бинарных файлов к работе
i686-w64-mingw32.shared-cmake --build . --target all --target prepare-bin --target prepare-bin-libs --parallel 4 #тоже самое что и JOBS в файле конфигурации МХЕ
В реультате в каталоге **~/github/build/psi** будет собран *.exe файл Psi+ и в каталоге **~/github/build/psi/plugins** будут собраны все плагины *.dll, а также в каталог **~/github/build/psi** будут скопированы все необходимые для запуска Psi+ библиотеки зависимостей
Подробнее про флаги для сборки при помощи CMake можно почитать [[https://github.com/psi-im/psi/blob/master/Readme-cmake-ru.txt|тут]]
===== Полезные ссылки =====
* [[http://psi-im.org/|Psi - The cross-platform XMPP client for power users]]
* [[http://qt-project.org/|Qt Project]]
* [[http://dependencywalker.com/|Dependency Walker for Windows (x84 & x64)]]
* [[http://www.equation.com/servlet/equation.cmd?fa=gdb|GNU Debugger for Windows]]