qmake:语法

一、操作符

以下部分描述了如何使用运算符来操作变量的内容。

赋值

= 运算符为变量赋值:

  TARGET = myapp

附加值

+= 运算符将一个新值附加到变量中的值列表:

  DEFINES += USE_MY_STUFF

删除值

-= 运算符从变量的值列表中删除一个值:

  DEFINES -= USE_MY_STUFF

添加唯一值

*= 运算符将一个值添加到变量中的值列表中。这可以防止值在变量中多次包含。 例如:

  DEFINES *= USE_MY_STUFF

替换值

~= 运算符将与正则表达式匹配的任何值替换为指定值:

  DEFINES ~= s/QT_[DT].+/QT

列表中以 QT_D QT_T 开头的任何值都将替换为 QT

可变扩展

$$ 运算符用于提取变量的内容,并可用于在变量之间传递值或将它们提供给函数:

  EVERYTHING = $$SOURCES $$HEADERS
  message("该项目包含以下文件:")
  message($$EVERYTHING)

变量可用于存储环境变量的内容。

要在 qmake 运行时获取环境值的内容,请使用 $$(...) 运算符:

  DESTDIR = $$(PWD)
  message(该项目将安装在:$$DESTDIR)

PWD环境变量的值是在处理工程文件时读取的。要在处理生成的 Makefile 时获取环境值的内容,请使用 $(...) 运算符:

  DESTDIR = $(PWD)
  message(处理 Makefile 时,该项目将安装在:$$DESTDIR)

访问 qmake 属性

特殊的 $$[...] 运算符可用于访问 qmake 属性:

   message(Qt 版本:$$[QT_VERSION])
   message(Qt安装在:$$[QT_INSTALL_PREFIX])
   message(Qt资源可以在以下位置找到:)
   message(文档:$$[QT_INSTALL_DOCS])
   message(头文件:$$[QT_INSTALL_HEADERS])
   message(库:$$[QT_INSTALL_LIBS])
   message(二进制文件(可执行文件):$$[QT_INSTALL_BINS])
   message(插件:$$[QT_INSTALL_PLUGINS])
   message(数据文件:$$[QT_INSTALL_DATA])
   message(翻译文件:$$[QT_INSTALL_TRANSLATIONS])
   message(设置:$$[QT_INSTALL_CONFIGURATION])
   message(示例:$$[QT_INSTALL_EXAMPLES])

此运算符可访问的属性通常用于使第三方插件和组件能够集成到 Qt 中。例如,如果在其项目文件中进行以下声明,则 Qt Designer 插件可以与 Qt Designer 的内置插件一起安装:

  target.path = $$[QT_INSTALL_PLUGINS]/designer
  INSTALLS += target

二、作用域

作用域类似于过程编程语言中的 if 语句。如果某个条件为true,则处理范围内的声明。

作用域语法

作用域包括一个条件,后跟同一行上的左大括号、一系列命令和定义,以及新行上的右大括号:

  <condition> {
      <command or definition>
      ...
  }

左大括号必须与条件写在同一行。如以下部分所述,范围可以串联以包含多个条件。

作用域和条件

作用域被写成一个条件,后跟包含在一对大括号内的一系列声明。例如:

  win32 {
      SOURCES += paintwidget_win.cpp
  }

也可以否定给定作用域中使用的条件,以提供一组替代声明,仅当原始条件为假时才会处理这些声明。例如:

  !win32 {
      SOURCES -= paintwidget_win.cpp
  }

作用域可以嵌套以组合多个条件。例如:

  macx {
      CONFIG(debug, debug|release) {
          HEADERS += debugging.h
      }
  }

上面例子等同于:

  macx:CONFIG(debug, debug|release) {
      HEADERS += debugging.h
  }

还可以使用运算符来执行单行条件赋值。 例如:

  win32:DEFINES += USE_MY_STUFF

: 运算符:逻辑 AND 运算符,将许多条件连接在一起,并要求所有条件都为真。

| 运算符:逻辑 OR 运算符,将多个条件连接在一起,并且只需要其中一个为真。

  win32|macx {
      HEADERS += debugging.h
  }

还可以使用 else 作用域为作用域内的声明提供替代声明。如果前面作用域的条件为假,则处理每个 else 作用域。例如:

  win32:xml {
      message(在Windows上构建)
      SOURCES += xmlhandler_win.cpp
  } else:xml {
      SOURCES += xmlhandler.cpp
  } else {
      message(未知配置)
  }

配置和作用域

存储在 CONFIG 变量中的值由 qmake 特别处理。每个可能的值都可以用作作用域的条件。 例如,CONFIG 保存的值列表可以用 opengl 值扩展:

 CONFIG += opengl

可以使用这个特性给最终的可执行文件一个合适的名字:

 opengl {
     TARGET = application-gl
 } else {
     TARGET = application
 }

由于可以将自定义的值放在 CONFIG 行上,这提供了一种自定义项目文件和微调生成的 Makefile 的便捷方法。

平台作用域值

可以使用作用域测试各种其他内置平台和特定于编译器的值。这些基于 Qt 的 mkspecs 目录中提供的平台规范。 例如,项目文件中的以下几行显示了 linux-g++ 规范的当前使用和测试规范:

 message($$QMAKESPEC)

 linux-g++ {
     message(Linux)
 }


三、变量

项目文件中使用的很多变量都是qmake在生成Makefile时使用的特殊变量,比如 DEFINESSOURCESHEADERS。 此外,可以创建自己使用的变量。 当 qmake 遇到对该名称的赋值时,它会创建具有给定名称的新变量。 例如:

 MY_VARIABLE = value

自定义的变量所做的事情没有限制,因为 qmake 将忽略它们,除非它在处理范围时需要评估它们。

还可以通过在变量名称前添加 $$ 前缀来将当前变量的值分配给另一个变量。 例如:

 MY_DEFINES = $$DEFINES
 #或
 MY_DEFINES = $${DEFINES}

现在 MY_DEFINES 变量包含项目文件中此时 DEFINES 变量中的内容。


四、函数

qmake 提供了一系列内置函数来允许处理变量的内容。这些函数处理提供给它们的参数并作为结果返回一个值或值列表。 要将结果分配给变量,请在此类函数中使用 $$ 运算符,就像将一个变量的内容分配给另一个变量一样:

 HEADERS = model.h
 HEADERS += $$OTHER_HEADERS
 HEADERS = $$unique(HEADERS)

您可以定义自己的函数来处理变量的内容,如下所示:

 defineReplace(functionName){
     #function code
 }

以下示例函数将变量名称作为其唯一参数,使用 eval() 内置函数从变量中提取值列表,并编译文件列表:

 defineReplace(headersAndSources) {
     variable = $$1
     names = $$eval($$variable)
     headers =
     sources =

     for(name, names) {
         header = $${name}.h
         exists($$header) {
             headers += $$header
         }
         source = $${name}.cpp
         exists($$source) {
             sources += $$source
         }
     }
     return($$headers $$sources)
 }

五、测试函数

qmake 提供了可在编写作用域时用作条件的内置函数。这些函数不返回值,而是指示成功或失败:

 count(options, 2) {
     message(指定发布和调试)
 }

这种类型的函数应该只在条件表达式中使用。

可以定义自己的函数来为作用域提供条件。以下示例测试列表中的每个文件是否存在,如果它们都存在则返回 true,否则返回 false:

 defineTest(allFiles) {
     files = $$ARGS

     for(file, files) {
         !exists($$file) {
             return(false)
         }
     }
     return(true)
 }
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值