Question wrt KDE not depending on pkg-config (was Re: Initial support for kde_projects.xml in kdesrc-build)
Alexander Neundorf
neundorf at kde.org
Wed Feb 2 19:18:51 CET 2011
Hi Raphael,
On Wednesday 02 February 2011, Raphael Kubo da Costa wrote:
> Alexander Neundorf <neundorf at kde.org> writes:
> > On Wednesday 02 February 2011, Michael Pyne wrote:
> > ...
> >
> >> e.g. worrying about environment variables like PKG_CONFIG_PATH is no
> >> idle claim (kdesrc-build sets that as well), along with PATH in order to
> >> pick up the right Qt version.
> >
> > Please try to use only CMAKE_PREFIX_PATH instead of setting PATH. I
> > recommend this to everybody.
> > I'd also suggest not to set PKG_CONFIG_PATH, at least not to directories
> > where KDE stuff is installed, this has to be found also without
> > pkgconfig.
>
> Sorry for deviating from the original purpose of the discussion (thus
> moving this to kde-buildsystem@).
>
> I question I've had for some time is why KDE's cmake files should not
> depend on pkg-config -- AFAIR, support for it on Windows used not to be
> good, but I've been told things have improved. Are there any other
> historical reasons for that?
* pkgconfig is strictly speaking not necessary, cmake can do what pkg-config
does
* support for pkg-config is not on all platforms as good as on Linux
* it needs an additional env.variable to be set up correctly, so you have to
remember to set CMAKE_PREFIX_PATH and PKG_CONFIG_PATH, although pkgconfig
would not be necessary
* The way information is returned by pkg-config sucks. It is designed so that
its output can be used directly in Makefiles in the compiler/linker command
line. E.g "-L/some/where -L/some/other/place -lfoo -lbar". This is
a) command line arguments specific for one compiler
b) not what cmake would like to have
E.g. for linking libraries, cmake does a lot. It analyzes where all the
libraries are, collects an RPATH, orders the directories, detects if there
are conflicts/ambiguities, e.g when linking to two libraries in two different
directories, where each library exists in each directory. If you just hand
the "-L/some/where -L/some/other/place -lfoo -lbar" to cmake, it cannot do
all that. You have to be careful to get just the "foo" and "bar" parsed out
of the string returned by pkgconfig, use these names for FIND_LIBRARY(), also
parse the directories out of the string, use these as HINTS for
FIND_LIBRARY(), and then use the results of the FIND_FOO() calls, which will
have the full path, so cmake can handle them correctly.
* not sure about the behaviour wrt. crosscompiling. Different people say
different things how it should be used there.
CMake has a more powerful alternative to this, which is not too different
actually, by installing FooConfig.cmake files. These files contain just the
information (e.g. the libraries which are needed), and no toolchain-specific
syntax.
Downside is that this is currently hard to impossible to use from non-cmake
buildsystems.
There are two ways to improve this:
* add a mode to cmake so it can be called similar to pkg-config
e.g. something like "cmake --find_package JPEG --print
JPEG_LIBRARIES --toolchain GNU", which internally does basically
find_package(JPEG) and prints the specified variables, so the result can be
used directly like that from pkg-config.
or/and:
* add a second file format for the FooConfig.cmake files, e.g. xml or json, so
it can be easily used also by other tools, which don't have a cmake
interpreter included.
Alex
More information about the Kde-buildsystem
mailing list