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

时间:2015-01-14 23:48:33

标签: qt qt5 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(\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结合起来,这几乎不会非常棘手)。

任何提示?

1 个答案:

答案 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)$,,