[oe] [meta-qt5] Problems with Qt5 and CMake

Manuel Nickschas manuel.nickschas at bmw-carit.de
Fri May 24 13:03:02 UTC 2013


On Friday 24 May 2013 14:44:41 Stefan Herbrechtsmeier wrote:

Hi,

> > It would be good to let CMake respect OE_QMAKE_PATH_* variables, so 
you
> > can
> > generate .cmake files with correct paths for target and in OE builds
> > override them with OE_QMAKE_PATH_* values to use correct sysroot.
> 
> CMake offers find_xxx functions and CMAKE_FIND_ROOT_PATH to 
modify the
> program, include and library paths.
> Or you could use CMAKE_CURRENT_LIST_DIR in a cmake file to get the 
path
> of the file.
> 
> The problem is that its up to the developer to use this functions and
> that CMake don't support a common way to model the dependencies like 
the
> Requires field of pkg-config files.
> 
> > The same for finding native host tools in
> > OE_QMAKE_PATH_EXTERNAL_HOST_BINS.
> 
> The cmake.class overlays the machine sysroot over the native sysroot and
> don't install any binaries into the machine sysroot. Thereby the
> find_program function detects the binary in the native sysroot and all
> the other find_xxx functions detect the include files and libraries in
> the machine sysroot.

Hm, no, that is not the issue. The issue is that Qt5 uses a fairly recent 
CMake feature where find_package and friends look for a *Config.cmake file 
first, and then use that to set everything up. In case of Qt5, please have a 
look at the files Qt5 (the qtbase package) installs into the target sysroot, in 
/usr/lib/cmake/.

In particular, the issue is with 
$sysroot/usr/lib/cmake/Qt5Core/Qt5CoreConfigExtras.cmake:

[...]
    set_target_properties(Qt5::moc PROPERTIES
        IMPORTED_LOCATION "/usr/bin/qt5/moc"
    )
[...]

and similar for other host binaries such as rcc or qdbusxml2cpp (in 
Qt5DBus/Qt5DBusConfigExtras.cmake).

The path specified there is clearly wrong for cross-compiling, because it 
references the location in the target itself, without prepending the sysroot 
prefix. Thus, it won't find moc. In particular, it needs not even find the moc 
from the target sysroot, but from the native sysroot, as it's a host tool.

Unfortunately, I have no clue how the Qt5 build system ends up generating 
those paths; I assume it's not using CMake and find_program, but 
hardcodes the paths somewhere.

One could probably patch this away, but then you'd end up with host-
specific absolute paths inside the target, which will then break if you try to 
use them for compiling something inside the target.

Or maybe indeed replace the hardcoded path by some CMake variable that 
can then be set at cmake runtime to the proper sysroot; not sure if this would 
work.

Cheers,
~ Sput
-- 
Manuel "Sput" Nickschas * Development Specialist, Team GENIVI
BMW Car IT GmbH * http://www.bmw-carit.de
Embedded Software House Ulm * Lise-Meitner-Str. 14 * 89081 Ulm
-----------------------------------------------------------------------------
BMW Car IT GmbH
Geschäftsführer: Harald Heinecke und Reinhard Stolle
Sitz und Registergericht: München HRB 134810
-----------------------------------------------------------------------------



More information about the Openembedded-devel mailing list