Macros/Environment variable in .sln and .vcproj files for Visual studio

46,189

Solution 1

Just use the environment variable in the relevant field:

OutputDirectory="$(MyEnvVariableName)\Bin"

One trick is that you need to restart the Visual Studio IDE each time you change the variable.

There is an MSDN article precisely about this: How to: Use Environment Variables in a Build

Solution 2

The best way to achieve what you describe in b) is to use property sheets. Check out also this very similar question.

I found some promising info on property sheets, but Visual studio doesn't expand macros when I am using them in File tag in the .vcproj.

I am not sure what version of VS you use. VS2008 lets you define for example an include directory like this: "$(OpenCVInclude)\cxcore\include". I use it all the time. OpenCVInclude is a macro defined in a property sheet.

As for question a), I think there is no "clean" way to do what you want. As an alternative you could the configuration manager:

  • Include all the projects in the solution.
  • Name the project differently, for example based on the OEM.
  • For each project define release and debug configurations in the solution
  • In "Build->Configuration Manager" You can check or uncheck the "Build" column for each configuration. Check "build" for the relevant project.

Solution 3

I am not sure if you are building just C++ projects or if you are also building C#\VB projects, but one of the great things about Visual Studio is all of the projects are really just MSBuild projects. If you edit a project in a text editor you will see that at the end of the project it imports a .targets file. If you track down and find follow the imports you will find that almost all of the VS projects import Microsoft.Common.Targets. Microsoft.Common.Targets imports Custom.Before.Microsoft.Common.Targets. Using this import you can import your own targets file with your own custom actions.

I for example have a target file that has a common property defined across all projects in a solution and a custom post build event that processes at the end of each project building.

Using this extension method and by creating custom configurations in the solution besides just the standard release\debug, you should be able to create as complex of a build configuration as you need.

Share:
46,189
Admin
Author by

Admin

Updated on July 15, 2021

Comments

  • Admin
    Admin almost 3 years

    I have two similar problems:

    a) I have a solution which includes several projects and I want to be able easily switch project location by setting some environment variable/macro. As example this project can be located in \SolutionDir\Dir1\ or \SolutionDir\Dir2\ So, I want to specify that it should be located in \SolutionDir\$(Var) and just set the variable.

    Is there any build in Visual Studio way to do it?

    I know currently only two solutions - edit .sln file manual/programmatically to find this project and set correct path.

    I wasn't able to use environment variable in .sln file.

    b) I have a project which includes resources (.rc and .h) files. I want to be able to set their location through other environment variable or macro.

    Something like \ProjectDir\$(Var2)\resource.rc

    I found some promising info on property sheets, but Visual studio doesn't expand macros when I am using them in File tag in the .vcproj.

    Thank you for any ideas how to solve this problem.

    Regards, Victor