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

cma*_*t85 23 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
Run Code Online (Sandbox Code Playgroud)

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

那么,无论如何我可以在任何编译运行之前执行此脚本吗?我知道我可以创建另一个脚本,并调用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
}
Run Code Online (Sandbox Code Playgroud)

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

smo*_*ris 13

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

  • 将完整路径添加versioning.hHEADERS变量中.
  • 添加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.)


smo*_*ris 6

使用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)

  • 这种方法存在严重的问题,因为`qmake`是为了干净的构建而运行的,即使没有变化也是如此.这就是为什么使用脚本作为目标的原因. (2认同)