有关如何创建预构建步骤的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
Run Code Online (Sandbox Code Playgroud)
现在,问题是这种方法本身不是构建步骤,而只是另一个构建目标,所以如果我-j为其配置了标志,make则与其他构建作业并行运行我的脚本.这非常糟糕,因为我的脚本创建/更新了一个头文件 - 让它在编译过程中改变是不可接受的.
那么,无论如何我可以在任何编译运行之前执行此脚本吗?我知道我可以创建另一个脚本,并调用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
}
Run Code Online (Sandbox Code Playgroud)
但这仍然导致相同的并行行为.我认为这可能是由于我的使用ccache,但关闭它没有任何区别(当然除了慢得多).
smo*_*ris 13
另一个选择是从原始问题中的项目文件片段开始,并确保qmake知道它versioning.h是项目文件中其他构建目标的依赖项 -
versioning.h到HEADERS变量中.versioning.h驻留在DEPENDPATH变量中的文件夹.(警告:如果你运行qmake时versioning.h不存在,它将发出"警告:找不到:versioning.h" - 该警告的唯一解决方法是使用该system()命令,正如我在其他答案中所述.)
创建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 = ..
Run Code Online (Sandbox Code Playgroud)
创建test.c包含以下内容:
#include "../versioning.h"
Run Code Online (Sandbox Code Playgroud)
跑qmake.它会输出WARNING: Failure to find: ../versioning.h.
跑make -j9.它将运行versionTarget.commands(睡眠5秒以夸大任何多处理问题),然后,运行命令进行编译test.c.
(如果你检查生成的Makefile,你会看到,test.o取决于两个test.c和../versioning.h,所以要要正确弄清楚,它不能运行命令编译test.c的命令创建/更新之前../versioning.h.)
使用system()qmake命令 - 它在您运行时运行qmake,这在make运行任何构建命令之前发生.
win32: PYTHON=python.exe
else: PYTHON=python
system(cd $$PWD; $$PYTHON ./version_getter.py -p ../VersionData/versioning.h)
Run Code Online (Sandbox Code Playgroud)