一、操作符
以下部分描述了如何使用运算符来操作变量的内容。
赋值
= 运算符为变量赋值:
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时使用的特殊变量,比如 DEFINES、SOURCES、HEADERS。 此外,可以创建自己使用的变量。 当 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)
}