In a C++ file, I have a code like this:
#if ACTIVATE
# pragma message( "Activated" )
#else
# pragma message( "Not Activated")
#endif
I want to set this ACTIVE define to 1 with the msbuild command line.
It tried this but it doesn't work:
msbuild /p:DefineConstants="ACTIVATE=1"
Any idea?
I'm a little late to the party (only 4 years or so), but I just had to workaround this problem on a project, and stumbled across this question while searching for a fix. Our solution was to use an environment variable with /D
defines in it, combined with the Additional Options box in visual studio.
$(ExternalCompilerOptions)
, to the Additional Options under project options->C/C++->Command Line (remember both Debug and Release configs)/D
compiler option to define your macros c:\> set ExternalCompilerOptions=/DFOO /DBAR
c:\> msbuild
Item #1 ends up looking like this in the vcxproj file:
<ClCompile>
<AdditionalOptions>$(ExternalCompilerOptions) ... </AdditionalOptions>
</ClCompile>
This works for me with VS 2010. We drive msbuild from various build scripts, so the environment variable ugliness is hidden a bit. Note that I have not tested if this works when you need to set the define to specific value ( /DACTIVATE=1
). I think it would work, but I'm concerned about having multiple '='s in there.
H^2
C++ projects (and solutions) are not (yet ?) integrated in the MSBuild environment. As part of the build process, the VCBuild task is called, which is just a wrapper around vcbuild.exe.
You could :
ACTIVATE=1
would be defined, and compile it with devenv.exe (with the /ProjectConfig switch).Note that your solution would not work for C# projects either unless you tweaked your project files a bit. For reference, here is how I would do this :
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
:<PropertyGroup Condition=" '$(MyConstants)' != '' "> <DefineConstants>$(DefineConstants);$(MyConstants)</DefineConstants> </PropertyGroup>
msbuild /p:MyConstants="ACTIVATE=1"
If you need to define some constant (not just true
/false
), you can do it the following way:
On command line:
MSBuild /p:MyDefine=MyValue
In vcxproj file (in section <ClCompile>
; and/or <ResourceCompile>
, depending on where you need it):
<PreprocessorDefinitions>MY_DEFINE=$(MyDefine);$(PreprocessorDefinitions)</PreprocessorDefinitions>
Note that if you don't specify /p:MyDefine=MyValue
in a call to MSBuild
then empty string will be assigned to MY_DEFINE
macro. If it's OK for you, that's it. If not, keep reading.
How to make a macro undefined if corresponding MSBuild parameter is not specified
To have MY_DEFINE
macro undefined instead of empty string, you can use the following trick:
<ClCompile>
....
<PreprocessorDefinitions>_DEBUG;_CONSOLE;OTHER_UNCONDITIONAL_MACROS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(MyDefine)'!=''">MY_DEFINE=$(MyDefine);%(PreprocessorDefinitions)</PreprocessorDefinitions>
....
</ClCompile>
First PreprocessorDefinitions
defines unconditional macros. Second PreprocessorDefinitions
additionally defines MY_DEFINE
macro when MyDefine
is not empty string. You can test this by placing the following piece of code into your cpp file:
#define STRINGIZE2(x) #x
#define STRINGIZE(x) STRINGIZE2(x)
#ifndef MY_DEFINE
#pragma message("MY_DEFINE is not defined.")
#else
#pragma message("MY_DEFINE is defined to: [" STRINGIZE(MY_DEFINE) "]")
#endif
and running:
> MSBuild SandBox.sln /p:Configuration=Debug /p:MyDefine=test /t:Rebuild
...
MY_DEFINE is defined to: [test]
...
> MSBuild SandBox.sln /p:Configuration=Debug /p:MyDefine= /t:Rebuild
...
MY_DEFINE is not defined.
...
> MSBuild SandBox.sln /p:Configuration=Debug /t:Rebuild
...
MY_DEFINE is not defined.
...
I think you want:
/p:DefineConstants=ACTIVATE
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With