Qt qmake:从变量中删除条目
Qt qmake: removing entries from a variable
作为 Qt 项目部署过程的一部分,我需要将几个文件复制到部署文件夹中。我的问题是我无法让 -= operator 工作。我也想根据文件名过滤掉特定的文件。
为了重现我的问题,我创建了一个简单的 Qt 项目,其 .pro 文件如下所示(参见 "portion of interest"):
TEMPLATE = app
QT = core
CONFIG += console
CONFIG -= app_bundle
CONFIG += c++11
SOURCES += main.cpp \
myfile1.cpp \
myfile1d.cpp
SOURCES += myfile1.cpp
SOURCES += myfile1d.cpp
#portion of interest - start
FOLDER_PATH = $$_PRO_FILE_PWD_/../files/
#add all files present in 'files' folder
FILES_TO_COPY = $$FOLDER_PATH/*
#exclude a specific file
win32:CONFIG(release, debug|release): {
FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt
}
filesToCopy.files = $$FILES_TO_COPY
filesToCopy.path = $$_PRO_FILE_PWD_/../deploy
INSTALLS += filesToCopy
#portion of interest - finish
我在 Qt Creator 项目设置中的构建过程中添加了一个 "make install" 步骤。此步骤应查看 .pro 文件中的 INSTALLS 变量,并将指定文件从 'files' 复制到 'deploy' 文件夹。
现在,文件夹 'files' 包含以下文件:
- fileb.txt
- filec.txt
- filecd.txt
- filed.txt
- filedd.txt
这是我想要做的:
1) 最初,我希望将除 'filecd.txt' 之外的所有文件从 'files' 复制到 'deploy'。我正在尝试使用“-=”来排除 'filecd.txt' 但我仍然在复制所有文件。
2) 我还想根据名称过滤掉特定文件。例如,如果我们处于发布模式,则不应复制文件的调试版本。这应该排除 filecd.txt 和 filedd.txt,它们被模拟为 filec.txt 和 filed.txt.
的调试版本
感谢您的帮助。
{ 版本信息:Qt Creator 4.2.1,基于 Qt 5.8.0(MSVC 2015,32 位)
套件信息:桌面 Qt 5.8.0 MSVC2015 32 位)}
更新:
对于其他尝试做类似事情的人(以及有经验的人进行审查),这是我最终做的事情:
#add all files present in 'files' folder
FILES_TO_COPY = $$files($$FOLDER_PATH/*)
#From these files: fileb.txt filec.txt filecd.txt filed.txt filedd.txt
#we only want to copy the following files to the deployment folder
#fileb.txt filec.txt filed.txt
#i.e., we wish to exclude these files from deployment folder:
#filecd.txt filedd.txt
win32:CONFIG(release, debug|release): {
#FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt
for(iter, FILES_TO_COPY): {
#name of one file
FNAME = $$iter #/path/to/filecd.txt
SEARCH_TOKEN = 'd.txt'
SECTIONS = $$split(FNAME, $$SEARCH_TOKEN)#filec d.txt
FNAME1 = $$first(SECTIONS) #filec
#if 'd.txt' is not part of the filename then split returns
#the filename untouched (i.e. FNAME1 would be equal to FNAME,
#and should be found in FILES_TO_COPY)
#NOTE: If we are unlucky enough to have another file called
#'filec' (without any extension) then the search for filecd.txt
#will be abandoned.
!contains(FILES_TO_COPY, $$FNAME1) : {
FILE_EXT = '.txt'
FNAME1D = $$join(FNAME1, , , $$FILE_EXT) #filec.txt
contains(FILES_TO_COPY, $$FNAME1D): {
REDUNDANT_FILES += $$FNAME
}
}
}
}
FILES_TO_COPY -= $$REDUNDANT_FILES
filesToCopy.files = $$FILES_TO_COPY
filesToCopy.path = $$_PRO_FILE_PWD_/../deploy
INSTALLS += filesToCopy
qmake 在文件被解析后执行 glob 扩展,所以当 FILES_TO_COPY -= ...
行被解析时,变量仍然具有未扩展的 glob 值。
相反,使用 $$files
内置测试功能来 assemble 一个文件列表,然后您可以从中删除这些文件:
FILES_TO_COPY = $$files($$FOLDER_PATH/*)
win32:CONFIG(release, debug|release): {
FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt
}
您可以使用正则表达式删除变量,使其更整洁:
FILES_TO_COPY ~= .*filecd.txt
作为 Qt 项目部署过程的一部分,我需要将几个文件复制到部署文件夹中。我的问题是我无法让 -= operator 工作。我也想根据文件名过滤掉特定的文件。
为了重现我的问题,我创建了一个简单的 Qt 项目,其 .pro 文件如下所示(参见 "portion of interest"):
TEMPLATE = app
QT = core
CONFIG += console
CONFIG -= app_bundle
CONFIG += c++11
SOURCES += main.cpp \
myfile1.cpp \
myfile1d.cpp
SOURCES += myfile1.cpp
SOURCES += myfile1d.cpp
#portion of interest - start
FOLDER_PATH = $$_PRO_FILE_PWD_/../files/
#add all files present in 'files' folder
FILES_TO_COPY = $$FOLDER_PATH/*
#exclude a specific file
win32:CONFIG(release, debug|release): {
FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt
}
filesToCopy.files = $$FILES_TO_COPY
filesToCopy.path = $$_PRO_FILE_PWD_/../deploy
INSTALLS += filesToCopy
#portion of interest - finish
我在 Qt Creator 项目设置中的构建过程中添加了一个 "make install" 步骤。此步骤应查看 .pro 文件中的 INSTALLS 变量,并将指定文件从 'files' 复制到 'deploy' 文件夹。
现在,文件夹 'files' 包含以下文件:
- fileb.txt
- filec.txt
- filecd.txt
- filed.txt
- filedd.txt
这是我想要做的:
1) 最初,我希望将除 'filecd.txt' 之外的所有文件从 'files' 复制到 'deploy'。我正在尝试使用“-=”来排除 'filecd.txt' 但我仍然在复制所有文件。
2) 我还想根据名称过滤掉特定文件。例如,如果我们处于发布模式,则不应复制文件的调试版本。这应该排除 filecd.txt 和 filedd.txt,它们被模拟为 filec.txt 和 filed.txt.
的调试版本感谢您的帮助。
{ 版本信息:Qt Creator 4.2.1,基于 Qt 5.8.0(MSVC 2015,32 位)
套件信息:桌面 Qt 5.8.0 MSVC2015 32 位)}
更新: 对于其他尝试做类似事情的人(以及有经验的人进行审查),这是我最终做的事情:
#add all files present in 'files' folder
FILES_TO_COPY = $$files($$FOLDER_PATH/*)
#From these files: fileb.txt filec.txt filecd.txt filed.txt filedd.txt
#we only want to copy the following files to the deployment folder
#fileb.txt filec.txt filed.txt
#i.e., we wish to exclude these files from deployment folder:
#filecd.txt filedd.txt
win32:CONFIG(release, debug|release): {
#FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt
for(iter, FILES_TO_COPY): {
#name of one file
FNAME = $$iter #/path/to/filecd.txt
SEARCH_TOKEN = 'd.txt'
SECTIONS = $$split(FNAME, $$SEARCH_TOKEN)#filec d.txt
FNAME1 = $$first(SECTIONS) #filec
#if 'd.txt' is not part of the filename then split returns
#the filename untouched (i.e. FNAME1 would be equal to FNAME,
#and should be found in FILES_TO_COPY)
#NOTE: If we are unlucky enough to have another file called
#'filec' (without any extension) then the search for filecd.txt
#will be abandoned.
!contains(FILES_TO_COPY, $$FNAME1) : {
FILE_EXT = '.txt'
FNAME1D = $$join(FNAME1, , , $$FILE_EXT) #filec.txt
contains(FILES_TO_COPY, $$FNAME1D): {
REDUNDANT_FILES += $$FNAME
}
}
}
}
FILES_TO_COPY -= $$REDUNDANT_FILES
filesToCopy.files = $$FILES_TO_COPY
filesToCopy.path = $$_PRO_FILE_PWD_/../deploy
INSTALLS += filesToCopy
qmake 在文件被解析后执行 glob 扩展,所以当 FILES_TO_COPY -= ...
行被解析时,变量仍然具有未扩展的 glob 值。
相反,使用 $$files
内置测试功能来 assemble 一个文件列表,然后您可以从中删除这些文件:
FILES_TO_COPY = $$files($$FOLDER_PATH/*)
win32:CONFIG(release, debug|release): {
FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt
}
您可以使用正则表达式删除变量,使其更整洁:
FILES_TO_COPY ~= .*filecd.txt