CMake中的函数与macros
CMake 2.8.12的官方文档讲述了macro
当它被调用时,macros中logging的命令首先通过用传递的参数replaceforms参数($ {arg1})来修改,然后作为普通命令调用。
和关于function
当它被调用时,函数中logging的命令首先通过用传递参数replaceforms参数($ {arg1})来修改,然后作为普通命令调用。
显然,两个引号几乎相同,但是让我困惑。 当像macros一样调用一个函数时,是否首先replace参数?
我在下面写了一个示例代码
set(var "ABC") macro(Moo arg) message("arg = ${arg}") set(arg "abc") message("# After change the value of arg.") message("arg = ${arg}") endmacro() message("=== Call macro ===") Moo(${var}) function(Foo arg) message("arg = ${arg}") set(arg "abc") message("# After change the value of arg.") message("arg = ${arg}") endfunction() message("=== Call function ===") Foo(${var})
和输出是
=== Call macro === arg = ABC # After change the value of arg. arg = ABC === Call function === arg = ABC # After change the value of arg. arg = abc
所以,当调用Foo
和${arg}
只是在调用Moo
时用${var}
replacestring时, arg
被赋予了var
的值。
所以我觉得上面这两个引号很容易混淆,虽然官方的文件也这么说
它们是stringreplace,就像C预处理器对macros的处理一样。 如果你想要真正的CMakevariables和/或更好的CMake范围控制,你应该看看函数命令。
换句话说,函数推送并popup新的variables作用域(创build和更改的variables仅存在于函数中),而macros则不会。 但是,您可以使用set
命令的PARENT_SCOPE
参数覆盖函数默认行为。