关于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
现在,问题在于这种方法本身不是构建步骤,而只是另一个构建目标,因此,如果我为
-j
配置了make
标志,它将与其他构建作业并行运行我的脚本。这非常糟糕,因为我的脚本会创建/更新头文件-在编译过程中对其进行部分更改是 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
。)