Qmake/QtCreator のビルド中にソース フォルダーからビルド フォルダーにコピーする必要がある大きなデータ ファイルがいくつかあります。それらは大きいため、新しい/変更されたファイルに対してのみコピーが行われるようにします。そして、それらすべてをプロジェクトファイルに具体的にリストすることは避けたいと思います。これが私が試したことです:
DemoData フォルダがターゲットであるため、このデータ ファイルのコピーは失敗します。そのため、フォルダ内のファイルが追加または変更された場合、コピーは実行されません。フォルダが存在しない場合のみ。
DemoData.commands = $$COPY_CMD $${SRC_DATA_DIR}DemoData $${BLD_DATA_DIR}DemoData
DemoData.target += $${BLD_DATA_DIR}DemoData
PRE_TARGETDEPS += $${BLD_DATA_DIR}DemoData
QMAKE_EXTRA_TARGETS += DemoData
DemoData.target アイテムには複数のアイテムのリストがあるとは想定されていないため、このアプローチは失敗します。QMake は、生成された makefile でリストを引用符で囲み、1 つのターゲットにします。
DemoData.commands = $$COPY_CMD $${SRC_DATA_DIR}DemoData $${BLD_DATA_DIR}DemoData
DEMO_DATA_FILES = $$files($${SRC_DATA_DIR}DemoData/*)
for(FILE, DEMO_DATA_FILES){
DemoData.target += $${BLD_DATA_DIR}DemoData\\$$basename(FILE)
PRE_TARGETDEPS += $${BLD_DATA_DIR}DemoData\\$$basename(FILE)
}
QMAKE_EXTRA_TARGETS += DemoData
(AFAICT)QMakeは他の変数に含まれる変数名をサポートしていないため、この試みは失敗します。1 レベルの置換のようです。makefile が生成されますが、DemoDataX ターゲットにはすべてコマンド ラインがありません。「コマンド」フィールドの内容を表示しようとすると、すべて構文エラーが発生します。
DEMO_DATA_FILES = $$files($${SRC_DATA_DIR}DemoData/*)
DEMO_DATA_NAME = DemoData
for(FILE, DEMO_DATA_FILES){
$${DEMO_DATA_NAME}.target = $${FILE}
$${DEMO_DATA_NAME}.commands = $$COPY_CMD $${FILE} $${BLD_DATA_DIR}DemoData
PRE_TARGETDEPS += $${FILE}
QMAKE_EXTRA_TARGETS += $${DEMO_DATA_NAME}
DEMO_DATA_NAME = $${DEMO_DATA_NAME}X
}
このアプローチは機能しますが、2 つの欠点があります。マイナーなものは、別の「make install」ステップを実行する必要があることです。主なものは、ファイルが常に無条件にコピーされることです。私たちのデータ ファイルは大きいため、これは時間的に許容できません。
DemoData.path = $${BLD_DATA_DIR}DemoData
DemoData.files = $${SRC_DATA_DIR}DemoData/*
INSTALLS += DemoData
これを行う方法はありますか、またはある種の外部スクリプトまたは手動で生成/維持されたメイクファイルが残っていますか?