<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Mar 16, 2016 at 2:53 PM Rail Shafigulin via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I'm confused about the clang --target, -mcpu, -march<div><br></div><div>Can someone give a clear explanation on what is the difference between them?</div><div><br></div></div></blockquote><div><br></div><div>I can try :)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div></div><div>Originally I thought need to specify -mcpu (which I assume means CPU) and -march but then I can't figure out how --target fits into the picture. Sometimes it tells me that -march or -mcpu options is not used. I would really appreciate any help on this.<br clear="all"><div><br></div></div></div></blockquote><div><br></div><div>Let's say you're on an x86_64-linux-gnu machine (basically any linux machine) and you want to compile some code for a haswell specific binary, you'd use:</div><div><br></div><div>clang -march=haswell foo.c</div><div><br></div><div>Which tells clang to use the current host as the "OS" for your compile and to tell the backend to generate haswell specific code.</div><div><br></div><div>Let's say you instead want to compile for arm-linux-gnu (just your basic arm linux machine), you'd use:</div><div><br></div><div>clang -target arm-linux-gnu foo.c <some other options></div><div><br></div><div>I'm glossing over this a bit because it's not relevant to what you asked, but the other options there are going to be things like a sysroot where you can get the headers and libraries for an arm-linux-gnu machine, because they're likely not installed on your x86_64-linux-gnu machine.</div><div><br></div><div>Now, let's say you want to target a specific arm processor as part of your cross compile, you'd do this:</div><div><br></div><div>clang -target arm-linux-gnu foo.c -mcpu=armv7</div><div><br></div><div>or you could do this:</div><div><br></div><div>clang -target armv7-linux-gnu foo.c</div><div><br></div><div>this is partially because of legacy reasons, and partially because arm is weird here. The -mcpu and -march options are very similar in clang. In general, they're setting the processor you're compiling your code to run on. (Arm is even weirder here so I'm glossing over a lot of details).</div><div><br></div><div>The reasons behind this are largely historical and option compatibility with gcc. If you've done cross compilation with gcc all that the --target option does in clang is select at runtime the same thing that you'd use --target for on the configure line.</div><div><br></div><div>Make sense?</div><div><br></div><div>-eric </div></div></div>