HPC Visual Studio Command Line Compilation from Powershell

I admit to an almost perverse fondness for command line environments. So I decided to jump onto PowerShell as my default command line environment because its way more cool than the cmd shell and even a nerd with a penchant for undead languages sometimes worries about being cool to some tiny degree. Only know about bash, csh, ksh, or sh? See: https://en.wikipedia.org/wiki/Windows_PowerShell.

One of the things I often do is build very simple little programs to test various features of Windows HPC Server 2008. So when I began using Powershell, I almost immediately ran into a situation where I wanted to do a quick C++ compile from within the PowerShell environment. I have been doing this for a couple of years in cmd shell because Visual Studio provides a shortcut the Tools folder of its start menu item that starts a cmd shell with all the environment variable preset for you.

“Ah ha!”, says I. “I need to do the same thing for PowerShell.” Here are my notes on how I did this and then tested it.

Start with the HPC version of the PowerShell shortcut in the Start menu. You’ll need to install at least the HPC Pack Client Utilities to get this shortcut. See: https://technet.microsoft.com/en-us/library/cc947676.aspx for a quick overview of all the cmdlets you get with this Client Pack.

You’ll also need to install Visual Studio 2008 (or earlier) and the Windows SDK for Server 2008 and HPC Server SDKs to do anything useful.

The Windows SDK for Server 2008 is at:  https://www.microsoft.com/downloads/details.aspx?FamilyID=E6E1C3DF-A74F-4207-8586-711EBE331CDC&displaylang=en.

The HPC SDK is at: https://www.microsoft.com/downloads/details.aspx?familyid=12887DA1-9410-4A59-B903-693116BFD30E&displaylang=en.  

Now, let’s cut to the chase. First get that shortcut.

Start->Microsoft HPC Pack->HPC Powershell and right click and copy it.

Paste it somewhere handy, I put it on my desktop. I also change the ‘Start in:’ field to point to my globally available share rather than my /Users home.

As with all my command shells I turn on Quick Edit and Insert modes in the General tab of properties for this shortcut.

At that location I have a file, pVSvars.ps1, that sets the same environment variables in a Powershell manner as is done for the default Visual Studio command shell.

------------------------------------------------------------------------------

PS C:\Home\fchism> dir pVSvars.ps1

 

 

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Home\fchism

 

 

Mode                LastWriteTime     Length Name

----                -------------     ------ ----

-a---          3/3/2009   4:14 PM       1686 pVSvars.ps1

 

 

PS C:\Home\fchism> more pVSvars.ps1

 

# Set up Visual Studio Variables for Powershell

 

$env:PATH="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64;C:\W

indows\Microsoft.NET\Framework64\v3.5;C:\Windows\Microsoft.NET\Framework64\v3.5

\Microsoft .NET Framework 3.5 (Pre-Release Version);C:\Windows\Microsoft.NET\Fr

amework64\v2.0.50727;C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\VCPa

ckages;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE;C:\Progra

m Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools;C:\Program Files (x86)\

Microsoft Visual Studio 9.0\Common7\Tools\bin;C:\Program Files\Microsoft SDKs\W

indows\v6.0A\bin\x64;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\win64\x6

4;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin;C:\Program Files\Microsoft

SDKs\Windows\v6.0A\Bin\x64;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\wi

n64\x64;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\;$env:PATH"

 

$env:INCLUDE="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ATLMFC\INCL

UDE;C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE;C:\Program Fi

les\Microsoft SDKs\Windows\v6.0A\include;$env:INCLUDE"

 

$env:LIB="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ATLMFC\LIB\amd6

4;C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\LIB\amd64;C:\Program Fi

les\Microsoft SDKs\Windows\v6.0A\lib\x64;$env:LIB"

 

$env:LIBPATH="C:\Windows\Microsoft.NET\Framework64\v3.5;C:\Windows\Microsoft.NE

T\Framework64\v2.0.50727;C:\Windows\Microsoft.NET\Framework64\v3.5;C:\Windows\M

icrosoft.NET\Framework64\v2.0.50727;C:\Program Files (x86)\Microsoft Visual Stu

dio 9.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 9.0\

VC\LIB\amd64;$env:LIBPATH"

 

PS C:\Home\fchism>

I have an ‘Unrestricted’ execution policy, so all I have to do at this point is enter .\pVSvars.ps1 at the command prompt. Now I have a Visual Studio Powershell ready to do command line compiling.

As an example, here are the contents of a sample build directory for an MPI hello world build directory.

PS C:\Home\fchism\pSane\MpiHi> dir

 

 

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Home\fchism\pSane\MpiHi

 

 

Mode LastWriteTime Length Name

---- ------------- ------ ----

-a--- 2/6/2007 11:13 AM 0 !MPI-HelloWorld

-a--- 3/3/2009 4:30 PM 794 Makefile

-a--- 5/1/2008 6:10 PM 2632 mpihi.c

-a--- 2/6/2007 11:13 AM 428 README

-a--- 3/4/2009 10:58 AM 1222 run-mpi.ps1

-a--- 3/3/2009 4:20 PM 1006 script-mpihi.cmd

--------------------------------------------------------------------------------------

 

Notice that there is both a Makefile and a C source file in this directory. The Makefile is nmake compatible. Here’s the contents of this directory pointing to the Windows HPC Server SDK include and library directories required to build an MPI application for Windows HPC Server 2008. Here are the contents of that Makefile:

PS C:\Home\fchism\pSane\MpiHi> more Makefile

 

# Makefile for Simple MPI Hello World program

# F. Chism 30August2006

#

# Requires the PATH from starting a Visual Studio cmd shell

# Use nmake not make when building

#

# To build 64-bit version (the default) run from a VS 64-bit cmd shell

#

# namke mpihi.exe

#

# To build a 32-bit version add -DWIN32 to the nmake command and run

# from a 32-bit cmd shell

#

# namke WIN32=true mpihi.exe

 

CCP_SDK="C:\Program Files\Microsoft HPC Pack 2008 SDK\"

CC=cl

CPPFLAGS=/I "C:\Program Files\Microsoft HPC Pack 2008 SDK\Include"

# Default to 64-bit build

LIBS="C:\Program Files\Microsoft HPC Pack 2008 SDK\Lib\amd64\msmpi.lib"

#!IFDEF WIN32

#LIBS="$(CCP_LIB32)\msmpi.lib"

#!ENDIF

 

 

mpihi.exe: mpihi.c

        $(CC) $(CPPFLAGS) mpihi.c $(LIBS)

 

clean:

        del mpihi.exe mpihi.obj

 

-------------------------------------------------------------------------------------

 

Now all I have to do is type nmake at the prompt, and voila! A working .exe is created.

 

 

PS C:\Home\fchism\pSane\MpiHi> nmake

 

Microsoft (R) Program Maintenance Utility Version 9.00.21022.08

Copyright (C) Microsoft Corporation. All rights reserved.

 

        cl /I "C:\Program Files\Microsoft HPC Pack 2008 SDK\Include" mpihi.c "C

:\Program Files\Microsoft HPC Pack 2008 SDK\Lib\amd64\msmpi.lib"

Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64

Copyright (C) Microsoft Corporation. All rights reserved.

 

mpihi.c

Microsoft (R) Incremental Linker Version 9.00.21022.08

Copyright (C) Microsoft Corporation. All rights reserved.

 

/out:mpihi.exe

mpihi.obj

"C:\Program Files\Microsoft HPC Pack 2008 SDK\Lib\amd64\msmpi.lib"

PS C:\Home\fchism\pSane\MpiHi> dir

 

 

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Home\fchism\pSane\MpiHi

 

 

Mode LastWriteTime Length Name

---- ------------- ------ ----

-a--- 2/6/2007 11:13 AM 0 !MPI-HelloWorld

-a--- 3/3/2009 4:30 PM 794 Makefile

-a--- 3/4/2009 11:36 AM 2638 mpihi.c

-a--- 3/4/2009 11:36 AM 53760 mpihi.exe

-a--- 3/4/2009 11:36 AM 2806 mpihi.obj

-a--- 2/6/2007 11:13 AM 428 README

-a--- 3/4/2009 10:58 AM 1222 run-mpi.ps1

-a--- 3/3/2009 4:20 PM 1006 script-mpihi.cmd

 

 

PS C:\Home\fchism\pSane\MpiHi> mpiexec -n 8 mpihi.exe

Rank, 2,Headnode

Rank, 6,Headnode

Rank, 7,Headnode

Rank, 1,Headnode

Rank, 5,Headnode

Rank, 4,Headnode

Rank, 3,Headnode

Rank, 0,Headnode

 

Rank 3 to say Hi to rank 4.

Rank 5 to say Hi to rank 6.

Rank 0 to say Hi to rank 1.

Rank 7 to say Hi to rank 0.

Rank 2 to say Hi to rank 3.

Rank 4 to say Hi to rank 5.

Rank 6 to say Hi to rank 7.

Rank 1 to say Hi to rank 2.

 

Rank 5 said 'Hi Powershell Fans' to rank 6.

Rank 1 said 'Hi Powershell Fans' to rank 2.

Rank 7 said 'Hi Powershell Fans' to rank 0.

Rank 0 said 'Hi Powershell Fans' to rank 1.

Rank 3 said 'Hi Powershell Fans' to rank 4.

Rank 4 said 'Hi Powershell Fans' to rank 5.

Rank 6 said 'Hi Powershell Fans' to rank 7.

Rank 2 said 'Hi Powershell Fans' to rank 3.

 

PS C:\Home\fchism\pSane\MpiHi>

-------------------------------------------------------------------------------------

I use “Windows PowerShell In Action” as my main study guide for PowerShell. A nice list of books on Powershell can be found at: https://search.barnesandnoble.com/booksearch/results.asp?CAT=1375303 or https://www.amazon.com/s/ref=nb_ss_gw?url=search-alias%3Daps&field-keywords=Powershell or https://www.borders.com/online/store/SearchResults?keyword=powershell&type=0&simple=1 .

Later Dudes and Dudettes,

   Frankie