On 05/27/2015 02:40 PM, Stephen Kelly wrote:
> By current 'design language' it is not a 'usage requirement', just like 
> IMPORTED_LOCATION, LOCATION, $<TARGET_FILE> and others are not 'usage 
> requirements'.

Sure, but it does tell CMake what to do when a client consumes the
interface.

> I still think the topic overloads INTERFACE libraries with their
> semantic opposite.

I don't agree that this is a semantic opposite:

>  "An INTERFACE target has no LOCATION..."

I think we agree on INTERFACE == "has no LOCATION".
IMPORTED_LIBNAME does not specify a LOCATION.

INTERFACE libraries support specification of link dependencies so why
not in-line link items?  The future LINK_ITEMS work discussed earlier
in the thread would be perfectly valid as a usage requirement of an
interface library:

 "To use this interface, put $items in-place on your link line."

The only way LINK_ITEMS would differ between INTERFACE and other
library types is whether the LOCATION (a.k.a. $<TARGET_FILE:...>)
can be one of the items specified.

IMPORTED_LIBNAME is a predecessor to a possible INTERFACE_LINK_ITEMS
just like IMPORTED_LINK_INTERFACE_LIBRARIES was a predecessor to
INTERFACE_LINK_LIBRARIES.  (This is why I originally named it
IMPORTED_LINK_ITEM, but with the additional restrictions mentioned
in the grandparent of this message the name IMPORTED_LIBNAME is
better.)

> Is it impossible to implement $<TARGET_FILE:...> for UNKNOWN IMPORTED 
> libraries such that it reports an error if IMPORTED_LIBNAME is set?

Of course it is possible to implement that but I don't think it is
the right approach.  Validity of TARGET_FILE should be based on the
*type* of the target given, not its configuration.  See also next
paragraph.

> opengl32 is "unknown", or at least the full path to it is.

The purpose of the UNKNOWN target type is so we can have a library
with a LOCATION but we do not know if it is STATIC or SHARED.
This is different from not having a LOCATION, which is the purpose
of an INTERFACE library.

>> shows how purely IMPORTED_LIBNAME corresponds to IMPORTED_LOCATION.
> 
> I don't think the simplicity of a small hunk is a good deciding factor.

The hunk on its own is not a deciding factor.  The natural correspondence
is the (proposed) deciding factor, and the hunk illustrates the
correspondence.

> I still don't understand why correspondence of MAP_IMPORTED_CONFIG
> and INTERFACE libraries is important, independent of this feature.

Speaking independently from this feature: If a project exports an
INTERFACE full of $<CONFIG:...> generator expressions then the
consuming project needs to be able to map its configurations to
those of the providing project.  Setting MAP_IMPORTED_CONFIG_<CONFIG>
is the way to specify this mapping.  IMPORTED_CONFIGURATIONS allows
a default mapping to be computed.  For non-INTERFACE targets this
default mapping filters on existence of IMPORTED_LOCATION[_<CONFIG>].

Actually I think this can and should be done for INTERFACE libraries
even without IMPORTED_LIBNAME.  I'll look at factoring this part out
into a preceding commit.

> Also, if IMPORTED_LIBNAME and IMPORTED_LOCATION correspond so closely,
> why don't INTERFACE libraries support both?

Because INTERFACE == "has no LOCATION".

-Brad

-- 

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