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