Stephen Kelly wrote:
> Sounds good to me. I haven't looked into the implementation details like
> that yet, but I'll do so tomorrow.

I looked into the implementation details and used the following two 
toolchains to test it:

rpitoolchain.cmake:
 
  set(CMAKE_SYSTEM_NAME Linux)

  set(CMAKE_SYSROOT /home/stephen/rpi/rasp-pi-rootfs)
  set(CMAKE_STAGING_PREFIX /home/stephen/dev/src/qtbase-rpi/extprefix)

  set(CMAKE_C_COMPILER /home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/bin/arm-linux-gnueabihf-gcc)
  set(CMAKE_CXX_COMPILER /home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/bin/arm-linux-gnueabihf-g++)

  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)


clangtargettoolchain.cmake:

  set(CMAKE_SYSTEM_NAME Linux)

  set(CMAKE_SYSROOT /home/stephen/rpi/rasp-pi-rootfs)
  set(CMAKE_STAGING_PREFIX /home/stephen/dev/src/qtbase-rpi/extprefix)

  set(triple arm-linux-gnueabihf)
  set(gcc_toolchain /home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf)

  set(CMAKE_C_COMPILER /home/stephen/dev/build/qtbase/llvm/bin/clang)
  set(CMAKE_C_COMPILER_TARGET ${triple})
  set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN ${gcc_toolchain})
  set(CMAKE_CXX_COMPILER /home/stephen/dev/build/qtbase/llvm/bin/clang++)
  set(CMAKE_CXX_COMPILER_TARGET ${triple})
  set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN ${gcc_toolchain})

  # Debian bug 708744
  include_directories(SYSTEM "${CMAKE_SYSROOT}/usr/include/${triple}")

  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)


I tested with this CMakeLists.txt:

  cmake_minimum_required(VERSION 2.8.12)
  find_package(Qt5Widgets 5.2 REQUIRED)

  find_package(ZLIB REQUIRED)

  include_directories(${ZLIB_INCLUDE_DIRS})
  add_executable(main main.cpp)
  target_link_libraries(main ${ZLIB_LIBRARIES} Qt5::Widgets)



stephen@hal:~/dev/src/playground/cmake/build{master}$ cmake .. -
DCMAKE_TOOLCHAIN_FILE=../rpitoolchain.cmake -DCMAKE_INSTALL_PREFIX=/opt/kf5
-- The C compiler identification is GNU 4.7.2
-- The CXX compiler identification is GNU 4.7.2
-- Check for working C compiler: /home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/bin/arm-linux-gnueabihf-gcc
-- Check for working C compiler: /home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/bin/arm-linux-gnueabihf-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/bin/arm-linux-gnueabihf-g++
-- Check for working CXX compiler: /home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/bin/arm-linux-gnueabihf-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found ZLIB: /home/stephen/rpi/rasp-pi-rootfs/usr/lib/arm-linux-
gnueabihf/libz.so (found version "1.2.7") 
-- Configuring done
-- Generating done
-- Build files have been written to: 
/home/stephen/dev/src/playground/cmake/build
Qt( base ) KDE ( ) 
stephen@hal:~/dev/src/playground/cmake/build{master}$ make VERBOSE=1
makeobj[0]: Entering directory 
`/home/stephen/dev/src/playground/cmake/build'
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -
H/home/stephen/dev/src/playground/cmake -
B/home/stephen/dev/src/playground/cmake/build --check-build-system 
CMakeFiles/Makefile.cmake 0
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_progress_start 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles/progress.marks
/usr/bin/make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/stephen/safe/dev/playground/cmake/build'
/usr/bin/make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend
make[2]: Entering directory `/home/stephen/safe/dev/playground/cmake/build'
cd /home/stephen/dev/src/playground/cmake/build && 
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_depends "Unix 
Makefiles" /home/stephen/dev/src/playground/cmake 
/home/stephen/dev/src/playground/cmake 
/home/stephen/dev/src/playground/cmake/build 
/home/stephen/dev/src/playground/cmake/build 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles/main.dir/DependInfo.cmake
 
--color=
Dependee 
"/home/stephen/dev/src/playground/cmake/build/CMakeFiles/main.dir/DependInfo.cmake"
 
is newer than depender 
"/home/stephen/dev/src/playground/cmake/build/CMakeFiles/main.dir/depend.internal".
Dependee 
"/home/stephen/dev/src/playground/cmake/build/CMakeFiles/CMakeDirectoryInformation.cmake"
 
is newer than depender 
"/home/stephen/dev/src/playground/cmake/build/CMakeFiles/main.dir/depend.internal".
Scanning dependencies of target main
make[2]: Leaving directory `/home/stephen/safe/dev/playground/cmake/build'
/usr/bin/make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build
make[2]: Entering directory `/home/stephen/safe/dev/playground/cmake/build'
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_progress_report 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles 1
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g++  
--sysroot=/home/stephen/rpi/rasp-pi-rootfs  -DQT_CORE_LIB -DQT_GUI_LIB -
DQT_NO_DEBUG -DQT_WIDGETS_LIB -fPIE -isystem /home/stephen/dev/src/qtbase-
rpi/extprefix/include -isystem /home/stephen/dev/src/qtbase-
rpi/extprefix/include/QtWidgets -isystem /home/stephen/dev/src/qtbase-
rpi/extprefix/include/QtGui -isystem /home/stephen/rpi/rasp-pi-
rootfs/opt/vc/include -isystem /home/stephen/dev/src/qtbase-
rpi/extprefix/include/QtCore -isystem /home/stephen/dev/src/qtbase-
rpi/hostprefix/mkspecs/devices/linux-rasp-pi-g++    -o 
CMakeFiles/main.dir/main.cpp.o -c 
/home/stephen/dev/src/playground/cmake/main.cpp
Linking CXX executable main
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_link_script 
CMakeFiles/main.dir/link.txt --verbose=1
/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g++  
--sysroot=/home/stephen/rpi/rasp-pi-rootfs      
CMakeFiles/main.dir/main.cpp.o  -o main -rdynamic -lz 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Widgets.so.5.3.0 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Gui.so.5.3.0 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Core.so.5.3.0 -Wl,-
rpath,/opt/kf5/lib:/opt/vc/lib -Wl,-rpath-link,/home/stephen/rpi/rasp-pi-
rootfs/opt/vc/lib 
make[2]: Leaving directory `/home/stephen/safe/dev/playground/cmake/build'
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_progress_report 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles  1
[100%] Built target main
make[1]: Leaving directory `/home/stephen/safe/dev/playground/cmake/build'
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_progress_start 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles 0
makeobj[0]: Leaving directory `/home/stephen/dev/src/playground/cmake/build'


So, determining compiler information works, find_package works, the zlib 
include dir is stripped as it is implicit (and I verified that the sysroot 
zlib.h is used by adding an #error), the libz.so.1.2.7 is simplified to -lz 
because of the implicit link directories, the -rpath info is properly 
transformed with the CMAKE_INSTALL_PREFIX replacing the 
CMAKE_STAGING_PREFIX, and the -rpath-link info is properly not transformed. 

I also tested without setting the CMAKE_INSTALL_PREFIX and the default 
/usr/local path is the result of the transformation.

The clang toolchain also works fine with clang trunk (I made some changes 
there to find the crti.o etc properly).

stephen@hal:~/dev/src/playground/cmake/build{master}$ cmake .. -
DCMAKE_TOOLCHAIN_FILE=../clangtargettoolchain.cmake
-- The C compiler identification is Clang 3.4.0
-- The CXX compiler identification is Clang 3.4.0
-- Check for working C compiler: 
/home/stephen/dev/build/qtbase/llvm/bin/clang
-- Check for working C compiler: 
/home/stephen/dev/build/qtbase/llvm/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: 
/home/stephen/dev/build/qtbase/llvm/bin/clang++
-- Check for working CXX compiler: 
/home/stephen/dev/build/qtbase/llvm/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found ZLIB: /home/stephen/rpi/rasp-pi-rootfs/usr/lib/arm-linux-
gnueabihf/libz.so (found version "1.2.7") 
-- Configuring done
-- Generating done
-- Build files have been written to: 
/home/stephen/dev/src/playground/cmake/build
Qt( base ) KDE ( ) 
stephen@hal:~/dev/src/playground/cmake/build{master}$ make VERBOSE=1
makeobj[0]: Entering directory 
`/home/stephen/dev/src/playground/cmake/build'
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -
H/home/stephen/dev/src/playground/cmake -
B/home/stephen/dev/src/playground/cmake/build --check-build-system 
CMakeFiles/Makefile.cmake 0
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_progress_start 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles/progress.marks
/usr/bin/make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/stephen/safe/dev/playground/cmake/build'
/usr/bin/make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend
make[2]: Entering directory `/home/stephen/safe/dev/playground/cmake/build'
cd /home/stephen/dev/src/playground/cmake/build && 
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_depends "Unix 
Makefiles" /home/stephen/dev/src/playground/cmake 
/home/stephen/dev/src/playground/cmake 
/home/stephen/dev/src/playground/cmake/build 
/home/stephen/dev/src/playground/cmake/build 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles/main.dir/DependInfo.cmake
 
--color=
Dependee 
"/home/stephen/dev/src/playground/cmake/build/CMakeFiles/main.dir/DependInfo.cmake"
 
is newer than depender 
"/home/stephen/dev/src/playground/cmake/build/CMakeFiles/main.dir/depend.internal".
Dependee 
"/home/stephen/dev/src/playground/cmake/build/CMakeFiles/CMakeDirectoryInformation.cmake"
 
is newer than depender 
"/home/stephen/dev/src/playground/cmake/build/CMakeFiles/main.dir/depend.internal".
Scanning dependencies of target main
make[2]: Leaving directory `/home/stephen/safe/dev/playground/cmake/build'
/usr/bin/make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build
make[2]: Entering directory `/home/stephen/safe/dev/playground/cmake/build'
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_progress_report 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles 1
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
/home/stephen/dev/build/qtbase/llvm/bin/clang++  -target arm-linux-gnueabihf 
-gcc-toolchain /home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf --
sysroot=/home/stephen/rpi/rasp-pi-rootfs  -DQT_CORE_LIB -DQT_GUI_LIB -
DQT_NO_DEBUG -DQT_WIDGETS_LIB -fPIE -isystem /home/stephen/rpi/rasp-pi-
rootfs/usr/include/arm-linux-gnueabihf -isystem 
/home/stephen/dev/src/qtbase-rpi/extprefix/include -isystem 
/home/stephen/dev/src/qtbase-rpi/extprefix/include/QtWidgets -isystem 
/home/stephen/dev/src/qtbase-rpi/extprefix/include/QtGui -isystem 
/home/stephen/rpi/rasp-pi-rootfs/opt/vc/include -isystem 
/home/stephen/dev/src/qtbase-rpi/extprefix/include/QtCore -isystem 
/home/stephen/dev/src/qtbase-rpi/hostprefix/mkspecs/devices/linux-rasp-pi-
g++    -o CMakeFiles/main.dir/main.cpp.o -c 
/home/stephen/dev/src/playground/cmake/main.cpp
Linking CXX executable main
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_link_script 
CMakeFiles/main.dir/link.txt --verbose=1
/home/stephen/dev/build/qtbase/llvm/bin/clang++  -target arm-linux-gnueabihf 
-gcc-toolchain /home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf --
sysroot=/home/stephen/rpi/rasp-pi-rootfs      CMakeFiles/main.dir/main.cpp.o  
-o main -rdynamic -lz /home/stephen/dev/src/qtbase-
rpi/extprefix/lib/libQt5Widgets.so.5.3.0 /home/stephen/dev/src/qtbase-
rpi/extprefix/lib/libQt5Gui.so.5.3.0 /home/stephen/dev/src/qtbase-
rpi/extprefix/lib/libQt5Core.so.5.3.0 -Wl,-rpath,/usr/local/lib:/opt/vc/lib 
-Wl,-rpath-link,/home/stephen/rpi/rasp-pi-rootfs/opt/vc/lib 
make[2]: Leaving directory `/home/stephen/safe/dev/playground/cmake/build'
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_progress_report 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles  1
[100%] Built target main
make[1]: Leaving directory `/home/stephen/safe/dev/playground/cmake/build'
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_progress_start 
/home/stephen/dev/src/playground/cmake/build/CMakeFiles 0
makeobj[0]: Leaving directory `/home/stephen/dev/src/playground/cmake/build'


All the same things work as with the other toolchain, and now the -target 
and -gcc-toolchain are also properly passed, which result in finding 
binutils etc properly.

I also tested a static and shared lib. 

Linking CXX shared library libuser2.so
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_link_script 
CMakeFiles/user2.dir/link.txt --verbose=1
/home/stephen/dev/build/qtbase/llvm/bin/clang++  -target arm-linux-gnueabihf 
-gcc-toolchain /home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf --
sysroot=/home/stephen/rpi/rasp-pi-rootfs -fPIC    -shared -Wl,-
soname,libuser2.so -o libuser2.so CMakeFiles/user2.dir/lib.cpp.o 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Widgets.so.5.3.0 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Gui.so.5.3.0 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Core.so.5.3.0 -Wl,-
rpath,/opt/kf5/lib:/opt/vc/lib -Wl,-rpath-link,/home/stephen/rpi/rasp-pi-
rootfs/opt/vc/lib 
Linking CXX static library libuser.a
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -P 
CMakeFiles/user.dir/cmake_clean_target.cmake
/home/stephen/dev/prefix/qtbase/kde/bin/cmake -E cmake_link_script 
CMakeFiles/user.dir/link.txt --verbose=1
/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-ar cr 
libuser.a  CMakeFiles/user.dir/lib.cpp.o
/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-
ranlib libuser.a

So, the correct ar and ranlib are used when building the static library. 
When building the shared library, the correct ld is used:

stephen@hal:~/dev/src/playground/cmake/build{master}$ 
/home/stephen/dev/build/qtbase/llvm/bin/clang++  -target arm-linux-gnueabihf 
-gcc-toolchain /home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf --
sysroot=/home/stephen/rpi/rasp-pi-rootfs -fPIC    -shared -Wl,-
soname,libuser2.so -o libuser2.so CMakeFiles/user2.dir/lib.cpp.o 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Widgets.so.5.3.0 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Gui.so.5.3.0 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Core.so.5.3.0 -Wl,-
rpath,/opt/kf5/lib:/opt/vc/lib -Wl,-rpath-link,/home/stephen/rpi/rasp-pi-
rootfs/opt/vc/lib -v
clang version 3.4 
Target: arm--linux-gnueabihf
Thread model: posix
Found candidate GCC installation: /home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/lib/gcc/arm-linux-gnueabihf/4.7.2
Selected GCC installation: /home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/lib/gcc/arm-linux-gnueabihf/4.7.2
 "/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/lib/gcc/arm-linux-
gnueabihf/4.7.2/../../../../arm-linux-gnueabihf/bin/ld" --
sysroot=/home/stephen/rpi/rasp-pi-rootfs -z relro -X --hash-style=gnu --
build-id --eh-frame-hdr -m armelf_linux_eabi -shared -dynamic-linker 
/lib/ld-linux-armhf.so.3 -o libuser2.so /home/stephen/rpi/rasp-pi-
rootfs/usr/lib/arm-linux-gnueabihf/crti.o /home/stephen/rpi/gcc-4.7-linaro-
rpi-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.7.2/crtbeginS.o -
L/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/lib/gcc/arm-linux-
gnueabihf/4.7.2 -L/home/stephen/rpi/gcc-4.7-linaro-rpi-
gnueabihf/lib/gcc/arm-linux-gnueabihf/4.7.2/../../../../arm-linux-
gnueabihf/lib/../lib32 -L/home/stephen/rpi/rasp-pi-rootfs/lib/arm-linux-
gnueabihf -L/home/stephen/rpi/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf -
L/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/lib/gcc/arm-linux-
gnueabihf/4.7.2/../../../../arm-linux-gnueabihf/lib -
L/home/stephen/rpi/rasp-pi-rootfs/lib -L/home/stephen/rpi/rasp-pi-
rootfs/usr/lib -soname libuser2.so CMakeFiles/user2.dir/lib.cpp.o 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Widgets.so.5.3.0 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Gui.so.5.3.0 
/home/stephen/dev/src/qtbase-rpi/extprefix/lib/libQt5Core.so.5.3.0 -rpath 
/opt/kf5/lib:/opt/vc/lib -rpath-link /home/stephen/rpi/rasp-pi-
rootfs/opt/vc/lib -lstdc++ -lm -lgcc_s -lc -lgcc_s 
/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/lib/gcc/arm-linux-
gnueabihf/4.7.2/crtendS.o /home/stephen/rpi/rasp-pi-rootfs/usr/lib/arm-
linux-gnueabihf/crtn.o
Qt( base ) KDE ( ) 
stephen@hal:~/dev/src/playground/cmake/build{master}$ realpath 
/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/lib/gcc/arm-linux-
gnueabihf/4.7.2/../../../../arm-linux-gnueabihf/bin/ld
/home/stephen/rpi/gcc-4.7-linaro-rpi-gnueabihf/arm-linux-gnueabihf/bin/ld


I'll do further tests later with other projects and with the QNX toolchain 
file.

Thanks,

Steve.


--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers

Reply via email to