由于大写,qmake 4.8.4 打破了自定义目标。我该如何解决?

qmake 4.8.4 has broken custom targets due to capitalisation. How do I work around it?

我的 .pro 文件中有额外的内容:

win32 {
    OUT_PWD_SHELL = $$replace(OUT_PWD, /, \)

    autoversion.target = $$OUT_PWD\autoversioninfo.h
    autoversion.depends = FORCE
    autoversion.commands = $$PWD/../../AutoBuildVersion.exe $$replace(PWD, /, \) $$OUT_PWD_SHELL
    QMAKE_EXTRA_TARGETS += autoversion
    PRE_TARGETDEPS += $$OUT_PWD\autoversioninfo.h
}

这未能按预期工作,因为在生成的 makefile 中 DESTDIR_TARGET 添加了一个以 d:\ 开头的新依赖项,但为 autoversion 生成的规则以 D:/ 开头。我可以通过将所有 / 替换为 \ 来稍微改进这一点,但区分大小写仍然会破坏它并且目标未构建。

如果我从 autoversion.targetPRE_TARGETDEPS 中删除完整路径,那么问题就解决了,但是在计算依赖关系时,cpp 文件的规则包括生成的 header 更改为在依赖项中提供 header 的显式路径,并且该路径指向源目录而不是生成生成文件的输出目录。这会导致 make 无法生成生成的文件。

我不知道为什么 qmake 会改变驱动器的大小写处理,这很烦人,但我怎样才能让这一切正常工作?

没有好的解决办法。我想出的最好办法是使用一个始终运行的虚假目标来生成头文件。不利的一面是,当头文件已经存在时,这会减慢构建速度,但有利的一面是,它允许构建完成。

win32 {
    OUT_PWD_SHELL = $$replace(OUT_PWD, /, \)

    gen_autoversion.target = GENERATE_AUTOVERSIONINFO
    gen_autoversion.commands = $$PWD/../../AutoBuildVersion.exe $$replace(PWD, /, \) $$OUT_PWD_SHELL

    QMAKE_EXTRA_TARGETS += gen_autoversion

    PRE_TARGETDEPS += GENERATE_AUTOVERSIONINFO
}

我不确定这里是否真的需要 PRE_TARGETDEPS。