[cmake-developers] FindBoost.cmake cannot find some libraries when cross-compiling
Chuck Atkins
chuck.atkins at kitware.com
Wed Oct 15 10:40:42 EDT 2014
Can you post your toolchain file as well? Does it set any of the
CMAKE_FIND_ROOT_PATHG_MODE_{INCLUDE,PROGRAM,LIBRARY,PACKAGE} variables to
anything?
- Chuck
On Wed, Oct 15, 2014 at 10:04 AM, Guillaume Papin <
guillaume.papin at parrot.com> wrote:
> Hello CMake developers,
>
> I have a cross-compiled version of Boost and some other libraries under
> ~/my-project/CrossThirdPartyPrefix.
>
> I invoke CMake with a CMAKE_TOOLCHAIN_FILE and also I sets
> CMAKE_FIND_ROOT_PATH
> to the directory where my cross-compiled Boost is installed.
>
> cmake
> -DCMAKE_TOOLCHAIN_FILE=$HOME/my-project/plateforms/arm-toolchain.cmake \
> -DCMAKE_FIND_ROOT_PATH=$HOME/my-project/CrossThirdPartyPrefix \
> ~/my-projects/src/
>
> But I have an error when using FindBoost.cmake:
>
> In my project's CMakeLists.txt:
> find_package(Boost 1.53.0 REQUIRED COMPONENTS atomic thread system)
>
> The error:
> CMake Error at .../share/cmake-3.0/Modules/FindBoost.cmake:1179
> (message):
> Unable to find the requested Boost libraries.
>
> Boost version: 1.55.0
>
> Boost include path:
> ~/myproject/CrossThirdPartyPrefix/include
>
>
> Could not find the following Boost libraries:
>
> boost_thread
> boost_system
>
> Some (but not all) of the required Boost libraries were found. You
> may
> need to install these additional Boost libraries. Alternatively,
> set
> BOOST_LIBRARYDIR to the directory containing Boost libraries or
> BOOST_ROOT
> to the location of Boost.
>
>
> So the first component library (atomic) is found but not the other ones.
>
> Looking at the code, when the first library is found, Boost_LIBRARY_DIR is
> set
> to the directory that contains the library and then change the further
> calls of
> find_library to use Boost_LIBRARY_DIR as the unique HINTS, and with the
> NO_DEFAULT_PATH options set.
>
> macro(_Boost_FIND_LIBRARY var)
> find_library(${var} ${ARGN})
>
> if(${var})
> # If this is the first library found then save Boost_LIBRARY_DIR.
> if(NOT Boost_LIBRARY_DIR)
> get_filename_component(_dir "${${var}}" PATH)
> set(Boost_LIBRARY_DIR "${_dir}" CACHE PATH "Boost library
> directory" FORCE)
> endif()
> elseif(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT)
> # Try component-specific hints but do not save Boost_LIBRARY_DIR.
> find_library(${var} HINTS
> ${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT} ${ARGN})
> endif()
>
> # If Boost_LIBRARY_DIR is known then search only there.
> if(Boost_LIBRARY_DIR)
> set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR}
> NO_DEFAULT_PATH)
> endif()
> endmacro()
>
> *
> https://github.com/Kitware/CMake/blob/1b3495d32e1523648da08e138482a654f8765333/Modules/FindBoost.cmake#L322-L325
>
> The issue is that, when using CMAKE_FIND_ROOT_PATH, the Boost_LIBRARY_DIR
> of the
> host (~/myproject/CrossThirdPartyPrefix/lib/ in my case), will be expanded
> against the root paths.
>
> To find my libraries I can apply the following fix but I'm not sure if
> it's the
> right solution or not.
>
> diff --git a/Modules/FindBoost.cmake b/Modules/FindBoost.cmake
> index 3642b3e..aad6575 100644
> --- a/Modules/FindBoost.cmake
> +++ b/Modules/FindBoost.cmake
> @@ -321,7 +321,7 @@ macro(_Boost_FIND_LIBRARY var)
>
> # If Boost_LIBRARY_DIR is known then search only there.
> if(Boost_LIBRARY_DIR)
> - set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR}
> NO_DEFAULT_PATH)
> + set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR}
> NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
> endif()
> endmacro()
>
> @@ -855,7 +855,7 @@ if(_Boost_CHANGE_LIBDIR AND NOT
> _Boost_LIBRARY_DIR_CHANGED)
> endif()
>
> if(Boost_LIBRARY_DIR)
> - set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR} NO_DEFAULT_PATH)
> + set(_boost_LIBRARY_SEARCH_DIRS ${Boost_LIBRARY_DIR} NO_DEFAULT_PATH
> NO_CMAKE_FIND_ROOT_PATH)
> else()
> set(_boost_LIBRARY_SEARCH_DIRS "")
> if(BOOST_LIBRARYDIR)
>
>
> What I'm wondering is, whether or not Boost_LIBRARY_DIR should be a path
> on the target or on the host?
>
> Right now, the workaround I have that doesn't require to modify
> FindBoost.cmake
> is to set Boost_LIBRARY_DIR to /lib/, which will be expanded against the
> CMAKE_FIND_ROOT_PATH.
>
> By the way, I'm a happy CMake user, thanks for all the work!
> Guillaume
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake-developers
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20141015/b1f460b9/attachment-0002.html>
More information about the cmake-developers
mailing list