8

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

これを行う方法はありますか、またはある種の外部スクリプトまたは手動で生成/維持されたメイクファイルが残っていますか?

4

2 に答える 2

8

QMAKE_EXTRA_COMPILES 機能を使用します。

# list your files in this variable.
# Masks are available with $$files functions but
# if your set of files changes (files added or removed)
# your have to re-run qmake after that explicitly, not just make
MYFILES = $$files($${PWD}/files/*.*)

copy_files.name = copy large files
copy_files.input = MYFILES
# change datafiles to a directory you want to put the files to
copy_files.output = $${OUT_PWD}/datafiles/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT}
copy_files.commands = ${COPY_FILE} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
copy_files.CONFIG += no_link target_predeps

QMAKE_EXTRA_COMPILERS += copy_files

大きなファイルを MYFILES 変数に追加します。ファイルごとに、指定されたディレクトリ (例ではデータファイル) にファイルをコピーするルールが Makefile で生成されます。元のファイルはルールの依存関係としてリストされるため (これはデフォルトの qmake の動作です)、元のファイルが既存のコピーよりも新しい場合にのみコピーが行われます。生成されたルールは、ターゲット ファイル ルール (copy_files.CONFIG += target_predeps) の依存関係としてリストされるため、すべてのビルドでコピーが自動的に行われます。

唯一の注意点は次のとおりです。ファイルのセットが動的である場合 (ファイルが追加または削除される場合)、私の例のようにマスクを使用できますが、セットを変更した後に qmake を実行するように注意する必要があります。Qt Creator は、qmake ではなく make を起動してプロジェクトをビルドすることに注意してください。qmake が確実に起動されるようにする最も簡単な方法は、.pro ファイルを変更することです。

ロシア語が読める方は、QMAKE_EXTRA_COMPILERS に関する詳細情報がここにあります

于 2013-09-06T06:45:17.707 に答える