How is ARGN passed to a macro

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

How is ARGN passed to a macro

Torsten Robitzki
Hi,
I’ve stumbled over following behavior and now I’m searching for the rules, that explains that behavior:

test.cmake:

  macro(check_argn)
    message("in macro check_argn ARGN: ${ARGN}")

    if(ARGN)
      foreach(item IN LISTS ARGN)
        message("ARG: ${item}")
      endforeach(item)
      message("ARGN: ${ARGN}")
    endif()
  endmacro()

  function(f1 a)
    message("in function ARGN: ${ARGN}")
    check_argn()
  endfunction()

  f1(1)
  f1(1 2)

This will yield the following output:

  $ cmake -P ./test.cmake
  in function ARGN:
  in macro check_argn ARGN:
  in function ARGN: 2
  in macro check_argn ARGN:
  ARG: 2
  ARGN:

I would expect ARGN to behave exactly the same in the macro, as in the function, but apparently there is a difference. Can someone of you explain that to me?

TIA and kind regards,

Torsten
--

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:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: How is ARGN passed to a macro

Andreas Naumann
Hey Torsten,

Am 21.11.18 um 13:15 schrieb Torsten Robitzki:

> Hi,
> I’ve stumbled over following behavior and now I’m searching for the rules, that explains that behavior:
>
> test.cmake:
>
>    macro(check_argn)
>      message("in macro check_argn ARGN: ${ARGN}")
>
>      if(ARGN)
>        foreach(item IN LISTS ARGN)
>          message("ARG: ${item}")
>        endforeach(item)
>        message("ARGN: ${ARGN}")
>      endif()
>    endmacro()
>
>    function(f1 a)
>      message("in function ARGN: ${ARGN}")
>      check_argn()
>    endfunction()
>
>    f1(1)
>    f1(1 2)
>
> This will yield the following output:
>
>    $ cmake -P ./test.cmake
>    in function ARGN:
>    in macro check_argn ARGN:
>    in function ARGN: 2
>    in macro check_argn ARGN:
>    ARG: 2
>    ARGN:
>
> I would expect ARGN to behave exactly the same in the macro, as in the function, but apparently there is a difference. Can someone of you explain that to me?

I think the behavior is explained in [1] and [2]. In particular the
second section of [2] states that the parameter " [...] such as ARGN are
not variables in the usual CMake sense. They are string replacements
[...]".  And the example at the end of [2] seems to match your test
perfectly.

Hope that helps a bit,
Andreas

[1] https://cmake.org/cmake/help/latest/command/function.html

[2] https://cmake.org/cmake/help/latest/command/macro.html

>
> TIA and kind regards,
>
> Torsten


--

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:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: How is ARGN passed to a macro

Torsten Robitzki
Hi Andreas,

> Am 21.11.2018 um 20:18 schrieb Andreas Naumann <[hidden email]>:
>
> I think the behavior is explained in [1] and [2]. In particular the second section of [2] states that the parameter " [...] such as ARGN are not variables in the usual CMake sense. They are string replacements [...]".  And the example at the end of [2] seems to match your test perfectly.

yes, but what puzzles me, is that I can’t print ${ARGN} in the macro (but in the function) but I can loop over it. That seems to be somehow strange to me.

Anyhow, thanks a lot and as long as this behavior is defined and (most likely) stays this way, I can work with it :-)

regards,

Torsten


--

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:
https://cmake.org/mailman/listinfo/cmake

signature.asc (849 bytes) Download Attachment