The main difference between macros and functions is, that macros are evaluated within the current context, while functions open a new scope within the current one. Thus, variables defined within functions are not known after the function has been evaluated. On the contrary, variables within macros are still defined after the macro has been evaluated.
macro(set_my_variable _INPUT)
if("${_INPUT}" STREQUAL "Foo")
set(my_output_variable "foo")
else()
set(my_output_variable "bar")
endif()
endmacro(set_my_variable)
Use the macro:
set_my_variable("Foo")
message(STATUS ${my_output_variable})
will print
-- foo
while
set_my_variable("something else")
message(STATUS ${my_output_variable})
will print
-- bar
macro(set_custom_variable _OUT_VAR)
set(${_OUT_VAR} "Foo")
endmacro(set_custom_variable)
Use it with
set_custom_variable(my_foo)
message(STATUS ${my_foo})
which will print
-- Foo