I’m trying to build my vcxproj with different properties through command line base on MSBuild. I tested WarningLevel property since it is on MSDN MSBuild introduction page.
My project originally sets WarningLevel as 3. I kicked off:
msbuild myproj.vcxproj /p:Configuration=Debug /p:Platform=Win32 /p:WarningLevel=4;OutDir=testDebug
I checked tracker log to see what the executing command is, it turned out “/W3” is still there other than “/W4” as expected. However, “OutDir” was set correctly and I could find target files in binDebug directory.
Is there anything incorrect I did with WarningLevel? How to override properties correctly? Please teach me the right way, I will be fully grateful.
Regards,
SL
This is in essence a duplicate of this question, but that one is for adding items to the list of PreProcessorDefinitions which is not exactly the same as overriding WarningLevel, which can only have one value. So here it goes: WarningLevel isn’t a global property, like OutDir, but it’s part of the ClCompile ItemDefinitionGroup so you cannot set it directly. It looks somewhat like this in the project file:
<PropertyGroup>
<!-- global property, can be overridden on commandline -->
<OutDir>$(ProjectDir)$(Configuration)$(Platform)</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<!-- not a global property -->
<WarningLevel>Level4</WarningLevel>
</ClCompile>
<ItemDefinitionGroup>
Two ways to deal with this, see answers for the linked question:
First option is to set the WarningLevel to another property which you then define on the commandline. Go to Project Properties->Configuration Properties->C/C++->General->Warning Level and enter $(MyWarningLevel). In the project file, this looks like
<ItemDefinitionGroup>
<ClCompile>
<!-- gets it's value from a global property now -->
<WarningLevel>$(MyWarningLevel)</WarningLevel>
</ClCompile>
<ItemDefinitionGroup>
and it’s set using msbuild myproj.vcxproj /p:MyWarningLevel=Level3
. If not set explicitly the default value will be used.
Second option is to use one of the msbuild/C++ extension points. Create a file named override.props or so containing
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup $(PUT_IN_YOUR_CONDITION)>
<ClCompile>
<WarningLevel>Level4</WarningLevel>
</ClCompile>
</ItemDefinitionGroup>
</Project>
and have msbuild pick it up with msbuild myproj.vcxproj /p:ForceImportBeforeCppTargets=/path/to/override.props
2