Re: [CMake] How to write a correct wrapper of MESSAGE()?
On Mon, Oct 21, 2013 at 6:06 PM, Johannes Zarl johannes.z...@jku.at wrote: On Thursday, 17. October 2013, 07:12:51, Clark WANG wrote: When I'm using CMake more and more I find it's not a real serious language. It's so tricky. I can see why you are frustrated. I don't think it's all bad though. Hopefully CMake3 will be used for some language cleanups at the expense of breaking some backwards-compatibility... The 3.0 (now rc1) release noteshttp://www.cmake.org/cmake/help/v3.0/release/3.0.0.htmldid not mention about these kinds of things. :( Johannes -- 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 -- 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
Re: [CMake] How to write a correct wrapper of MESSAGE()?
On Thursday, 17. October 2013, 07:12:51, Clark WANG wrote: When I'm using CMake more and more I find it's not a real serious language. It's so tricky. I can see why you are frustrated. I don't think it's all bad though. Hopefully CMake3 will be used for some language cleanups at the expense of breaking some backwards-compatibility... Johannes -- 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
Re: [CMake] How to write a correct wrapper of MESSAGE()?
On Tue, Oct 15, 2013 at 8:12 PM, Johannes Zarl johannes.z...@jku.at wrote: On Monday, 14. October 2013, 19:07:06, Matthew Woehlke wrote: 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. Really? That... is surprising. I thought the whole point of 'IN LISTS' was to take a variable that already contains a list and NOT do additional splitting (the way 'foreach(NAME ${LIST})' would)... While the behaviour here is hardly what one would expect, the list is not really split. What happens, is the following: 1) Function info gets two parameters: foo;bar and baz 2) The ARGV list is created by adding the parameters to the list: set(ARGV) list(ADD ARGV foo;bar) # here the foo;bar list is flattened list(ADD ARGV baz) Since a list cannot contain another list, we get a flattened representation of the arguments: ARGV == foo;bar;baz 3) foreach(name IN LISTS ARGV) only gets to see the flattened representation contained in ARGV. When I'm using CMake more and more I find it's not a real serious language. It's so tricky. Johannes -- 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 -- 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
Re: [CMake] How to write a correct wrapper of MESSAGE()?
On Monday, 14. October 2013, 19:07:06, Matthew Woehlke wrote: 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. Really? That... is surprising. I thought the whole point of 'IN LISTS' was to take a variable that already contains a list and NOT do additional splitting (the way 'foreach(NAME ${LIST})' would)... While the behaviour here is hardly what one would expect, the list is not really split. What happens, is the following: 1) Function info gets two parameters: foo;bar and baz 2) The ARGV list is created by adding the parameters to the list: set(ARGV) list(ADD ARGV foo;bar) # here the foo;bar list is flattened list(ADD ARGV baz) Since a list cannot contain another list, we get a flattened representation of the arguments: ARGV == foo;bar;baz 3) foreach(name IN LISTS ARGV) only gets to see the flattened representation contained in ARGV. Johannes -- 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
Re: [CMake] How to write a correct wrapper of MESSAGE()?
On 2013-10-09 07:44, Johannes Zarl 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. Really? That... is surprising. I thought the whole point of 'IN LISTS' was to take a variable that already contains a list and NOT do additional splitting (the way 'foreach(NAME ${LIST})' would)... -- Matthew -- 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
Re: [CMake] How to write a correct wrapper of MESSAGE()?
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. 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.woeh...@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_FAQhttp://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.htmlhttp://cmake.org/cmake/help/s upport.html CMake Consulting: http://cmake.org/cmake/help/**consulting.htmlhttp://cmake.org/cmake/hel p/consulting.html CMake Training Courses: http://cmake.org/cmake/help/**training.htmlhttp://cmake.org/cmake/help/ training.html Visit other Kitware open-source projects at http://www.kitware.com/** opensource/opensource.htmlhttp://www.kitware.com/opensource/opensource.h tml Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/**listinfo/cmakehttp://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
Re: [CMake] How to write a correct wrapper of MESSAGE()?
On Wed, Oct 9, 2013 at 7:44 PM, Johannes Zarl johannes.z...@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.woeh...@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 -- 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
Re: [CMake] How to write a correct wrapper of MESSAGE()?
On Sat, Oct 5, 2013 at 1:38 AM, Matthew Woehlke matthew.woeh...@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_FAQhttp://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.htmlhttp://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/**consulting.htmlhttp://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/**training.htmlhttp://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/** opensource/opensource.htmlhttp://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/**listinfo/cmakehttp://www.cmake.org/mailman/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
Re: [CMake] How to write a correct wrapper of MESSAGE()?
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} (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.) -- Matthew -- 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
[CMake] How to write a correct wrapper of MESSAGE()?
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: MACRO(info_mac_1) message([MACRO 1] ${ARGV}) ENDMACRO() MACRO(info_mac_2) message([MACRO 2] ${ARGV}) ENDMACRO() FUNCTION(info_fun_1) message([FUNC 1] ${ARGV}) ENDFUNCTION() FUNCTION(info_fun_2) message([FUNC 2] ${ARGV}) ENDFUNCTION() message(foo;bar) info_mac_1(foo;bar) message(foo bar) info_mac_2(foo bar) message(foo;bar) info_fun_1(foo;bar) message(foo bar) info_fun_2(foo bar) The output (tested with 2.8.8) would be like this: foo;bar [MACRO 1] foobar foobar [MACRO 2] foo;bar foo;bar [FUNC 1] foobar foobar [FUNC 2] foo;bar As you can see all the 4 commands I defined did not work the same way as MESSAGE(). So how should I define a correct wrapper on MESSAGE()? Thanks. -Clark -- 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