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.
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.