A expansão macro, respondida por Yantao Xie realmente abre meus olhos!
Também descobri que o tutorial abaixo vem com alguns exemplos concretos, o que é útil para entender o conceito de escopo de variável.
Citado em Learn cmake in 15 mins :
No CMake, você pode usar um par de function
/ endfunction
comandos para definir uma função. Aqui está um que duplica o valor numérico de seu argumento e, em seguida, imprime o resultado:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
As funções são executadas em seu próprio escopo. Nenhuma das variáveis definidas em uma função poluem o escopo do chamador. Se quiser retornar um valor, você pode passar o nome de uma variável para sua função e, em seguida, chamar o set
comando com o argumento especial PARENT_SCOPE
:
function(doubleIt VARNAME VALUE)
math(EXPR RESULT "${VALUE} * 2")
set(${VARNAME} "${RESULT}" PARENT_SCOPE) # Set the named variable in caller's scope
endfunction()
doubleIt(RESULT "4") # Tell the function to set the variable named RESULT
message("${RESULT}") # Prints: 8
Da mesma forma, um par de comandos macro
/ endmacro
define uma macro. Ao contrário das funções, as macros são executadas no mesmo escopo de seu chamador. Portanto, todas as variáveis definidas dentro de uma macro são definidas no escopo do chamador. Podemos substituir a função anterior pela seguinte:
macro(doubleIt VARNAME VALUE)
math(EXPR ${VARNAME} "${VALUE} * 2") # Set the named variable in caller's scope
endmacro()
doubleIt(RESULT "4") # Tell the macro to set the variable named RESULT
message("${RESULT}") # Prints: 8
Ambas as funções e macros aceitam um número arbitrário de argumentos. Argumentos sem nome são expostos à função como uma lista, por meio de uma variável especial chamada ARGN
.
Aqui está uma função que dobra todos os argumentos que recebe, imprimindo cada um em uma linha separada:
function(doubleEach)
foreach(ARG ${ARGN}) # Iterate over each argument
math(EXPR N "${ARG} * 2") # Double ARG's numeric value; store result in N
message("${N}") # Print N
endforeach()
endfunction()
doubleEach(5 6 7 8) # Prints 10, 12, 14, 16 on separate lines
function
emacro
: a semântica dereturn()
: Quando usado em amacro
, você não retornará da macro, mas da função de chamada.