I'm using target_include_directories of A to get some include directories into B well, so I can't use target_link_libraries(A INTERFACE B), and I can't seem to use the OBJECT-way neither since B's sources won't compile without A's INTERFACE_INCLUDE_DIRECTORIES... Any suggestions?
On Wed, Jul 23, 2014 at 3:19 PM, Nick Overdijk <n...@astrant.net> wrote: > Crystal clear. Another layer of indirection eh? I'll see if I can work > with that... Thanks for the explanation. > > > On Wed, Jul 23, 2014 at 3:14 PM, Brad King <brad.k...@kitware.com> wrote: > >> On 07/23/2014 09:07 AM, Nick Overdijk wrote: >> > Oh wait, since a is in the interface of b, b will always be >> > accompanied by a, even though it's not a dependency. >> > Is that how it works? >> >> Yes. If B is a static library then it does not really link so >> its dependencies are only ever used transitively when something >> else links to B. If B really links as a shared library though >> then see the following. >> >> If target B links to target A then CMake will not compile objects >> in B until A is done. As explained in my previous link this is >> because we allow A to contain custom commands that generate >> headers used by B. The VS and Xcode IDE build systems offer only >> this granularity since they organize compilation and linking rules >> of a single target together. The Makefile generator was designed >> this way too. Only the Ninja generator has a chance of increasing >> parallelism if the extra ordering dependencies were dropped. We've >> thought about how to do extra analysis to determine when there is >> no such custom command to drop them but have not implemented anything >> yet. >> >> You might be able to use OBJECT libraries to increase parallelism >> for all generators and with no changes to CMake: >> >> set(CMAKE_POSITION_INDEPENDENT_CODE ON) >> add_library(Aobjs OBJECT a1.c a2.c) >> add_library(Bobjs OBJECT b1.c b2.c) >> add_library(Cobjs OBJECT c1.c c2.c) >> set(dummy_c dummy.c) # needed for VS 6 and Xcode >> add_library(A SHARED $<TARGET_OBJECTS:Aobjs> ${dummy_c}) >> add_library(B SHARED $<TARGET_OBJECTS:Bobjs> ${dummy_c}) >> add_library(C SHARED $<TARGET_OBJECTS:Cobjs> ${dummy_c}) >> target_link_libraries(B PUBLIC A) >> target_link_libraries(C PUBLIC B) >> >> This way the object compilations will be completely independent >> of one another and of the linking and ordering dependencies. >> >> -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