> On 9 Jan 2017, at 20:55, Brad King <brad.k...@kitware.com> wrote:
> 
> On 12/21/2016 07:12 AM, Florent Castelli wrote:
>> find_package(foo)
>> if(NOT FOO_FOUND)
>>  add_library(foo STATIC foo.cpp)
>> endif()
> 
> Instead do
> 
>  find_package(foo)
>  if(NOT FOO_FOUND)
>    add_subdirectory(bundled_foo)
>  endif()
> 
> so that the imported targets are visible.  Inside the bundled_foo you can 
> build
> the target and then crate an ALIAS library whose name matches what the 
> imported
> target would have been.
> 

The problem with that approach is that it’s up to the “caller” to put that 
boilerplate and it would be much nicer to have all of that in the callee, all 
within the same script.
Additionally, all the bundled library are usually setup in another folder 
“ext”, “vendor”, “3rdparty” which will be a different context and won’t make 
those available to the rest of the code.

>> make imported libraries global by default
> 
> The reason they are locally scoped is that find_package() may load
> different, possibly conflicting, external packages in separate directories.
> The find_package() call should be made at the highest level that contains
> anything that directly references the target.  See above example.
> 

If the libraries don’t come from a find_package() call but my code, it should 
be my responsibility to make sure there’s no 2 conflicting libraries with the 
same name.
If I can guarantee that, then that is an annoying restriction on imported 
targets. 

> An alternative is:
> 
>  find_package(foo)
>  add_library(Foo INTERFACE)
>  target_link_libraries(Foo PUBLIC FOO::FOO)
> 
> That will make a globally visible Foo target that when used forwards all
> usage requirements from the imported target.
> 

That’s another approach I’m considering. It’s just annoying that “FOO::FOO” 
becomes reserved as I’d rather have the external libraries “namespaced”, and I 
can’t redefine an alias.
I guess I could set their name to Ext::FOO::FOO instead which would be decent.
Again, that’s some more annoying boilerplate.

Note it should also be INTERFACE and not PUBLIC in there.

> -Brad
> 

Anyway, this still doesn’t explain why “UNKNOWN IMPORTED” and “GLOBAL” keywords 
don’t work with each other. My guess is they should under a controlled setup, 
but I couldn’t make it work.

/Florent
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to