пятница, 31 октября 2014 г.

SQLCipher и Qt - часть вторая, Windows (MinGW)

Переходим к сборке плагина для базы данных в Windows, используя Qt 5.3.2 с 32-битным набором компиляторов MinGW 4.8.2. Никакого способа автоматической сборки проекта qt5-sqlcipher под Windows я не придумал, поскольку требуется запускать скрипт configure из MSYS - как это сделать из проекта Qt, я не знаю. Придется компилировать SQLCipher вручную. Для сборки его под Windows требуется много всего.

Устанавливаем готовую библиотеку OpenSSL отсюда (ссылка взята с сайта OpenSSL). Внимание - ставить нужно полную версию, а не Light, поскольку нам нужны заголовочные файлы и статическая библиотека для компоновки. При установке OpenSSL ругается по поводу отсутствия "Microsoft Visual C++ 2008 Redistributable". Ставим пакет отсюда, OpenSSL почему-то продолжает ругаться, но работает. В моем случае OpenSSL установилась в каталог C:\OpenSSL-Win32, пути дальше указаны для такого варианта.

Устанавливаем MSYS - я поставил 1.0.11 в варианте "все в одном". При установке указываем путь к уже имеющемуся MinGW (в составе Qt, в моем случае это C:\Qt\Tools\mingw482_32).

Устанавливаем Tcl/Tk - я поставил ActiveTcl Community Edition для x86.

Перезагружаемся, чтобы добавленные пути гарантированно присутствовали в переменной PATH.

Скачиваем qt5-sqlcipher и сам SQLCipher, если не установлен Git, можно взять ZIP-архивы. Структура каталогов такая же, как под Linux и Mac OS X - каталог с проектом qt5-sqlcipher, в нем подкаталог sqlcipher с исходниками SQLCipher.

Запускаем MSYS, переходим в каталог sqlcipher. Запускаем следующие команды:

make clean
./configure --enable-tempstore=yes --disable-tcl --with-crypto-lib=none CFLAGS="-DSQLITE_HAS_CODEC -I/c/OpenSSL-Win32/include" LDFLAGS="-L/c/OpenSSL-Win32/lib/MinGW" LIBS="-leay32"
make


Команда make clean необходима, только если были предыдущие попытки сборки. Ключ --with-crypto-lib=none для configure нужен, поскольку скрипт не находит OpenSSL, никак (похоже, он ищет libcrypto, а под Windows ее нет, есть libeay32). Результатом успешной работы make будет библиотека libsqlcipher в подкаталоге .libs (именно так, с точкой в начале) каталога sqlcipher. Копируем в этот подкаталог библиотеку libeay32.a из C:\OpenSSL-Win32\lib\MinGW.

Правим файл проекта qsqlcipher.pro. Комментируем строку с командой для сборки SQLCipher (мы его уже собрали вручную, а запуск make приведет к ошибке):

#sqlcipher.commands = $(MAKE) -C $$PWD/sqlcipher install

Добавляем:

win32 {
    INCLUDEPATH += $$PWD/sqlcipher
    LIBS -= -lcrypto
    LIBS += -L $$PWD/sqlcipher/.libs -leay32
}

После этого проект должен собраться. Как и в других системах, копируем готовый плагин qsqlcipher.dll из подкаталога plugins/sqldrivers в соответствующий подкаталог плагинов Qt и проверяем. Работает, как это ни удивительно.

SQLCipher и Qt - часть первая, Linux и Mac OS X

Появилась потребность (пока не срочная, но возможная) сделать шифрование базы данных SQLite в проекте, написанном с использованием Qt.

Вариантов шифрования баз SQLite немного, один из них - SQLCipher, имеющий открытый исходный код и свободно распространяемый в варианте Community Edition. Более того, имеется возможность скомпилировать его в виде плагина для баз данных в Qt 5 и для этого уже есть готовый проект: qt5-sqlcipher.

Проблема в том, что вышеупомянутый проект тестировался автором только на Mac OS X 10.7, а мне нужны плагины под Windows, Mac OS X и, возможно, для Android и Linux. Начать я решил с простого - Linux и Mac OS X.

На всех системах имеется Qt 5.3.2 с уже установленными исходниками qtbase, поэтому выкачивать еще раз их не нужно. Git под Mac OS X и Linux установлен. Сначала берем исходники самого qt5-sqlcipher (без ключа --recursive):

git clone https://github.com/sijk/qt5-sqlcipher.git

Переходим в каталог qt5-sqlcipher и скачиваем исходники самого SQLCipher:

git clone https://github.com/sqlcipher/sqlcipher.git

В каталоге проекта qt5-sqlcipher создаем файл .qmake.conf, указывающий путь к исходникам qtbase. В моем случае (под Linux) это была строчка

QT_SRCDIR=/home/az/Qt/5.3/Src/qtbase

Под Mac OS X 10.9 проект qt5-sqlcipher собрался без каких-либо правок - достаточно было просто открыть файл проекта в Qt Creator и запустить сборку. Библиотека OpenSSL, которая нужна для сборки SQLCipher, уже была. Готовый плагин (файл libqsqlcipher.dlyb, есть также отладочный вариант - libqsqlcipher_debug.dlyb) находится в подкаталоге plugins/sqldrivers каталога сборки проекта. Для проверки его работоспособности я просто скопировал плагин в подкаталог plugins/sqldrivers Qt. База данных с драйвером "QSQLCIPHER" работает.

Под Linux (Debian Testing) нужно поставить пакет libssl-dev (сама OpenSSL почти наверняка уже присутствует). Параметр LDFLAGS="-lcrypto" скрипту configure под Linux не понравился, что, в общем-то, ожидаемо - для этого нужно использовать LIBS. Поэтому в файл проекта qsqlcipher.pro была внесена следующая правка:

mac {
    SQLCIPHER_CONFIGURE = --enable-tempstore=yes \
                          --disable-tcl \
                          CFLAGS="-DSQLITE_HAS_CODEC" \
                          LDFLAGS="-lcrypto"
}

linux {
    SQLCIPHER_CONFIGURE = --enable-tempstore=yes \
                          --disable-tcl \
                          CFLAGS="-DSQLITE_HAS_CODEC" \
                          LIBS="-lcrypto"
}

Во-вторых, не находится заголовочный файл sqlite3.h. Для этого добавляем путь к нему:

linux {
    INCLUDEPATH += $$PWD/sqlcipher
}

После этого проект собрался "одним движением", то есть просто запуском сборки. Готовый плагин libqsqlcipher.so из подкаталога plugins/sqldrivers также был скопирован в соответствующий подкаталог плагинов Qt и проверен. Работает.

История же со сборкой под Windows куда более длинная и извилистая и будет рассказана в следующем посте.