我正在尝试确定 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(nt))
}
这将使用 OUT_PWD
变量,该变量自动指向生成生成文件的位置。这在某些情况下很好。但是,我必须处理两种不同的情况:
直接从QtCreator内部编译,大部分是开箱即用的构建配置。它创建一个新的
build-foo-desktop-release
目录,在那里创建 Makefile,并在那里构建可执行文件。在这种情况下,一切正常。从命令行构建,
qmake -makefile /my/projects/foo/foo.pro
并在临时全新构建目录中make
。这样,它直接在该构建目录中创建 Makefile,但将可执行文件编译为release
子目录。这显然破坏了我的复制代码。
由于某些原因,摆脱其中一种情况不是一种选择。我必须在同一个项目文件中处理它们。在项目文件中制作非常技术性/棘手的东西也不是一种选择。它必须保持大部分"直截了当"。在qmake
命令行调用中覆盖 qmake 自己的一些变量也可能不是一种选择。这是因为更广泛的背景,这里无法解释。
在这两种情况下,是否有获取正确路径的选项?类似于OUT_PWD
的东西,但对于可执行文件本身?
不幸的是,DESTDIR
是空的(如前所述,强制设置它不是一个选项)。 DESTDIR_TARGET
也是空的(否则我可以将其与dirname
结合起来,这几乎不够棘手)。
有什么提示吗?
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)$,,