Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Visual Studio project properties effectively for multiple projects and configurations

I have always used Visual Studios built in GUI support for configuring my projects, often using property sheets so that several projects will use a common set.

One of my main gripes with this is managing multiple projects, configurations and platforms. If you just do everything with the main GUI (right click the project -> properties) it quickly becomes a mess, difficult to maintain and prone to bugs (like failing to correctly define some macro, or using the wrong runtime library, etc). Dealing with the fact that different people put there dependency libraries in different places (eg mine all live in "C:\Libs\[C,C++]\[lib-name]\") and then often manage the different versions of those libraries differently as well (release, debug, x86, x64, etc) is also a large problem since it vastly complicates the time to set it up on a new system, and then there is issues with version-control and keeping everyone's paths separate...

Property sheets make this a bit better, but I cant have one sheet have separate settings for different configurations and platforms (the drop down boxes a greyed out), resulting in me having many sheets which if inherited in the correct order do what I want ("x86", "x64", "debug", "release", "common", "directories" (deals with the previously mentioned dependency issue by defining user macros like BoostX86LibDir), etc) and if inherited in the wrong order (eg "common" before "x64" and "debug") lead to issues like trying to link an incorrect library version, or incorrectly naming the output...

What I want is a way of dealing with all these scattered dependencies and setting up a set of "rules" which are used by all my projects in the solution, like naming an output library as "mylib-[vc90,vc100]-[x86,x64][-d].lib", without having to do all this for each individual project, configuration and platform combination, and then keep them all correctly in sync.

I am aware of moving to entirely different systems like CMake that create the needed files, however this then complicates things elsewhere by making it so even simple tasks like adding a new file to the project then requires additional changes elsewhere, which is not something I am entirely happy with either, unless there is some with VS2010 integration which can keep track of these sorts of changes.

like image 479
Fire Lancer Avatar asked Aug 17 '10 12:08

Fire Lancer


People also ask

How do I copy properties from one project to another in Visual Studio?

Open the shortcut menu for this item and then choose Add New Project Property Sheet. Specify a name and location. In Property Manager, open the new property sheet and then set the properties you want to include.

How do I use project properties in VS code?

You access project properties by right-clicking the project node in Solution Explorer and choosing Properties, or by typing properties into the search box on the menu bar and choosing Properties Window from the results.

Where are Visual Studio project properties stored?

You'll find the Visual Studio project files in a locale-specific folder under the base directory, %VSINSTALLDIR%MSBuild\Microsoft\VC\<version> . The <version> is specific to the version of Visual Studio. It's v160 for Visual Studio 2019. Properties are also stored in any custom .


2 Answers

I just found out somthing I didnt think was possible (it is not exposed by the GUI) that helps make property sheet far more useful. The "Condition" attribute of many of the tags in the project property files and it can be used in the .props files as well!

I just put together the following as a test and it worked great and did the task of 5 (common,x64,x86,debug,release) separate property sheets!

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">   <PropertyGroup Label="UserMacros">     <!--debug suffix-->     <DebugSuffix Condition="'$(Configuration)'=='Debug'">-d</DebugSuffix>     <DebugSuffix Condition="'$(Configuration)'!='Debug'"></DebugSuffix>     <!--platform-->     <ShortPlatform Condition="'$(Platform)' == 'Win32'">x86</ShortPlatform>     <ShortPlatform Condition="'$(Platform)' == 'x64'">x64</ShortPlatform>     <!--toolset-->     <Toolset Condition="'$(PlatformToolset)' == 'v90'">vc90</Toolset>     <Toolset Condition="'$(PlatformToolset)' == 'v100'">vc100</Toolset>   </PropertyGroup>   <!--target-->   <PropertyGroup>     <TargetName>$(ProjectName)-$(Toolset)-$(ShortPlatform)$(DebugSuffix)</TargetName>   </PropertyGroup> </Project> 

Only issue is the properties GUI cant handle it, a project that uses the above property sheet just reports default inherited values like "$(ProjectName)" for the target.

like image 132
Fire Lancer Avatar answered Oct 19 '22 20:10

Fire Lancer


I made some improvements, may be useful for somebody

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">   <PropertyGroup Label="UserMacros">     <!--IsDebug: search for 'Debug' in Configuration-->     <IsDebug>$([System.Convert]::ToString( $([System.Text.RegularExpressions.Regex]::IsMatch($(Configuration), '[Dd]ebug'))))</IsDebug>      <!--ShortPlatform-->     <ShortPlatform Condition="'$(Platform)' == 'Win32'">x86</ShortPlatform>     <ShortPlatform Condition="'$(Platform)' == 'x64'">x64</ShortPlatform>      <!--build parameters-->     <BUILD_DIR>$(registry:HKEY_CURRENT_USER\Software\MyCompany\@BUILD_DIR)</BUILD_DIR>   </PropertyGroup>    <Choose>     <When Condition="$([System.Convert]::ToBoolean($(IsDebug)))">       <!-- debug macroses -->       <PropertyGroup Label="UserMacros">         <MyOutDirBase>Debug</MyOutDirBase>         <DebugSuffix>-d</DebugSuffix>       </PropertyGroup>     </When>     <Otherwise>       <!-- other/release macroses -->       <PropertyGroup Label="UserMacros">         <MyOutDirBase>Release</MyOutDirBase>         <DebugSuffix></DebugSuffix>       </PropertyGroup>     </Otherwise>   </Choose>    <Choose>     <When Condition="Exists($(BUILD_DIR))">       <PropertyGroup Label="UserMacros">         <MyOutDir>$(BUILD_DIR)\Bin\$(MyOutDirBase)_$(ShortPlatform)\</MyOutDir>         <MyIntDir>$(BUILD_DIR)\Build\$(Configuration)_$(ShortPlatform)_$(PlatformToolset)\$(ProjectGuid)\</MyIntDir>       </PropertyGroup>     </When>     <Otherwise>       <PropertyGroup Label="UserMacros">         <MyOutDir>$(SolutionDir)\Bin\$(MyOutDirBase)_$(ShortPlatform)\</MyOutDir>         <MyIntDir>$(SolutionDir)\Build\$(Configuration)_$(ShortPlatform)_$(PlatformToolset)\$(ProjectGuid)\</MyIntDir>       </PropertyGroup>     </Otherwise>   </Choose>    <PropertyGroup>     <OutDir>$(MyOutDir)</OutDir>     <IntDir>$(MyIntDir)</IntDir> <!-- some common for projects     <CharacterSet>Unicode</CharacterSet>     <LinkIncremental>false</LinkIncremental> -->    </PropertyGroup> </Project> 

have fun!

like image 23
lunicon Avatar answered Oct 19 '22 22:10

lunicon