I have 2 CMake scripts:
Script1.cmake:
cmake_minimum_required(VERSION 3.15)
macro(m1)
message("[DEBUG1] " ${var1})
m2(var1) #<====================== HERE is different
endmacro(m1)
macro(m2 var2)
message("[DEBUG2] " ${var2})
set(${var2} "set from m2")
endmacro()
m1()
message("[DEBUG3] " ${var1})
Script2.cmake:
cmake_minimum_required(VERSION 3.15)
macro(m1)
message("[DEBUG1] " ${var1})
m2("var1") #<====================== HERE is different
endmacro(m1)
macro(m2 var2)
message("[DEBUG2] " ${var2})
set(${var2} "set from m2")
endmacro()
m1()
message("[DEBUG3] " ${var1})
I run them with cmake -P
. They both give the same output:
[DEBUG1]
[DEBUG2] var1
[DEBUG3] set from m2
For [DEBUG1]
, I can explain it that because var1
is not defined yet. So ${var1}
resolves to nothing.
But for [DEBUG2]
, how could it be the same to pass in var1
and "var1"
?
For passing
"var1"
, I think the result is logically reasonable.But for passing
var1
, I am actually passing some non-existing variable to macrom2
. I think there should be some error because the variable is not defined yet. But actually CMake works fine. And${var2}
resolves to the name ofvar1
.
I did some C++ programming before and I can understand pass argument by reference or pass argument by value. But it seems neither explanation fits in here. It seems there's some implicit conversion happening.