Trouble with glib2, pkg-config and cmake under Debian
Alexander Neundorf
neundorf at kde.org
Wed Aug 22 02:01:59 BST 2007
On Tuesday 21 August 2007 11:16, Tobias Koenig wrote:
> Hi,
>
> there is a problem with compiling glib2 dependend software with current
> Debian unstable and cmake.
>
> Let me explain the problem a bit closer.
>
> The current libglib2.0-dev package contains nearly all header files
> under /usr/include/glib-2.0/ but the file glibconfig.h is located under
> /usr/lib/glib-2.0/include. Unfortunately, some header files from
> /usr/include/glib-2.0/ include the glibconfig.h by '#include
> <glibconfig.h>'.
>
> So when you want to compile your software you have to add both path
> /usr/include/glib-2.0 _and_ /usr/lib/glib-2.0/include to the -I flag.
>
> Now pkg-config and cmakes enter the scene: The shipped glib-2.0.pc file
> contains the correct 'cflags' variable, which includes both pathes,
> however the 'includedir' variable contains only the /usr/include path...
>
> Our FindGLIB2.cmake module calls pkgconfig and queries for the
> 'includedir' variable instead of following the 'cflags' suggestion.
>
> => the -I/usr/lib/glib-2.0/include is missing and the software doesn't
> compile.
>
> So where is the bug? Is it possible to define multiple pathes in the
> 'includedir' variable? Would cmake be able to handle multiple pathes
> there? Should FindGLIB2.cmake use the 'cflags' variable instead of the
> 'includedir'? Shall we ask the Debian maintainer to place the
> glibconfig.h to /usr/include?
You are using UsePkgConfig.cmake, right ?
Please take a look at FindPkgConfig.cmake, which is much more advanced and
will probably handle things better. Maybe this already solves the problem.
Beside that, I don't know why the pkgconfig file doesn't put all include dirs
in the includedir variable.
You could also simply extend the cmake module to also check for glibconfig.h
in appropriate directories, e.g. if the include dir
is /usr/include/glib-2.0/, use GET_FILENAME_COMPONENT(NAME) to get
the "glib-2.0" part, then twice GET_FILENAME_COMPONENT(PATH) so you get to
the install prefix ("/usr"), and append lib/ to that. Use the glib-2.0 as
PATH_SUFFIXES and add the lib/ path as additional path to the FIND_PATH()
call.
The problem with pkgconfig is that it just returns strings which are
appropriate for including them directly in the command for the compiler
invocation ("-I/usr/include -DWHATEVER "), same for libs.
Now cmake is more advanced than that and actually prefers to know how it calls
the compiler. I.e. it keeps a list of current include directories (as opposed
to a string which will be inserted into the compiler command whatever it is)
and it prefers to know exactly which libraries you want to link to something,
i.e. with the complete full path.
Without that (e.g. if you simply get "-L/usr/lib -L/usr/lib/foo -lblub -lfoo")
cmake would need to parse that string and try to detect which libraries are
meant with this. It needs the full path for the libraries to sort the link
directories correctly so you get the libs you want. It needs to know what
include directories are so the dependency scanning works, it can eliminate
duplicate include dirs and it can sort the include dirs correctly (project
first, then the rest). All that is not possible with the approach taken by
pkgconfig. It is too "simplistic", you can do gcc `pkg-config --cflags`
file.c, but this is no good format to get the required information into
another tool, be it cmake or any other buildsystem.
Add to that the fact that pkgconfig isn't available on many platforms by
default (Windows, commercial Unixes, QNX, ...) and that the information it
returns is not compiler independent, since it returns the flags just for that
one compiler.
Bye
Alex
More information about the kde-core-devel
mailing list