C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

Qt / qmake / DEPLOYMENTFOLDERS / qtcAddDeployment それは一体は何か?

まったく、下らない事に随分と時間を取られてしまった。1時間程だろうか(´・ω・`)

状況

Vim/zsh系でQtアプリを試していて、QMLを使ったアプリで遊ぼうとしていた。記述するコードは先ずは最小構成、

  • test.cxx
  • test.qml
  • test.pro

テストソースを書いてこの場で qmake して Makefile を生成し、 make する分には全く問題無い。

しかし、これをQtCreatorでロードし、QtCreatorからプロジェクトにビルド設定を作り(test.pro.user、これはXMLだ。ヒトやウサギなどの知的生命体が直接Vimる対象では無い・w・)、実行してみると問題が明らかになる。

先のVim/zsh系では簡単なテストという事もあり、ソースもビルドも実行も全て同じディレクトリーで行なっていた。しかし、QtCreatorに任せデフォルトで作成されたビルド設定ではソースのある場所に対して ../test-build-desktop-Qt_4_8_1_in_PATH__System__Release などにビルドと実行の為の作業ディレクトリーが設定される。

すると、実行時に test.qml をロード出来ないから、

file:///home/usagi/tmp/test-build-desktop-Qt_4_8_1_in_PATH__System__Release/test.qml: File not found 

とかそういうエラーが実行時に発生する。当然だ、そこに test.qml ファイルをコピーする様な設定はMakefileには自動追加されていないし、test.proにもそうした細工はまだしていないのだか。

そこで少々調べてみると、どうやら .pro に、

folder_01.source = ./test.qml
folder_01.target = ./
DEPLOYMENTFOLDERS = folder_01

とかすれば良さそうな事が分かった。この紹介は多数の人々がそうすればいいよ、とブログや掲示板に残してくれている。実際にこの記述は試しにQtCreatorで作成してみたQt Quickアプリの.proでも同様に記述されていた。

しかしこれ、自分で作成していた test.pro に書いても、書き方を変えても、ディレクトリーを掘って内包する様にしてみても、まったく追加でデプロイメントされなかった。

この問題の理由

DEPLOYMENTFOLDERS なる機能は qmake の機能では無く、実はQtCreatorがQt Quickアプリのテンプレで作成したプロジェクトの中にこっそり作成するユーザーコードにより定義される関数なのであった。

つまり、DEPLOYMENTFOLDERSなどいくら設定しても、それを実際にデプロイしてくれる関数がどこにも無いのだから何も起こらない。

気づいたきっかけ

QtCreatorで作成してみた.proにはqtcAddDeployment()なる関数呼び出しらしき記述も後方に追記されている事に気づいた。命名規則が全て大文字ではない事もあり、これはもしやユーザー定義では無いかと思い、その直前でincludeされている.priをよく見ると、関数定義されていた。

defineTest(qtcAddDeployment) {
for(deploymentfolder, DEPLOYMENTFOLDERS) {
    item = item$${deploymentfolder}
    itemsources = $${item}.sources
...

解決法

  1. 素直にQtCreatorのテンプレを使う。
  2. リソースをコピーする簡単なqmakeくらい書く。

後者については備忘録として次の記事でメモを残すことにします。