///////////////////////////////////////////////////////////////////// // Builder.cpp - Builds C++ code programmatically // // ver 2.1 // // 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 * * Maintenance History: * ==================== * v2.1 : 06 Nov 08 * - fixed bug that caused failure if LIB or INCLUDE were already defined * v2.0 : 21 Oct 08 * - changed design to avoid need to copy compiler's components to local * application directory * v1.0 : 16 Aug 07 * - first release */ ///////////////////////////////////////////////////////////////////// // 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; //////////////////////////////////////////////////////////////////////// // undoing (then redoing) Windows.h macro definition which confuses compiler #define GetEnvironmentVariable GetEnvironmentVariable StringBuilder^ path = gcnew StringBuilder(System::Environment::GetEnvironmentVariable("PATH")); StringBuilder^ libs = gcnew StringBuilder(System::Environment::GetEnvironmentVariable("LIB")); StringBuilder^ includes = gcnew StringBuilder(System::Environment::GetEnvironmentVariable("INCLUDE")); #define GetEnvironmentVariable GetEnvironmentVariableW /////////////////////////////////////////////////////////////////// // Vista Ultimate 64bit, SP1 includes->Append("C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\INCLUDE;"); includes->Append("C:\\Program Files (x86)\\Microsoft SDKs\\windows\\v7.1A\\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 (x86)\\Microsoft SDKs\\windows\\v7.1A\\INCLUDE;"); compiler->StartInfo->EnvironmentVariables->Remove("INCLUDE"); compiler->StartInfo->EnvironmentVariables->Add("INCLUDE",includes->ToString()); ////////////////////////////////////////////////////////////////// // Vista Ulitmate 64bit, SP1 libs->Append("C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\LIB;"); libs->Append("C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE;"); libs->Append("C:\\Program Files (x86)\\Microsoft SDKs\\windows\\v7.1A\\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 // replace LIB string inherited by child from this process with new libs string libs->Append("C:\\Program Files (x86)\\Microsoft SDKs\\windows\\v7.01\\LIB;"); compiler->StartInfo->EnvironmentVariables->Remove("LIB"); compiler->StartInfo->EnvironmentVariables->Add("LIB",libs->ToString()); ////////////////////////////////////////////////////////////////// // Vista Ulitmate 64bit, SP1 path->Append(";C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\INCLUDE"); path->Append(";C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\INCLUDE\\src"); path->Append(";C:\\Program Files (x86)\\Microsoft Visual Studio 12.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"); // replace this process's path System::Environment::SetEnvironmentVariable("path", path->ToString()); // replace child process's path compiler->StartInfo->EnvironmentVariables->Remove("PATH"); compiler->StartInfo->EnvironmentVariables->Add("PATH",path->ToString()); //compiler->StartInfo->FileName = "c:\\program files (x86)\\Microsoft Visual Studio 9.0\\VC\\vcvarsall.bat; //compiler->Start(); //compiler->WaitForExit(); 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()); }