【问题标题】:How to get the actual qmake build destination within the project file?如何在项目文件中获取实际的 qmake 构建目标?
【发布时间】:2015-01-14 23:48:32
【问题描述】:

我正在尝试确定 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.promake 在一个临时的新构建目录中从命令行构建。这样,它直接在该构建目录中创建 Makefile,但将可执行文件编译到 release 子目录中。这显然破坏了我的复制代码。

由于某些原因,摆脱其中一种情况不是一种选择。我必须在同一个项目文件中处理它们。在项目文件中制作非常技术/棘手的东西也不是一种选择。它必须基本上保持原样“直截了当”。在qmake 命令行调用中覆盖一些qmake 自己的变量也可能不是一个选项。这是因为更广泛的背景,在这里无法解释。

在这两种情况下都可以选择正确的路径吗? OUT_PWD 之类的东西,但对于可执行文件本身?

不幸的是,DESTDIR 是空的(如上所述,强制设置它不是一个选项)。 DESTDIR_TARGET 也是空的(否则我可以将它与 dirname 结合起来,这几乎不会不够棘手)。

有什么提示吗?

【问题讨论】:

  • 你知道你的构建目标。您的目标将在当前目录中构建。所以你可以使用 $PWD 变量来复制可执行文件附近的文件。

标签: qt qt5 qmake


【解决方案1】:
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)$,,

【讨论】:

  • 感谢您编写代码!但不幸的是,这在这里也不起作用(至少在我的用于构建 Windows EXE 的葡萄酒驱动的 mingw 工具链中——我不确定这在这里是否重要)。它与 Makefile 一起复制文件,就像我的第一个实验一样。它非常接近我关于棘手的痛苦阈值(高于或低于该阈值;我不确定^^)。
猜你喜欢
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多