【问题标题】:How to refer to the source directory in qmake?qmake中如何引用源码目录?
【发布时间】:2011-03-04 10:46:52
【问题描述】:

我加了

version.target = version.h
version.commands = bash generate-version.sh

QMAKE_EXTRA_TARGETS += version

PRE_TARGETDEPS += version.h

到项目,但它尝试在目标目录中运行“generate-version.sh”:

make: Leaving directory `.../qqq-build-desktop'
make: Entering directory `.../qqq-build-desktop'
Makefile:236: warning: overriding commands for target `version.h'
Makefile:233: warning: ignoring old commands for target `version.h'
bash generate-version.sh
bash: generate-version.sh: No such file or directory
make: Leaving directory `.../qqq-build-desktop'

有 $$DESTDIR,但我没有看到 $$SRCDIR。 qmake中如何引用项目目录(或者如何重写)?

【问题讨论】:

    标签: qmake


    【解决方案1】:

    我的第一个想法是尝试重写

    version.commands = bash generate-version.sh
    

    这样就不必调用 shell 脚本了。也许您可以将所有语句合并为一行:

    version.commands = echo \'char VERSION[]=\"1.0\";\' > version.h && ls && echo Done
    

    如果您在调用脚本时遇到困难,那么您可能正在寻找 PWD 或 OUT_PWD。来自qmake Variable Reference

    残疾人

    此变量包含通向 qmake 项目文件 (project.pro) 所在目录的完整路径。

    OUT_PWD

    此变量包含通向 qmake 放置生成的 Makefile 的目录的完整路径。

    文档中没有提到的一个警告是,如果您正在执行递归 qmake,PWD 指的是从哪里读取顶级 .pro 文件。因此,如果您从 {proj-root} 运行 qmake -r,当最终读入 sub/sub/sub/dir-proj.pro 时,PWD 仍将指向 {proj-root}。

    假设 generate-version.sh 与您的顶级 .pro 文件位于同一目录中,您可以尝试:

    version.commands = bash $$PWD/generate-version.sh
    

    【讨论】:

    • 无论如何都需要访问“.git”或“.svn”目录来获取版本,所以无论如何我们都需要$$PWD。​​span>
    • 如果在包含的 .pri 文件中使用,PWD 会指向 .pri 所在的目录,而不是 .pro 文件的原始目录。 Qt 至少 int Qt 5.6。有没有办法在 .pri 文件中获取原始 .pro 目录..?
    【解决方案2】:

    我找到了更好更清洁的解决方案

    version.target = version.h
    version.commands = bash ${QMAKE_VAR__PRO_FILE_PWD_}/generate-version.sh
    QMAKE_EXTRA_TARGETS += version
    

    变量 _PRO_FILE_PWD_ 自 qt 4.5 起被记录并包含包含正在使用的项目文件的目录的路径(包含 .pro 文件)

    但要访问 QMAKE_EXTRA_TARGETS 的此变量,必须附加 QMAKE_VAR_。

    【讨论】:

    • 似乎不起作用。当我将 $$PWD 替换为 ${QMAKE_VAR__PRO_FILE_PWD_} 时,它无法编译。 Makefile 包含文字 ${QMAKE_VAR__PRO_FILE_PWD_}.
    • 你的qtcreator是什么版本
    • 我正在检查普通的“qmake-qt4”。 QMake version 2.01a 现在(测试时不知道版本)。
    【解决方案3】:

    残疾人

    指定通向包含 当前正在解析的文件。这对于引用其中的文件很有用 编写项目文件以支持影子构建时的源代码树。

    【讨论】:

      【解决方案4】:

      我使用(Linux 和 g++)

      DEFINES += SVN_VERSION=\\\"\""`svnversion $$PWD`\""\\\"
      DEFINES += COMPILE_DATE=\\\"\""`date`\""\\\"
      DEFINES += SW_VERSION=\\\"\"0.5\"\\\"
      

      将宏 SVNVERSON 定义为 svn 版本。 要从 C++ 访问它:

      QString svnVersion = SVN_VERSION;
      QString swVersion  = SW_VERSION;
      

      说明:在shell上我想看到这个调用:

      -DSVN_VERSION=\""`svnversion /path/to/my/source`"\"
      

      如您所见,shell 级别需要一些转义。在 .pro 文件中,它必须被转义两次。

      【讨论】:

      • 如果版本发生变化,这将触发所有文件的重新编译——不仅包括版本头文件。 - SVN 不是什么大问题,但是当利用 git 的全部功能时,这种情况经常发生。
      【解决方案5】:

      这很有效,而且很容易理解。

      version.commands = ( cd $${PWD}; generate-version.sh )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        相关资源
        最近更新 更多