[CMake] How to write a correct wrapper of MESSAGE()?

Clark WANG dearvoid at gmail.com
Wed Oct 9 21:47:11 EDT 2013


On Wed, Oct 9, 2013 at 7:44 PM, Johannes Zarl <johannes.zarl at jku.at> wrote:

> I guess you search for something like this:
>
> function(info)
>     set(msg)
>     foreach(i RANGE ${ARGC})
>         set(msg "${msg}${ARGV${i}}")
>     endforeach()
>     message(STATUS "[info] ${msg}")
> endfunction()
>
> message("Foo:bar;baz space" "FOO")
> info("Foo:bar;baz space" "FOO")
> message(two words)
> info(two words)
>
> ...which yields the following output:
>
> Foo:bar;baz spaceFOO
> -- [info] Foo:bar;baz spaceFOO
> twowords
> -- [info] twowords
>
> The "IN LISTS" signature of foreach seems to do additional list splitting,
> leading to ("foo;bar" "baz") appearing as 3 elements. Accessing the ARGV
> array
> by the positional indices (e.g. ${ARGV0}) prevents the splitting.
>

This works. Thank you so much.

>
> HTH,
>   Johannes
>
> On Wednesday, 9. October 2013, 05:33:26, Clark WANG wrote:
> > On Sat, Oct 5, 2013 at 1:38 AM, Matthew Woehlke
> > <matthew.woehlke at kitware.com
> >
> > > wrote:
> > >
> > > On 2013-09-27 04:18, Clark WANG wrote:
> > >> I'm trying to write some MESSAGE() wrappers like info(), warning(),
> > >> fatal(), etc which may be a bit easier to use. But I failed to
> simulate
> > >> the
> > >> correct MESSAGE() behavior no matter I use MACRO or FUNCTION. For
> > >> example: [snip]
> > >
> > > FUNCTION vs MACRO shouldn't make a difference in argument parsing
> AFAIK.
> > > The difference is primarily that FUNCTION creates a scope, while MACRO
> > > operates in the scope from which it is called.
> > >
> > > The behavior of MESSAGE seems to concatenate multiple arguments with no
> > > separators. So maybe you could do something like:
> > >
> > > set(msg "")
> > > foreach(part IN LISTS ARGN)
> > >
> > >   set(msg "${msg}{$part}")
> > >
> > > endforeach()
> > > # ...do stuff with ${msg}
> >
> > This does not work either. For example:
> >
> > $ cat CMakeLists.txt
> > cmake_minimum_required(VERSION 2.8)
> >
> > FUNCTION(info_f)
> >     set(msg "")
> >     foreach(part IN LISTS ARGN)
> >           set(msg "${msg}${part}")
> >       endforeach()
> >     message("[info_f] ${msg}")
> > ENDFUNCTION()
> >
> > MACRO(info_m)
> >     set(msg "")
> >     foreach(part IN LISTS ARGN)
> >           set(msg "${msg}${part}")
> >       endforeach()
> >     message("[info_m] ${msg}")
> > ENDMACRO()
> >
> > message("foo;bar")
> > info_f("foo;bar")
> > info_m("foo;bar")
> > $ cmake .
> > foo;bar
> > [info_f] foobar
> > [info_m]
> > $
> >
> > > (I like ARGN since it is 'unnamed positional arguments'. Since you have
> > > no named arguments, ARGV == ARGN, but generally speaking I can't think
> > > of why you'd ever need to use ARGV.)
> >
> > Good point.
> >
> > > --
> > > Matthew
> > >
> > > --
> > >
> > > Powered by www.kitware.com
> > >
> > > Please keep messages on-topic and check the CMake FAQ at:
> > > http://www.cmake.org/Wiki/**CMake_FAQ<
> 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<
> http://cmake.org/cmake/help/s
> > > upport.html> CMake Consulting:
> > > http://cmake.org/cmake/help/**consulting.html<
> http://cmake.org/cmake/hel
> > > p/consulting.html> CMake Training Courses:
> > > http://cmake.org/cmake/help/**training.html<
> http://cmake.org/cmake/help/
> > > training.html>
> > >
> > > Visit other Kitware open-source projects at http://www.kitware.com/**
> > > opensource/opensource.html<
> http://www.kitware.com/opensource/opensource.h
> > > tml>
> > >
> > > Follow this link to subscribe/unsubscribe:
> > > http://www.cmake.org/mailman/**listinfo/cmake<
> http://www.cmake.org/mailma
> > > n/listinfo/cmake>
>
> --
>
> 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://www.cmake.org/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20131010/819bfafd/attachment.htm>


More information about the CMake mailing list