关于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.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。)

    08-06 12:37