QMake:测试功能没有按预期工作

QMake: test functions do not work as expected

在 QtCreator 4.2.0 中,我尝试使用一个 *.pro 文件为多种硬件配置构建二进制文件。

Build & 运行 => Build Settings => Build Enviroment 我定义环境变量 TARGET 如下:

pro 文件中,我使用以下测试函数:

equals($$TARGET,"bbb")
{
    message("setting include paths for bbb"))
    message($$TARGET)
}

equals($$TARGET,"laptop")
{
    message("setting include paths for laptop.")
    message($$TARGET)
}

contains($$TARGET,"*bbb*")
{
    message("setting include paths for bbb"))
    message($$TARGET)
}

contains($$TARGET,"*laptop*")
{
    message("setting include paths for laptop.")
    message($$TARGET)
}

我在 运行 qmake:

时得到这个输出
Project MESSAGE: setting include paths for bbb
Project MESSAGE: bbb
Project MESSAGE: setting include paths for laptop.
Project MESSAGE: bbb
Project MESSAGE: setting include paths for bbb
Project MESSAGE: bbb
Project MESSAGE: setting include paths for laptop.
Project MESSAGE: bbb
Project MESSAGE: setting include paths for bbb

这对我来说毫无意义,我不知道我在这里做错了什么。为什么 laptop 测试后的部分被执行了?

顺便说一下,我使用 Scopes 解决了我的问题。这非常适合我:

CONFIG += $$(TARGET_HW)
desktop {
    message("setting include paths for laptop.")
}

cetec {
    message("setting include paths for cetec."))
}

但我仍然对使用测试函数的正确方法感兴趣。

我提供第一次测试的正确语法,作为例子:

equals(TARGET,"bbb") {
    message("setting include paths for bbb"))
    message($$TARGET)
}

请注意:

  1. 大括号在测试的同一行。
  2. 测试的变量没有美元符号,只有变量名

左大括号必须与条件(https://doc.qt.io/qt-5/qmake-language.html#scope-syntax)写在同一行。

你的问题太多了,在之前正确的基础上再补充一个答案:

  1. 如@daru所说,需要打开大括号in the same line作为测试函数

  2. 如@p-a-o-l-o 所说,contains and equals 语法要求变量名作为第一个参数,没有 $$.

  3. TARGET 是一个 internal variable,默认包含项目文件的基本名称。它成为您正在构建的可执行文件或库的名称。

  4. 您可以使用一个 environment variable 命名的 TARGET,但是您应该将它分配给一个具有另一个名称的 qmake 变量名称。

示例代码:

TGT=$$(TARGET)

equals(TGT,"bbb") {
    message("$$TGT equals bbb"))
    message(TGT=$$TGT)
}

equals(TGT,"laptop") {
    message("$$TGT equals laptop")
    message(TGT=$$TGT)
}

contains(TGT,"bbb") {
    message("$$TGT contains bbb"))
    message(TGT=$$TGT)
}

contains(TGT,"top") {
    message("$$TGT contains top")
    message(TGT=$$TGT)
}