[CMake] find_package scoping mystery

Andreas Pakulat apaku at gmx.de
Mon Apr 16 06:28:32 EDT 2012


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.
Backwards compatibility is valued very high for CMake and IMHO thats a
good thing most of the time.

Andreas



More information about the CMake mailing list