[cfe-dev] Not setting -fms-compatibility-version= when -fno-ms-compatibility is set

Petr Hosek via cfe-dev cfe-dev at lists.llvm.org
Fri Feb 7 14:14:24 PST 2020

I'm trying to use Clang to cross-compile runtimes for Fuchsia on Windows.
The problem I'm hitting is that CMake checks the existence of _MSC_VER
macro, and if set it detects the compiler as "Clang with GNU-like command
line" which is a special mode in which CMake treats clang as clang-cl. This
breaks cross-compilation for runtimes because CMake no longer passes
--target= flag even if CMAKE_*_COMPILER_TARGET is set, etc. because of this

This is IMHO a bug in CMake: it shouldn't blindly assume that Clang is
clang-cl without first consulting other variables
like CMAKE_*_COMPILER_TARGET or CMAKE_SYSTEM_NAME, but I'm not sure how
easy or difficult would it be to change CMake, and even then we would have
a problem with rolling out new CMake version everywhere.

So instead, I'm hoping to bypass CMake's detection and force it to treat
Clang as clang (note that this is only for the purpose of
cross-compilation) and to do so I need to unset _MSC_VER. Looking at the
driver code, it seems like _MSC_VER is only defined if
-fms-compatibility-version is set. I was hoping that setting
-fno-ms-compatibility would do the trick, but it doesn't because
-fms-compatibility-version is set independently of -f[no]-ms-compatibility:
When MSVC target is the default driver, -fms-compatibility-version is going
to be set because
a non-empty string, and AFAICT there's no way to disable it, which doesn't
match the documentation:

Does anyone know if this is intentional or just a bug? Would it make sense
to change the driver to avoid setting -fms-compatibility-version
when -fno-ms-compatibility is set?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20200207/4723de8b/attachment.html>

More information about the cfe-dev mailing list