[CMake] Defining a function in a macro
David Cole
dlrdave at aol.com
Sun Aug 3 08:43:44 EDT 2014
Ouch... my brain hurts...
Another idea would be to write the "generated functions" out to a file,
and then, after all functions are written to the file, include the file.
Might result in something you can actually look at in an editor (and
make sense of) without your brain hurting too much, too.
;-)
D
-----Original Message-----
From: Walter Gray <chrysalisx at gmail.com>
To: cmake <cmake at cmake.org>
Sent: Fri, Aug 1, 2014 8:32 pm
Subject: [CMake] Defining a function in a macro
Hey List -
Just wanted to put this out there for posterity, and in case anyone
runs
into the same question I had. I had a bunch of nearly identical
functions, so I wanted to write a function to define them for me to
reduce code repetition. The problem I ran into was that if you write
macro(_define_function name)
function(namespaced_${function_name} ...)
message(${ARGV} from ${name})
endfunction()
endmacro()
_define_function(foo)
namespaced_foo("Message")
you actually wind up printing "foo from foo", since all variable
references to a macro are expanded first. I also couldn't use a
function, since there would be no way to access ${name} from inside the
function (that I'm aware of - please correct me on this if I'm wrong)
The solution I came up with was, if I wanted to reference the
function's
argv, I would do a double-dereference of a string containing "ARGV"
like so:
macro(_define_function name)
function(namespaced_${function_name} ...)
set(my_argv ARGV)
message(${${my_argv}} from ${name})
endfunction()
endmacro()
This produced the correct results. If any of you know of a cleaner way
to do this, I'd love to hear about it. If not, have fun writing
functions to write your functions!
As a relatively useless, but I thought entertaining aside:
macro(_define_function name my_argv)
function(namespaced_${function_name} ...)
message(${my_argv} from ${name})
endfunction()
endmacro()
_define_function(foo "\${ARGV}")
namespaced_foo("Message")
The result is "foo Message from foo" because ${my_argv} gets expand to
${ARGV}, which then expands to "foo ${ARGV}".
Thanks!
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For
more
information on each offering, please visit:
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
More information about the CMake
mailing list