Solution-wide #define

Is there a way to globally declare a #define?

Like I want to have a file that has for instance,

#define MONO

and I want all source-code files to know that this pre-processor directive is defined. How would I achieve that?


Update: You cannot do a "solution-wide" define afaik, however the answer below is workable on a per-project basis.

You set them in your Compilation Properties or Build options:

http://msdn.microsoft.com/en-US/library/76zdzba1(v=VS.80).aspx (VS2008) http://msdn.microsoft.com/en-US/library/76zdzba1(v=VS.100).aspx (VS2010)

see the "To set a custom constant" heading.

Update

Microsoft Documentation on Build Options

You get to the build options by right-clicking the project and selecting properties from the menu.

Project Build Options


I know solution for C# projects (I don't tested it for any other projects)

For example you have:

Project1\
Project2\
Solution1\Solution1.sln
Solution2\Solution2.sln

Create SolutionDefines.targets file in solution directory

Project1\
Project2\
Solution1\Solution1.sln
Solution1\SolutionDefines.targets
Solution2\Solution2.sln
Solution2\SolutionDefines.targets
Solution3\Solution2.sln
Solution3\|no target file|

in each project file add:

<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />

In Solution1\SolutionDefines.targets add:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);TRACING_BUILD</DefineConstants>
    </PropertyGroup>
</Project>

In Solution2\SolutionDefines.targets add:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);ANOTHER_DEFINE</DefineConstants>
    </PropertyGroup>
</Project>

In this case you have:

For Solution1 - all projects have TRACING_BUILD define added

For Solution2 - all projects have ANOTHER_DEFINE define added

For Solution3 - all projects - no defines added

In this approach you must store all solutions with solution wide defines in separate directories


Years later, and similar to Alexei's answer but supported innately

One can make a Directory.Build.props similar to a NuGet.Config file as per

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

Ours looks like:

<Project>
    <PropertyGroup>
        <DefineConstants>RC_427</DefineConstants>
    </PropertyGroup>
</Project>

And it effectively includes this into all CSPROJ files in your SLN. For some reason that particular solution is insanely hard to find via google. Been around since MSBuild 15


I don't think there is a way to create a solution-wide #define. You can create one for each project/assembly, as the other answers have described, but you'll need to do this for each and every project in the solution if you need all source code files to know of that #define.


There is one more workaround, correct me if i'm wrong:

For example, ProjectA references ProjectB, and ProjectsCommon contains base static variable. Both projects refernece ProjectsCommon.

Code in ProjectsCommon:

[assembly: InternalsVisibleTo("ProjectA")]

------------------------------------------

public class ConditionVariables
{
    public static bool IsABC { get; internal set; } = false;
}

Code in ProjectA:

#if ABC
    ProjectsCommon.ConditionVariables.IsABC = true;
#endif

Code in ProjectB:

if (ProjectsCommon.ConditionVariables.IsABC )
{
    // first scenario
}
else
{
    // second one
}

However, code in ProjectA should run first. This is probably good when ProjectA is a bootstarapper project.