遅まきながら、「艦隊これくしょん~艦これ~ - オンラインゲーム - DMM.com」と言うゲームを始めました。
このゲーム、flash が必須になっているのでiPhoneでやることができません。でも、運営がdmmと言うこともあって、職場からはアクセスしずらい・・・。
そして、私が持っているMacBook Proは蓋が閉じているとリモートアクセスできないと言う謎仕様なので、リモートでやることができません。
うちで常時起動しているのはFreeBSD8のサーバだけ。
ならば、こいつで艦これが動けばいいのです。
まずは、FreeBSD上のfirefoxでflashが使えるようにする必要があります。この手順は、FreeBSDハンドブックの7.2. Web ブラウザを見ればそのままで行けます。
これで、firefox上で艦これができるようになるのですが、それだけではつまりません。
艦メモ ~艦娘メモリーズ~(艦これ専用ブラウザ) - 理ろぐと言うQtで書かれた艦これ専用ブラウザアプリがあるので、これをFreeBSDで動かすことにします。
Qtは、マルチプラットフォームが売りのGUIライブラリなので、FreeBSDでもそのまま動くはず。
が、portsにあるのはQt 4.8だけ。5系はまだportsで対応していないようです。
しょうがないので、Download Qt, the cross-platform application framework | Qt Project からソースを持ってきてビルドすることにします。
持ってくるのは、The source code is also available as a single zip (280 MB) (Info) file for Windows users or as tar.gz (226 MB) (Info) file for Linux/Mac users.って書いてある「tar.gz」のリンク先から、qt-everywhere-opensource-src-5.1.1.tar.gz。
こいつを展開して、以下のようなシェルスクリプトを作成して実行します。(別にシェルスクリプトにしなくても良いんだけど、何度もやり直すので)
#!/bin/bash

./configure -opensource -confirm-license -no-compile-examples |& tee configure.log
configure.logの最後の方だけ引用しておくと、
Build options:
  Configuration .......... accessibility accessibility-atspi-bridge alsa audio-backend clock-gettime clock-monotonic concurrent cups dbus evdev fontconfig full-config getaddrinfo getifaddrs glib gnu-libiconv gstreamer gtk2 gtkstyle icu ipv6ifname large-config largefile medium-config minimal-config nis opengl openssl png precompile_header qpa qpa reduce_exports release rpath shared small-config sse2 sse3 ssse3 system-freetype system-jpeg system-png system-zlib v8 v8snapshot xcb xcb-glx xcb-render xcb-xlib xinput2 xlib xrender 
  Build parts ............ libs tools examples
  Mode ................... release
  Using C++11 ............ no
  Using PCH .............. yes
  Target compiler supports:
    SSE2/SSE3/SSSE3 ...... yes/yes/yes
    SSE4.1/SSE4.2 ........ no/no
    AVX/AVX2 ............. no/no

Qt modules and options:
  Qt D-Bus ............... yes (loading dbus-1 at runtime)
  Qt Concurrent .......... yes
  Qt GUI ................. yes
  Qt Widgets ............. yes
  JavaScriptCore JIT ..... yes (To be decided by JavaScriptCore)
  QML debugging .......... yes
  Use system proxies ..... no

Support enabled for:
  Accessibility .......... yes
  ALSA ................... yes
  CUPS ................... yes
  FontConfig ............. yes
  Iconv .................. gnu
  ICU .................... yes
  Image formats: 
    GIF .................. yes (plugin, using system library)
    JPEG ................. yes (plugin, using system library)
    PNG .................. yes (in QtGui, using system library)
  Glib ................... yes
  GStreamer .............. yes
  GTK theme .............. yes
  Large File ............. yes
  libudev ................ no
  Networking: 
    getaddrinfo .......... yes
    getifaddrs ........... yes
    IPv6 ifname .......... yes
    OpenSSL .............. yes (loading libraries at run-time)
  NIS .................... yes
  OpenGL ................. desktop
  OpenVG ................. no
  PCRE ................... system
  pkg-config ............. yes 
  PulseAudio ............. no
  QPA backends: 
    DirectFB ............. no
    EGLFS ................ no
    KMS .................. no
    LinuxFB .............. no
    XCB .................. yes (system library)
      MIT-SHM ............ yes
      Xcursor ............ yes (loaded at runtime)
      Xfixes ............. yes (loaded at runtime)
      Xi ................. no
      Xi2 ................ yes
      Xinerama ........... yes (loaded at runtime)
      Xrandr ............. yes (loaded at runtime)
      Xrender ............ yes
      XKB ................ no
      XShape ............. yes
      XSync .............. yes
      XVideo ............. yes
  Session management ..... yes
  SQL drivers: 
    DB2 .................. no
    InterBase ............ no
    MySQL ................ yes (plugin)
    OCI .................. no
    ODBC ................. yes (plugin)
    PostgreSQL ........... yes (plugin)
    SQLite 2 ............. yes (plugin)
    SQLite ............... yes (plugin, using bundled copy)
    TDS .................. no
  udev ................... no
  xkbcommon .............. yes
  zlib ................... yes (system library)


Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into /usr/local/Qt-5.1.1

みたいな感じ。実際には、ここまで来るのが長くて、必要なライブラリをいろいろ入れて上げないとこの状態になりません。元から入っているものがあるので、全て列挙できませんが、私が追加したライブラリ(ports)を以下に列挙しておきます。
  • graphics/svgalib
  • x11/libxcb
  • x11/libxkbcommon
  • x11/xcb
  • x11/xcb-proto
  • x11/xcb-util
  • x11/xcb-util-image
  • x11/xcb-util-keysyms
  • x11/xcb-util-renderutil
  • x11/xcb-util-wm
configureに成功したら、ビルドします。必ず、make ではなく gmake を使うこと。configureの出力に書いてあるのですが、気が付かずに make を使っていてずっとはまっていました。
ビルドしていくと、以下のエラーで止まります。
/usr/bin/ld: cannot find -ldl
gmake[6]: *** [../../../../plugins/platforms/libqxcb.so] エラー 1
gmake[6]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/platforms/xcb' から出ます
libdlがないと言うエラーですが、FreeBSDの場合はlibcに含まれています。
mkspecsにはないみたいだし、なんでかな〜と思ってソースを眺めていると、qtbase/src/plugins/platforms/xcb/xcb-plugin.pro に LIBS += -ldl なんて書いてあります。
今回は、とりあえずFreeBSDでビルドできればいいので、この行を消してしまいましょう。
diff --git a/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro b/qtbase/src/plugins/pl
atforms/xcb/xcb-plugin.pro
index 8299528..4559081 100644
--- a/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro
+++ b/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro
@@ -40,7 +40,7 @@ HEADERS = \
         qxcbimage.h \
         qxcbxsettings.h
 
-LIBS += -ldl
+#LIBS += -ldl
 
 # needed by GLX, Xcursor ...
 contains(QT_CONFIG, xcb-xlib) {
先に進むと、今度はsqlite3のビルドでエラーになります。
../../../3rdparty/sqlite/sqlite3.c:23531: error: 'fchmod' undeclared here (not in a function)


(中略)


gmake[5]: *** [.obj/release-shared/sqlite3.o] エラー 1
gmake[5]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/sqldrivers/sqlite' から出ます
fchmod は sys/stat.h にプロトタイプ宣言があるはずで、/usr/include/sys/stat.h を見ると #if __POSIX_VISIBLE >= 200112 であれば宣言されるように見えますが、__POSIX_VISIBLEがなんなのかわかりません。追うのも面倒なので、sqlite3.c に直接プロトタイプ宣言を追加してしまいます。
diff --git a/qtbase/src/3rdparty/sqlite/sqlite3.c b/qtbase/src/3rdparty/sqlite/sqlit
e3.c
index 03fa649..2675d25 100644
--- a/qtbase/src/3rdparty/sqlite/sqlite3.c
+++ b/qtbase/src/3rdparty/sqlite/sqlite3.c
@@ -23019,6 +23019,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
 #include <sys/mman.h>
 #endif
 
+int fchmod(int, mode_t);
 
 #if SQLITE_ENABLE_LOCKING_STYLE
 # include <sys/ioctl.h>
さらに進むと、リンク時にundefined referenceが出ます。
g++ -Wl,--no-undefined -Wl,-O1 -pthread -Wl,-rpath,/usr/local/Qt-5.1.1/lib -Wl,-rpath-link,/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib -shared -o libqevdevmouseplugin.so .obj/release-shared/main.o  -L/usr/local/lib -L/usr/X11R6/lib -L/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib -lQt5PlatformSupport -lfontconfig -lfreetype -lgthread-2.0 -pthread -lglib-2.0 -lintl -lXext -lX11 -lm -lXrender -lQt5DBus -lQt5Gui -lQt5Core -lGL  
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x994): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::create(QFlags<QDeviceDiscovery::QDeviceType>, QObject*)'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x9b4): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::scanConnectedDevices()'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x16f4): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::create(QFlags<QDeviceDiscovery::QDeviceType>, QObject*)'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x1714): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::scanConnectedDevices()'
gmake[5]: *** [../../../../plugins/generic/libqevdevmouseplugin.so] エラー 1
gmake[5]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/generic/evdevmouse' から出ます
createとscanConnectedDevicesはQDeviceDiscoveryにあるはずですが、なんでビルドされないんだろーと思って見ていたところ、qtbase/src/platformsupport/devicediscovery/devicediscovery.pri の中で、linux のときしかビルドされないようになっていました。evdev があるならlinuxじゃなくてもビルドして良いだろうと、限定を外します。
diff --git a/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri b/qtbase
/src/platformsupport/devicediscovery/devicediscovery.pri
index 9a58eee..f5176dc 100644
--- a/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri
+++ b/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri
@@ -1,4 +1,4 @@
-linux:contains(QT_CONFIG, evdev) {
+contains(QT_CONFIG, evdev) {
     HEADERS += $$PWD/qdevicediscovery_p.h
 
     contains(QT_CONFIG, libudev) {
さらに先に進むと、flexのオプションが違うとエラーに。
( test -e Makefile.ANGLE.DerivedSources || /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/bin/qmake /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/ThirdParty/ANGLE/DerivedSources.pri -o Makefile.ANGLE.DerivedSources ) && make -f Makefile.ANGLE.DerivedSources
flex --noline --nounistd --outfile=generated/glslang_lex.cpp src/compiler/glslang.l
flex: unknown flag '-'.  For usage, try
        flex --help
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/ThirdParty/ANGLE.
調べてみると、システムに標準で入っているflex 2.5.4 だとlong形式のオプションはなくて、portsから入れた2.5.37だと解釈できるらしい。私の場合、portsのflexはインストールされていたんだけど、PATHが/usr/local/bin/よりも/usr/bin/を優先していたのでエラーになっていた。
これは、/usr/local/bin/を優先することで先に進んだ。
qtbaseが終わって先に進んで行くと、webkitで以下のエラー
enerated/SettingsMacros.h:31:11: error: missing binary operator before token "("
generated/SettingsMacros.h:54:11: error: missing binary operator before token "("
generated/SettingsMacros.h:77:11: error: missing binary operator before token "("
generated/SettingsMacros.h:108:11: error: missing binary operator before token "("
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/WebCore.
なんだべーと思って調べた所、Building Qt 5.0.0 fails on Windows 8 with MinGW 4.7.2 | Qt Project forums | Qt Projectと言う記事を発見。
SettingsMacros.hはヘッダなのに、これをビルドして.oを作ろうとしてるのが問題らしい。
記事の通りに、qtwebkit/Source/WebCore/Makefile.WebCore.Target から SettingsMacros.h を削除してあげたら先に進んだ。
このファイル自体が生成されるファイルなので、git diff の出力はなし。
次は、またundefined reference。
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/lib/libQt5WebKit.so: undefined reference to `void WTF::freeOwnedGPtr<_GError>(_GError*)'
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/WebKit2.
undefined referenceが出たら*.proか*.priを疑え、と言うことでqtwebkit/Source/WTF/WTF.pri が犯人。
diff --git a/qtwebkit/Source/WTF/WTF.pri b/qtwebkit/Source/WTF/WTF.pri
index 2b4e8bc..f88b3fd 100644
--- a/qtwebkit/Source/WTF/WTF.pri
+++ b/qtwebkit/Source/WTF/WTF.pri
@@ -20,7 +20,7 @@ mac {
     }
 }
 
-linux-*:use?(GSTREAMER) {
+use?(GSTREAMER) {
     DEFINES += ENABLE_GLIB_SUPPORT=1
     PKGCONFIG += glib-2.0 gio-2.0
 }
これで、無事にQtのビルドが成功。後は、rootになってgmake installしてあげれば、/usr/local/Qt-5.1.1にインストールされる。

後は、艦メモのビルド方法(Ubuntu編) - 理ろぐを見ながら艦メモをビルド。
はまりポイントは2つ。
Twitter4QMLのビルド時に使うsyncqt.plとqmakeの位置が、/usr/local/Qt-5.1.1/binであること(ハマるところではないか)
後は、KanmusuMemoryは CONFIG += c++11 しているので、OS標準のg++ 4.2.1 ではビルドできない。
portsから g++ 4.6.3 を入れたら、ビルドできた。(指定方法を調べるのが面倒だったので、qmakeでできたMakefileの、CC, CXX, LINKをgcc46/g++46に書き換え)
後は、初めてtwitterのコンシューマーキーとコンシューマーシークレットを取得したりした。

後は、こいつをiPhoneから使うために、vncを試してみたんだけど、なかなかうまくいかず。長くなるので詳細は書かないけど、通常のvncだとQtにキー入力ができず、OpenGLも使えないため艦メモのスクリーンショット機能が使えない。
コンソールでXを立ちあげて、x0vncserverを使うと、うまく行きそうな雰囲気だ。(あまり検証できていない)

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: FreeBSD 8 で Qt 5.1.1を動かす

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/3101

コメントする

このブログ記事について

このページは、falseが2013年11月10日 10:57に書いたブログ記事です。

ひとつ前のブログ記事は「portsでライブラリの依存関係チェックに失敗する」です。

次のブログ記事は「ruby 1.9 で fastladder」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1