在CMake中,为了更好体现CMakeLists.txt文件中代码的可读性和重复利用,我们可以使用function命令和macro命令。function和macro命令非常类似,但是也有不同,比如参数传递的方式,在function中,参数传递采用传值的方式,类似C语言,而在macro中,参数传递采用文本替换的方式。调用macro时,相当于把macro中的语句替换到相应的位置,即macro的作用域是全局的,是整个CMakeLists.txt文件,所以在macro中要避免使用return()命令,因为如果在macro中执行return(),整个CMake进程就会退出,与之对应的function的作用域是局部的。另外macro命令不会影响CMake下面这些环境变量:CMAKE_CURRENT_FUNCTION, CMAKE_CURRENT_FUNCTION_LIST_DIR, CMAKE_CURRENT_FUNCTION_LIST_FILE, CMAKE_CURRENT_FUNCTION_LIST_LINE。
如果为了更好体现文件的调用结构,我们可以把function和marco分别写到functions.cmake和macros.cmake文件中,然后在CMakeLists.txt文件使用include命令将function和marco引用进来:
include("functions.cmake")
include("macros.cmake")
macro命令的基本语法是:
macro(<name> [<arg1> ...])
<commands>
endmacro()
下面一个macro样例是添加一个布尔类型的缓存变量,当为True时,格外添加个定义。参数传递使用${arg}:
macro(add_boolean_option name val helpstr)
if(DEFINED ${name})
set(value ${${name}})
else(DEFINED ${name})
set(value ${val})
endif()
set(${name} ${value} CACHE STRING "${helpstr}")
set_property(CACHE ${name} PROPERTY TYPE BOOL)
if (${value})
add_definitions("-D${name}")
endif (${value})
endmacro(add_boolean_option)
调用这个marco可以比如写:
add_boolean_option(BOOST False "if enabling BOOST")
function命令的基本语法是:
function(<name> [<arg1> ...])
<commands>
endfunction()
下面是function一个求和的样例,val0,val1作为输入,sum作为输出:
function(func_sum val0 val1 sum)
math(EXPR res "${val0} + ${val1}")
set(${sum} ${res} PARENT_SCOPE)
endfunction()
调用这个function可以比如写:
func_sum(1 2 SUM)
message(STATUS "SUM = ${SUM}")
因篇幅问题不能全部显示,请点此查看更多更全内容