Hi there,

I can use a trivial toolchain file to compile for QNX with qcc:

 SET(CMAKE_SYSTEM_NAME QNX)
 SET(arch gcc_ntoarmv7le)
 SET(CMAKE_C_COMPILER qcc -V${arch})
 SET(CMAKE_CXX_COMPILER QCC -V${arch})

 SET(CMAKE_FIND_ROOT_PATH $ENV{QNX_TARGET}/armle-v7 $ENV{QNX_TARGET})

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


However, I just noticed that when I build, /usr/bin/ar is used instead of 
/home/stephen/bbndk/host_10_1_0_132/linux/x86/usr/bin/ntoarm-ar

When cross-compiling with g++, the _CMAKE_TOOLCHAIN_PREFIX is set by 
examining the name of the compiler in CMakeDetermineCXXCompiler.cmake. 

When using qcc, the COMPILER_BASENAME doesn't match, and the appropriate 
prefix is not encoded into the name anyway. I was thinking that 
CMakeDetermineCXXCompiler.cmake could be extended to handle QCC and use the 
CMAKE_CXX_COMPILER_TARGET. 

However, currently the CMAKE_CXX_COMPILER_TARGET needs to be of the form 
gcc_nto<arch>, not just nto<arch>, so the QNX specific code in 
CMakeDetermineCXXCompiler.cmake would have to account for that, and other 
possible suffixes (the version is optional):

 stephen@hal:~/bbndk/host_10_1_0_132/linux/x86/usr/bin$ ./QCC -V
 cc: targets available in 
/home/stephen/bbndk/host_10_1_0_132/linux/x86/etc/qcc:
        4.6.3,gcc_ntoarmv7le_gpp
        4.6.3,gcc_ntox86_gpp
        4.6.3,gcc_ntox86_cpp
        4.6.3,gcc_ntoarmv7le_cpp-ne
        4.6.3,gcc_ntoarmv7le
        4.6.3,gcc_ntox86_cpp-ne
        4.6.3,gcc_ntox86        (default)
        4.6.3,gcc_ntoarmv7le_cpp

Can I extend the CMakeDetermineCXXCompiler.cmake with handling for that?

That would mean that with a recent enough cmake version, I can replace the 

 SET(arch gcc_ntoarmv7le)
 SET(CMAKE_C_COMPILER qcc -V${arch})
 SET(CMAKE_CXX_COMPILER QCC -V${arch})

in my toolchain file with 

 SET(arch gcc_ntoarmv7le)
 SET(CMAKE_C_COMPILER qcc)
 SET(CMAKE_CXX_COMPILER QCC)
 SET(CMAKE_C_COMPILER_TARGET ${arch})
 SET(CMAKE_CXX_COMPILER_TARGET ${arch})

and it will 'just work'.



I also notice that CMakeDetermineCXXCompiler.cmake doesn't have specific 
handling for clang, and it could be extended similarly. Note that there are 
two ways to use clang as a cross-compiler. One is specifying -target, which 
CMAKE_C_COMPILER_TARGET does, and the other is creating a symlink or copy so 
that the name contains the triple:

 stephen@hal:/tmp$ /usr/bin/clang -dumpmachine
 x86_64-pc-linux-gnu
 stephen@hal:/tmp$ ln -s clang arm-linux-gnueabihf-clang
 stephen@hal:/tmp$ ./arm-linux-gnueabihf-clang  -dumpmachine
 arm--linux-gnueabihf

So, possibly both ways should be handled in the clang case. I haven't 
actually done any testing for the clang cases yet though to find out if the 
missing _CMAKE_TOOLCHAIN_PREFIX causes a problem. I don't recall ever 
hitting any, which confuses me somewhat.

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