Qtアプリのビルドと一緒にその他の必要なファイルもコピーする

 アプリの開発をしていると、実行時に必要なファイルがでてくると思います。dllとかsoとかdylibとか......、いえ、今回の記事では何でも良いのですけどね。何か設定的なことを書いたテキストでもリソース的なファイルでも何でも。
 大抵、シャドウビルドで開発をするのでそれらのファイルは通常、手でコピーしなければなりません。シャドウビルドで作られたフォルダに都合良く勝手にコピーはされませんから。
 で、数日前の「Qtからお手軽にZIPファイルを扱えるQuaZIPの紹介」でも、サラッとdllをコピーする方法を紹介したのですが、若干使い勝手が悪いです。
 複数のファイルをコピーしたい場合にこの方法だと冗長になってしまうので、イマイチです。
 なので、少しは楽にならないかなーと考えた方法を紹介します。もっと、良い方法があったら誰か教えてください! 凄い人!

/// ポイント ///
 繰り返しもありますが

置換関数を作る
 結局のところ、パスを作るところが冗長なので置換関数でなんとかします。なんとも普通な発想です。もう少し、qmakeっぽいやり方ないものかと思いますが......。
 結局、QMAKE_EXTRA_TARGETSに登録するところは、頑張って書かないといけないのが現状の難点です。つまり、プロジェクト設定でMakeの引数をいっぱい書かないといけないって事です。

コピーコマンドは「$(COPY_DIR)」で書く
 これはMakefileへ「$(COPY_DIR)」がそのまま出力されるので、Makefileで定義されるコピーコマンドが使えます。環境にproファイルで何とかする必要がありません。

Windowsはパスの区切り文字を「\」に統一
 proファイル内は、「/」で統一して書いて良い(Makefileを出力するときにqmakeがなんとかしてくれる)のですが、QMAKE_EXTRA_TARGETSのcommandsはそのままMakefileに出力されるので環境に合わせたパスの表記をしなければなりません。


では、こんな感じです。

/// hoge.pro ///
# 置換関数の宣言(使うところより前)
defineReplace(makeCopyCommand){
    DEPEND_FILE = $$1
    win32:{
        CONFIG(debug,debug|release){
            APP_BUILD_DIR=$$shadowed($${PWD})/debug
        }else{
            APP_BUILD_DIR=$$shadowed($${PWD})/release
        }
        DEPEND_FILE ~= s|/|\|gi
        APP_BUILD_DIR ~= s|/|\|gi
    }else{
        APP_BUILD_DIR=$$shadowed($${PWD})
    }
    return($(COPY_DIR) $$DEPEND_FILE $$APP_BUILD_DIR)
}
# なんかのファイル1個目
copyfile1.commands += $$makeCopyCommand($${PWD}/hoge.txt)
QMAKE_EXTRA_TARGETS += copyfile1
# なんかのファイル2個目
copyfile2.commands += $$makeCopyCommand($${PWD}/../fuga/fuga.dll)
QMAKE_EXTRA_TARGETS += copyfile2
(※proファイルに日本語を書くと化けます。説明用にあえて日本語を書いているだけなのでご注意ください)

/// プロジェクト設定 ///
 以下の画像のようにビルドステップを追加してMakeの引数を設定します。
 qmake_project_setting_build_step.JPG
 (※プロジェクトのパスは今回の例と関係ないので気にしないでください)

 リリースとデバッグの両方で設定してください。ビルド設定を切り替えて「アレ?コピーされない?」となりますので。
 何はともあれ、これでいちいちビルドフォルダへコピーする煩わしさから解放されます。

 

/// 宣伝 ///
 proファイルの詳しいことを知りたい方は、緑野翁さんの著書「qmake入門」を参照してください。BOOK☆WALKERか今冬のコミケC91(2016/12/29 ビックサイト)のスペース「西み32b」で入手できます。
  BOOK☆WALKER:qmake入門