Nov 29, 2009

qt4-qtruby を Windows で : qt4-qtrubyビルド編

ツール導入編からの続きです。


qt4-qtruby

KDEのSubversionリポジトリからソースコードを入手:
> mkdir kdebindings
> cd kdebindings
> svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdebindings .
  ...
  Checked out revision 1055931.
Ruby以外用のソースコード(Python,C#など)も大量にダウンロードされる。今回利用するのは
  • smoke/qt
  • ruby/qtruby
の2個のみ。

まず CMakeLists.txt を qtruby 用に書き換える。

kdebindings/CMakeLists.txt を kdebindings/CMakeLists.txt.qtruby で上書き。その内容を以下のように編集する。
  • "add_subdirectory(smoke)" と書いてある行の上に "add_subdirectory(generator)" と追記する:
  ...
  FIND_PACKAGE (OpenGL REQUIRED)

  add_subdirectory(generator)
  add_subdirectory(smoke)

  if(RUBY_EXECUTABLE)
  ...
"Visual Studio 2008 コマンド プロンプト" を起動し、
kdebindings> PATH=d:\Qt\2009.04\qt\bin;d:\tmp\cmake-2.8.0-win32-x86\bin;d:\ruby19\bin;d:\Perl\bin;%PATH%
kdebindings> cmake -G "Visual Studio 9 2008" -DCMAKE_INSTALL_PREFIX=d:\ruby19  -DRUBY_EXECUTABLE=d:\ruby19\bin\ruby  -DRUBY_LIBRARY=d:\ruby19\lib\msvcr90-ruby191.lib  -DRUBY_INCLUDE_PATH=d:\ruby19\include\ruby-1.9.1  -DQT_QMAKE_EXECUTABLE=d:\Qt\2009.04\qt\bin\qmake  -Wno-dev  -DENABLE_SMOKE=on  -DENABLE_QTRUBY=on  -DENABLE_QTWEBKIT_SMOKE=off -DENABLE_QTSCRIPT_SMOKE=off  -DENABLE_QTUITOOLS_SMOKE=off  -DENABLE_QTTEST_SMOKE=off  -DENABLE_PHONON_SMOKE=off  -DENABLE_QSCI_SMOKE=off-DENABLE_QWT_SMOKE=off  -DENABLE_KDE_SMOKE=off  -DENABLE_KDEVPLATFORM_SMOKE=off  -DENABLE_KHTML_SMOKE=off  -DENABLE_KTEXTEDITOR_SMOKE=off  -DENABLE_SOLID_SMOKE=off  -DENABLE_PLASMA_SMOKE=off  -DENABLE_QTWEBKIT_RUBY=off  -DENABLE_QTUITOOLS_RUBY=off  -DENABLE_QTSCRIPT=off  -DENABLE_QTTEST=off  -DENABLE_PHONON_RUBY=off  -DENABLE_QSCINTILLA_RUBY=off  -DENABLE_QWT_RUBY=off  -DENABLE_SOPRANO_RUBY=off  -DENABLE_KDEVPLATFORM_RUBY=off  -DENABLE_KORUNDUM_RUBY=off  -DENABLE_KHTML_RUBY=off-DENABLE_KTEXTEDITOR_RUBY=off  -DENABLE_SOLID_RUBY=off  -DENABLE_KROSSRUBY=off -DENABLE_PLASMA_RUBY=off  -DENABLE_QIMAGEBLITZ_SMOKE=off -DENABLE_QTDBUS_SMOKE=off -DQT_QTDBUS_LIBRARY:FILEPATH= .

1回目の実行ではCMakeの内部エラー(?)のためソリューションファイル等が生成されない。原因はおそらくこれ:
CMake Error at smoke/qt/QtGuess.txt:134 (list):
この問題は上記コマンドをもう1度実行することで回避できる。2回目のcmake実行後、"kdebindings.sln" が生成されるので、 Visual Studio 2008 で開く。

各種手作業

DBusのサポートを外すため、複数の設定ファイルをビルド前に修正しておく必要がある。
  • kdebindings/smoke/qt/qt_includes.h
    • ファイル最下部: QtDBus.h をインクルードしている行をコメントアウト。
  • kdebindings/smoke/qt/smokeconfig.xml
    • QDBus... という行をすべて削除。

generator.exe のビルド

Qtのヘッダーファイルをパースする generator.exe をビルドする。
  • cppparser
  • generator
  • generator_dump
  • generator_smoke
の4プロジェクトを選択し、「選択範囲のビルド」を実行する。

smokeqt プロジェクトのビルド
  • ソリューション エクスプローラから smokeqt を右クリックで選択、プロジェクトのみをビルド。
    • ※ x_1.cpp ~ x_20.cpp と smokedata.cpp は generator.exe で自動生成されるソースコードなので、ビルド開始時には存在しない。

qtruby4 プロジェクトのビルド

まず以下の箇所に修正が必要。
  • kdebindings/ruby/qtruby/src/qtruby.h
    • 関数 "rb_str_catf" の宣言をコメントアウト。gcc 専用の "__attribute__" が付加されている他、ruby 側での宣言と矛盾しているなどの問題があり、コンパイルエラーの原因となる。

本来だと "qtruby4shared" → "qtruby4" の順にビルドし2個のDLLを生成することになるが、なぜか qtruby4 側から qtruby4shared のシンボルが見つからないため、リンクエラーが発生してしまう。ここでは qtruby4shared のソースコードを qtruby4 に含めてしまい、1個のDLL (qtruby4.so) のみを生成するように変更する。
  • "qtruby4shared" の "Source Files" 以下にある3個のファイル(handlers.cpp, marshall_types.cpp, Qt.cpp) を "qtruby4" プロジェクトの "Source Files" に移動。
  • 出力ファイル名を qtruby4.dll (kdebindings\ruby\qtruby\src\Release\qtruby4.dll) から qtruby4.so に変更。
  • qtruby4 プロジェクトの「追加の依存ファイル」から "Release\qtruby4shared.lib" を削除。
以上の変更を適用した後で qtruby4 プロジェクトのみをビルドする。kdebindings\ruby\qtruby\src\Release\qtruby4.so が生成される。


インストール

INSTALL プロジェクトはうまく動作しないようなので、以下手作業で各種ファイルを配置する。
  • Qt, OpenSSL
    • ビルドした DLL が d:\Qt\2009.04\qt\bin 以下にあるので d:\ruby19\bin にコピー
    • OpenSSL の ssleay32.dll, libeay32.dll も d:\ruby19\bin にコピー
  • qt4-qtruby
    • kdebindings/smoke/qt/Release/smokeqt.dll を d:\ruby19\bin にコピー
    • kdebindings/ruby/qtruby/src/Release/qtruby4.so を d:/ruby19/lib/ruby/site_ruby/1.9.1/i386-msvcr90 にコピー
    • kdebindings/ruby/qtruby/src/lib/*.rb を d:/ruby19/lib/ruby/site_ruby/1.9.1/ へコピー
    • kdebindings/ruby/qtruby/src/lib/Qt/qtruby4.rb を d:/ruby19/lib/ruby/site_ruby/1.9.1/Qt/ へコピー

実行
> ruby -rQt -e "app=Qt::Application.new(ARGV); hello=Qt::PushButton.new('Hello'); hello.show(); app.exec()"
というone-liner を実行して、このようなウィンドウが表示されればOKです:


No comments:

Post a Comment