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

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

Qt / qmake / 簡単なリソースファイルの取り扱い方

先の記事のあーうーから、結局自前で簡単なスクリプトを qmake の .pro に書いてみる事にした。

状況

.cxxなどの通常のビルド対象の他に、 .qml とか .png とか .mp3 とかそういう外部リソースファイルがある場合に、 qmake が生成する Makefile でよしなにDESTDIRへコピーや削除が行われる様にしたい。

実装方法

qmakeに食べさせる .pro に次の様に実装する。

resources += \
  test.qml \
  test.png \

QMAKE_POST_LINK = @ 
for(t, resources) {
  QMAKE_POST_LINK += cp -rv $$PWD/$$t $$OUT_PWD/$$t ;
}
QMAKE_CLEAN += $$resources

resources に DESTDIR へ出力したいリソースファイル群を定義する。これは .pro からの相対パスで指定する。使うだけならばここだけ書き換えればOK。

QMAKE_POST_LINKはqmakeによって生成されたMakefileがリンカーを走らせた後に実行する単一のコマンド。"単一の"というのがポイントで、 += で空白文字区切りにコマンドを入れても結果的には単に1回だけのコマンドとして全体が評価される。よってはじめに @ を付けコマンド自体の出力を抑制し、 cp に v オプションを付けコピー状況が明示される様にし、かつresourcesから取り出した1つあたりにつき ; でコマンドを区切る様にしてある。

QMAKE_CLEANは空白文字区切りで make clean の際に追加で削除を指示したいパスを放り込む。

効果

qmake を行うビルドと実行用の作業ディレクトリーがソースのディレクトリーと異なる場合でも、makeによりリソースが正常にコピーされ、またmake cleanも一応程度に対応する。

余談

この記事書いてる中の人はVimで .pro .cxx .qml など書いて qmake とか make とかシェルで叩いてます。qmlのビジュアルな編集がしたいなーって時は qtcreator hoge.qml とかその為に動かす程度にはGUIも使うけどね・x・

そんな状態でも、 QtCreator に .pro を読ませればGUI環境がいいってメンバーとの連携もできて、かつ基本的な .pro とかその他ソースはテキストエディターさえあれば全く支障なく編集し、ビルドし、テストもできる。qmakeを使うとcmakeよりも定義量も少なく(特にQtを使う場合は勿論なおさらに)て楽です。一般的なライブラリーの検索とリンクなどはcmakeの方が便利な事もあるかもしれないけど、-Iとか-Lとか指示するだけの事だし、何事も割とqmakeに以降するのもいいのかなーなんて思い出してるところです。