понедельник, 24 июня 2013 г.

Собираем Qt5 в Ubuntu 10.04

Да-да, вы не ошиблись. Именно 10.04. "Но как, почему, зачем такое извращение?!" — спросите вы, — "Ведь есть 12.04, 12.10, 13.04, наконец!" Что ж, если вас устраивают падения центра приложений, исчезновение окон и прочие маленькие радости уже на третий день аптайма, — дело ваше. Меня не устроили, и я решил остаться на проверенной, надёжной 10.04. Однако время не стоит на месте, вышел Qt5, который просто так установить и использовать на старенькой системе не получилось. Пришлось засучить рукава и начать поиск решения. Вообще, со всем этим связана целая история (весьма печальная, надо сказать), но о ней я напишу как-нибудь в другой раз. А теперь заканчиваю разглагольствования и перехожу к сути.

Итак, предположим, что у нас есть чистая Ubuntu 10.04. Впрочем, "не очень чистая" и даже совсем "грязная" тоже подойдут. Прежде всего, необходимо установить некоторые пакеты, если они у вас еще не установлены, а также скачать необходимые исходники (да, придется заниматься этим страшным делом — собирать библиотеки из исходников, поскольку не все они доступны в виде готовых deb-пакетов).

Убедитесь, что включены все источники приложений (Система, Параметры, Источники приложений). Чтобы установить нужные пакеты, просто наберите в терминале:

sudo aptitude install m4 gcc g++ make libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm1 libxcb-icccm1-dev libxcb-sync0 libxcb-sync0-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev libxext-dev libicu-dev

Если планируется собирать модуль WebKit, то к списку следует добавить следующие пакеты:

bison flex gperf ruby

Кроме того, при сборке WebKit потребуется пропатчить исходники, но об этом далее.

Чтобы можно было использовать новый стандарт C++11, нам потребуется собрать новую версию GCC (та версия, что имеется в репозиториях, давно устарела). Если использовать C++11 не планируется, пропускаем следующий шаг.

Качаем исходники. Прежде всего нам потребуется GCC версии 4.7. Надо сказать, что сам я не пробовал собирать Qt5 с GCC версии меньше 4.7, но, если верить вот этой теме на форуме Qt, то версии 4.6 будет достаточно. Версия 4.8, если опять же верить другой теме, не поддерживается. Возможно, в следующих патчах это будет исправлено. Итак, качаем GCC 4.7. Выбираем зеркало и ищем нужный релиз, либо (если очень лень) клацаем по ссылке.
Теперь нужно скачать библиотеки GMP, MPFR и MPC (нет, это не известный медиаплеер, а библиотека multiprecision). Найти исходники можно на официальных сайтах, либо на FTP, там же, откуда качали GCC, только в поддиректории infrastructure. Ленивые клацают по ссылкам:

Но и это ещё не всё. Идём по ссылке и качаем исходники последней версии Qt5.


Рекомендуется скачать именно самую последнюю версию, но, если голос лени всё же сильнее голоса разума, то клацаем сюда (это не самый последний релиз, поэтому ещё раз подчеркну, что лучше скачать более новый вручную).

Также рекомендую сразу скачать последнюю версию QtCreator, если вы ещё её не скачали. В моем случае это была версия 2.7.1.

Если планируется использовать модуль WebKit, то необходимо запастись патчем для исходников (хоть это и несколько громкое название). Дело в том, что во время сборки WebKit генерируется некоторое количество файлов. Однако, по неизвестной причине на Ubuntu 10.04 некоторые файлы не создаются, что приводит к ошибке во время сборки. Я изрядно поломал голову над решением этой проблемы, однако выход оказался куда как прост: достаточно собрать Qt5 в системе, где ошибок не возникает (в той же Ubuntu 12.04), а затем скопировать недостающие файлы в папку с исходниками на "проблемной" системе. Впрочем, нет необходимости делать это снова, просто качайте архив с патчем.

Вот теперь с закачками покончено. Но основное "веселье" только начинается. Распаковываем всё в какую-нибудь папку (у меня это была /home/user/tmp). Лучше, чтобы в пути не было символов пробела (да, на дворе 2013 год, а make и другие утилиты всё ещё не очень хорошо дружат с пробелами).

Начнём со вспомогательных библиотек (GMP, MPFR и MPC). По умолчанию они устанавливаются в /usr/local (сами бинарные файлы, естественно, в /usr/local/lib). Обычно менять путь не требуется, поэтому будем рассматривать вариант по умолчанию. Самые смелые и опытные могут поэкспериментировать.

Переходим в папку с GMP и набираем:

./configure && make && sudo make install

Можно после install добавить параметр -jN, где N — количество потоков (обычно оптимальным числом потоков является количество ядер процессора).

Дожидаемся, пока закончится сборка, вводим пароль суперпользователя, ждём ещё немного, пока закончится установка, и переходим в папку с MPFR. Повторяем процедуру, переходим в папку с MPC и делаем всё то же самое.

Далее, выполняем команду:

export LD_LIBRARY_PATH=/usr/local/lib

Это нужно для того, чтобы указать системе путь к новым библиотекам. Важно: данная команда действует только для того окна терминала, в котором была выполнена, либо для того скрипта, в котором была выполнена. Поэтому не закрываем окно терминала и все последующие команды выполняем в нём.

Теперь переходим в папку с GCC и выполняем:

./configure --with-gmp=/usr/local/lib --with-mpfr=/usr/local/lib --with-mpc=/usr/local/lib && make && sudo make install

Параметры --with-* нужны, чтобы указать путь к соответствующим библиотекам, так как они установлены по нестандартному пути (обычно библиотеки лежат в /usr/lib). Если при сборке всё же появится сообщение о том, что мол не найдена библиотека такая-то (у меня это была MPC, так как я случайно закрыл терминал и забыл ввести команду export), то выполняем:

sudo cp /usr/local/lib/libmpc.so.2 /usr/lib

Вместо libmpc вписываем нужную библиотеку. После этого перезапускаем сборку.

GCC компилируется достаточно долго, можно пойти попить чаю. Однако, все когда-нибудь заканчивается, и после завершения сборки и установки GCC мы переходим в папку с Qt5.

Если требуется модуль WebKit, то копируем папку qtwebkit-examples-and-demos из патча в папку с Qt5. Подтверждаем слияние папок и замену файлов. В папке qtwebkit-examples-and-demos содержится только лишь один файл, препятствующий сборке примеров для этого модуля. Дело в том, что у меня при сборке примеров возникла очередная ошибка (компилятор не мог найти точку входа в какую-то процедуру). Поскольку примеры мне не были нужны, я просто исключил их из процесса сборки. Тем не менее, если у кого-то есть желание потратить вечерок-другой на решение проблемы — можно просто не копировать папку qtwebkit-examples-and-demos. Но я бы не советовал... (Нет, правда, оно вам надо?)

Теперь выполняем следующую команду:

./configure -prefix /home/user/qt/5.0.2 -opensource -fully-process -qt-sql-sqlite -no-qml-debug -qt-xcb -nomake examples -nomake demos -nomake tests -nomake docs -skip webkit

Поясним, что означают параметры configure:
  • -prefix /home/user/qt/5.0.2 Задаёт путь, куда будут установлены скомпилированные библиотеки Qt. Можно заменить на любой другой (только без пробелов).
  • -opensource Указывает, под какой лицензией планируется использовать Qt. Можно пропустить, тогда выбрать лицензию будет предложено в процессе сборки.
  • -fully-process Также необязательный параметр. Указывает, что следует создавать Makefile для каждого подпроекта.
  • -qt-sql-sqlite Снова необязательный параметр. Позволяет встроить плагины SQL прямо в соответствующий модуль (QtSql). В данном случае будет встроен плагин SQLITE.
  • -no-qml-debug Необязательный параметр. Не указывайте его, если планируете пользоваться дебаггером для QML.
  • -qt-xcb Этот параметр не является обязательным, но при сборке на Ubuntu 10.04 лучше его указать, так как, если верить различным источникам в интернете, без него могут быть ошибки при сборке (видимо, это связано с отсутствием каких-то библиотек или заголовочных файлов).
  • -nomake examples и -nomake demos Эти параметры указывают, что не нужно собирать примеры приложений. Опустите их, если вам требуется собрать примеры.
  • -nomake tests А этот параметр указывает, что не нужно собирать тесты (в самом деле, если мы не собираемся всерьёз заниматься тестированием Qt, нам они ни к чему).
  • -nomake docs Отказ от сборки документации. С одной стороны, документация идёт в комплекте с QtCreator, а потому собирать ее отдельно нет смысла, с другой — этот процесс занимает так мало времени, что уже успел бы завершиться, пока читаются эти малополезные лирические отступления.
  • -skip webkit Пропускает указанный модуль (он не будет собран). Можно указать также gui, widgets, sql и т.д. Если использовать WebKit не планируется, то данный параметр поможет сэкономить весьма и весьма приличное количество времени (я не замерял специально, но субъективно WebKit собирается дольше чем все остальные модули вместе взятые).
Сразу после запуска configure будет предложено подтвердить принятие лицензионного соглашения. Вводим yes и нажимаем Enter.

Опять же, если было решено собрать модуль WebKit, то копируем папку qtwebkit  из патча в папку с Qt5. Подтверждаем слияние папок и замену файлов. В папке qtwebkit содержатся необходимые исходники, сгенерированные на другой, "беспроблемной" системе.

Далее выполняем:

make && make install

Важно: в данном случае не следует указывать параметр -jN, т.к. это приводит к неожиданным ошибкам, а сборку приходится запускать ещё раз. Почему? Потому что разработчик, видимо, не учёл возможность параллельной компиляции.

Qt5 собирается ещё дольше, чем GCC, поэтому можете смело пойти на получасовую прогулку, или сделать небольшую уборку, пока он компилируется.

После того, как библиотеки Qt наконец собрались, добавляем путь к ним в QtCreator. Те, кто знает, как это делается, и те, кто не пользуется QtCreator, могут дальше не читать.

Итак, открываем QtCreator и выбираем пункт Параметры... меню Инструменты.


Переходим на вкладку Компиляторы, добавляем наш компилятор в /usr/local, жмём Применить... Затем во вкладке Профили Qt жмём кнопку Добавить... и указываем путь к исполняемому фалу qmake в той папке, куда установили библиотеки Qt5.


Задаём какое-нибудь легко узнаваемое название профиля, жмём Применить... и переходим ко вкладке Комплекты, создаём новый, опять же присваиваем имя, выбираем только что созданный профиль Qt и компилятор.


Жмём ОК и — готово!

воскресенье, 23 июня 2013 г.

Приветствую всех, кто случайно набрёл на этот скромный блог!

В первом посте хотелось бы немного рассказать о том, из чего блог будет состоять. Прежде всего, это статьи о разработке. Qt, C++ и всё, что им сопутствует. Плюс Linux глазами пользователя и разработчика. Будут посты и на другие темы, связанные и не связанные с основной тематикой.

Писатель из меня не ахти, поэтому, как говорится, буду краток (C). Надеюсь, мои заметки будут кому-то интересны и полезны.