///////////////////////////////////////////////////////////////////// // Builder.cpp - Builds C++ code programmatically // // // // Language: C++/CLI (Managed C++), Visual Studio 2008 // // Platform: Dell Precision T7400, Vista Ultimate, SP1 // // Application: CSE784 Prototype for VRTS Project, Fall 2008 // // Jim Fawcett, CST 4-187, Syracuse University, (315) 443-3948 // // jfawcett@twcny.rr.com, www.ecs.syr.edu/faculty/fawcett // ///////////////////////////////////////////////////////////////////// /* * Package Operations: * =================== * Programmatically builds C++ source code. * - supply command line arguments for file name(s) and options, e.g.: * ..//..//builder.cpp /EHa * - returns Exit code 0 if successful * * Required Files: * =============== * Builder.cpp * * Compiler Command: * ================= * cl builder.cpp /EHa */ ///////////////////////////////////////////////////////////////////// // supressing compiler warning 4005 - Macro Redefinition // - Needed here because we need to prevent compiler from // redefining the identifier GetEnvironmentVariable to // GetEnvironmentVariableW. // - That's something triggered by the inclusion of Windows.h in // HiResTimer.h. I haven't figured out a more graceful way of // handling this yet. #include "HiResTimer.h" #pragma warning(disable: 4005) #include #include #using using namespace System; using namespace System::IO; using namespace System::Text; using namespace System::Diagnostics; using namespace System::Collections; using namespace std; static String^ CompileArgs(int argc, char* argv[]) { std::string temp; for (int i = 1; i < argc; ++i) { temp.append(argv[i]); temp.append(" "); } return gcnew String(temp.c_str()); } void main(int argc, char* argv[]) { if(argc < 2) { Console::Write( "\n Please enter name of file to build and options\n\n" ); return; } Process^ compiler = gcnew Process; StringBuilder^ includes = gcnew StringBuilder(); /////////////////////////////////////////////////////////////////// // Vista Ultimate 64bit, SP1 //includes->Append("C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\INCLUDE;"); //includes->Append("C:\\Program Files (x86)\\Microsoft SDKs\\windows\\v6.0A\\INCLUDE;"); /////////////////////////////////////////////////////////////////// // Vista Ultimate 32 bit, SP1, AND XP Professional 32bit, SP2 includes->Append("C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\INCLUDE;"); /////////////////////////////////////////////////////////////////// // Both 64 bit and 32 bit includes->Append("C:\\Program Files\\Microsoft SDKs\\windows\\v6.0A\\INCLUDE;"); compiler->StartInfo->EnvironmentVariables->Add("INCLUDE",includes->ToString()); StringBuilder^ libs = gcnew StringBuilder(); ////////////////////////////////////////////////////////////////// // Vista Ulitmate 64bit, SP1 //libs->Append("C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\LIB;"); //libs->Append("C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\Common7\\IDE;"); //libs->Append("C:\\Program Files (x86)\\Microsoft SDKs\\windows\\v6.0A\\LIB;"); /////////////////////////////////////////////////////////////////// // Vista Ultimate 32 bit, SP1, AND XP Professional, SP2 libs->Append("C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\LIB;"); libs->Append("C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\IDE;"); /////////////////////////////////////////////////////////////////// // Both 64 bit and 32 bit libs->Append("C:\\Program Files\\Microsoft SDKs\\windows\\v6.0A\\LIB;"); compiler->StartInfo->EnvironmentVariables->Add("LIB",libs->ToString()); //////////////////////////////////////////////////////////////////////// // undoing (then redoing) Windows.h macro definition which confuses compiler #define GetEnvironmentVariable GetEnvironmentVariable StringBuilder^ path = gcnew StringBuilder(System::Environment::GetEnvironmentVariable("path")); #define GetEnvironmentVariable GetEnvironmentVariableW ////////////////////////////////////////////////////////////////// // Vista Ulitmate 64bit, SP1 //path->Append(";C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\INCLUDE"); //path->Append(";C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\INCLUDE\\src"); //path->Append(";C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\Common7\\IDE"); /////////////////////////////////////////////////////////////////// // Vista Ultimate 32 bit, SP1, AND XP Professional, SP2 path->Append(";C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\INCLUDE"); path->Append(";C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\INCLUDE\\src"); path->Append(";C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\IDE"); compiler->StartInfo->EnvironmentVariables->Remove("PATH"); compiler->StartInfo->EnvironmentVariables->Add("PATH",path->ToString()); String^ args = CompileArgs(argc, argv); Console::Write("\ncompile arguments: {0}\n\n",args); HRTimer::HiResTimer hrt; hrt.Start(); compiler->StartInfo->FileName = "cl.exe"; compiler->StartInfo->Arguments = args; compiler->StartInfo->UseShellExecute = false; compiler->StartInfo->RedirectStandardOutput = true; compiler->Start(); Console::WriteLine( compiler->StandardOutput->ReadToEnd() ); compiler->WaitForExit(); hrt.Stop(); Console::Write("\nExit code = {0}",compiler->ExitCode); Console::Write("\nRun time = {0} microsecs\n\n", hrt.ElapsedMicroseconds()); }