Hello, I am trying to get my head around how Clang is supposedly used as Crosscompiler. I am using it for years with a custom gcc toolchain, but its cumbersome as it involves adding all inlude and library paths from gcc and adding them as options. So I tested the arguments that should allow crosscompiling and compared what they do.
(I am on Debian Strech AMD64, but same or similar issues persist on older Debian Versions atleast) ---------------------------------------------------- echo 'int main(){}' > test.cpp # Works clang++ -v test.cpp &> clang_normal.txt # DOESNT Work. This is the same gcc toolchain clang picked up automatically with the above command clang++ --gcc-toolchain=/usr/bin/../lib/gcc/x86_64-linux-gnu/6.2.1 -v test.cpp &> clang_defaulttc.txt # installed package g++-arm-linux-gnueabihf # Works clang++ --target=arm-linux-gnueabihf -v test.cpp &> clang_crossnormal.txt DOESNT Work. This is the same gcc toolchain clang picked up automatically with the above command clang++ --target=arm-linux-gnueabihf --gcc-toolchain=/usr/lib/gcc-cross/arm-linux-gnueabihf/6 -v test.cpp &> clang_crossdefaulttc.txt # own cross compiler. Lacks the correct include paths, works otherwise with the commands below clang++ --target=arm-none-eabi -B/opt/hip-toolchain-5/bin/arm-none-eabi- -v test.cpp --specs=nosys.specs &> clang_extcrosstc.txt clang++ --target=arm-none-eabi -B/opt/hip-toolchain-5/bin/arm-none-eabi- --sysroot=/opt/hip-toolchain-5/arm-none-eabi -v test.cpp --specs=nosys.specs &> clang_extcrosstc_s.txt clang++ --target=arm-none-eabi -B/opt/hip-toolchain-5/bin/arm-none-eabi- --gcc-toolchain=opt/hip-toolchain-5/lib/gcc/arm-none-eabi/5.3.0 --sysroot=/opt/hip-toolchain-5/arm-none-eabi -v test.cpp --specs=nosys.specs &> clang_extcrosstc_st.txt # Trick with sysmlinking to clang, this essentially saves the --target and -B option. /opt/hip-toolchain-5/bin/arm-none-eabi-clang++ -v test.cpp --specs=nosys.specs &> clang_extcrosstc_link.txt # Normalize tempnames for easy comparison for file in *.txt; do sed -e 's,/tmp/test-.*\.o,/tmp/test-000000.o,g' -e 's,/tmp/.*\.res,/tmp/cc000000.res,g' -i $file done ---------------------------------------------------- The results are attached as file. Findings are: * Detection of default system compilers seems to work, also with crosscompilers via --target * --gcc-toolchain wont work, even if you set the very same value that clang claims to have used * --gcc-toolchain doesnt do anything for my cross compiler (tried several variants with useful paths) * -B/opt/hip-toolchain-5/bin/arm-none-eabi- makes gcc pickup the right gcc for linking (would be system gcc otherwise) * --sysroot=/opt/hip-toolchain-5/arm-none-eabi should pick up the correct system includes according to http://clang.llvm.org/docs/CrossCompilation.html. It doesnt (searches for /usr/include instead of /include) That means I dont know a way to make --gcc-toolchain usefull, might be a bug (debian or upstream). --sysroot similarly doesnt seem to make sense (and -isysroot is even worse) The only way is adding alot include and library paths for crosscompilers. using --gcc-toolchain makes even that impossible, since crtbegin.o wont be found even with the correct added paths? Is this just insanely buggy, or am I getting it totally wrong? Using clang with cmake seems to be somewhat easier, since cmake has an own option for sysroot and manages to do it right
cross_results.tar.gz
Description: GNU Zip compressed data
_______________________________________________ cfe-users mailing list cfe-users@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users