3
votes

I'm programming with Visual C++ Express on the command line using makefiles (GNU Make). For this to work, I have to call the Visual Studio batch file vsvars32.bat to set up the environment. This has to be done everytime I open a new cmd.exe, before using make. When I try to call the batch file from my makefile, it obviously executes the batch file as an own process, because the environment is the same afterwards.

So my question: is there a way to execute scripts in cmd.exe like the built-in source command of the Linux/Unix bash? Apart from installing bash on Windows, of course.

Edit after posting my own answer:

The above question is not quite right, it should be like this:

Is it possible to call an environment-changing batch file from within a makefile, so that the changed environment persists for the other programs called in the makefile?

The answer to the original question is yes: you can use the built-in call command of cmd.exe. But since call is a built-in command and not a real program, it doesn't work in a makefile, only if you call a batch file from another batch file.

6

6 Answers

4
votes

Answer compiled from the previous answers:

I made a batch file called make.bat which contains the following:

call "%VS90COMNTOOLS%vsvars32.bat"
call make.exe %*

This does the job. But calling an environment-changing batch file from within a makefile, so that the changed environment persists for the other programs called in the makefile, seems to be impossible.

Edit: After overflowing my PATH variable by repeatedly calling vsvars32.bat, I made the following changes:

if not "%VISUALCVARS%" == "TRUE" (
set VISUALCVARS=TRUE
call "%VS90COMNTOOLS%vsvars32.bat"
)
call make.exe %*

1
votes

use 'Call':

@echo off
pushd.
call "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars3235.bat"
msbuild LinqSupportClassesSDKBuild.csproj /t:rebuild /p:Configuration=Release /nologo /v:q /clp:ErrorsOnly;
popd

this is the cmd file we use to build our linq provider.

1
votes

At least in my install of Visual Studio (albeit somewhat ancient VS .NET 2003), one of the links in the VS start menu group is to open a cmd.exe instance with the environment already setup. You might find these helpful:

They are more geared toward launching the command prompt from the IDE, but they do include information on launching it with the appropriate environment as well which you may find helpful for your purposes.

1
votes

How do you launch your console? If you are just launching 'cmd' then instead, create a shortcut that executes (%comspec% resolves to c:\windows\cmd.exe or whatever is relevent on your system)

%comspec% /k ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"" x86

Obviously, change the path to point to the proper installation folder. More generally, as the above poster pointed out, if a .cmd file needs to process another .cmd file rather than launch it as a seperate process, use the 'call' batch command.

0
votes

Wrap GNU make in a script (mmake.bat). Put the script in the path somewhere.

The script itself should run the vsvars32.bat and then make, like this

vsvars32.bat
make %*

As far as I remember, invoking a script from another script like this is done within the same shell (similar to Bash "." command).

0
votes

I have found three solutions to this problem:

1) If the environment variables being set by the batch file are static (that is, they are always the same values), set those values for your entire user profile. Right-click on My Computer, click Properties-->Advanced-->Environment Variables. Add the variables from the batch file to the User Variables or System Variables section (User variables are only visible by you, System variables are visible by all users of that computer).

2) Write a wrapper batch file that calls the environment setup script then calls the Makefile.

3) Instead of using the SET command to set environment variables in the batch file, use the SETX command (requires the Windows Resource Kit). SETX is similar to SET, except it makes its changes to the master environment in the registry and will take effect in all command prompts launched in the future (but not the current one).