在我们的 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 中的引号中,因此它成为一个目标。
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 不支持包含在其他变量中的变量名称。它似乎更像是一级替代。生成了一个 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
}
这种方法有效,但有两个缺点。次要问题是必须执行单独的“make install”步骤。主要的一点是文件总是被无条件复制。由于我们的数据文件很大,这在时间上是不可接受的。
DemoData.path = $${BLD_DATA_DIR}DemoData
DemoData.files = $${SRC_DATA_DIR}DemoData/*
INSTALLS += DemoData
有没有办法做到这一点,或者我留下了某种外部脚本或手动生成/维护的makefile?