[CMake] An observation about CTest

Michael Hertling mhertling at online.de
Mon Jun 28 10:22:09 EDT 2010


On 06/28/2010 08:55 AM, Michael Wild wrote:
> 
> On 28. Jun, 2010, at 7:03 , Andreas Mohr wrote:
> 
>> Hello,
>>
>> On Sun, Jun 27, 2010 at 05:09:41PM -0400, cmake-request at cmake.org wrote:
>>> Your remarks focus on old-fashioned macros so it is possible you are not
>>> aware of functions? As far as I know, most or all macros can be replaced by
>>> functions which do have the nice property of not polluting the global
>>> namespace.  So newly developed build systems should use functions wherever
>>> possible, and certainly for old CMake-based build systems I am associated
>>> with I am trying to move to functions as time permits.
>>
>> That's all fine and dandy (and you've written some nice prose about
>> it :), but I've just been reading man cmakecommands of Debian cmake
>> 2.8.1-5(!) from top to bottom and bottom to top, and nowhere does it
>> mention _any_ underlying difference between macros and functions.

As for me, I wouldn't say so. The documentation of MACRO() states:

"Note that the parameters to a macro and values such as ARGN are not
variables in the usual CMake sense. They are string replacements much
like the c preprocessor would do with a macro. If you want true CMake
variables you should look at the function command."

So, one could conclude that there's indeed a difference between macros
and functions particularly in regard to variables, i.e. one of this
thread's concerns.

>> Not even I knew about this difference, despite having almost a month-full
>> of rather very internal CMake experience (Google searches in the couple
>> hundreds, vcproj2cmake adaptation of a _large_ project etc.).
>>
>> Suggestion for the sake of world peace: I'll submit a patch for that man
>> page, ok? :)
>>
>> Andreas Mohr
>>
> 
> You are right, the docs don't mention that FUNCTION introduces a new scope, [...]

They do, but not for FUNCTION() where such facts would be expected;
it's rather hidden in the section of SET() w.r.t. PARENT_SCOPE:

"If PARENT_SCOPE is present, the variable will be set in the scope above
the current scope. Each new directory *or function* creates a new scope.
This command will set the value of a variable into the parent directory
or calling function (whichever is applicable to the case at hand)."

> [...] which should be fixed. [...]

Yes, mentioning the scoping capabilities of FUNCTION() right in the
latter's documentation, perhaps in connection with a reference to
SET()'s PARENT_SCOPE option, would be adequate and helpful, IMO.
Besides, ADD_SUBDIRECTORY()'s documentation doesn't note the
introduction of a new scope, too.

> [...] But it should be clear from the traditional use of the names. Macros are textual replacements (just as in C), functions have their own local scope (again, just as in C).   

Regards,

Michael


More information about the CMake mailing list