mirror of
				https://github.com/arcan1s/arcanis.me.git
				synced 2025-10-27 11:53:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			204 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| ---
 | ||
| category: ru
 | ||
| type: paper
 | ||
| hastr: true
 | ||
| layout: paper
 | ||
| tags: archlinux, linux, сборка, qutim
 | ||
| title: Сборка Qutim с Qt5
 | ||
| short: building-qutim-using-qt5
 | ||
| description: Если кто-то не знает, <a href="http://qutim.org" title="Домашняя страница Qutim">Qutim</a> - мультипротокольный кросс-платформенный месседжер. Написан он на <code>CPP</code> с использованием библиотек Qt. Проект активно развивается. В этой статье речь пойдет о реализации сборки данного пакета в Archlinux с использованием библиотек Qt5 (а не Qt4, как это делают текущие пакеты в AUR).
 | ||
| ---
 | ||
| <h2><a href="#problems" class="anchor" name="problems"><span class="octicon octicon-link"></span></a>Что не так?</h2>
 | ||
| <p>Да все так. Просто пакет использует для сборки систему <a href="http://qt-project.org/wiki/qbs" title="Wiki">qbs</a>, которая, на мой взгляд, немного странная. Пакет, необходимый для сборки, <a href="https://aur.archlinux.org/packages/qbs-git/" title="AUR">находится в AUR</a> (рекомендую git-версию). Когда я спросил у Andrea Scarpino (который сопровождает все KDE и Qt пакеты в официальные репозитории) по поводу переноса этого пакета в репозитории, он ответил, что всему свое время. В принципе, я с ним согласен, так как проект, судя по всему, еще немного сыроват.</p>
 | ||
| 
 | ||
| <h2><a href="#prepare" class="anchor" name="prepare"><span class="octicon octicon-link"></span></a>Подготовка</h2>
 | ||
| <p>Установим зависимости. Что-то может быть пропустил, зависимости сканировал с использованием <code>namcap</code>:</p>
 | ||
| 
 | ||
| {% highlight bash %}
 | ||
| pacman -Sy --asdeps clang git libc++abi qt5-quick1 qt5-x11extras
 | ||
| yaourt -S --asdeps jreen-git qbs-git
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <h3><a href="#qbs" class="anchor" name="qbs"><span class="octicon octicon-link"></span></a>Настройка qbs</h3>
 | ||
| <p>Желающие могут почитать документацию <a href="http://qt-project.org/wiki/qbs" title="Wiki">по ссылке</a> или посмотреть примеры (включены в пакет). Загвоздка в том, что эта штука использует файл настроек, который, во-первых, нужно сначала сгенерировать, во-вторых, хранится в домашней директории (и только там). В теории, генерация файла настроек (<code>~/.config/QtProject/qbs.conf</code>) происходит следующим образом:</p>
 | ||
| 
 | ||
| {% highlight bash %}
 | ||
| qbs-setup-qt --detect
 | ||
| qbs-detect-toolchains
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <p>Сначала находим Qt для сборки, потом находим инструментарий (компиляторы, например). Дальше вставляем инструментарий (например, нам для Qutim нужен <code>clang</code>) в Qt, например, так:</p>
 | ||
| 
 | ||
| {% highlight bash %}
 | ||
| sed 's/clang\\/qt-5-2-0\\/g' -i ~/.config/QtProject/qbs.conf
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <p>Альтернативные варианты - править файл вручную или воспользоваться <code>qbs-config-ui</code> или <code>qbs-config</code> на Ваш выбор.</p>
 | ||
| <p>Так или иначе, нужный файл мы сгенерировали, сохраним его в будущей директории сборки:</p>
 | ||
| 
 | ||
| {% highlight ini %}
 | ||
| [General]
 | ||
| 
 | ||
| [Qt]
 | ||
| filedialog=
 | ||
| 
 | ||
| [profiles]
 | ||
| clang\cpp\compilerName=clang++
 | ||
| clang\cpp\toolchainInstallPath=/usr/bin
 | ||
| clang\qbs\architecture=x86_64
 | ||
| clang\qbs\endianness=little
 | ||
| clang\qbs\toolchain=clang, llvm, gcc
 | ||
| gcc\cpp\compilerName=g++
 | ||
| gcc\cpp\toolchainInstallPath=/usr/bin
 | ||
| gcc\qbs\architecture=x86_64
 | ||
| gcc\qbs\endianness=little
 | ||
| gcc\qbs\toolchain=gcc
 | ||
| qutim\Qt\core\binPath=/usr/lib/qt/bin
 | ||
| qutim\Qt\core\buildVariant=release
 | ||
| qutim\Qt\core\config=shared, qpa, no_mocdepend, release, qt_no_framework
 | ||
| qutim\Qt\core\docPath=/usr/share/doc/qt
 | ||
| qutim\Qt\core\incPath=/usr/include/qt
 | ||
| qutim\Qt\core\libInfix=
 | ||
| qutim\Qt\core\libPath=/usr/lib
 | ||
| qutim\Qt\core\mkspecPath=/usr/lib/qt/mkspecs/linux-g++
 | ||
| qutim\Qt\core\namespace=
 | ||
| qutim\Qt\core\pluginPath=/usr/lib/qt/plugins
 | ||
| qutim\Qt\core\qtConfig=minimal-config, small-config, medium-config, large-config, full-config, gtk2, gtkstyle, fontconfig, libudev, evdev, xlib, xcb-glx, xcb-xlib, xcb-sm, xrender, accessibility-atspi-bridge, linuxfb, c++11, accessibility, opengl, shared, qpa, reduce_exports, reduce_relocations, clock-gettime, clock-monotonic, mremap, getaddrinfo, ipv6ifname, getifaddrs, inotify, eventfd, system-jpeg, system-png, png, system-freetype, no-harfbuzz, system-zlib, nis, cups, iconv, glib, dbus, dbus-linked, openssl-linked, xcb, xinput2, alsa, pulseaudio, icu, concurrent, audio-backend, release
 | ||
| qutim\Qt\core\version=5.2.0
 | ||
| qutim\cpp\compilerName=clang++
 | ||
| qutim\cpp\toolchainInstallPath=/usr/bin
 | ||
| qutim\qbs\architecture=x86_64
 | ||
| qutim\qbs\endianness=little
 | ||
| qutim\qbs\toolchain=clang, llvm, gcc
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <p><a href="/resources/docs/qutim-qt5-git/qbs-qutim.conf" title="Файл" type="text/plain">qbs-qutim.conf</a></p>
 | ||
| 
 | ||
| <h3><a href="#patch" class="anchor" name="patch"><span class="octicon octicon-link"></span></a>Готовим патч для исходников</h3>
 | ||
| <p>Первая проблема - <code>clang</code> (по крайней мере, в Archlinux):</p>
 | ||
| 
 | ||
| {% highlight diff %}
 | ||
| diff -ruN qutim.orig/core/libqutim.qbs qutim/core/libqutim.qbs
 | ||
| --- qutim.orig/core/libqutim.qbs    2014-01-06 15:39:56.000000000 +0400
 | ||
| +++ qutim/core/libqutim.qbs 2014-01-06 15:44:54.502175067 +0400
 | ||
| @@ -75,7 +75,7 @@
 | ||
|          cpp.linkerFlags: {
 | ||
|              var flags = base;
 | ||
|              if (qbs.toolchain.contains("clang") && qbs.targetOS.contains("linux"))
 | ||
| -                flags = flags.concat("-stdlib=libc++ -lcxxrt");
 | ||
| +                flags = flags.concat("-lc++abi");
 | ||
|              return flags;
 | ||
|          }
 | ||
| 
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <p>И пофиксить сборку библиотеки для Vk:</p>
 | ||
| 
 | ||
| {% highlight diff %}
 | ||
| diff -ruN qutim.orig/protocols/vkontakte/vreen/vreen.qbs qutim/protocols/vkontakte/vreen/vreen.qbs
 | ||
| --- qutim.orig/protocols/vkontakte/vreen/vreen.qbs  2014-01-06 15:41:42.000000000 +0400
 | ||
| +++ qutim/protocols/vkontakte/vreen/vreen.qbs   2014-01-06 15:46:47.142178486 +0400
 | ||
| @@ -5,6 +5,7 @@
 | ||
|      property string vreen_qml_path: "bin"
 | ||
|      property string vreen_lib_path: "lib"
 | ||
|      property string vreen_libexec_path: "lib"
 | ||
| +    property string lib_path: "lib"
 | ||
| 
 | ||
|      property string vreen_version_major:  1
 | ||
|      property string vreen_version_minor: 9
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <p><a href="/resources/docs/qutim-qt5-git/qutim-qbs-1.1.patch" title="Файл" type="text/plain">qutim-qbs-1.1.patch</a></p>
 | ||
| 
 | ||
| <h3><a href="#sources" class="anchor" name="sources"><span class="octicon octicon-link"></span></a>Получаем исходники</h3>
 | ||
| 
 | ||
| {% highlight bash %}
 | ||
| # клонируем репозиторий
 | ||
| git clone https://github.com/euroelessar/qutim
 | ||
| # кладем файл настроек qbs
 | ||
| mkdir -p .config/QtProject
 | ||
| cp qbs-qutim.conf .config/QtProject/qbs.conf
 | ||
| # создаем директорию сборки
 | ||
| mkdir build
 | ||
| # обновляем подмодули
 | ||
| cd qutim
 | ||
| git submodule update --init --recursive
 | ||
| # патчим
 | ||
| cd ..
 | ||
| patch -p0 -i qutim-qbs-1.1.patch
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <h2><a href="#build" class="anchor" name="build"><span class="octicon octicon-link"></span></a>Сборка</h2>
 | ||
| 
 | ||
| {% highlight bash %}
 | ||
| cd qutim
 | ||
| HOME=$(pwd) qbs -j $(nproc) -d ../build release profile:qutim
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <p>Я пытался сделать универсальный способ сборки пакета, поэтому такое странное переназначение домашней директории. Флаг <code>-j</code> указывает число потоков сборки, флаг <code>-d</code> директорию сборки, <code>release</code> тип сборки (debug, release), <code>profile</code> используемый профиль, описанный в файле настроек.</p>
 | ||
| 
 | ||
| <h2><a href="#install" class="anchor" name="install"><span class="octicon octicon-link"></span></a>Установка</h2>
 | ||
| 
 | ||
| {% highlight bash %}
 | ||
| HOME=$(pwd) sudo qbs install -d ../build --install-root "/usr" profile:qutim
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <p>Из нового - указание корневого каталога (<code>--install-root</code>). Без этого пакет будет установлен в <code>/</code> (<code>/bin</code> и <code>/lib</code>).</p>
 | ||
| 
 | ||
| <h2><a href="#pkgbuild" class="anchor" name="pkgbuild"><span class="octicon octicon-link"></span></a>PKGBUILD</h2>
 | ||
| 
 | ||
| {% highlight bash %}
 | ||
| pkgname=qutim-qt5-git
 | ||
| _gitname=qutim
 | ||
| pkgver=v0.3.1.967.gc56d61e
 | ||
| pkgrel=1
 | ||
| pkgdesc="Multiplatform instant messenger (qt5 build). Git version"
 | ||
| arch=('i686' 'x86_64')
 | ||
| url="http://qutim.org"
 | ||
| license=('LGPL' 'GPL3')
 | ||
| depends=('jreen-git' 'libc++abi' 'qt5-quick1' 'qt5-x11extras')
 | ||
| makedepends=('clang' 'qbs')
 | ||
| conflicts=(qutim-0.2_ru-git, qutim-0.3-git, qutim-stable, qutim-git)
 | ||
| source=("${_gitname}::git+https://github.com/euroelessar/qutim.git"
 | ||
|         "qutim-qbs-1.1.patch"
 | ||
|         "qbs-qutim.conf")
 | ||
| md5sums=('SKIP'
 | ||
|          '12c30176729a5230ff7e6effbb1b37f8'
 | ||
|          '40f096b269eb00b040035591fce8e259')
 | ||
| 
 | ||
| pkgver() {
 | ||
|   cd "${_gitname}"
 | ||
|   git describe --always | sed 's|-|.|g'
 | ||
| }
 | ||
| 
 | ||
| prepare() {
 | ||
|   # FIXME: dirty hack
 | ||
|   mkdir -p "${srcdir}/.config/QtProject"
 | ||
|   cp "${srcdir}/qbs-qutim.conf" "${srcdir}/.config/QtProject/qbs.conf"
 | ||
|   # create build directory
 | ||
|   if [[ -d ${srcdir}/build ]]; then
 | ||
|     rm -rf "${srcdir}/build"
 | ||
|   fi
 | ||
|   mkdir "${srcdir}/build"
 | ||
| 
 | ||
|   cd "${_gitname}"
 | ||
|   # update modules
 | ||
|   git submodule update --init --recursive
 | ||
|   # fix qbs build
 | ||
|   cd ..
 | ||
|   patch -p0 -i "${srcdir}/qutim-qbs-1.1.patch"
 | ||
| }
 | ||
| 
 | ||
| build() {
 | ||
|   cd "${_gitname}"
 | ||
|   HOME="${srcdir}" qbs -j $(nproc) -d ../build release profile:qutim
 | ||
| }
 | ||
| 
 | ||
| package() {
 | ||
|   cd "${srcdir}/${_gitname}"
 | ||
|   HOME="${srcdir}" qbs install -d ../build --install-root "${pkgdir}/usr" profile:qutim
 | ||
| }
 | ||
| {% endhighlight %}
 | ||
| 
 | ||
| <p><a href="/resources/docs/qutim-qt5-git/PKGBUILD" title="Файл" type="text/plain">PKGBUILD</a></p>
 |