Is this a problem with cmake or with my setup?
Alexander Neundorf
neundorf at kde.org
Thu Aug 5 21:41:48 CEST 2010
On Wednesday 04 August 2010, Brad King wrote:
> On 08/03/2010 06:45 PM, Michael Jansen wrote:
> > 1. Where does that list after rpath-link come from?
>
> CMake computes it based on the known shared library implementation
> dependencies. For targets built in the tree these come from their
> full list of libraries used for linking (not the link interface).
> For imported targets these come from a target property called
>
> IMPORTED_LINK_DEPENDENT_LIBRARIES
>
> The property should be set when the imported target is created.
> CMake's install(EXPORT) command copies the shared library
> dependency information into the above property when exporting
> a shared library target.
>
> >From the above CMake constructs a list of full paths to the library
>
> files (sonames) that it knows must be found at link time. It then
> inspects the directories containing these libraries for conflicts,
> constructs a constraint graph, and generates a safe order for the
> directories to be listed with the -rpath-link flag.
>
> > 2. How can i influence it's content?
>
> There is no direct interface for it. One must give CMake enough
> information for the above automatic algorithm to work. If all the
> libraries involved in linking every CMake-built shared library along
> the way were brought in as imported targets then it would work.
> However, this is not the case for the Qt libraries AFAIK.
>
> For a shared library target CMake distinguishes its link interface
> dependencies (or "link interface") from its link implementation
> dependencies (or "link implementation"). It computes the set of
> shared libraries that go in IMPORTED_LINK_DEPENDENT_LIBRARIES by
> identifying shared libraries in the target's link implementation
> but excluding those in the target's link interface. The result
> is the set of "dependent libraries".
>
> In the default case the link interface is the same as the link
> implementation so the list of dependent libraries is empty. When
> LINK_INTERFACE_LIBRARIES is set (which happens in your case) then
> the list can be non-empty. However, it will only every consist
> of the libraries from the link implementation that CMake *knows*
> are shared libraries.
>
> Currently the definition of "knows" is that the dependent library
> is a *target* (imported or built) and not just a file name. One
> can see the code in CMake 2.8.2 in the file Source/cmTarget.cxx
> at lines 4222-4245:
>
> http://cmake.org/gitweb?p=cmake.git;a=blob;f=Source/cmTarget.cxx;h=45ba3584
>;hb=v2.8.2#l4207
>
> Note the TODO comment. It does not recognize shared libraries
> by file name. This causes your problem because the file
>
> /path/to/kde4/trunk/support/libphoton.so
>
> does not end up in the list of known dependent libraries.
> Therefore it is not included in the above-mentioned ordering
> algorithm and /path/to/kde4/trunk/support does not end up in
> the -rpath-link option.
>
> Unfortunately implementing the TODO comment is non-trivial. CMake
> must first recognize shared library full-path file names from the
> link implementation list. Then for each shared library it finds
> it must also locate the full path to the file that will be loaded
> at runtime based on the *soname* of the library! In simple cases
Wouldn't this mean to parse the ELF header, find all required shared libs, and
look for them too ?
Also, I think you can't reliable figure out at build time which shared lib
will be used at runtime. LD_LIBRARY_PATH may be set, /etc/ld.so.conf may be
different, it could be executed on a different system, etc.
> the soname is the same as the library, or the library file is just
> a symlink to the soname, but in the worst-case we need to know
> and understand the library's ABI to parse out the soname.
>
> > 3. Do we have a problem with our LINK_INTERFACE by only being
> > able to specify which libs we need and not being able to
> > specify where WE took it from? KHTML needs phonon but it does
> > not tell me openly.
>
> The KHTML imported target *should* come with libphoton.so listed
> in the IMPORTED_LINK_DEPENDENT_LIBRARIES property. It does not
> right now because
>
> - libphoton.so was not imported as a target when khtml was built
> - CMake did not recognize it as a runtime dependency of khtml
> due to the lack of implementation at the above-mentioned TODO
Hmm, wouldn't we still have a problem ?
Qt has been built with phonon, and some parts of Qt most probably link against
this phonon in qt/lib/.
khtml has been linked against phonon in kdesupport/lib/, and we'd like to use
that one, since it is newer.
But, if cmake would have the full information, i.e. that Qt would like to have
the one in qt/lib/, and that khtml the one in kdesupport/lib/, wouldn't we
get a conflict then ?
Is maybe the whole situation just a mess with phonon being built as part of Qt
and also independent from it ?
Alex
More information about the Kde-buildsystem
mailing list