Re: [CMake] Controlling the targets in an export set

2014-07-24 Thread Nils Gladitz

On 07/24/2014 01:57 AM, Adar Dembo wrote:

I have a project that generates a shared library foo. As part of the
build, the bar1, bar2, and bar3 static archives are created, and
eventually, foo is linked against all of them. Thus, the project's sole
deliverable is libfoo.so; all the necessary symbols from the bar1..bar3
archives are found within libfoo.so.

If I try to export foo using install(TARGETS foo EXPORT foo ...) and
install(EXPORT foo ...), cmake complains that target foo requires
targets bar1, bar2, and bar3, which are not in the export set. I have to
add install(TARGETS bar1 EXPORT foo ...) for bar1..bar3 if I want this
to succeed. However, this also means that I'm exporting my static
archives, which as I wrote earlier aren't necessary.

How can I exercise finer-grained control over foo's export set? How can
I build an export set containing foo but excluding bar1, bar2, and bar3?


You can link your static libraries to your shared library privately 
hence removing them from foo's interface:


  target_link_libraries(foo PRIVATE bar1 bar2 bar3)

You are probably already aware but just in case ...

To portably link archives to shared libraries you need position 
independent code[1].


Of the objects contained in your archives only those will get included 
which are required to resolve some reference when creating libfoo.so.
Symbols that were contained in objects which were not required in the 
link will hence not be available.


This might seemed to have worked within the project until now given that 
the archives were in your link interface.


Nils

[1] http://cmake.org/cmake/help/v3.0/prop_tgt/POSITION_INDEPENDENT_CODE.html
--

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


Re: [CMake] Controlling the targets in an export set

2014-07-24 Thread Adar Dembo
Thanks, that did the trick (though I had to use LINK_PRIVATE instead of
PRIVATE; maybe I'm using an older version of cmake).

And yes, I need -fPIC code through and through. I've already taken care of
that.

And double yes, a few other targets needed to explicitly list foo's
transitive dependencies in their own target_link_libraries(). Wasn't too
hard to fix though.


On Thu, Jul 24, 2014 at 12:15 AM, Nils Gladitz nilsglad...@gmail.com
wrote:

 On 07/24/2014 01:57 AM, Adar Dembo wrote:

 I have a project that generates a shared library foo. As part of the
 build, the bar1, bar2, and bar3 static archives are created, and
 eventually, foo is linked against all of them. Thus, the project's sole
 deliverable is libfoo.so; all the necessary symbols from the bar1..bar3
 archives are found within libfoo.so.

 If I try to export foo using install(TARGETS foo EXPORT foo ...) and
 install(EXPORT foo ...), cmake complains that target foo requires
 targets bar1, bar2, and bar3, which are not in the export set. I have to
 add install(TARGETS bar1 EXPORT foo ...) for bar1..bar3 if I want this
 to succeed. However, this also means that I'm exporting my static
 archives, which as I wrote earlier aren't necessary.

 How can I exercise finer-grained control over foo's export set? How can
 I build an export set containing foo but excluding bar1, bar2, and bar3?


 You can link your static libraries to your shared library privately hence
 removing them from foo's interface:

   target_link_libraries(foo PRIVATE bar1 bar2 bar3)

 You are probably already aware but just in case ...

 To portably link archives to shared libraries you need position
 independent code[1].

 Of the objects contained in your archives only those will get included
 which are required to resolve some reference when creating libfoo.so.
 Symbols that were contained in objects which were not required in the link
 will hence not be available.

 This might seemed to have worked within the project until now given that
 the archives were in your link interface.

 Nils

 [1] http://cmake.org/cmake/help/v3.0/prop_tgt/POSITION_
 INDEPENDENT_CODE.html

-- 

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

[CMake] Controlling the targets in an export set

2014-07-23 Thread Adar Dembo
I have a project that generates a shared library foo. As part of the build,
the bar1, bar2, and bar3 static archives are created, and eventually, foo
is linked against all of them. Thus, the project's sole deliverable is
libfoo.so; all the necessary symbols from the bar1..bar3 archives are found
within libfoo.so.

If I try to export foo using install(TARGETS foo EXPORT foo ...) and
install(EXPORT foo ...), cmake complains that target foo requires targets
bar1, bar2, and bar3, which are not in the export set. I have to add
install(TARGETS bar1 EXPORT foo ...) for bar1..bar3 if I want this to
succeed. However, this also means that I'm exporting my static archives,
which as I wrote earlier aren't necessary.

How can I exercise finer-grained control over foo's export set? How can I
build an export set containing foo but excluding bar1, bar2, and bar3?
-- 

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