[cmake-developers] find_package with NO_MODULE while cross-compiling

Nils Gladitz nilsgladitz at gmail.com
Tue Mar 15 18:24:05 EDT 2016


On 15.03.2016 23:01, Julien Schueller wrote:
> Hi,
>
> When using find_package (<name> NO_MODULE) while cross-compiling,
> cmake may find an existing <name>Config.cmake in the host root path if 
> <name>Config.cmake is not available in the target root path.
>
> For example let's say that I have Qt5 project in my host Linux box, 
> which provides a /usr/lib/cmake/.../Qt5WidgetsConfig.cmake.
> In my cmake project I use: find_package (Qt5Widgets NO_MODULE), 
> everything goes as planned.
> Now I want to cross-compile using MinGW-w64, I install qt5 in my mingw 
> target root, so I have a 
> /usr/i686-w64-mingw32/lib/cmake/.../Qt5WidgetsConfig.cmake
> I set CMAKE_FIND_ROOT_PATH to /usr/i686-w64-mingw32 and stuff via a 
> toolchain file, and everything goes fine too.
> No if I remove the qt5 target package for mingw, or it is unavailable 
> in the first place, cmake prefers the host qt5 config file, and the 
> compilation fails.
>
> I found a workaround, which is to not let cmake use host rules to find 
> <name>Config.cmake in the case of cross-compiling:
> if (CMAKE_CROSSCOMPILING)
>   set (NO_MODULE_ARGS     NO_MODULE NO_SYSTEM_ENVIRONMENT_PATH     
> NO_CMAKE_SYSTEM_PATH)
> endif ()
> find_package (Qt5Widgets ${NO_MODULE_ARGS})
> Would there be a smarter way to do this instead of invading each 
> CMakeLists that uses a find_package relying on package-provided cmake 
> configs ?

Setting 
https://cmake.org/cmake/help/v3.5/variable/CMAKE_FIND_ROOT_PATH_MODE_PACKAGE.html 
to ONLY in your toolchain file should prevent cmake from picking up 
native packages.

Nils
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20160315/987543dd/attachment.html>


More information about the cmake-developers mailing list