Solution-wide #define

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.


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


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