[cmake-developers] PATHS guess in find_package ignored with NO_DEFAULT_PATH & CMAKE_FIND_ROOT_PATH_MODE_PACKAGE

Nils Gladitz nilsgladitz at gmail.com
Fri Jul 1 08:19:25 EDT 2016



On 07/01/2016 02:08 PM, Julien Schueller wrote:
>
>
> ------------------------------------------------------------------------
>
>     *De: *"Nils Gladitz" <nilsgladitz at gmail.com>
>     *À: *"Julien Schueller" <schueller at phimeca.com>,
>     "cmake-developers" <cmake-developers at cmake.org>
>     *Envoyé: *Vendredi 1 Juillet 2016 13:57:40
>     *Objet: *Re: [cmake-developers] PATHS guess in find_package
>     ignored with NO_DEFAULT_PATH & CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
>
>
>
>     On 07/01/2016 01:44 PM, Julien Schueller wrote:
>
>
>
>         ------------------------------------------------------------------------
>
>             *De: *"Nils Gladitz" <nilsgladitz at gmail.com>
>             *À: *"Julien Schueller" <schueller at phimeca.com>,
>             "cmake-developers" <cmake-developers at cmake.org>
>             *Envoyé: *Vendredi 1 Juillet 2016 12:37:47
>             *Objet: *Re: [cmake-developers] PATHS guess in
>             find_package ignored with NO_DEFAULT_PATH &
>             CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
>
>             On 07/01/2016 11:13 AM, Julien Schueller wrote:
>
>
>                 I'm using find_package in no-module mode with the
>                 PATHS option to provide a hard-coded guess to a path
>                 where a sublibrary 'hmat' was previously found,
>                 and with the NO_DEFAULT_PATH to not find it first in
>                 system directories.
>                 find_package (HMAT REQUIRED NO_MODULE PATHS
>                 <hmat-prefix>/lib/cmake/hmat NO_DEFAULT_PATH)
>
>                 So far so good. Now I want to cross-compile with the
>                 usual toolchain file:
>                 set (CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)
>                 set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
>                 set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
>                 set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
>                 ...
>                 This works wonderfully too.
>
>                 But now I add CMAKE_FIND_ROOT_PATH_MODE_PACKAGE to
>                 ONLY in my toolchain file to prevent detecting native
>                 libraries
>                 set (CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
>                 And now find_package fails to find my package!
>
>                 I'm puzzled as I did not find in the doc something
>                 that explains why the PATHS is ignored (step #8 in
>                 find_package):
>                 https://cmake.org/cmake/help/v3.5/command/find_package.html#command:find_package
>
>
>             The given path "<hmat-prefix>/lib/cmake/hmat" is prefixed
>             by the paths in CMAKE_FIND_ROOT_PATH.
>             Which means that (given ONLY) cmake only looks for the
>             package in
>             "/usr/i686-w64-mingw32/<hmat-prefix>/lib/cmake/hmat".
>
>             You might want to e.g. add <hmat-prefix> to
>             CMAKE_FIND_ROOT_PATH and use PATHS / instead.
>
>             Nils
>
>
>         Thanks,
>
>         In my case <hmat-prefix> has the same value as
>         CMAKE_FIND_ROOT_PATH, and even if I modify the PATHS option
>         value to be relative (PATHS lib/cmake/hmat) the detection fails.
>         (They're not actually set to /usr/i686-w64-mingw32 but some
>         absolute location in my home where I unzip a mingw toolchain,
>         but I can reproduce the issue on another box where the
>         toolchain is natively /usr/i686-w64-mingw32).
>
>
>     I don't think behavior for relative paths is defined.
>
>     Use absolute paths like "/lib/cmake/hmat", just "/" probably works
>     as well (since the path in the prefix matches
>     "<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/").
>
>     Nils
>
>
> Yes, if I use just "/lib/cmake/hmat" it works. Couldn't cmake see that 
> that my absolute path begins with CMAKE_FIND_ROOT_PATH and hence 
> should be treated as valid according 
> to CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ?

CMake could do a lot of things but as-is the defined (documented) 
behavior is that when you tell cmake to only look in the prefixes 
provided by CMAKE_FIND_ROOT_PATH then all search locations are re-rooted 
to those prefixes.

e.g. a given path "/usr" can exist under your regular filesystem root 
and as /usr/i686-w64-mingw32/usr.
Still you would not want cmake to look in your native /usr directory in 
this case even though it is "valid" (exists).

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


More information about the cmake-developers mailing list