[cmake-developers] Generating guards around add_library(... IMPORTED)

Alexander Neundorf neundorf at kde.org
Tue Dec 18 12:41:30 EST 2012


On Tuesday 18 December 2012, Stephen Kelly wrote:
> Alexander Neundorf wrote:
> > On Tuesday 18 December 2012, Stephen Kelly wrote:
> >> Alexander Neundorf wrote:
> >> > With the return() in the FooTargets.cmake file, this included file
> >> > will simply do nothing, and we'll stay with the "old" imported
> >> > targets and their properties.
> >> > But the FooConfig.cmake file which has just been executed may set a
> >> > bunch of variables, which would fit to the targets which now have not
> >> > been imported, and which do not fit to the previuosly imported
> >> > targets.
> >> > 
> >> > Should the FooConfig.cmake fail in this case ?
> >> > Probably not.
> >> 
> >> Can you post a code snippet showing the problem?
> > 
> > Let's say there is Foo 2.0 installed in /usr/lib/, and Foo 1.0 is
> > installed in /usr/local/lib/.
> > Both provide the imported target Foo::SomeLib.
> > 2.0 has been built with FOO_MAKE_IT_COOL=FALSE, 1.0 has been built with
> > FOO_MAKE_IT_COOL=TRUE.
> 
> Do you mean as compiler defintions, or as cmake variables set in the Config
> file with set() ? I'll assume the latter.

Yes.

> > Now CMakeLists.txt does:
> > 
> > find_package(Foo 2.0)
> > 
> > find_package(Foo 1.0)
> > 
> > If we guard only including the targets, won't we end up with the imported
> > targets from 2.0, but with FOO_MAKE_IT_COOL=TRUE from 1.0 ?
> 
> Yes, I suppose. However, I don't see the point. 

The point is that you get targets from one installed Config.cmake file, and 
other information from a different installed Config.cmake file, due to 
different required version or search paths.

> We can also turn it around.
> Consider what would happen if my patch wasn't applied:
> 
>  find_package(Foo 2.0)
> 
>  find_package(Foo 1.0)
> 
>  if (FOO_MAKE_IT_COOL)
>    # Why is this always true, even though I use find_package Foo 2.0?
>    # Oh, right, I use find_package Foo 1.0 after that and that overwrites.
>    # Conclusion: If using different versions of the same package, I have to
>    # do so in independent directories.
>  endif()
>
> > Should we guard the whole Config.cmake file ?
> 
> A Config file author could choose to do that, but if only broken code would
> break on it, that is up to the config file author to decide whether to
> maintain that kind of thing (and its complexity).

I am not arguing against your patch.
I am just unsure how to handle the whole thing the best way.
 
Alex



More information about the cmake-developers mailing list