summaryrefslogtreecommitdiff
path: root/tools/msbuild/LLVM.Cpp.Common.targets
diff options
context:
space:
mode:
Diffstat (limited to 'tools/msbuild/LLVM.Cpp.Common.targets')
-rw-r--r--tools/msbuild/LLVM.Cpp.Common.targets184
1 files changed, 184 insertions, 0 deletions
diff --git a/tools/msbuild/LLVM.Cpp.Common.targets b/tools/msbuild/LLVM.Cpp.Common.targets
new file mode 100644
index 00000000000..1edc08d2a32
--- /dev/null
+++ b/tools/msbuild/LLVM.Cpp.Common.targets
@@ -0,0 +1,184 @@
+<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 and /ZI, then map them both to /Z7. -->
+ <Warning Condition="'%(ClCompile.DebugInformationFormat)' == 'ProgramDatabase'"
+ File="@(ClCompile)(0,0)"
+ Text="clang-cl does not support /Zi (Program Database). 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."/>
+ <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 Ignore Standard Include Paths is non-empty, then ignore it. -->
+ <Warning Condition="'%(ClCompile.IgnoreStandardIncludePath)' == 'true'"
+ File="@(ClCompile)(0,0)"
+ Text="clang-cl does not support Ignore Standard Include Path (/X). 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>