msbuild, defining Conditional Compilation Symbols
.NetMsbuildCompiler Options.Net Problem Overview
I'm possibly just blind, but is there a command line to specify conditional compilation symbols in MSBUILD?
I currently have this Line in my buildscript:
SET MSBUILD=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
SET CONFIG=Debug
%MSBUILD% /p:Configuration=%CONFIG% /p:OutputPath=..\..\output source\MyProject\MyProject.csproj
And I'd like to add a condition. In Visual Studio, i can just go into Project Properties => Build => Conditional compilation symbols, but I have not seen that option for msbuild?
Bonus Karma if you know if I can completely override all symbols already specified in the .csproj files to make sure that only the conditionals from my Buildscript go in.
.Net Solutions
Solution 1 - .Net
Have you seen this? (most info is in the penultimate post)
/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"
Solution 2 - .Net
I had to use a space instead of a semicolon a la this post by Björn Lasar: http://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx
Update: the blog has disappeared; retrieved via Internet Archive:
> Recently I had to use MSBuild directly to automate some builds. I also had to configure some preprocessor defines based upon a configuration. This is usually done by an Argument like this
"/p:DefineConstants=MY_PREPROC_FLAG"
> Nothing special here since there are enough comments on the web about that. Today I needed one Flag more and I used the commandline syntax similar to how I knew it from the IDE:
"/p:DefineConstants=MY_PREPROC_FLAG;YET_ANOTHER_FLAG"
> but this one didn't work.
>So the point is that if you want to support multiple defines to a project by commandline you'll have to separate them by simple spaces...
"/p:DefineConstants=MY_PREPROC_FLAG YET_ANOTHER_FLAG"
>and it will be added to the (semicolon-separated) Defines from the IDE. Good to know I think...
Solution 3 - .Net
/p:DefineConstants
is an all or nothing deal.
If you just want to turn off trace symbol, you can't just do it with: msbuild /p:DefineTrace=false
You have to define something to override all the symbols already defined: msbuild /p:DefineConstants="RANDOM-SYMBOL"
Thanks Michael Stum point this hidden rule out I have also wrote a blog about it --- dead link
Solution 4 - .Net
What is said in the answers is valid for C#
code, and also for ASP.NET "codebehind" C# code. For ASP.NET web projects, if you want to do conditional compilation in the ASPX pages as well, it works a bit differently to conditionally render HTML on the page (note I've removed MasterPageFile="..." AutoEventWireup="true" CodeBehind="..." Inherits="..."
which you usually have in the <%@ ... %>
declaration as well):
<%@ Page Title="MyPage" Language="C#" CompilerOptions="/d:DebugSym1;DebugSym2" %>
<% #if DebugSym1 %>
<h4>Section1</h4>
<% #else %>
<h4>(Section 1 skipped)</h4>
<% #endif %>
<% #if DebugSym2 %>
<h4>Section2</h4>
<% #else %>
<h4>(Section 2 skipped)</h4>
<% #endif %>
If you remove DebugSym1
or DebugSym2
from the CompilerOptions
, then the #else
part of the relevant #if
statement is rendered.
I thought this was worth mentioning for completeness of this topic and can save you time. More you can find in this article, if you're interested.