<div dir="auto">I have a PR that asks the linker (via the compiler) what its implicit search directories are instead.<div dir="auto"><br></div><div dir="auto">It is the right way to do it IMHO, but I need to find time to finish it unfortunately.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Feb 6, 2017 11:16 PM, "Jörg Krause" <joerg.krause@embedded.rocks> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Mon, 2017-02-06 at 22:22 +0100, Jörg Krause wrote:<br>
> Hi,<br>
><br>
> On Sun, 2017-02-05 at 23:03 +0100, Jörg Krause wrote:<br>
> > Hi,<br>
> ><br>
> > when using CHECK_{SYMBOL,FUNCTION}_EXISTS in a cross-compilation<br>
> > environment, CMake passes the host rpath to the linker:<br>
> ><br>
> > """ CMakeOutput.log<br>
> ><br>
> > /home/joerg/host/usr/bin/i586-<wbr>linux-gcc  <br>
> > --sysroot=/home/joerg/host/<wbr>usr/i586-buildroot-linux-musl/<wbr>sysroot<br>
> > -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64<br>
> > -Os   -<br>
> > DNDEBUG    CMakeFiles/cmTC_<wbr>cb8f6.dir/CheckSymbolExists.c.<wbr>o  -o<br>
> > cmTC_cb8f6 -Wl,-rpath,/usr/lib32 -rdynamic<br>
> > /home/joerg/host/usr/i586-<br>
> > buildroot-linux-musl/sysroot/<wbr>usr/lib32/libmbedtls.so<br>
> > /home/joerg/host/usr/i586-<wbr>buildroot-linux-<br>
> > musl/sysroot/usr/lib32/<wbr>libmbedx509.so /home/joerg/host/usr/i586-<br>
> > buildroot-linux-musl/sysroot/<wbr>usr/lib32/libmbedcrypto.so <br>
> ><br>
> > """<br>
> ><br>
> > This leads to a linker error if mbedtls is linked with zlib, as the<br>
> > linker tries to link with the host zlib and does not find the host<br>
> > libc:<br>
> ><br>
> > """ CMakeError.txt<br>
> ><br>
> > /home/joerg/host/usr/i586-<wbr>buildroot-linux-musl/bin/ld: warning:<br>
> > libc.so.6, needed by /usr/lib32/libz.so.1, not found (try using<br>
> > -rpath<br>
> > or -rpath-link)<br>
> > /usr/lib32/libz.so.1: undefined reference to `strcpy@GLIBC_2.0'<br>
> > /usr/lib32/libz.so.1: undefined reference to `free@GLIBC_2.0'<br>
> > /usr/lib32/libz.so.1: undefined reference to `fseeko64@GLIBC_2.1<br>
> > [..]<br>
> ><br>
> > """<br>
> ><br>
> > I did not find any solution which allows me to remove the rpath<br>
> > from<br>
> > the check. Setting CMAKE_SKIP_RPATH does not change the build<br>
> > behaviour of the check_symbol_exists macro.<br>
> ><br>
> > From my understanding, the rpath flag should not be used when the<br>
> > sysroot flag is passed to the linker, right?<br>
> ><br>
> > For reference, I added a minimal example which uses Buildroot for<br>
> > cross-compilation.<br>
> ><br>
> > """ CMakeLists.txt<br>
> ><br>
> > cmake_minimum_required(VERSION 2.8.12)<br>
> ><br>
> > project(test)<br>
> ><br>
> > list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/<wbr>cmake")<br>
> ><br>
> > find_package(MbedTLS)<br>
> > if(MBEDTLS_FOUND)<br>
> >     message(STATUS "Using mbedTLS")<br>
> > endif()<br>
> ><br>
> > """<br>
> ><br>
> > """ FindMbedTLS.cmake<br>
> ><br>
> > include(CheckSymbolExists)<br>
> ><br>
> > find_path(MBEDTLS_INCLUDE_DIRS<br>
> >     NAMES mbedtls/ssl.h<br>
> >     PATH_SUFFIXES include<br>
> > )<br>
> ><br>
> > find_library(MBEDTLS_LIBRARY NAMES mbedtls)<br>
> > find_library(MBEDX509_LIBRARY NAMES mbedx509)<br>
> > find_library(MBEDCRYPTO_<wbr>LIBRARY NAMES mbedcrypto)<br>
> ><br>
> > if(MBEDTLS_LIBRARY AND MBEDX509_LIBRARY AND MBEDCRYPTO_LIBRARY)<br>
> >     set(CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIRS})<br>
> >     set(CMAKE_REQUIRED_LIBRARIES ${MBEDTLS_LIBRARY}<br>
> > ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRARY})<br>
> >     check_symbol_exists(mbedtls_<wbr>ssl_init "mbedtls/ssl.h"<br>
> > MBEDTLS_V2)<br>
> > endif()<br>
> ><br>
> > """<br>
> ><br>
> > """ toolchainfile.cmake<br>
> ><br>
> > string(REPLACE "/usr/share/buildroot" "" RELOCATED_HOST_DIR<br>
> > ${CMAKE_CURRENT_LIST_DIR})<br>
> ><br>
> > set(CMAKE_SYSTEM_NAME Linux)<br>
> > set(CMAKE_SYSTEM_PROCESSOR i586)<br>
> ><br>
> > set(CMAKE_C_FLAGS_DEBUG "" CACHE STRING "Debug CFLAGS")<br>
> > set(CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "Debug CXXFLAGS")<br>
> > set(CMAKE_C_FLAGS_RELEASE " -DNDEBUG" CACHE STRING "Release<br>
> > CFLAGS")<br>
> > set(CMAKE_CXX_FLAGS_RELEASE " -DNDEBUG" CACHE STRING "Release<br>
> > CXXFLAGS")<br>
> ><br>
> > # Build type from the Buildroot configuration<br>
> > set(CMAKE_BUILD_TYPE Release CACHE STRING "Buildroot build<br>
> > configuration")<br>
> ><br>
> > # Buildroot defaults flags.<br>
> > set(CMAKE_C_FLAGS "-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE<br>
> > -D_FILE_OFFSET_BITS=64 -Os" CACHE STRING "Buildroot CFLAGS")<br>
> > set(CMAKE_CXX_FLAGS "-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE<br>
> > -D_FILE_OFFSET_BITS=64 -Os" CACHE STRING "Buildroot CXXFLAGS")<br>
> > set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "Buildroot LDFLAGS for<br>
> > executables")<br>
> ><br>
> > set(CMAKE_INSTALL_SO_NO_EXE 0)<br>
> ><br>
> > set(CMAKE_PROGRAM_PATH "${RELOCATED_HOST_DIR}/usr/<wbr>bin")<br>
> > set(CMAKE_SYSROOT "${RELOCATED_HOST_DIR}/usr/<wbr>i586-buildroot-linux-<br>
> > musl/sysroot")<br>
> > set(CMAKE_FIND_ROOT_PATH "${RELOCATED_HOST_DIR}/usr/<wbr>i586-buildroot-<br>
> > linux-musl/sysroot")<br>
> > set(CMAKE_FIND_ROOT_PATH_MODE_<wbr>PROGRAM NEVER)<br>
> > set(CMAKE_FIND_ROOT_PATH_MODE_<wbr>PACKAGE ONLY)<br>
> > set(CMAKE_FIND_ROOT_PATH_MODE_<wbr>LIBRARY ONLY)<br>
> > set(CMAKE_FIND_ROOT_PATH_MODE_<wbr>INCLUDE ONLY)<br>
> > set(ENV{PKG_CONFIG_SYSROOT_<wbr>DIR} "${RELOCATED_HOST_DIR}/usr/<wbr>i586-<br>
> > buildroot-linux-musl/sysroot")<br>
> ><br>
> > # This toolchain file can be used both inside and outside<br>
> > Buildroot.<br>
> > set(CMAKE_C_COMPILER "${RELOCATED_HOST_DIR}/usr/<wbr>bin/i586-linux-<br>
> > gcc")<br>
> > set(CMAKE_CXX_COMPILER "${RELOCATED_HOST_DIR}/usr/<wbr>bin/i586-linux-<br>
> > g++")<br>
> ><br>
> > """<br>
> ><br>
> > What do I miss?<br>
><br>
> Note, that this project was build using CMake 3.7.2 on Debian. When<br>
> using CMake 3.6.3, CMake does correctly not add rpath to the cross-<br>
> linker and the check_symbol_exists() succeeds.<br>
<br>
I did a git bisect. The behaviour was introduced in commit<br>
896ad251de49f167f4ce3cbbcf9a6c<wbr>ce85a16681 [1].<br>
<br>
My suggestion is to set FIND_LIBRARY_USE_LIB32_PATHS and<br>
FIND_LIBRARY_USE_LIB64_PATHS to FALSE when cross-compiling on Linux.<br>
<br>
[1] <a href="https://gitlab.kitware.com/cmake/cmake/commit/896ad251de49f167f4ce3
cbbcf9a6cce85a16681" rel="noreferrer" target="_blank">https://gitlab.kitware.com/<wbr>cmake/cmake/commit/<wbr>896ad251de49f167f4ce3<br>
cbbcf9a6cce85a16681</a><br>
<br>
Best regards,<br>
Jörg Krause<br>
--<br>
<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" rel="noreferrer" target="_blank">http://www.cmake.org/Wiki/<wbr>CMake_FAQ</a><br>
<br>
Kitware offers various services to support the CMake community. For more information on each offering, please visit:<br>
<br>
CMake Support: <a href="http://cmake.org/cmake/help/support.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/<wbr>support.html</a><br>
CMake Consulting: <a href="http://cmake.org/cmake/help/consulting.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/<wbr>consulting.html</a><br>
CMake Training Courses: <a href="http://cmake.org/cmake/help/training.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/<wbr>training.html</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/<wbr>opensource/opensource.html</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/cmake" rel="noreferrer" target="_blank">http://public.kitware.com/<wbr>mailman/listinfo/cmake</a></blockquote></div></div>