如何在项目文件中获取实际的 qmake 构建目标



我正在尝试确定 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)$,,

最新更新