views:

7243

answers:

4

Hello

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

+3  A: 

Hello,

I think I have the same goal than you: I want to use environment variables to locate some projects in a solution file (.sln) and to use some environment variables to locate some files within my projects.

I found a way to do that and it works fine for me (with Visual Studio 2005): - edit the .sln file with a text editor and use environment variables with the following syntax %MyEnvironmentVariable% - edit the .vcproj files and replace the path to the desired files with some variables, with the following syntax $(MyEnvironmentVariable).

Hope it helps... Cyrille

+1  A: 

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.
Dani van der Meer
A: 

(a) Cyrille gives a decent solution to what you asked for. Another way is to keep your changeable settings in one common place. Note that this won't work for non-msbuild files like *.sln and *.vcproj (until VS 2010).

Project files: ... $(ChangeableDir)\foo.cs

Common.targets: ChangeThis ...

However, I don't think this is a great way to do things. If the differences between what you're building are large pieces of functionality, you should consider creating a branch in your source control system. OTOH, if the differences are minor -- eg hardcoded strings -- then this leads to your second question...

(b) The kind of resource management you describe is essentially the same problem faced by people localizing their project into different languages. Luckily, direct support is built into Visual Studio since 2005. Check out previous questions like: http://stackoverflow.com/questions/355685/localization-in-visual-studio-2008

Richard Berg
+2  A: 

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

Rom