CentOS 5をプログラミング環境で使う

C++ GUIツールキットQt 4.xを入れる

はじめに

Qt 4.xをCentOS 5に設定します。

2009年6月27日現在、Qt 4.5.2が最新リリースです。

CentOS 5で標準パッケージングされているGUIツールキットQtのバージョンは3.3.6です。また、Qt4.2.1も別途yumでインストールできますが、Qtの最新版は4.5ですので、ここはQt4.5を入れることを目標にしています。

Qtのライセンス

Qtは、大半のLinuxディストリビューションに標準で含まれています。しかし、ライセンスは少々複雑です。Qtは、商用ライセンス/オープンソースライセンスのデュアル・ライセンスを採用しています。オープンソースライセンスのQtを使用する場合、GPLまたはLGPLの選択ができます(Ver.4.5より前のバージョンではGPLのみ選択可能)。GPLを選択した場合、GPLのQtを使用したアプリケーション・プログラムはGPLが適用されることになります。LGPLのQtを使用したアプリケーション・プログラムは、LGPLと互換性のあるライセンスを選択可能です。

インストール

Qt 4.5 をインストールする方法はいくつか考えられます。

(1) バイナリパッケージの検索

RedHat Enterprise Linux 5用にQt 4.3.5のバイナリパッケージを提供しているサイトがありました。

ただし、Qt以外にもCentOS 5に含まれるパッケージとバージョン違いのためにQtが依存するパッケージをalcanceから入れることになります。

(2) ソースファイルからビルドしてインストールする

Trolltechのサイトから、オープンソース版のソースを入手し、ビルドします。

(3) ソースファイルからRPMパッケージを作成してインストールする

Qt4のソースRPM入手と展開

CentOSの標準パッケージ qt4-4.2.1-1から作ろうとしましたが、バージョンが違うため手間がかかります。ちょうどFedora 12(development)のパッケージに、qt-4.5.2があるので、このFedoraのソースRPMパッケージから作成することにしました。

展開すると、以下のファイルが含まれています。

work$ mkdir qt4-srpm
work$ cd qt4-srpm
qt4-srpm$ rpm2cpio /tmp/qt-4.5.2-2.fc12.src.rpm
    :   
qt4-srpm$ ls
Trolltech.conf                         qt-x11-opensource-src-4.2.2-multilib-QMAKEPATH.patch
assistant.desktop                      qt-x11-opensource-src-4.2.2-multilib-optflags.patch
designer.desktop                       qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm.patch
gstreamer-logo.svg                     qt-x11-opensource-src-4.5.0-gcc_hack.patch
hi128-app-qt4-logo.png                 qt-x11-opensource-src-4.5.0-qdoc3.patch
hi48-app-qt4-logo.png                  qt-x11-opensource-src-4.5.1-enable_ft_lcdfilter.patch
linguist.desktop                       qt-x11-opensource-src-4.5.1-kde4_plugins.patch                  
phonon-4.2.96-pluseaudio.patch         qt-x11-opensource-src-4.5.1-mysql_config.patch
qconfig-multilib.h                     qt-x11-opensource-src-4.5.1-phonon.patch
qt-4.5-sparc64.patch                   qt-x11-opensource-src-4.5.2.tar.bz2
qt-all-opensource-src-4.4.0-rc1-as_IN-437440.patch      qt.spec       
qt-copy-20080626-qt452.patch                            qtconfig.desktop
qt-copy-patches-20090626svn.tar.bz2                     qtdemo.desktop                      
qt-copy-patches-svn_checkout.sh        
qt4-srpm$ 

展開されたファイルのうち、qt.specを、RPMビルド作業用の~/rpm/SPECSへコピーし、それ以外のファイルは~/rpm/SOURCESへコピーします。

問題解決

流用するファイルの選択と修正

Fedora用のソースRPMのファイルのうち、使用するものとCentOS用に修正する内容をまとめます。

qt.specファイルの修正

Fedora12(開発中)のqt-4.5.2に含まれれるqt.specは、RHEL 5を考慮して記述されているので、修正なしでこのままビルド可能ですが、ビルド後インストールするとき、phonon pluginが依存関係解決できなかったので、以下の修正を加えました。

SPECファイル修正に伴いリリース番号を増加する

SPECファイルを修正するので、リリース番号を1増やし、またビルド時にコマンドラインでdistに.el5を追加します。

-Release: 2%{?dist}
+Release: 3%{?dist}
phonon関係はビルドしない

KDEが鋭意開発している、サウンド共通APIがphononですが、まだ利用には敷居が高く、CentOS 5.xでは外しておきます。

-%define phonon -phonon
-%define phonon_backend -phonon-backend
+%define phonon -no-phonon
+%define phonon_backend -no-phonon-backend
phonon関係パッケージは生成しない
+%if "%{?phonon_backend}" == "-phonon-backend"
 %package -n phonon-backend-gstreamer
 Summary: Gstreamer phonon backend
 Group:   Applications/Multimedia
  :中略
 Provides:  %{name}-backend-gst = %{phonon_version}-%{phonon_release}
 %description -n phonon-backend-gstreamer
 %{summary}.
+%endif
phononマクロ定義の条件判定の不整合を解消

phononマクロは、"-phonon"か"-no-phonon"のどちらかが値として設定されているので、%if 0%{?phonon:1}は必ず1となって条件が成立してしまう。複数個所にこの条件マクロが登場するので修正。

-%if 0%{?phonon:1}
+%if "%{?phonon}" == "-phonon"
webkitマクロ定義の条件判定の不整合を解消

webkitマクロは、"-webkit"か"-no-webkit"のどちらかが値として設定されているので、%if 0%{?webkit:1}は必ず1となって条件が成立してしてまう。複数個所に以下のパターンで登場するので修正。

-%if 0%{?webkit:1}
+%if "%{?webkit}" == "-webkit"
-%{?webkit:%{_qt4_libdir}/libQtWebKit.so.*}
+%if "%{?webkit}" == "-webkit"
+%{_qt4_libdir}/libQtWebKit.so.*
+%endif
changelogは書きましょう
 %changelog
+* Sun Jun 28 2009 Toru Takahashi <torutk@gmail.com> - 4.5.2-3
+- fix condition macro for phonon and phonon-backend
+- fix condition macro for webkit

トラブルシュート

Qt 4.5.1/4.5.2のインストールで発生したトラブル

qt4-4.5.1/4.5.2のqt4-x11パッケージをインストールすると依存関係の欠如エラー
エラー: 依存性の欠如:
        phonon-backend >= 4.3 は qt4-x11-4.5.2-2.i386 に必要とされています

fedora 12のパッケージにはphononがありますが、これをビルドするには、CentOSにはないパッケージやCentOSのパッケージより新しいバージョンが必要であったりと厳しい状況です。phononはあきらめてqtをビルドするのがよいようです。

Qt 4.5.1のビルドで発生したトラブル

GraphicsMagickパッケージがない

rpmbuildを実行するとすぐにこのエラーが発生します。CentOS 5には、GraphicsMagickパッケージは用意されていないので、別途インストールします。CentOS 5用バイナリパッケージのページにGraphicsMagickパッケージの作成について記述しているので、そちらの手順で作成し、インストールして回避します。

SQLiteの関数が定義されていない

Qt.4.5.0での対処と同じ。

Qt 4.5.0のビルドで発生したトラブル

コンパイルエラー"'sqlite3_column_value' was not declared in this scope"

src/3rdparty/webkit/WebCore/platform/sql/SQLiteStatement.cpp のコンパイルで関数sqlite3_column_valueが見つからずエラーが発生します。sqlite-develパッケージの提供するsqlite3.hは、CentOS 5に標準搭載されているsqlite3のバージョン3.3.6ではこの関数が公開されていないためです。2009年3月16日現在でsqlite3の最新版は3.6.11です。

回避策1) WebKitをビルドしない

せっかくの新機能なので入れたいのが人情ですが、涙を呑んで外します。

qt.specを修正します。

-%define webkit -webkit
+%define webkit -no-webkit

回避策2)sqlite3のバージョンアップ

SQLiteパッケージを最新に作り直します。CentOS 5用バイナリパッケージのページにSQLite3パッケージの作成について記述しているので、そちらの手順で最新版(3.6.11)をインストールします。

rpmbuildでビルド

rpmbuildコマンドでビルドします。

~$ cd ~/rpm/SPECS
SPECS$ rpmbuild -ba --define="dist .el5" qt.spec
    : (数時間後)
SPECS$

生成されたRPMバイナリパッケージは以下です。

SPECS$ cd ../RPMS/i386
i386$ ls qt4*
qt4-4.5.2-3.el5.i386.rpm            qt4-examples-4.5.2-3.el5.i386.rpm
qt4-debuginfo-4.5.2-3.el5.i386.rpm  qt4-mysql-4.5.2-3.el5.i386.rpm
qt4-demos-4.5.2-3.el5.i386.rpm      qt4-odbc-4.5.2-3.el5.i386.rpm
qt4-devel-4.5.2-3.el5.i386.rpm      qt4-postgresql-4.5.2-3.el5.i386.rpm
qt4-doc-4.5.2-3.el5.i386.rpm        qt4-x11-4.5.2-3.el5.i386.rpm
i386$