[CMake] find_package scoping mystery
Dave Abrahams
dave at boostpro.com
Mon Apr 16 09:21:07 EDT 2012
on Mon Apr 16 2012, Andreas Pakulat <apaku-Mmb7MZpHnFY-AT-public.gmane.org> wrote:
> On 16.04.12 06:04:33, Dave Abrahams wrote:
>>
>> 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.
>
> Well, thats the price to pay to keep existing CMake code still
> running.
It doesn't have to be. If there was a way to say "this function doesn't
create its own scope," I could create a wrapper for find_package that
doesn't interfere with its meaning. Then I wouldn't have to pay that
price.
> Backwards compatibility is valued very high for CMake and IMHO thats a
> good thing most of the time.
No doubt about it.
--
Dave Abrahams
BoostPro Computing
http://www.boostpro.com
More information about the CMake
mailing list