QMake提供内置函数用于处理变量的内容以及在配置过程中进行测试。处理变量内容的函数通常会返回可赋值给其它变量的值,可以使用$$FuncionName获取函数的返回值;进行测试的函数通常作为作用域的条件部分使用。
qmake提供了在配置过程中处理变量内容的函数。这些函数称为替换函数。通常,替换函数返回可以赋值给其它变量的值。可以通过在函数名称前使用$$操作符来获取这些值。
basename(variablename)
返回指定文件的基本文件名
- FILE = /etc/passwd
- FILENAME = $$basename(FILE) #passwd
dirname(file)
返回指定文件file中的目录部分
- FILE = /etc/X11R6/XF86Config
- DIRNAME = $$dirname(FILE) #/etc/X11R6
find(variablename, substr)
在variablename变量的所有值中查找匹配substr字符串的值,substr可能是正则表达式。
join(variablename, glue, before, after)
使用glue连接variablename变量中的值。如果变量的值非空,在值前面加一个前缀before,在值的后面加一个后缀after。Variablename是必须参数,其它参数默认是空字符串。如果需要在glue、before、after中对空格进行编码,必须对它们使用引号。
member(variablename, position)
返回variablename变量的值列表中position位置的值。如果在指定位置不能找到值项,返回一个空字符串。Variablename是必须参数,如果不指定position参数,position默认为0,返回variablename变量的值列表中的第一个值。
include(filename)
包含文件filename.
prompt(question)
显示指定的question,返回一个从stdin读取的值。
quote(string)
将整个string转换为单个实体,返回结果。这只是一种把字符串括上双引号的花样方法。
replace(string, old_string, new_string)
使用new_string替换在变量string中出现的old_string。如:
- MESSAGE = This is a tent.
- message($$replace(MESSAGE, tent, test))
- sprintf(string, arguments...)
使用逗号分隔的函数参数arguments替换1%——9%,返回处理后的字符串。
unique(variablename)
返回变量中值的链表,如果有重复的删除。
- ARGS = 1 2 3 2 5 1
- ARGS = $$unique(ARGS) #1 2 3 5
CONFIG(config)
本函数用来测试放置在CONFIG变量中的变量。这与常规旧式(tmake)作用域相同,但具有附加的优点,可以将第二个参数传递给活动配置进行测试。由于CONFIG变量中值的顺序是重要的,CONFIG的第二个参数用于指定要考虑的值的集合。例如:
- CONFIG = debug
- CONFIG += release
- CONFIG(release, debug|release):message(Release build!) #will print
- CONFIG(debug, debug|release):message(Debug build!) #no print
由于release作为活跃设置, CONFIG用于生成构建文件。在一般情况下,不需要第二个参数,但对于特定的互斥测试,这是非常宝贵的。函数CONFIG的别名:isActiveConfig。
contains(variablename, value)
如果variablename变量包含value值,成功;否则,失败。value可以指定正则表达式。可以使用作用域检查此函数的返回值。
- contains( drivers, network ) {
- # drivers contains 'network'
- message( "Configuring for network build..." )
- HEADERS += network.h
- SOURCES += network.cpp}
上述代码只有在drivers变量包含network值的条件下,作用域才会被处理。
find( variablename, substr ):
这将会放置variablename中所有匹配substr的值。substr也可以是正则表达式,而因此将被匹配。
MY_VAR = one two three four
MY_VAR2 =
MY_VAR2将会包含“-Lone -Ltwo -Lthree -Lfour -Lfive”,并且MYVAR3将会包含“three two three”。
count(variablename, number)
如果variablename变量包含指定数量number的值列表,成功;否则,失败。
本函数用于确保作用域内的声明仅在变量包含正确数值的情况下才被处理。
- options = $$find(CONFIG, "debug") $$find(CONFIG, "release")
- count(options, 2) {
- message(Both release and debug specified.)}
error(string)
函数无返回值,用于显示给定的字符串string给用户,并退出。只用于不可恢复的错误。error(An error has occurred in the configuration process.)
eval(string)
评估使用qamke语法规则的string字符串的内容,返回true。在string字符串中可以使用定义和赋值来修改现有变量的值或创建新的定义。
- eval(TARGET = myapp) {
- message($$TARGET)}
注意:引号可以用来分隔字符串,如果不需要返回值,则可以放弃。
exists(filename)
测试给定文件名的文件是否存在。如果文件存在,函数成功;否则,失败。如果文件名是一个正则表达式,如果有任何文件匹配成功,则函数执行成功。
- exists( $(QTDIR)/lib/libqt-mt* )
- {
- message( "Configuring for multi-threaded Qt..." )
- CONFIG += thread
- }
for(iterate, list)
这个特殊的测试函数将开启循环,遍历列表中的所有值,依次对每个值设置迭代。为方便起见,如果列表为1…10,则迭代将遍历值1到10。
在for循环的条件行后使用else作用域是不允许的。
- LIST = 1 2 3
- for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!)
message(string)
此函数简单地将消息写入控制台。不像error()函数,本函数允许继续处理。message( "This is a message" )
上述代码会将"This is a message"消息写入控制台。引号的使用是可选的。
注意:默认,对于给定项目,qmake生成的每个MakeFile文件都会写入消息。如果要确保每个项目只显示一次消息,在构建期间,可以测试build_pass变量,并在相邻build_pass变量的作用域中过滤出消息。!build_pass:message( "This is a message" )
include(filename)
将filename指定的文件的内容包含在当前工程所在的点。如果文件已经被包含,函数成功;否则,失败。被包含的文件要被立即处理。
通过使用此函数作为作用域的条件,可以检查文件是否被包含。
- include( shared.pri )
- OPTIONS = standard custom!include( options.pri ) {
- message( "No custom build options specified" )
- OPTIONS -= custom}
infile(filename, var, val)
当文件被qmake解析时,如果filename文件包含有val值的var变量,成功;否则,失败。如果不指定第三个参数val,函数只会测试文件中是否包含var变量。isEmpty(variablename)
如果variablename变量为空,成功;否则,失败。等价于count(variablename, 0)。
- isEmpty(CONFIG) {
- CONFIG += qt warn_on debug}
system(command)
在shell中执行给定的命令command,如果command返回一个0的退出状态,成功;否则,失败。
可以使用system函数从command命令获取stdout和stderr,赋值给变量。如:
- UNAME = $$system(uname -s)
- contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )
warning(string)
显示给定的字符串string,总会成功。与message()相同。
packagesExist(packages)
使用PKGCONFIG机制决定在工程解析时是否存在给定的packages。通常用于打开、关闭特性。如:
- packagesExist(sqlite3 QtNetwork QtDeclarative)
- {
- DEFINES += USE_FANCY_UI
- }
error(string)
输出指定的字符串,然后qmake退出。
replace(string, old_string, new_string)
将字符串string中的子串old_string用new_string替换,返回替换后的新串。
debug(level, message)
检测qmake是否在指定的调试级别上运行。如果是,则返回true并打印一条调试信息。
export(varname)
将变量varname的值从函数本地上下文导出到全局上下文中。
if(condition)
评估condigion。用于对布尔表达式分组。
mkpath(dirpath)
创建目录路径dirpath。Qt5.0中引入,是QDir::mkpath的包装器。
requires(condition)
评估condition。如果条件为假,则qmake构建时跳过此项目及其子目录。
注意:也可以使用REQUIRES变量,但建议用此函数。
touch(filename, reference_filename)
更新filename的时间戳以匹配reference_filename的时间戳。Qt5.0中引入。
unset(varname)
从当前上下文中删除变量varname。如下:








defined(name[, type])
| type | 含义 |
|---|---|
| test | 检查测试函数 |
| replace | 检查代替函数 |
| var | 检查变量 |
- defined(COPY_TARGET, var) {
-
- ...
- }
contains(variablename, value)
- contains(QT, core) {
-
- ...
- }
equals(variablename, value)
其别名:isEqual(varname, value)
- TARGET = Test
- equals(TARGET, "Test") {
-
- ...
- }
- message(string)
- log(string)
- warning(string)
- error(string)
greaterThan(variablename, value)
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
system(command)
0x06 测试变量是否小于某个值
lessThan(variablename, value)
附:
Replace Functions
absolute_path(path[, base])
basename(variablename)
cat(filename[, mode])
clean_path(path)
dirname(file)
enumerate_vars
escape_expand(arg1 [, arg2 …, argn])
find(variablename, substr)
first(variablename)
format_number(number[, options…])
fromfile(filename, variablename)
getenv(variablename)
join(variablename, glue, before, after)
last(variablename)
list(arg1 [, arg2 …, argn])
lower(arg1 [, arg2 …, argn])
member(variablename [, start [, end]])
num_add(arg1 [, arg2 …, argn])
prompt(question [, decorate])
quote(string)
re_escape(string)
relative_path(filePath[, base])
replace(string, old_string, new_string)
sprintf(string, arguments…)
resolve_depends(variablename, prefix)
reverse(variablename)
section(variablename, separator, begin, end)
shadowed(path)
shell_path(path)
shell_quote(arg)
size(variablename)
sort_depends(variablename, prefix)
sorted(variablename)
split(variablename, separator)
str_member(arg [, start [, end]])
str_size(arg)
system(command[, mode[, stsvar]])
system_path(path)
system_quote(arg)
take_first(variablename)
take_last(variablename)
unique(variablename)
upper(arg1 [, arg2 …, argn])
val_escape(variablename)
Test Functions
cache(variablename, [set|add|sub] [transient] [super|stash], [source variablename])
CONFIG(config)
contains(variablename, value)
count(variablename, number)
debug(level, message)
defined(name[, type])
equals(variablename, value)
error(string)
eval(string)
exists(filename)
export(variablename)
files(pattern[, recursive=false])
for(iterate, list)
greaterThan(variablename, value)
if(condition)
include(filename)
infile(filename, var, val)
isActiveConfig
isEmpty(variablename)
isEqual
lessThan(variablename, value)
load(feature)
log(message)
message(string)
mkpath(dirPath)
requires(condition)
system(command)
touch(filename, reference_filename)
unset(variablename)
warning(string)
write_file(filename, [variablename, [mode]])
Test Function Library
packagesExist(packages)
prepareRecursiveTarget(target)
qtCompileTest(test)
qtHaveModule(name)