就像它们在其他编程语言中的角色一样,函数和宏是开发人员扩展CMake功能、封装重复任务的主要机制。它允许开发人员定义可重用的CMake代码块,这些代码块可以像常规的内置CMake命令一样调用。它们也是CMake自己模块系统的基石(后文再说)。
基础
函数和宏与C++非常相似,函数引入了一个新的作用域,函数参数成为函数体中可访问的变量。而宏则是文本替换,宏参数被替换为对应的字符串。命令格式如下:
function(name [arg1 [arg2 [...]]])
# Function body (i.e. commands) ...
endfunction()
macro(name [arg1 [arg2 [...]]])
# Macro body (i.e. commands) ...
endmacro()
函数或宏的调用方式与任何其他CMake命令完全相同,然后在调用点执行函数或宏的主体。例如:
function(print_me)
message("Hello from inside a function")
message("All done")
endfunction()
# Called like so:
print_me()
如上所示,name参数定义了用于调用函数或宏的名称,它应该只包含字母、数字和下划线。名称不区分大小写,但为了风格一致,建议名字小写,因为CMake自己的命令遵循的约定是命令名小写,单词之间用下划线分隔。CMake的早期版本要求名称作为endfunction()或endmacro()的括号里要重复参数,但现在已经没必要了。(这点和if()endif()类似。)
参数的使用
函数和宏的参数处理基本相同,只有一个非常重要的区别。对于函数,每个参数都是一个CMake变量,并且具有CMake变量的所有常规行为。例如,它们可以在**if()**语句中作为变量进行测试。相比之下,宏参数是字符串替换,因此用作宏调用参数的内容基本上粘贴到宏体中参数出现的任何位置。如果在If()语句中使用宏参数,则会将其视为字符串而不是变量。