<div dir="ltr"><div>Passing --target= through CMAKE_*_FLAGS works, but it defeats the point of using CMAKE_*_COMPILER_TARGET, which feels more idiomatic.</div><div><br></div><div>After reading a bit more through CMake internals, I think I can workaround this by setting:</div><div><br></div><div>set(CMAKE_C_COMPILER_ID_RUN OFF)<br>set(CMAKE_CXX_COMPILER_ID_RUN OFF)<br>set(CMAKE_C_COMPILER_ID Clang)<br>set(CMAKE_CXX_COMPILER_ID Clang)<br></div><div><br></div><div>in the runtimes build, and then set:</div><div><br></div><div>set(CMAKE_C_SIMULATE_ID MSVC)<br>set(CMAKE_CXX_SIMULATE_ID MSVC)</div><div><br></div><div>when targeting *-pc-windows-msvc with Clang.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 7, 2020 at 2:26 PM Martin Storsjö <<a href="mailto:martin@martin.st">martin@martin.st</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">On Fri, 7 Feb 2020, Petr Hosek via cfe-dev wrote:<br>
<br>
> I'm trying to use Clang to cross-compile runtimes for Fuchsia on Windows.<br>
> The problem I'm hitting is that CMake checks the existence of _MSC_VER<br>
> macro, and if set it detects the compiler as "Clang with GNU-like command<br>
> line" which is a special mode in which CMake treats clang as clang-cl. This<br>
> breaks cross-compilation for runtimes because CMake no longer passes<br>
> --target= flag even if CMAKE_*_COMPILER_TARGET is set, etc. because of thislogic: <a href="https://github.com/Kitware/CMake/blob/master/Modules/Compiler/Clang" rel="noreferrer" target="_blank">https://github.com/Kitware/CMake/blob/master/Modules/Compiler/Clang</a>.<br>
> cmake#L13<br>
> This is IMHO a bug in CMake: it shouldn't blindly assume that Clang is<br>
> clang-cl without first consulting other variables<br>
> like CMAKE_*_COMPILER_TARGET or CMAKE_SYSTEM_NAME, but I'm not sure how easy<br>
> or difficult would it be to change CMake, and even then we would have a<br>
> problem with rolling out new CMake version everywhere.<br>
<br>
This sounds like an issue with how CMake does compiler identification in <br>
mode advanced setups; I've often run into issues where I'd like to <br>
configure with something like CMAKE_C_COMPILER=clang <br>
CMAKE_C_FLAGS="-target <other-system-tuple>", but it first does all the <br>
compiler identification steps only with ${CMAKE_C_COMPILER} in isolation. <br>
This is much more straightforward with GCC like cross compilers, where one <br>
would have CMAKE_C_COMPILER=<other-system-tuple>-gcc. For that case iirc I <br>
managed it to behave correctly by using CMAKE_C_FLAGS_INIT="-target <br>
<other-system-tuple>", which ensures that the flag is used along with <br>
CMAKE_C_COMPILER even for the very first compiler identification steps.<br>
<br>
However, I'm not very proficient with CMake, I'm just fumblingly trying to <br>
make things work for me.<br>
<br>
// Martin<br>
</blockquote></div></div>