qt - 任何编译之前的 qmake 预构建步骤

标签 qt qmake

SO 上有几个关于如何为 qmake 创建预构建步骤的问题,我可以在我的 .pro 文件中这样做:

versionTarget.target = ../VersionData/versioning.h
versionTarget.depends = FORCE
win32: versionTarget.commands = cd $$PWD; python.exe ./version_getter.py -p $$TARGET
else:  versionTarget.commands = cd $$PWD; python ./version_getter.py -p $$TARGET

PRE_TARGETDEPS += ../VersionData/versioning.h
QMAKE_EXTRA_TARGETS += versionTarget

现在,问题是这种方法本身不是一个构建步骤,而只是另一个构建目标,所以如果我为 make 配置了 -j 标志与其他构建作业并行运行我的脚本。这非常糟糕,因为我的脚本创建/更新了一个头文件——在编译过程中改变它是 Not Acceptable 。

所以,无论如何我可以在任何编译运行之前执行这个脚本吗?我知道我可以创建另一个脚本并从中按顺序调用 version_getter.pyqmake ,但这是不可取的,因为我必须从命令行编译而不是而不是在 Qt Creator 中。


更新

我的每个子项目包含的完整.pri 文件如下:

CONFIG += thread
QT += core \
      gui

versionTarget.target = ../VersionData/versioning.h
versionTarget.depends = FORCE
win32: versionTarget.commands = cd $$PWD; python.exe ./version_getter.py -p $$TARGET
else:  versionTarget.commands = cd $$PWD; python ./version_getter.py -p $$TARGET

PRE_TARGETDEPS += ../VersionData/versioning.h
QMAKE_EXTRA_TARGETS += versionTarget

DEPENDPATH += ../VersionData
INCLUDEPATH += ../VersionData
HEADERS += ../VersionData/versioning.h

UI_HEADERS_DIR = $${_PRO_FILE_PWD_}/include/Qui
DESTDIR = $(SYREN_PATH)

!win32-msvc {
    QMAKE_CXXFLAGS += -std=c++0x
}

但这仍然会导致相同的并行行为。我认为这可能是由于我使用了 ccache,但关闭它没有任何区别(当然除了慢得多)。

最佳答案

另一种选择是从原始问题中的项目文件片段开始,并确保 qmake 知道 versioning.h 是项目文件中其他构建目标的依赖项 -

  • versioning.h 的完整路径添加到您的 HEADERS 变量中。
  • versioning.h 所在的文件夹添加到您的 DEPENDPATH 变量中。

(警告:如果您在 versioning.h 不存在时运行 qmake,它将发出“警告:找不到:versioning.h”— the only workaround for that warning is to use the system() command,正如我在我的其他答案。)

例子

创建包含以下内容的 test.pro:

versionTarget.target = ../versioning.h
versionTarget.depends = FORCE
versionTarget.commands = sleep 5s ; touch ../versioning.h
PRE_TARGETDEPS += ../versioning.h
QMAKE_EXTRA_TARGETS += versionTarget

SOURCES = test.c
HEADERS = ../versioning.h
DEPENDPATH = ..

创建包含以下内容的 test.c:

#include "../versioning.h"

运行qmake。它将输出 WARNING: Failure to find: ../versioning.h

运行 make -j9。它将运行 versionTarget.commands(它休眠 5 秒以放大任何多处理问题),并且在完成之后,运行编译 test.c 的命令。

(如果您检查生成的 Makefile,您会看到 test.o 依赖于 test.c../versioning.h,因此 Make 应该正确地弄清楚它不能在创建/更新 .. 的命令之前运行编译 test.c 的命令。/versioning.h.)

关于qt - 任何编译之前的 qmake 预构建步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39451390/

相关文章:

c++ - 使用cmake将两种解决方案合二为一

c++ - Qt 应用程序中的 Windows 资源管理器

Eclipse、QT 和 "C++ project": is it possible?

c++ - qmake 没有正确检测变量

c++ - Qmake 和 Make 使用单独的文件夹作为源和标题

c++ - QT构建QWidget、QObject错误

qt - 让qmake默认使用qt5

c++ - 如果 QStateMachine 中的转换成功,则从类发出信号

c++ - Qthread,给qthread添加函数

c++ - 如何更改 QTimeEdit 的步长?