Solution Build Environment 1.30

An Add-in for Visual Studio 2008/2005/2003/2002

November 4, 2008

http://wwhiz.com/OtherAddins.html

Introduction

The Solution Build Environment add-in uses a new file called SolutionName.slnenv residing in the same directory as the solution to provide build environment variables tailored to a given solution file. .slnenv stands for "solution environment." The Solution Build Environment add-in executes this file at solution open time and before the start of each build, resetting the build's environment variables accordingly.

New versions of the Solution Build Environment add-in may be found on http://wwhiz.com/ in the Other Addins section.

Usage

Inside the SolutionName.slnenv file, with one entry per line, are environmentvariablename=value entries.

MYPATH=c:\Src\MyDirectory\Include
EXTRA_OPTS=/D MY_DEFINE

The solution's path is available via a variable called $(SolutionDir). The solution directory does not contain a terminating backslash.

SOLPATH=$(SolutionDir)\Include

The solution's name is available through $(SolutionName).

SOLNAME=$(SolutionName)\Include

A special form of assignment is available through the ?= operator.  An assignment is only made if the environment variable does not already exist.

-- Only assign if PATH does not already exist.
PATH ?= c:\windows

Some software packages don't handle relative paths very well.  The Solution Build Environment add-in has a special symbol for expanding relative paths into an absolute form.  The absolute expansion of the path is triggered by inserting an exclamation point at the beginning of the line.

RELPATH=c:\Windows\System32\..
!ABSPATH=$(RELPATH)  # c:\Windows

Environment variables may be inserted using the $(EnvironmentVariableName) syntax. This has the same functionality as a batch file's %EnvironmentVariableName% substitution syntax but more closely mirrors Visual Studio's syntax for accessing environment variables.

PATH=$(PATH);c:\Tools;$(MYPATH)\..\Bin

Simple registry entries may be accessed via %(HKLM\Path\Key) or %(HKCU\Path\Key), where HKLM accesses HKEY_LOCAL_MACHINE and HKCU accesses HKEY_CURRENT_USER. Only string values may be retrieved.

MYPATH=%(HKLM\Software\MySoftware\Path)

An environment variable may be applied onto a specific Solution Configuration. The syntax for this is ConfigurationName:Name=Value.

Debug:PATH=$(PATH);%(HKLM\Software\MySoftware\DebugPath)
Release:PATH=$(PATH);%(HKLM\Software\MySoftware\DebugPath)

Other .slnenv files may be included using the include or forceinclude keywords. The filename following each keyword should not contain the .slnenv extension.

include $(HOMEDRIVE)$(HOMEPATH)\MyPersonalDefinitions
forceinclude ..\..\MandatoryDefinitions

Comments are specified by using -- or // or #.

-- This is a comment.
// This is a comment.
Key=Value # This is a comment

Example

Assume you are building a DirectX application called Game, but the DirectX include directory is not at the same location across different machines. (Normally, the DirectX include directory is global, but this may not always be the case.) This is a good example of creating a per user .slnenv file. First, we put a Game.slnenv file in the same directory as Game.sln.

-- Provide a reasonable default.
DXPATH=c:\dxsdk

-- Call the user .slnenv file so it can override.  We don't use forceinclude so this is optional.
include $(HOMEDRIVE)$(HOMEPATH)\UserDXPath

-- Now, build the compile options.
COMPILE_OPTS=/I "$(DXPATH)\Include"

The UserDXPath.slnenv file may look like this:

-- The DirectX SDK is actually at the d:\Program Files\DXSDK directory.
DXPATH=d:\Program Files\DXSDK

When the Game.sln file is run, the environment variable DXPATH is available to it via $(DXPATH) and COMPILE_OPTS is available via $(COMPILE_OPTS). If $(COMPILE_OPTS) is inserted into the Command-Line Options property page, the build uses your DirectX directory.

Technical Details

Solution Build Environment was written in C++ with ATL support for the add-in. It demonstrates the use of patching into the Solution Events and Build Events objects. It also demonstrates additional code that may be inserted into DllRegisterServer() and DllUnregisterServer() that install and uninstall the add-in registry entries without additional install scripts.

The build environment technique works because add-ins run in the same process space as Visual Studio's devenv.exe. Builds launched from the IDE inherit the environment of devenv.exe. Calling the Win32 SetEnvironmentVariable() function call allows manipulation of the IDE environment. Previous to setting the new environment variable, the old one is retrieved using GetEnvironmentVariable() and stored, allowing each solution session to work in a pristine environment.

The only strange part of the environment variable registration process occurs when an environment variable is used for the Output or Intermediate directory. Even though Solution Build Environment reconfigures the environment per solution configuration at build time, the Output and Intermediate directories are resolved by Visual Studio .NET once at solution open time. Solution Build Environment compensates for that by reading the .slnenv file at solution open time, too.

Applying the .slnenv file at solution open time also has benefit when modifying a setting such as the PATH. The new PATH will be available through the entire session, including when the solution is run.

Known Bugs

Thanks

Thanks to Carter L. Smithhart for the recent fixes to 1.10.

License

Copyright (C) 2000-2008 Joshua C. Jensen

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

History

Conclusion

I hope the Solution Build Environment add-in will be useful to you. If you have comments or find a bugs, please report them here or via email at 'jjensen@workspacewhiz.com'.

Thanks,

Joshua Jensen
Author, Solution Build Environment Add-in
http://workspacewhiz.com/