2

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=test\Debug

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 bin\Debug 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

ZDunker
  • 437
  • 1
  • 6
  • 18

1 Answers1

3

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

Community
  • 1
  • 1
stijn
  • 34,664
  • 13
  • 111
  • 163
  • Thank you, the second is what I'm looking for. I'm trying to automate build process with MSBuild. With your second suggestion, I could create a template for massive projects. I will give it a shot later when I got home. – ZDunker Aug 11 '16 at 22:15
  • 1
    It turns out working pretty well, I will use this template property sheet for all my projects. Just in case someone else come to this thread later and want to try the property sheet way, there's one thing you need to notice. I think you have to target your configuration as a in-liner as condition after ItemDefinitionGroup. For example, if you want to apply these settings to your Debug|Win32 configuration, you have to edit the line as – ZDunker Aug 12 '16 at 00:08