Qt5のインストール

GUIライブラリーであるQt5をソースコードからインストールする。

QtはKDEのライブラリーとして,Linux黎明期からオープンソースの世界で使われている歴史の長いクロスプラットフォームのライブラリーだ。Qtを使うことで,Windows, Linux, Macのデスクトップと,Android, iOSなどのモバイル環境にも対応可能なアプリケーションを開発できる。

インストール手順

インストール情報
項目 説明
配布元 Qt | Cross-platform software development for embedded & desktop
リポジトリー qt/qt5.git – Qt5 super module
手順
依存情報
依存先 (必須)
  • Make (GNU Make), Perl 5.14+, Python 2.7+, C++ (C++11) compiler, Git 1.6.x+
  • Linux: xcb 1.8.1+
依存先 (任意) Documentation: Clang 6.x+
SSL: OpenSSL
Webkit: bison, flex, gperf, Ruby, ICU
ccache
依存元
インストール手順
sh -eux <<-"EOT"
PKG=qt5 VER=5.12.4 TAG=v$VER
LOCAL=~/.local J=$(grep -cs '^processor' /proc/cpuinfo || echo 2)
mkdir -p "$LOCAL/src"
cd "$LOCAL/src"

if command -v git >/dev/null; then
  [ -e $PKG ] || git clone --depth 1 git://code.qt.io/qt/qt5.git $PKG
  cd $PKG
  git fetch --depth 1 origin tag $TAG
  git checkout -f $TAG
  ## status (addon, deprecated, essential, ignore) の全取得
  # for status in $(git config -f .gitmodules --get-regexp status | sort -uk 2 | cut -d ' ' -f 2 ); do
  # for status in essential addon; do
  # for status in essential; do # qtbase, qtdeclarative, qtmultimedia, qttools, qttranslations, qtdoc, qtrepotools, qtqa, qtquickcontrols2
  #  git submodule update --init --depth 1 --progress $(
  #    git config -f .gitmodules --get-regexp status $status | cut -d . -f 2
  #  )
  # done
  for module in qtbase; do
git submodule update --init --depth 1 --progress $module
done
git clean -dfX [ -e .gitmodules ] && git submodule foreach --recursive git clean -dfX [ -e configure.ac ] && autoreconf -is else [ -e $PKG-$VER ] || wget http://download.qt.io/archive/qt/${VER%.*}/$VER/single/qt-everywhere-src-$VER.tar.xz
tar -xf $PKG-$VER.* cd $PKG-$VER make -kj $J distclean clean || : fi
CCACHE=$(command -v ccache >/dev/null && echo -ccache) ./configure --prefix="$LOCAL/stow/$PKG-$VER/qt5" \ -opensource -confirm-license $CCACHE -developer-build -no-compile-examples -nomake examples \
QMAKE_LIBS+="-lxcb-shm" make -j $J # make -j $J TZ= LANG=en_US.UTF-8 check make -j $J install cd "$LOCAL/stow" echo $PKG-[0-9]* | xargs -n 1 stow --ignore=dir -D stow --ignore=dir $PKG-$VER EOT
インストール例
日付 バージョン OS 依存関係
2019-07-15 5.12.4 Ubuntu 18.04 GNU Make 4.2.1, GCC 7.4.0, XCB 1.13.1

Qtのconfigureは,前回の結果をconfig.cacheとしてキャッシュしているので,ビルドオプションを変更する場合,config.cacheを削除する必要があることに注意する。

また,make checkのテストはネットワーク用のテストサーバーの設置などがうまくいかないために成功しておらず,品質を保証できないので注意する。

インストール先とパス変数設定

Qt5のディレクトリー構成は,直下にdoc, mkspecs, pluginsがあるなど,FHSと異なっていたので,$LOCAL/qt5にリンクされるようにインストール先を指定した。

そのため,インストールしたQtのライブラリーやqmakeなどのコマンドを使用する際は以下の環境変数を~/.profile~/.bashrcに記入して,パスを通しておく。

QT_HOME="$LOCAL/qt5"
if [ -d "$QT_HOME" ]; then
  export QT_HOME
  export PATH="$QT_HOME/bin:$PATH"
  export CPATH="$QT_HOME/include:$CPATH"
  export LD_LIBRARY_PATH="$QT_HOME/lib:$LD_LIBRARY_PATH"
  export LIBRARY_PATH="$LD_LIBRARY_PATH"
  export PKG_CONFIG_PATH="$QT_HOME/lib/pkgconfig:$PKG_CONFIG_PATH"
fi

ソースコードのダウンロード

Qt5は大量のサブモジュールから構成されている。

Qt Wikiの情報では,Perl製のinit-repositoryスクリプトを使ったソースコードのダウンロードを推奨している。しかし,init-repositoryを使う場合,使わないサブモジュールをダウンロードしてしまったり,サブモジュールの全履歴をダウンロードするため,ダウンロードに時間がかかるという欠点がある。

そこで,init-repositoryで内部で行っているサブモジュールのダウンロードをgitで直接行う。

init-repositoryは.gitmodulesの内容を参照し,カテゴリーごとのQtのモジュールをダウンロードしている。

Qtのモジュールは大きくEssentialとAddonのカテゴリーに分類されている。その他にも,廃止予定のdeprecatedとignoreというカテゴリーも存在する。

以下のコードで,Qtのモジュールのステータス (addon, deprecated, essential, ignore) のリストを取得できる。

git config -f .gitmodules --get-regexp status | sort -uk 2 | cut -d ' ' -f 2
addon
deprecated
essential
ignore

このステータスに属しているモジュールのリストは以下のコードで取得できる。

status=essential
git config -f .gitmodules --get-regexp status $status | cut -d . -f 2
qtbase
qtdeclarative
qtmultimedia
qttools
qttranslations
qtdoc
qtrepotools
qtqa
qtquickcontrols2

この2種類のコードを組み合わせて,for文で該当のステータスのサブモジュールをダウンロードできる。

  ## status (addon, deprecated, essential, ignore) の全取得
  # for status in $(git config -f .gitmodules --get-regexp status | sort -uk 2 | cut -d ' ' -f 2 ); do
  # for status in essential addon; do
  for status in essential; do # qtbase, qtdeclarative, qtmultimedia, qttools, qttranslations, qtdoc, qtrepotools, qtqa, qtquickcontrols2
     git submodule update --init --depth 1 --progress $(
       git config -f .gitmodules --get-regexp status $status | cut -d . -f 2
     )
  done

–depth 1を指定することで,サブモジュールのダウンロードが最小限で済んでいる。これにより,ダウンロードデータと速度を従来の1/10程度に抑えることができる。

しかし,essentialのモジュールでもまだ数が多い。今回はQt Widgetsでの開発に必要なqtbaseのサブモジュールのみをダウンロード・ビルドすることにする。今後,必要なモジュールが増えたら,以下のfor文のビルド対象リポジトリーを増やして対応する。

  for module in qtbase; do
git submodule update --init --depth 1 --progress $module
done

ビルドオプション

ビルドオプションがいくつもあるので,今回指定したものを説明する。

Qt5のビルドオプション
オプション 説明
-opensource ライセンスにLGPL版を指定。指定しないと質問される。
-confirm-license ライセンスに同意。指定しないと質問される。
-ccache コンパイルにccacheを使う。Qtをソースコードからビルドする場面は,カスタマイズやクロスコンパイルが想定され,複数回のビルドが予想されるからだ。
-developer-build 開発用ビルドを行う。デバッグシンボルを埋め込み,-make tests相当を追加指定。Qt本体のバグの検証やmake checkのテスト時のバグ検知を増やすため推奨。
-nocompile-examples サンプルプログラムをビルドしない。-nomake examplesだけで十分かと思ったが,これも指定しないとqtbase/examples配下などがビルドされる。
-nomake examples ビルド対象からexamplesを除外。
QMAKE_LIBS+=”-lxcb-shm” ビルド時に-lxcb-shmをリンク。Linux版のビルドで自前XCB使用時に必要。

-opensource -confirm-license -ccache -nocompile-examples -nomake examplesは,共通オプションとして常に指定したらいいと個人的に思う。

Qtのサンプルは数が多いので,必要な場面でサンプルのディレクトリー配下で個別にビルドするのが効率がいい。

-nocompile-examplesはWikiなどでの言及がないものの,これを指定しないとexamplesがビルドされてしまっていたので,-nomake examplesとセットで指定が必要だと感じた。

-developer-build -nomake examplesの指定により,ビルド対象部はlibs tests toolsとなっている。今回は,結局ネットワーク関係のテストが失敗するので,テストを飛ばす。しかし,本来であれば,付属のテストをきっちりこなし,ライブラリー本体のビルドがないことを保証すべきなので,testsをビルド対象に含めている。

QMAKE_LIBSに関しては次の節で指定した経緯を説明する。

この他にビルドオプションとして候補となるのが,-staticだ。Qtのライブラリーを開発したライブラリーに静的リンクするための静的ライブラリーをビルドする際に指定する。Qtのインストーラーでは,静的ライブラリは同梱されないので,静的ライブラリの用意はソースコードからのビルドの一つの目的だろう。

ただし,ビルド後のライブラリー類のサイズが100 GB程度まで膨れ上がり,作業マシンのストレージの容量を超過するため,今回は-staticは指定しなかった。ストレージに余裕があれば,是非-staticを指定してビルドしたい。

libxcb-shmのリンク

ビルドオプションにQMAKE_LIBS+="-lxcb-shm"を指定して,XCBに含まれるxcb-shmのライブラリーをリンクするように指定している。

これは,ビルドのリンク時の-lxcb-shmが見つからないとのビルドエラーの回避のために必要だ。

Qt本体はOSのxcbを使う場合にしか,xcb-shmをリンクするようになっておらず,自前のXCBを使う標準的な方法がなかった。そのため,qmakeの変数で無理やりリンクライブラリーの指定を渡すことにした。

この変数の指定は試行錯誤の結果だ。以下でこの変数を指定するまでの経緯を説明する。

当初は,XCB関係のライブラリー無しでビルドしていた。makeはうまくいったものの,make checkで以下のエラーが出た。

make[6]: Entering directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/kernel/qpointer'
/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/kernel/qpointer/target_wrapper.sh  ./tst_qpointer 
qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in ""
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc.

make[6]: *** [Makefile:813: check] Aborted (core dumped)
make[6]: Leaving directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/kernel/qpointer'

調べたところ,/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.soが必要らしい。

XCB環境向けにビルドが有効になっていなかったのが原因の模様。qtbase/plugins/platforms/配下にplatform向けのsoができるのだが,ここにlibqxcb.soができていないのが原因のようだ。依存関係が足りていない。

config.summaryでX11 specifigがyesになっていないとビルドされないようだ。

Features used by QPA backends:
  evdev .................................. yes
  libinput ............................... no
  INTEGRITY HID .......................... no
  mtdev .................................. no
  tslib .................................. no
  xkbcommon .............................. yes
  X11 specific:
    XLib ................................. yes
    XCB Xlib ............................. yes
    EGL on X11 ........................... yes

X11 specificがyesになるように,事前にXCBをインストールしておく。

XCBをインストールして,上記のconfig.summaryの状態になった状態でビルドするとlibqxcb.soのビルドで以下のビルドエラーが出た。

make[6]: Leaving directory '/home/senooken/.local/src/qt5/qtbase/src/plugins/platforms/xcb/xcb-static'
( test -e Makefile.xcb_qpa_lib || /home/senooken/.local/src/qt5/qtbase/bin/qmake -o Makefile.xcb_qpa_lib /home/senooken/.local/src/qt5/qtbase/src/plugins/platforms/xcb/xcb_qpa_lib.pro ) && make -f Makefile.xcb_qpa_lib
make[6]: Entering directory '/home/senooken/.local/src/qt5/qtbase/src/plugins/platforms/xcb'
rm -f libQt5XcbQpa.so.5.12.4 libQt5XcbQpa.so libQt5XcbQpa.so.5 libQt5XcbQpa.so.5.12
g++ -Wl,--no-undefined -Wl,--version-script,QtXcbQpa.version -Wl,-O1 -fuse-ld=gold -Wl,--enable-new-dtags -Wl,-z,origin -Wl,-rpath,\$ORIGIN -shared -Wl,-Bsymbolic-functions -Wl,-soname,libQt5XcbQpa.so.5 -o libQt5XcbQpa.so.5.12.4 .obj/qxcbclipboard.o .obj/qxcbconnection.o .obj/qxcbintegration.o .obj/qxcbkeyboard.o .obj/qxcbmime.o .obj/qxcbscreen.o .obj/qxcbwindow.o .obj/qxcbbackingstore.o .obj/qxcbwmsupport.o .obj/qxcbnativeinterface.o .obj/qxcbcursor.o .obj/qxcbimage.o .obj/qxcbxsettings.o .obj/qxcbsystemtraytracker.o .obj/qxcbeventqueue.o .obj/qxcbeventdispatcher.o .obj/qxcbconnection_basic.o .obj/qxcbconnection_screens.o .obj/qxcbatom.o .obj/qxcbdrag.o .obj/qxcbconnection_xi2.o .obj/qxcbsessionmanager.o .obj/qxcbglintegrationfactory.o .obj/qxcbglintegration.o .obj/qxcbnativeinterfacehandler.o .obj/qtessellator.o .obj/qpixmap_x11.o .obj/qpaintengine_x11.o .obj/qcolormap_x11.o .obj/qbackingstore_x11.o .obj/qxcbnativepainting.o .obj/moc_qxcbclipboard.o .obj/moc_qxcbconnection.o .obj/moc_qxcbmime.o .obj/moc_qxcbnativeinterface.o .obj/moc_qxcbsystemtraytracker.o .obj/moc_qxcbeventqueue.o .obj/moc_qxcbeventdispatcher.o .obj/moc_qxcbconnection_basic.o .obj/moc_qxcbglintegrationplugin.o  /home/senooken/.local/src/qt5/qtbase/lib/libQt5ServiceSupport.a /home/senooken/.local/src/qt5/qtbase/lib/libQt5ThemeSupport.a /home/senooken/.local/src/qt5/qtbase/lib/libQt5FontDatabaseSupport.a /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libfontconfig.so /usr/lib/x86_64-linux-gnu/libfreetype.so /home/senooken/.local/lib/libz.so /home/senooken/.local/src/qt5/qtbase/lib/libQt5Gui.so /home/senooken/.local/src/qt5/qtbase/lib/libQt5EdidSupport.a /home/senooken/.local/src/qt5/qtbase/lib/libQt5DBus.so /home/senooken/.local/src/qt5/qtbase/lib/libQt5Core.so -lpthread /usr/lib/x86_64-linux-gnu/libX11-xcb.so /home/senooken/.local/stow/libxcb-1.13.1/lib/libxcb.so /usr/lib/x86_64-linux-gnu/libXrender.so /usr/lib/x86_64-linux-gnu/libXext.so /usr/lib/x86_64-linux-gnu/libX11.so /usr/lib/x86_64-linux-gnu/libm.so /usr/lib/x86_64-linux-gnu/libSM.so /usr/lib/x86_64-linux-gnu/libICE.so /home/senooken/.local/src/qt5/qtbase/lib/libxcb-static.a /home/senooken/.local/stow/libxkbcommon-0.8.4/lib/libxkbcommon-x11.so /home/senooken/.local/stow/libxkbcommon-0.8.4/lib/libxkbcommon.so /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libgthread-2.0.so /usr/lib/x86_64-linux-gnu/libglib-2.0.so /usr/lib/x86_64-linux-gnu/libfreetype.so /home/senooken/.local/lib/libz.so
.obj/qxcbbackingstore.o:qxcbbackingstore.cpp:function QXcbBackingStoreImage::createShmSegment(unsigned long): error: undefined reference to 'xcb_shm_create_segment'
.obj/qxcbbackingstore.o:qxcbbackingstore.cpp:function QXcbBackingStoreImage::createShmSegment(unsigned long): error: undefined reference to 'xcb_shm_create_segment_reply'
.obj/qxcbbackingstore.o:qxcbbackingstore.cpp:function QXcbBackingStoreImage::createShmSegment(unsigned long): error: undefined reference to 'xcb_shm_create_segment_reply_fds'
collect2: error: ld returned 1 exit status

リンク時に,-lxcb-shmが抜けている。

Makefileを追いかけて特定する。qt5リポジトリーのMakefileをみると,qtbaseに移動してqmakeを実行,

cd qtbase
./bin/qmake -o Makefile qtbase.pro
make -j $J qmake_all

ag libxcb-shmで検索すると,qtbase/src/plugins/platforms/xcb/xcb-static/xcb-static.proがヒットする。このファイルでxcb関係のビルドを設定しているらしい。

qtbase/src/gui/configure.json:651:                { "type": "pkgConfig", "args": "xcb-shm" },
qtbase/src/gui/configure.json:652:                "-lxcb-shm"
qtbase/src/plugins/platforms/xcb/xcb-static/xcb-static.pro:3:# libxcb-fixes, libxcb-randr, libxcb-shm, libxcb-sync, libxcb-image,

configure.jsonで設定を判定しているようだ。ここの設定を追いかけて,xcb-shmが有効になるように試みる。

設定の依存関係が以下となっている。

xcb_shm --> xcb_image
xcb_shm --> xcb_syslibs
xcb_image --> xcb_syslibs
xcb_syslibs --> system-xcb

結局,OSのxcbであるxcb_syslibsが必要になる。

これはでは実現不可能なため,別の方法でビルドオプションを渡す。

configure –helpを見ると,_LIBS変数で変数を渡せるらしい。試しに,以下の変数をconfigure実行時に指定してみるが,変化がない。

XCB_SHM_LIBS="-lxcb-shm"

どうにかして-lxcb-shmをビルドオプションにねじ込む。ビルド時のログから,該当のMakefileを探す。

make[5]: Entering directory '/home/senooken/.local/src/qt5/qtbase/src/plugins/platforms/xcb'

以下のファイルがlibqxcb.soビルドに使っているMakefileだ。

qtbase/src/plugins/platforms/xcb/Makefile:115:    $(MAKE) -f Makefile.xcb-plugin qmake_all

さらに,ポイントを絞るとMakefile.xcb-pluginのようだ。ただし,このMakefileはxcb-plugin.proからqmakeで生成されている。

そこで,qmakeの変数でビルドオプションを渡せないか試す。

./configure --prefix="$LOCAL/stow/$PKG-$VER" \
  -opensource -confirm-license -nomake examples -make tests QMAKE_CXXFLAGS+="-lxcb-shm"

QMAKE_CXXFLAGS+="-lxcb-shm"だと届かない。CXX_FLAGSではなく,QMAKE_LIBSでやる。

./configure --prefix="$LOCAL/stow/$PKG-$VER" \
  -opensource -confirm-license -nomake examples -make tests QMAKE_LIBS+="-lxcb-shm"

これで無事にビルドが通った。

make checkのエラー

Qtのビルドが成功しているかの確認として,make checkを実行した。残念ながら,現時点では全てのテストに合格できていない。

ここではmake checkで発生したエラーとその対応を記す。

TZ環境変数

TZ環境変数 (TZ=-9) が存在すると,QDateTimeで以下のエラーが出た。

make[6]: Entering directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/tools/qdatetime'
/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/tools/qdatetime/target_wrapper.sh  ./tst_qdatetime 
********* Start testing of tst_QDateTime *********
Config: Using QtTest library 5.12.4, Qt 5.12.4 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 7.4.0)
QDEBUG : tst_QDateTime::initTestCase() Current local time detected to be ahead of UTC but isn't the Central European timezone
...
FAIL! : tst_QDateTime::toString_textDate_extra() Compared values are not the same Actual (dt.toString()) : "Thu Jan 1 09:00:00 1970" Expected (QLatin1String("Thu Jan 1 00:00:00 1970")): "Thu Jan 1 00:00:00 1970" Loc: [tst_qdatetime.cpp(925)]
...
Totals: 447 passed, 1 failed, 32 skipped, 0 blacklisted, 61ms ********* Finished testing of tst_QDateTime ********* make[6]: *** [Makefile:630: check] Error 1 make[6]: Leaving directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/tools/qdatetime'

TZ=UTC-0に指定すると,今度は違うエラーが出た。

make[6]: Entering directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/tools/qtimezone'
/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/tools/qtimezone/target_wrapper.sh  ./tst_qtimezone 
********* Start testing of tst_QTimeZone *********
Config: Using QtTest library 5.12.4, Qt 5.12.4 (x86_64-little_endian-lp64 shared (dynamic) debug build; by GCC 7.4.0)
PASS   : tst_QTimeZone::initTestCase()
...
FAIL! : tst_QTimeZone::tzTest() 'tzpd.isValid()' returned FALSE. () Loc: [tst_qtimezone.cpp(909)] ...
Totals: 1037 passed, 1 failed, 1 skipped, 0 blacklisted, 386ms ********* Finished testing of tst_QTimeZone ********* make[6]: *** [Makefile:639: check] Error 1 make[6]: Leaving directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/tools/qtimezone'

どうやらTZ環境変数が存在するとこのテストは失敗するようだった。

そこで,make実行時にTZ環境変数を空にすることで,テストが通るようになった。

make -j $J TZ= LANG=en_US.UTF-8 check
LANG環境変数

LANG=ja_JP.UTF-8の環境変数が設定されている状態で,QFontDatabaseで以下のエラーが出ていた。

make[6]: Entering directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/gui/text/qfontdatabase'
/home/senooken/.local/src/qt5/qtbase/tests/auto/gui/text/qfontdatabase/target_wrapper.sh  ./tst_qfontdatabase 
********* Start testing of tst_QFontDatabase *********
Config: Using QtTest library 5.12.4, Qt 5.12.4 (x86_64-little_endian-lp64 shared (dynamic) debug build; by GCC 7.4.0)

...
FAIL! : tst_QFontDatabase::systemFixedFont() 'fdbSaysFixed' returned FALSE. () Loc: [tst_qfontdatabase.cpp(168)] ...
Totals: 15 passed, 1 failed, 8 skipped, 0 blacklisted, 291ms ********* Finished testing of tst_QFontDatabase ********* make[6]: *** [Makefile:646: check] Error 1 make[6]: Leaving directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/gui/text/qfontdatabase'
void tst_QFontDatabase::systemFixedFont() // QTBUG-54623
{
    QFont font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
    QFontInfo fontInfo(font);
    bool fdbSaysFixed = QFontDatabase().isFixedPitch(fontInfo.family(), fontInfo.styleName());
    qCDebug(lcTests) << "system fixed font is" << font << "really fixed?" << fdbSaysFixed << fontInfo.fixedPitch();
    QVERIFY(fdbSaysFixed);
    QVERIFY(fontInfo.fixedPitch());
}

この関数の返却値を見ているようだ。ここのfontInfo.family()とfontInfo.styleName()が以下の値となっていた。

QDEBUG : tst_QFontDatabase::systemFixedFont() "Takaoゴシック" ,  "Regular"

日本語だから問題が起きているのだろうか。make LC_ALL=C checkだと通った。

ただ,今度は別のテストでエラーが出てしまった。

make[6]: Entering directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/io/qtemporarydir'
/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/io/qtemporarydir/target_wrapper.sh  ./tst_qtemporarydir 
********* Start testing of tst_QTemporaryDir *********
Config: Using QtTest library 5.12.4, Qt 5.12.4 (x86_64-little_endian-lp64 shared (dynamic) debug build; by GCC 7.4.0)
...
FAIL! : tst_QTemporaryDir::QTBUG_4796(<unicode>XXXXXX) 'fileName1.startsWith(prefix)' returned FALSE. () Loc: [tst_qtemporarydir.cpp(485)] ...
Totals: 29 passed, 1 failed, 0 skipped, 0 blacklisted, 83ms ********* Finished testing of tst_QTemporaryDir ********* make[6]: *** [Makefile:640: check] Error 1 make[6]: Leaving directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/corelib/io/qtemporarydir'

LC_ALL=Cはまずいようで,LANG=en_US.UTF-8だとOKだった。そこで,make check実行時にLANG=en_US.UTF-8を指定する。

make -j $J TZ= LANG=en_US.UTF-8 check
qt-test-server

QHttpNetworkConnectionのテストが失敗した。

make[6]: Entering directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/network/access/qhttpnetworkconnection'
/home/senooken/.local/src/qt5/qtbase/tests/auto/network/access/qhttpnetworkconnection/target_wrapper.sh  ./tst_qhttpnetworkconnection 
********* Start testing of tst_QHttpNetworkConnection *********
Config: Using QtTest library 5.12.4, Qt 5.12.4 (x86_64-little_endian-lp64 shared (dynamic) debug build; by GCC 7.4.0)
QWARN  : tst_QHttpNetworkConnection::initTestCase() Could not lookup "qt-test-server.qt-test-net"
QWARN  : tst_QHttpNetworkConnection::initTestCase() Please configure the test environment!
QWARN  : tst_QHttpNetworkConnection::initTestCase() See /etc/hosts or network-settings.h
FAIL!  : tst_QHttpNetworkConnection::initTestCase() 'QtNetworkSettings::verifyTestNetworkSettings()' returned FALSE. ()
   Loc: [tst_qhttpnetworkconnection.cpp(104)]
PASS   : tst_QHttpNetworkConnection::cleanupTestCase()
Totals: 1 passed, 1 failed, 0 skipped, 0 blacklisted, 12ms
********* Finished testing of tst_QHttpNetworkConnection *********
make[6]: *** [Makefile:639: check] Error 1
make[6]: Leaving directory '/home/senooken/.local/src/qt5/qtbase/tests/auto/network/access/qhttpnetworkconnection'

エラー内容 (Could not lookup “qt-test-server.qt-test-net”) からして,テストサーバーが必要なようだ。

テストサーバーに関しては,「qt-test-serverのインストール」でqt-test-serverをインストールすることで,QHttpNetworkConnectionのテストは合格した。

しかし,QNetworkReplyのテストが突破できず,make checkのエラーの対応を断念した。

動作確認

ビルドができたので最低限の動作を確認する。パス環境変数の設定を忘れずに行っておく。

git clone --depth 1 https://github.com/senooken/QtExample
cd QtExample/Hello
qmake
make
./main.exe

Helloと書かれた小さなウィンドウが表示されれば,今回ビルドしたQt5はひとまず動作することが確認できる。

結論

Qt5のソースコードからのビルド手順を記した。

なんとか動作するビルドができたが,make checkでのエラーを解消できなかった。特に,ネットワークのサーバー構築周りは知識が不足しており,現時点で対応するのが難しい。また,staticビルドも試したかったが,ストレージ容量が足りず,断念した。

今後状況が整い次第,再ビルドし,状況に変化があれば随時追記していく。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です