<div dir="ltr"><div><font face="verdana, sans-serif">Dear David,</font></div><div><font face="verdana, sans-serif"><br></font></div><font face="verdana, sans-serif">I appreciate your experience. I also successfully built the clang for target ARM platform on x86 Linux by directly modifying "./llvm/CMakeLists.txt" as below in green color. It is ugly workaround. I prefer your approach and will try later. </font><div><font face="verdana, sans-serif"><br></font></div><div><div style=""><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif"># Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.</font></div><div style=""><font face="verdana, sans-serif" style="" color="#6aa84f">#set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")</font></div><div style=""><font face="verdana, sans-serif" color="#6aa84f">set(LLVM_TARGET_TRIPLE_ENV "armv7-linux-gnueabihf")</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif">set(LLVM_TARGET_TRIPLE_ENV "armv7-linux-gnueabihf"  CACHE STRING "ydd override default target to armv7-linux-gnueabihf.")</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif">mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif"><br><br></font></div></div><font face="verdana, sans-serif"><br style="color:rgb(0,0,0)"></font><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif"># By default, we target the host, but this can be overridden at CMake</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif"># invocation time.</font></div><div style=""><font face="verdana, sans-serif" style="" color="#6aa84f">set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING</font></div><div style=""><font face="verdana, sans-serif" color="#6aa84f">  "Default target for which LLVM will generate code." )</font></div><div style=""><font face="verdana, sans-serif" style="" color="#6aa84f">set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif">message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}")</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif">message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif">set(LLVM_TARGET_TRIPLE_ENV "armv7-linux-gnueabihf")<br></font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif">message(STATUS "ydd LLVM_TARGET_TRIPLE_ENV: ${LLVM_TARGET_TRIPLE_ENV}")</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif">message(STATUS "ydd LLVM_TARGETS_TO_BUILD: ${LLVM_TARGETS_TO_BUILD}")</font></div></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif"><br></font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif">Many Thanks,</font></div><div style="color:rgb(0,0,0)"><font face="verdana, sans-serif" style="">Andy</font></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Aug 20, 2020 at 5:38 PM David Spickett <<a href="mailto:david.spickett@linaro.org">david.spickett@linaro.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Andy,<br>
<br>
Assuming you are compiling with clang, I think -target and --sysroot<br>
need to be added to CMAKE_CXX_FLAGS instead of being cmake arguments<br>
themselves.<br>
<br>
"However, if you’re using Clang, the driver might not be up-to-date<br>
with your specific Linux distribution, version or GCC layout, so<br>
you’ll need to fudge.<br>
<br>
In addition to the ones above, you’ll also need:"<br>
<br>
Means you'll need extra CMAKE_CXX_FLAGS. (I also made the same mistake<br>
on first reading) So try:<br>
-DCMAKE_CXX_FLAGS="-target arm-linux-gnueabihf<br>
--sysroot=/usr/arm-linux-gnueabihf"<br>
<br>
Also I think (not tried your exact config) you need to tell cmake you<br>
want to use clang by doing:<br>
-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++<br>
<br>
If you're using GCC, skip the target and sysroot CFLAGS. Also I found<br>
that I had to explicitly give cmake the gcc name (similar to above):<br>
-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc<br>
-DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++-5<br>
I have a feeling CMake should find this on its own but I don't know<br>
enough to say.<br>
<br>
If the default triple is still x86 by that point you can set that<br>
with: -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf<br>
(probably won't be an issue)<br>
<br>
Thanks,<br>
David Spickett.<br>
<br>
On Thu, 20 Aug 2020 at 03:15, Dongdong Yang via cfe-dev<br>
<<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<br>
><br>
> I can get llvm source code and the information “cross-compiling from x86_64 to ARM” from <a href="https://llvm.org/docs/HowToCrossCompileLLVM.html" rel="noreferrer" target="_blank">https://llvm.org/docs/HowToCrossCompileLLVM.html</a>. However, I still fail to build clang for ARM. It is strange, I have already set a target with "   -target arm-linux-gnueabihf  "  .  I am describing the failure progress as below. Expecting any idea.<br>
><br>
><br>
><br>
> The build steps:<br>
> cd llvm-project<br>
> mkdir build<br>
> cd build<br>
> cmake -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles"<br>
> make<br>
> // After I built host llvm-tblgen  and clang-tblgen, I begin to return to build arm target clang as below steps:<br>
> cd ..<br>
> mkdir build_arm_onx86<br>
> cd build_arm_onx86<br>
> mkdir stall_prefix<br>
> cmake -G "Unix Makefiles" -DCMAKE_CROSSCOMPILING=True  -DCMAKE_INSTALL_PREFIX=./stall_prefix  -DLLVM_TABLEGEN=/home_2t/workspace/llvm_clang/llvm-project/build/bin/llvm-tblgen -DCLANG_TABLEGEN=/home_2t/workspace/llvm_clang/llvm-project/build/bin/clang-tblgen -DLLVM_TARGET_ARCH=ARM -DLLVM_TARGETS_TO_BUILD=ARM  -target arm-linux-gnueabihf  -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi"  ../llvm    2>&1 | tee out_cofiguration.txt<br>
> make  2>&1 | tee out_make.txt<br>
><br>
> The result:<br>
><br>
> build_arm_onx86$ file bin/clang-12<br>
> bin/clang-12: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=3b669c10e300bb5d9bb96cfb77f927ce95728ca6, not stripped<br>
><br>
> build_arm_onx86$ bin/clang --version<br>
> clang version 12.0.0 (<a href="https://github.com/llvm/llvm-project.git" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project.git</a> 3948341fa5fab2695b0df95edc248fe959e40664)<br>
> Target: x86_64-unknown-linux-gnu<br>
> Thread model: posix<br>
> InstalledDir: /home_2t/workspace/llvm_clang/llvm-project/build_arm_onx86/bin<br>
><br>
> Seems it failed from the configuration as attached cmake output log.<br>
> -- LLVM host triple: x86_64-unknown-linux-gnu<br>
> -- LLVM default target triple: x86_64-unknown-linux-gnu<br>
><br>
><br>
> Thanks in advance<br>
><br>
><br>
> Best Regards,<br>
> Andy<br>
><br>
> On Thu, Aug 13, 2020 at 7:32 PM Dongdong Yang <<a href="mailto:contribute.kernel@gmail.com" target="_blank">contribute.kernel@gmail.com</a>> wrote:<br>
>><br>
>> May I ask how to build clang for arm on x86 linux ubuntu box? And how to use  sysroot  to cross compile clang  libc++  for arm on x86 linux?   Appreciate any guidance.<br>
>><br>
>> Thanks,<br>
>> Andy<br>
><br>
> _______________________________________________<br>
> cfe-dev mailing list<br>
> <a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div>