我正在尝试确定qmake项目文件中的构建目录,但到目前为止我的所有实验都失败了: - (
起初我有一个非常简单的foo.pro
,因为QtCreator为一个普通的Qt5 gui应用程序生成它,并带有一些源文件。然后我添加了一个带有一些数据文件的EXTRA_BINFILES
列表。必须将它们复制到与可执行文件foo
相同的目录中。如果没有复制内容,它看起来像这样:
QT += core gui xml webkitwidgets widgets
TARGET = foo
TEMPLATE = app
EXTRA_BINFILES += \
foobar.png \
baz.png
SOURCES += \
main.cpp \
# ...
HEADERS += \
# ...
FORMS += \
# ...
当我构建它时,我得到foo
可执行文件(或foo.exe
,如果你想要的话)。到目前为止大部分都是直截了当的。现在我想将EXTRA_BINFILES
与此可执行文件一起复制。未解决的问题是如何获取目标目录。到目前为止,我最好的想法是添加:
for(FILE, EXTRA_BINFILES) {
QMAKE_POST_LINK += $$quote($${QMAKE_COPY} $$shell_path($${PWD}/$${FILE}) $$shell_path($${OUT_PWD})$$escape_expand(\n\t))
}
这使用OUT_PWD
变量,该变量自动指向生成Makefile的位置。这对某些场景来说很不错。但是,我必须处理两种不同的情况:
直接从QtCreator中编译,主要是开箱即用的构建配置。它创建一个新的build-foo-desktop-release
目录,在那里创建Makefile并在那里构建可执行文件。在这种情况下,一切正常。
在临时新建目录中使用qmake -makefile /my/projects/foo/foo.pro
和make
从命令行构建。这样,它直接在该构建目录中创建Makefile,但将可执行文件编译为release
子目录。这显然打破了我的复制码。
由于某些原因,不能选择摆脱其中一种情况。我必须在同一个项目文件中处理它们。在项目文件中制作非常技术性/棘手的东西也不是一种选择。它必须保持原样“直截了当”。覆盖qmake
命令行调用中的一些qmake自己的变量也可能不是一个选项。这是因为更广泛的背景,这里的解释太广泛了。
是否可以选择在两种情况下获得正确的路径?像OUT_PWD
这样的东西,但对于可执行文件本身?
不幸的是,DESTDIR
是空的(如上所述,强行设置它不是一个选项)。 DESTDIR_TARGET
也是空的(否则我可以将它与dirname
结合起来,这几乎不会非常棘手)。
任何提示?
答案 0 :(得分:0)
sub_dir = $$_PRO_FILE_PWD_
sub_dir ~= s,^$$re_escape($$PWD),,
PROJECT_BUILD_TREE = $$clean_path($$OUT_PWD)
PROJECT_BUILD_TREE ~= s,$$re_escape($$sub_dir)$,,