2013年12月12日木曜日

cmakeでQML 2 Extension Pluginをビルドする方法

QtCreator/qmakeを使えばそれはそれでQML 2 Extension Pluginプロジェクトを作成し、ビルドできますが、cmakeで済ませられるものはcmakeで済ませたいものです。

cmake便利だし優秀だしninja投げれるし。

今回のcmakeでビルドするまでのサンプルのQML 2 Extension Pluginのソースファイルとしては、最も簡単で確実に用意できるであろうQtCreatorでQML 2 Extension Pluginのプロジェクトをデフォルトのまま生成した際に作られる次のファイル構成とします。

  • untitled_plugin.cxx
  • untitled_plugin.h
  • myitem.cxx
  • myitem.h

それぞれのファイルの中身が気になる方は こちら からどうぞ。これらの内容やC++とQt5Qml/Quickのインターフェース等については主題ではないのでまた別の機会に。

さて、QtCreatorで生成すれば.proができてqmakeする事になりますが、このソースを今回はcmakeでビルドします。

さっそくCMakeLists.txtを書きます。

  • CMakeLists.txt

cmake_minimum_required(VERSION 2.8.10)

project(cmake-qt-test)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

find_package(Qt5Qml REQUIRED)
find_package(Qt5Quick REQUIRED)

add_library(untitled SHARED
  untitled_plugin.cxx
  myitem.cxx
)
qt5_use_modules(untitled Qml Quick)

execute_process(
  COMMAND awk "{print $2}" ${PROJECT_SOURCE_DIR}/qmldir
  COMMAND head -n1
  COMMAND tr . /
  COMMAND tr -d \n
  OUTPUT_VARIABLE qmldir_output
)
set(qmldir $ENV{QML2_IMPORT_PATH}/${qmldir_output})
message(STATUS "qmldir: ${qmldir}")

add_custom_command(TARGET untitled POST_BUILD
  COMMAND mkdir -pv ${qmldir}
  COMMAND cp -uv ${PROJECT_SOURCE_DIR}/qmldir ${qmldir}/qmldir
  COMMAND mv -v *.so ${qmldir}/
)

setで CMAKE_INCLUDE_CURRENT_DIR ONCMAKE_AUTOMOC ON して、 find_packageで Qt5Qml と Qt5Quick を REQUIRED しつつ、 add_library でターゲットuntitled を SHARED でソースファイル群を定義し、 qt5_use_modulesでターゲットuntitledに Qml と Quick を定義しています。

以上で libuntitled.so を qtcreator/qmake 無し、 cmake のみでビルドできます。

mkdir build
cd build
cmake -G Ninja ..
ninja

とか。

なお、CMakeLists.txtの、その後、 execute_process 以降は、qmldir ファイル(実際にQML2EPのプロジェクトではこれもC++ソースと同様に大凡必須)と環境変数 QML2_IMPORT_PATH から、ビルドディレクトリーに適切なQML2EP用のディレクトリー構造を構築し、qmldirファイルをコピー、ビルドしたlibuntitled.soファイルを移動する為のおまけ部分です。

参考: http://qt-project.org/doc/qt-5.0/qtdoc/cmake-manual.html

0 件のコメント:

コメントを投稿