[CMake] find_package scoping mystery
Dave Abrahams
dave at boostpro.com
Mon Apr 16 06:04:33 EDT 2012
on Mon Apr 16 2012, Andreas Pakulat <apaku-Mmb7MZpHnFY-AT-public.gmane.org> wrote:
> On 16.04.12 01:37:58, Dave Abrahams wrote:
>>
>> consider this simple wrapper:
>>
>> function(my_find_package)
>> find_package(${ARGV})
>
>> endfunction()
>>
>> If I replace all the calls to find_package in my project with calls to
>> my_find_package, everything breaks. It appears variable settings in any
>> found <packagename>Config.cmake files are visible inside
>> my_find_package, but disappear from the point of view of the caller,
>> unless I "manually" hoist them into the parent scope using
>>
>> function(my_find_package)
>> find_package(${ARGV})
>> set(some_variable ${some_variable} PARENT_SCOPE)
>> endfunction()
>>
>> I've tried hoisting everything as in
>> https://github.com/ryppl/ryppl-cmake/blob/find-package-hook/Modules/Ryppl.cmake#L9,
>> but apparently that is too much and it clobbers some variables that it
>> shouldn't.
>>
>> Can anyone explain to me what I'm failing to grasp, here?
>
> Functions have their own scope and the find module are written to be
> executed in the global scope. (functions are still a relatively new
> feature in cmake)
That's one way of saying it. The other way of saying it is that
built-in functions are special and can't be emulated or wrapped if they
end up include()ing anything. The built-ins don't create a dynamic
scope, so set() commands in files they include end up having an effect
at global scope. The other other way of saying it is @#&(!&!%%*!... but
I digress.
>
> I can see a few options:
> - Don't run find_package inside a function.
> - Use a macro instead of a function, macro's do not create a new scope
Yeah... these are two ways of saying the same thing. I ended up with a
macro.
> - inspect all the find-modules you use and adapt them to use
> PARENT_SCOPE for variables when they do not end up in the cache.
Thanks for your help,
--
Dave Abrahams
BoostPro Computing
http://www.boostpro.com
More information about the CMake
mailing list