-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <!-- The general order of executing an MSBuild file is roughly:
- 1) vcxproj file
- 2) ├─ Import Microsoft.Cpp.props
- 3) │ └─ Import Toolset specific props (e.g. $(VCTargets)Platforms\Win32\PlatformToolsets\llvm\Toolset.props)
- 4) │ └─ Import This File (LLVM.Cpp.Common.props)
- 5) │─ Core logic of vcxproj (define files, override properties, etc)
- 6) └─ Import Microsoft.Cpp.targets
- 7) │─ Import Toolset specific targets file (e.g. $(VCTargets)Platforms\Win32\PlatformToolsets\llvm\Toolset.targets)
- 8) └─ Run the compiler.
- The important thing is that we have hooks at 3, 4, and 7. 3 and 4 give
- us the ability to provide initial values for toolchain settings (where
- is the compiler, what values are considered "default" for a given
- setting, etc), 7 gives us the ability to act on anything that the user
- has overridden (such as warning or erroring on incompatible settings,
- mapping settings to other settings, etc).
- -->
-
- <PropertyGroup>
- <!-- This initializes the values in Properties > General > Output Directory.
- Builds will fail without this. -->
- <OutDirWasSpecified Condition=" '$(OutDir)'!='' AND '$(OutDirWasSpecified)'=='' ">true</OutDirWasSpecified>
- <OutDirWasSpecified Condition=" '$(OutDir)'=='' AND '$(OutDirWasSpecified)'=='' ">false</OutDirWasSpecified>
-
- <IntDir Condition="'$(IntDir)'=='' AND '$(IntermediateOutputPath)'!=''">$(IntermediateOutputPath)</IntDir>
- <IntDir Condition="'$(IntDir)'=='' AND '$(IntermediateOutputPath)'==''">$(Configuration)\</IntDir>
- <OutDir Condition="'$(OutDir)'=='' AND '$(SolutionDir)' != ''">$(SolutionDir)$(Configuration)\</OutDir>
- <OutDir Condition="'$(OutDir)'=='' AND '$(SolutionDir)' == ''">$(IntDir)</OutDir>
- <DebuggerFlavor Condition="'$(DebuggerFlavor)'==''">WindowsLocalDebugger</DebuggerFlavor>
- </PropertyGroup>
-
- <PropertyGroup>
- <!-- Short names for platform toolsets (added to project name in Solution Explorer) -->
- <_PlatformToolsetShortNameFor_llvm>LLVM</_PlatformToolsetShortNameFor_llvm>
- <_PlatformToolsetFriendlyNameFor_llvm>LLVM</_PlatformToolsetFriendlyNameFor_llvm>
- </PropertyGroup>
-
- <!-- Find an installed LLVM and set up our paths. -->
- <PropertyGroup>
- <LLVMInstallDir>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\LLVM\LLVM)</LLVMInstallDir>
- <LLVMInstallDir Condition="'$(LLVMInstallDir)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\LLVM\LLVM)</LLVMInstallDir>
- <LLVMInstallDir Condition="'$(LLVMInstallDir)' != ''">$(LLVMInstallDir)\</LLVMInstallDir>
- <ClangClExecutable>$(LLVMInstallDir)bin\clang-cl.exe</ClangClExecutable>
- </PropertyGroup>
-
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.WindowsSDK.props" Condition="Exists('$(VCTargetsPath)\Microsoft.Cpp.WindowsSDK.props')"/>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Common.props" />
-
- <PropertyGroup>
- <!-- Set some paths (such as include paths) that are common to all platforms. This is the same as what
- the default paths for cl will use.
- -->
- <IncludePath Condition="'$(IncludePath)' == ''">$(IncludePath);$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>
- <LibraryWPath Condition="'$(LibraryWPath)' == ''">$(WindowsSDK_MetadataPath);</LibraryWPath>
- <SourcePath Condition="'$(SourcePath)' == ''">$(VC_SourcePath);</SourcePath>
- </PropertyGroup>
-
-
- <!-- Set values which are reflected in the property UI by default. The user can override these
- by editing the vcxproj file (or making changes via the UI, which has the same effect).
- -->
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Set this to "Default" (which means not passing any /RTC option) so that any other value will
- be treated as having been overridden by the user. This Serves as a hint to the user that
- Default is the value we support, and other values will generate a warning. It also means
- that if the user simply creates a new project in MSVC (which uses /RTCu by default), then
- switches the toolset to Clang, we will still treat the value as default (which for us is to
- not pass the option). Only if the user explicitly overrode this setting in a project to use
- /RTCu would we see the warning. -->
- <BasicRuntimeChecks>Default</BasicRuntimeChecks>
-
- <AdditionalOptions>-m$(PlatformArchitecture) %(AdditionalOptions)</AdditionalOptions>
- </ClCompile>
- </ItemDefinitionGroup>
-</Project>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <!-- The general order of executing an MSBuild file is roughly:\r
+ 1) vcxproj file\r
+ 2) ├─ Import Microsoft.Cpp.props\r
+ 3) │ └─ Import Toolset specific props (e.g. $(VCTargets)Platforms\Win32\PlatformToolsets\llvm\Toolset.props)\r
+ 4) │ └─ Import This File (LLVM.Cpp.Common.props)\r
+ 5) │─ Core logic of vcxproj (define files, override properties, etc)\r
+ 6) └─ Import Microsoft.Cpp.targets\r
+ 7) │─ Import Toolset specific targets file (e.g. $(VCTargets)Platforms\Win32\PlatformToolsets\llvm\Toolset.targets)\r
+ 8) └─ Run the compiler.\r
+ The important thing is that we have hooks at 3, 4, and 7. 3 and 4 give\r
+ us the ability to provide initial values for toolchain settings (where\r
+ is the compiler, what values are considered "default" for a given\r
+ setting, etc), 7 gives us the ability to act on anything that the user\r
+ has overridden (such as warning or erroring on incompatible settings,\r
+ mapping settings to other settings, etc).\r
+ -->\r
+\r
+ <PropertyGroup>\r
+ <!-- This initializes the values in Properties > General > Output Directory.\r
+ Builds will fail without this. -->\r
+ <OutDirWasSpecified Condition=" '$(OutDir)'!='' AND '$(OutDirWasSpecified)'=='' ">true</OutDirWasSpecified>\r
+ <OutDirWasSpecified Condition=" '$(OutDir)'=='' AND '$(OutDirWasSpecified)'=='' ">false</OutDirWasSpecified>\r
+\r
+ <IntDir Condition="'$(IntDir)'=='' AND '$(IntermediateOutputPath)'!=''">$(IntermediateOutputPath)</IntDir>\r
+ <IntDir Condition="'$(IntDir)'=='' AND '$(IntermediateOutputPath)'==''">$(Configuration)\</IntDir>\r
+ <OutDir Condition="'$(OutDir)'=='' AND '$(SolutionDir)' != ''">$(SolutionDir)$(Configuration)\</OutDir>\r
+ <OutDir Condition="'$(OutDir)'=='' AND '$(SolutionDir)' == ''">$(IntDir)</OutDir>\r
+ <DebuggerFlavor Condition="'$(DebuggerFlavor)'==''">WindowsLocalDebugger</DebuggerFlavor>\r
+ </PropertyGroup>\r
+\r
+ <PropertyGroup>\r
+ <!-- Short names for platform toolsets (added to project name in Solution Explorer) -->\r
+ <_PlatformToolsetShortNameFor_llvm>LLVM</_PlatformToolsetShortNameFor_llvm>\r
+ <_PlatformToolsetFriendlyNameFor_llvm>LLVM</_PlatformToolsetFriendlyNameFor_llvm>\r
+ </PropertyGroup>\r
+\r
+ <!-- Find an installed LLVM and set up our paths. -->\r
+ <PropertyGroup>\r
+ <LLVMInstallDir>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\LLVM\LLVM)</LLVMInstallDir>\r
+ <LLVMInstallDir Condition="'$(LLVMInstallDir)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\LLVM\LLVM)</LLVMInstallDir>\r
+ <LLVMInstallDir Condition="'$(LLVMInstallDir)' != ''">$(LLVMInstallDir)\</LLVMInstallDir>\r
+ <ClangClExecutable>$(LLVMInstallDir)bin\clang-cl.exe</ClangClExecutable>\r
+ </PropertyGroup>\r
+\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.WindowsSDK.props" Condition="Exists('$(VCTargetsPath)\Microsoft.Cpp.WindowsSDK.props')"/>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Common.props" />\r
+\r
+ <PropertyGroup>\r
+ <!-- Set some paths (such as include paths) that are common to all platforms. This is the same as what\r
+ the default paths for cl will use.\r
+ -->\r
+ <IncludePath Condition="'$(IncludePath)' == ''">$(IncludePath);$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>\r
+ <LibraryWPath Condition="'$(LibraryWPath)' == ''">$(WindowsSDK_MetadataPath);</LibraryWPath>\r
+ <SourcePath Condition="'$(SourcePath)' == ''">$(VC_SourcePath);</SourcePath>\r
+ </PropertyGroup>\r
+\r
+\r
+ <!-- Set values which are reflected in the property UI by default. The user can override these\r
+ by editing the vcxproj file (or making changes via the UI, which has the same effect).\r
+ -->\r
+ <ItemDefinitionGroup>\r
+ <ClCompile>\r
+ <!-- Set this to "Default" (which means not passing any /RTC option) so that any other value will\r
+ be treated as having been overridden by the user. This Serves as a hint to the user that\r
+ Default is the value we support, and other values will generate a warning. It also means\r
+ that if the user simply creates a new project in MSVC (which uses /RTCu by default), then\r
+ switches the toolset to Clang, we will still treat the value as default (which for us is to\r
+ not pass the option). Only if the user explicitly overrode this setting in a project to use\r
+ /RTCu would we see the warning. -->\r
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>\r
+\r
+ <AdditionalOptions>-m$(PlatformArchitecture) %(AdditionalOptions)</AdditionalOptions>\r
+ </ClCompile>\r
+ </ItemDefinitionGroup>\r
+</Project>\r
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(VCTargetsPath)\Microsoft.CppCommon.targets" />
-
- <PropertyGroup>
- <!-- Set the path to clang-cl executable based on the value of the project-
- level setting. This has to be done in the .targets file since values
- selected via the settings UI appear in the vcxproj (which is imported
- before the targets file but after the props file) and we need the path
- that the user may have overridden in the UI. -->
- <CLToolExe>$(ClangClExecutable)</CLToolExe>
- </PropertyGroup>
-
- <ItemGroup>
- <PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\llvm-general.xml">
- <Context>Project</Context>
- </PropertyPageSchema>
- </ItemGroup>
-
- <!-- We hook up a target to run every time ClCompile is about to run, the
- purpose of which is to sanitize the command line before it gets passed to
- the compiler. Some options we silently discard, other options we warn on
- and then discard, and other options we generate a hard error.
-
- We try to keep hard errors to a minimum and reserve it for cases where
- the option implies fundamentally different assumptions about the way code
- should be compiled. This code would probably generate an error anyway,
- but at least this way we give the user a more useful message about what
- the actual problem is, rather than relying on some obscure compilation
- error.
-
- For any options that clang-cl discards, we would prefer to not even pass
- them in on the command line. So if a user starts with a cl projects and
- changes the toolset to clang, they could have set options such as /Gm
- (minimal rebuild), /sdl (Security Checks), etc. The ClCompile task would
- then notice this and pass these through to clang-cl.exe. Clang would of
- course ignore them, but in some cases (such as /Gm), they would generate
- -Wunused-command-line-argument warnings, so it's better if we can just
- strip them from the command line entirely. This also has the side
- benefit of making command lines shorter which is always nice when trying
- to look at the tool output.
- -->
- <Target Name="BeforeClCompile" BeforeTargets="ClCompile">
- <!-- Warn on /ZI, then map to /Z7. /Zi is mapped to /Z7 below too (see comment there), but don't warn on that. -->
- <Warning Condition="'%(ClCompile.DebugInformationFormat)' == 'EditAndContinue'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support /ZI (Program Database for Edit and Continue). The file will be compiled as if /Z7 (C7 Compatible Debug Info) had been passed. Update the Debug Information Format in project settings to silence this warning."/>
-
- <!-- Warn if Fiber Safe Optimizations are enabled, and then ignore them. -->
- <Warning Condition="'%(ClCompile.EnableFiberSafeOptimizations)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support fiber safe optimizations (/GT). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if Whole Program Optimization is enabled, and then ignore it. -->
- <Warning Condition="'%(ClCompile.WholeProgramOptimization)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support MSVC Link Time Optimization. Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if Smaller Type Check is enabled, then ignore it.-->
- <Warning Condition="'%(ClCompile.SmallerTypeCheck)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support Smaller Type Check (/RTCc). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if Runtime Checks are enabled, then ignore them.-->
- <Warning Condition="'%(ClCompile.BasicRuntimeChecks)' != 'Default'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support Basic Runtime Checks (/RTCu, /RTC1, /RTCs). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if parallel code generation on #pragma loop is enabled, then ignore. -->
- <Warning Condition="'(ClCompile.EnableParallelCodeGeneration)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support parallel code generation with #pragma loop(hint) (/Qpar). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if hotpatchable images are turned on -->
- <Warning Condition="'%(ClCompile.CreateHotpatchableImage)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support creating hotpatchable images (/hotpatch). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if /Zc:forScope- is specified, and then ignore it. -->
- <Warning Condition="'%(ClCompile.ForceConformanceInForLoopScope)' == 'false'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support disabling for loop scope conformance (/Zc:forScope-). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if /Zc:wchar_t- is specified, and then ignore it. -->
- <Warning Condition="'%(ClCompile.TreatWChar_tAsBuiltInType)' == 'false'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support treating wchar_t as a non builtin type (/Zc:wchar_t-). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if XML Documentation is generated, and then ignore it. -->
- <Warning Condition="'%(ClCompile.GenerateXMLDocumentationFiles)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support generating xml documentation comment files (/doc). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if Browse Information is generated, and then ignore it. -->
- <Warning Condition="'%(ClCompile.BrowseInformation)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support generating browse information (/FR). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Warn if /analyze is passed, then ignore it. -->
- <Warning Condition="'%(ClCompile.EnablePREfast)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support MSVC code analysis functionality (/analyze). Disable this option in compatibility settings to silence this warning."/>
-
- <!-- Error if they're trying to compile this file as managed code. -->
- <Error Condition="('%(ClCompile.CompileAsManaged)' != 'false') AND ('%(ClCompile.CompileAsManaged)' != '')"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support compiling managed code (/clr). This file cannot be compiled."/>
-
- <!-- Error if WinRT is being used. -->
- <Error Condition="('%(ClCompile.CompileAsWinRT)' == 'true') OR ('%(ClCompile.WinRTNoStdLib)' == 'true')"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support Windows Runtime Language Extensions (/ZW, /ZW:nostdlib). This file cannot be compiled."/>
-
- <!-- Error if OpenMP language extensions are enabled. -->
- <Error Condition="'%(ClCompile.OpenMPSupport)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support OpenMP (/openmp). This file cannot be compiled."/>
-
- <!-- Error if C++ Modules are enabled. Clang has its own notion of modules that are not compatible. -->
- <Error Condition="'%(ClCompile.EnableModules)' == 'true'"
- File="@(ClCompile)(0,0)"
- Text="clang-cl does not support MSVC Modules (/experimental:module). This file cannot be compiled."/>
-
- <ItemGroup>
- <ClCompile>
- <!-- Map /ZI and /Zi to /Z7. Clang internally does this, so if we were
- to just pass the option through, clang would work. The problem is
- that MSBuild would not. MSBuild detects /ZI and /Zi and then
- assumes (rightly) that there will be a compiler-generated PDB (e.g.
- vc141.pdb). Since clang-cl will not emit this, MSBuild will always
- think that the compiler-generated PDB needs to be re-generated from
- scratch and trigger a full build. The way to avoid this is to
- always give MSBuild accurate information about how we plan to
- generate debug info (which is to always using /Z7 semantics).
- -->
- <DebugInformationFormat Condition="'%(ClCompile.DebugInformationFormat)' == 'ProgramDatabase'">OldStyle</DebugInformationFormat>
- <DebugInformationFormat Condition="'%(ClCompile.DebugInformationFormat)' == 'EditAndContinue'">OldStyle</DebugInformationFormat>
-
- <!-- Unset any options that we either silently ignore or warn about due to compatibility.
- Generally when an option is set to no value, that means "Don't pass an option to the
- compiler at all."
- -->
- <WholeProgramOptimization/>
- <EnableFiberSafeOptimizations/>
- <IgnoreStandardIncludePath/>
- <EnableParallelCodeGeneration/>
- <ForceConformanceInForLoopScope/>
- <TreatWChar_tAsBuiltInType/>
- <SDLCheck/>
- <GenerateXMLDocumentationFiles/>
- <BrowseInformation/>
- <EnablePREfast/>
- <MinimalRebuild/>
- <StringPooling/>
- <ExpandAttributedSource/>
- <EnforceTypeConversionRules/>
- <ErrorReporting/>
- <DisableLanguageExtensions/>
- <ProgramDataBaseFileName/>
- <DisableSpecificWarnings/>
- <TreatSpecificWarningsAsErrors/>
- <ForcedUsingFiles/>
- <PREfastLog/>
- <PREfastAdditionalOptions/>
- <PREfastAdditionalPlugins/>
- <MultiProcessorCompilation/>
- <UseFullPaths/>
- <RemoveUnreferencedCodeData/>
-
- <!-- We can't just unset BasicRuntimeChecks, as that will pass /RTCu to the compiler.
- We have to explicitly set it to 'Default' to avoid passing anything. -->
- <BasicRuntimeChecks>Default</BasicRuntimeChecks>
- </ClCompile>
- </ItemGroup>
- </Target>
-
-</Project>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <Import Project="$(VCTargetsPath)\Microsoft.CppCommon.targets" />\r
+\r
+ <PropertyGroup>\r
+ <!-- Set the path to clang-cl executable based on the value of the project-\r
+ level setting. This has to be done in the .targets file since values\r
+ selected via the settings UI appear in the vcxproj (which is imported\r
+ before the targets file but after the props file) and we need the path\r
+ that the user may have overridden in the UI. -->\r
+ <CLToolExe>$(ClangClExecutable)</CLToolExe>\r
+ </PropertyGroup>\r
+\r
+ <ItemGroup>\r
+ <PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\llvm-general.xml">\r
+ <Context>Project</Context>\r
+ </PropertyPageSchema>\r
+ </ItemGroup>\r
+\r
+ <!-- We hook up a target to run every time ClCompile is about to run, the\r
+ purpose of which is to sanitize the command line before it gets passed to\r
+ the compiler. Some options we silently discard, other options we warn on\r
+ and then discard, and other options we generate a hard error.\r
+\r
+ We try to keep hard errors to a minimum and reserve it for cases where\r
+ the option implies fundamentally different assumptions about the way code\r
+ should be compiled. This code would probably generate an error anyway,\r
+ but at least this way we give the user a more useful message about what\r
+ the actual problem is, rather than relying on some obscure compilation\r
+ error.\r
+\r
+ For any options that clang-cl discards, we would prefer to not even pass\r
+ them in on the command line. So if a user starts with a cl projects and\r
+ changes the toolset to clang, they could have set options such as /Gm\r
+ (minimal rebuild), /sdl (Security Checks), etc. The ClCompile task would\r
+ then notice this and pass these through to clang-cl.exe. Clang would of\r
+ course ignore them, but in some cases (such as /Gm), they would generate\r
+ -Wunused-command-line-argument warnings, so it's better if we can just\r
+ strip them from the command line entirely. This also has the side\r
+ benefit of making command lines shorter which is always nice when trying\r
+ to look at the tool output.\r
+ -->\r
+ <Target Name="BeforeClCompile" BeforeTargets="ClCompile">\r
+ <!-- Warn on /ZI, then map to /Z7. /Zi is mapped to /Z7 below too (see comment there), but don't warn on that. -->\r
+ <Warning Condition="'%(ClCompile.DebugInformationFormat)' == 'EditAndContinue'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support /ZI (Program Database for Edit and Continue). The file will be compiled as if /Z7 (C7 Compatible Debug Info) had been passed. Update the Debug Information Format in project settings to silence this warning."/>\r
+\r
+ <!-- Warn if Fiber Safe Optimizations are enabled, and then ignore them. -->\r
+ <Warning Condition="'%(ClCompile.EnableFiberSafeOptimizations)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support fiber safe optimizations (/GT). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if Whole Program Optimization is enabled, and then ignore it. -->\r
+ <Warning Condition="'%(ClCompile.WholeProgramOptimization)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support MSVC Link Time Optimization. Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if Smaller Type Check is enabled, then ignore it.-->\r
+ <Warning Condition="'%(ClCompile.SmallerTypeCheck)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support Smaller Type Check (/RTCc). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if Runtime Checks are enabled, then ignore them.-->\r
+ <Warning Condition="'%(ClCompile.BasicRuntimeChecks)' != 'Default'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support Basic Runtime Checks (/RTCu, /RTC1, /RTCs). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if parallel code generation on #pragma loop is enabled, then ignore. -->\r
+ <Warning Condition="'(ClCompile.EnableParallelCodeGeneration)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support parallel code generation with #pragma loop(hint) (/Qpar). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if hotpatchable images are turned on -->\r
+ <Warning Condition="'%(ClCompile.CreateHotpatchableImage)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support creating hotpatchable images (/hotpatch). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if /Zc:forScope- is specified, and then ignore it. -->\r
+ <Warning Condition="'%(ClCompile.ForceConformanceInForLoopScope)' == 'false'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support disabling for loop scope conformance (/Zc:forScope-). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if /Zc:wchar_t- is specified, and then ignore it. -->\r
+ <Warning Condition="'%(ClCompile.TreatWChar_tAsBuiltInType)' == 'false'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support treating wchar_t as a non builtin type (/Zc:wchar_t-). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if XML Documentation is generated, and then ignore it. -->\r
+ <Warning Condition="'%(ClCompile.GenerateXMLDocumentationFiles)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support generating xml documentation comment files (/doc). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if Browse Information is generated, and then ignore it. -->\r
+ <Warning Condition="'%(ClCompile.BrowseInformation)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support generating browse information (/FR). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Warn if /analyze is passed, then ignore it. -->\r
+ <Warning Condition="'%(ClCompile.EnablePREfast)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support MSVC code analysis functionality (/analyze). Disable this option in compatibility settings to silence this warning."/>\r
+\r
+ <!-- Error if they're trying to compile this file as managed code. -->\r
+ <Error Condition="('%(ClCompile.CompileAsManaged)' != 'false') AND ('%(ClCompile.CompileAsManaged)' != '')"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support compiling managed code (/clr). This file cannot be compiled."/>\r
+\r
+ <!-- Error if WinRT is being used. -->\r
+ <Error Condition="('%(ClCompile.CompileAsWinRT)' == 'true') OR ('%(ClCompile.WinRTNoStdLib)' == 'true')"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support Windows Runtime Language Extensions (/ZW, /ZW:nostdlib). This file cannot be compiled."/>\r
+\r
+ <!-- Error if OpenMP language extensions are enabled. -->\r
+ <Error Condition="'%(ClCompile.OpenMPSupport)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support OpenMP (/openmp). This file cannot be compiled."/>\r
+\r
+ <!-- Error if C++ Modules are enabled. Clang has its own notion of modules that are not compatible. -->\r
+ <Error Condition="'%(ClCompile.EnableModules)' == 'true'"\r
+ File="@(ClCompile)(0,0)"\r
+ Text="clang-cl does not support MSVC Modules (/experimental:module). This file cannot be compiled."/>\r
+\r
+ <ItemGroup>\r
+ <ClCompile>\r
+ <!-- Map /ZI and /Zi to /Z7. Clang internally does this, so if we were\r
+ to just pass the option through, clang would work. The problem is\r
+ that MSBuild would not. MSBuild detects /ZI and /Zi and then\r
+ assumes (rightly) that there will be a compiler-generated PDB (e.g.\r
+ vc141.pdb). Since clang-cl will not emit this, MSBuild will always\r
+ think that the compiler-generated PDB needs to be re-generated from\r
+ scratch and trigger a full build. The way to avoid this is to\r
+ always give MSBuild accurate information about how we plan to\r
+ generate debug info (which is to always using /Z7 semantics).\r
+ -->\r
+ <DebugInformationFormat Condition="'%(ClCompile.DebugInformationFormat)' == 'ProgramDatabase'">OldStyle</DebugInformationFormat>\r
+ <DebugInformationFormat Condition="'%(ClCompile.DebugInformationFormat)' == 'EditAndContinue'">OldStyle</DebugInformationFormat>\r
+\r
+ <!-- Unset any options that we either silently ignore or warn about due to compatibility.\r
+ Generally when an option is set to no value, that means "Don't pass an option to the\r
+ compiler at all."\r
+ -->\r
+ <WholeProgramOptimization/>\r
+ <EnableFiberSafeOptimizations/>\r
+ <IgnoreStandardIncludePath/>\r
+ <EnableParallelCodeGeneration/>\r
+ <ForceConformanceInForLoopScope/>\r
+ <TreatWChar_tAsBuiltInType/>\r
+ <SDLCheck/>\r
+ <GenerateXMLDocumentationFiles/>\r
+ <BrowseInformation/>\r
+ <EnablePREfast/>\r
+ <MinimalRebuild/>\r
+ <StringPooling/>\r
+ <ExpandAttributedSource/>\r
+ <EnforceTypeConversionRules/>\r
+ <ErrorReporting/>\r
+ <DisableLanguageExtensions/>\r
+ <ProgramDataBaseFileName/>\r
+ <DisableSpecificWarnings/>\r
+ <TreatSpecificWarningsAsErrors/>\r
+ <ForcedUsingFiles/>\r
+ <PREfastLog/>\r
+ <PREfastAdditionalOptions/>\r
+ <PREfastAdditionalPlugins/>\r
+ <MultiProcessorCompilation/>\r
+ <UseFullPaths/>\r
+ <RemoveUnreferencedCodeData/>\r
+\r
+ <!-- We can't just unset BasicRuntimeChecks, as that will pass /RTCu to the compiler.\r
+ We have to explicitly set it to 'Default' to avoid passing anything. -->\r
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>\r
+ </ClCompile>\r
+ </ItemGroup>\r
+ </Target>\r
+\r
+</Project>\r