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.py
和 qmake
,但这是不可取的,因为我必须从命令行编译而不是而不是在 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/