[cmake-developers] [PATCH 3/3] FindQt4: document cross compilation
Clinton Stimpson
clinton at elemtech.com
Wed Jul 29 10:47:16 EDT 2015
On Wednesday, July 29, 2015 04:05:41 PM Pascal Bach wrote:
> Hi Clint
>
> Am 29.07.2015 um 15:45 schrieb Clinton Stimpson:
> > Hi Pascal,
> >
> > Thanks for the patches.
> >
> > Can you share with us why setting CMAKE_FIND_ROOT_PATH does not work, or
> > how this new method compares?
> >
> > For example, in the toolchain file:
> > SET(CMAKE_FIND_ROOT_PATH /path/to/Qt ...)
>
> The problem is how FindQt4 does find the locations using qmake.
>
> let's assume there are two sysroots one is /sysroots/x86_64 which contains
> binaries usable on the host machine, and there is /sysroots/arm which
> contains libraries for the target system. this are both set via:
> set( CMAKE_FIND_ROOT_PATH /sysroots/arm /sysroots/x86_64 )
> set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
> set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
> set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
> set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
Yes, this concern of 2 sysroots has been brought up before. Thanks for
addressing this.
>
> Here is what happens when only setting CMAKE_FIND_ROOT_PATH:
>
> 1. FindQt4 is trying to find the qmake executable. As there is no qmake in
> /sysroots/arm (it would not be runnable on the host) it will find qmake
> from the /sysroots/x86_64 directory. 2. FindQt4 is asking qmake for the
> path to the Qt installation. As the qmake found is the one from
> /sysroots/x86_64 it will point to the libraries from /sysroots/x86_64 which
> will obviously not run on arm!
>
> Currently I didn't find a way to override this behaviour of FindQt4, except
> by setting all the variables usually set by FindQt4 manually. It is usually
> accepted to set some variables manually when doing cross compilation. With
> this patchset I tried to reduce this variable to a minumum and let FindQt4
> figure out the rest.
>
> The minimum variables required with the patch are:
>
> QT_BINARY_DIR is necessary to find the correct qmake
> QT_LIBRARY_DIR is necessary to find the library directory
> QT_INCLUDE_DIR is necessary to find the include directory (might be possible
> to figure this out from QT_INCLUDE_DIR if some assumptions are made)
> QT_MKSPECS_DIR necessary to have the correct prefixes (E in the case of
> qt4-embedded).
>
>
> I hope my explanation is clear. If there is a better way to achive this I'm
> all ears.
>
I'm fine with this, and don't think it'll conflict with any other use cases.
However, I do think we should first document setting CMAKE_FIND_ROOT_PATH, then
afterwards document the other variables for those users which need more
control. Does that sound reasonable?
Clint
> Pascal
>
> > Clint
> >
> > On Wednesday, July 29, 2015 02:32:48 PM Pascal Bach wrote:
> >> ---
> >>
> >> Modules/FindQt4.cmake | 20 ++++++++++++++++++++
> >> 1 file changed, 20 insertions(+)
> >>
> >> diff --git a/Modules/FindQt4.cmake b/Modules/FindQt4.cmake
> >> index 9d03378..64c06e1 100644
> >> --- a/Modules/FindQt4.cmake
> >> +++ b/Modules/FindQt4.cmake
> >> @@ -29,6 +29,26 @@
> >>
> >> # for a particular executable, set the ``QT4_NO_LINK_QTMAIN`` target
> >> # property to ``TRUE`` on the executable.
> >> #
> >>
> >> +# Cross Compile
> >> +# ^^^^^^^^^^^^^
> >> +#
> >> +# To find Qt in a cross compile environment set the following variables
> >> in
> >> your toolchain file: +#
> >> +#
> >> +# ``QT_BINARY_DIR`` => Path to native Qt binary directory
> >> +# ``QT_LIBRARY_DIR`` => Path to target Qt library directory
> >> +# ``QT_INCLUDE_DIR`` => Path to target Qt include directory
> >> +# ``QT_MKSPECS_DIR`` => Path to target Qt mkspecs directory
> >> +
> >> +# example
> >> +#
> >> +# ::
> >> +# set( QT_BINARY_DIR /sysroots/x86_64-linux/usr/bin )
> >> +# set( QT_LIBRARY_DIR /sysroots/arm/usr/lib )
> >> +# set( QT_INCLUDE_DIR /sysroots/arm/usr/include/qtopia )
> >> +# set( QT_MKSPECS_DIR /sysroots/arm/usr/share/qtopia/mkspecs )
> >> +#
> >> +#
> >>
> >> # Qt Build Tools
> >> # ^^^^^^^^^^^^^^
> >> #
More information about the cmake-developers
mailing list