solenv/gcc-wrappers/wrapper.cxx | 105 ++++++++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 26 deletions(-)
New commits: commit 863aeceb42a955fcbe37963fe2db592a7bb5b79f Author: Peter Foley <pefol...@verizon.net> Date: Wed Mar 6 18:35:32 2013 -0500 use CreateProcess to get exit code Change-Id: I76bf9501243d173b20e8194748ca6c29e097efb4 diff --git a/solenv/gcc-wrappers/wrapper.cxx b/solenv/gcc-wrappers/wrapper.cxx index 5ad0486..43c3d66 100644 --- a/solenv/gcc-wrappers/wrapper.cxx +++ b/solenv/gcc-wrappers/wrapper.cxx @@ -11,9 +11,13 @@ #include <iostream> #include <vector> +#include <windows.h> + using namespace std; -void setupenv() { +vector<char> setupenv() { + vector<char> enviroment; + // Set-up library path string libpath="LIB="; char* libbuf; @@ -21,7 +25,8 @@ void setupenv() { _dupenv_s(&libbuf,&liblen,"ILIB"); libpath.append(libbuf); free(libbuf); - _putenv(libpath.c_str()); + enviroment.insert(enviroment.end(),libpath.begin(),libpath.end()); + enviroment.push_back('\0'); // Set-up include path string includepath="INCLUDE=.;"; @@ -31,8 +36,8 @@ void setupenv() { string incvar(incbuf); free(incbuf); + // 3 = strlen(" -I") for(size_t pos=0; pos != string::npos;) { - // 3 = strlen(" -I") size_t endpos=incvar.find(" -I",pos+3); size_t len=endpos-pos-3; if(endpos==string::npos) @@ -41,50 +46,98 @@ void setupenv() { includepath.append(incvar,pos+3,len); includepath.append(";"); } - pos=incvar.find(" -I",pos+len); + pos=incvar.find(" -I",pos+len); } + enviroment.insert(enviroment.end(),includepath.begin(),includepath.end()); + enviroment.push_back('\0'); + + // CreateProcess requires the enviroment block to be null terminated + enviroment.push_back('\0'); - _putenv(includepath.c_str()); + return enviroment; } -void processargs(string& command,vector<string> args) { - for(vector<string>::iterator i = args.begin(); i != args.end(); i++) { - command.append(" "); +string processargs(vector<string> rawargs) { + string args; + for(vector<string>::iterator i = rawargs.begin(); i != rawargs.end(); i++) { + args.append(" "); if(*i == "-o") { - // TODO: handle more than just exe output - command.append("-Fe"); + // TODO: handle more than just exe output + args.append("-Fe"); i++; - command.append(*i); - } - else { - command.append(*i); + args.append(*i); } + else if(*i == "-g") + args.append("-Zi"); + else + args.append(*i); } + return args; } -extern int main(int argc, char *argv[]) { +int startprocess(string command, string args, vector<char> enviroment) { + STARTUPINFO si; + PROCESS_INFORMATION pi; + DWORD ret; + + HANDLE stdout_handle=GetStdHandle(STD_OUTPUT_HANDLE); + HANDLE stderr_handle=GetStdHandle(STD_ERROR_HANDLE); + + memset(&si,0,sizeof(si)); + si.cb=sizeof(si); + si.dwFlags |= STARTF_USESTDHANDLES; + si.hStdError=stderr_handle; + si.hStdOutput=stdout_handle; + + memset(&pi,0,sizeof(pi)); + + void* env; + env=&enviroment.front(); + + if(!CreateProcess(command.c_str(), // Process Name + (char*)args.c_str(), // Command Line + NULL, // Process Handle not Inheritable + NULL, // Thread Handle not Inheritable + FALSE, // Handles are not Inherited + 0, // No creation flags + env, // Enviroment for process + NULL, // Use same starting directory + &si, // Startup Info + &pi) // Process Information + ) { + cerr << "Error: could not create process" << endl; + exit(1); + } + + WaitForSingleObject(&pi.hProcess, INFINITE); + GetExitCodeProcess(pi.hProcess, &ret); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + return int(ret); +} + +int main(int argc, char *argv[]) { + vector<string> rawargs(argv + 1, argv + argc); + char* ccbuf; size_t cclen; _dupenv_s(&ccbuf,&cclen,REAL_EXE); if(!ccbuf) { - cout << "Error" << REAL_EXE << "not defined. Did you forget to source the enviroment?" << endl; + cout << "Error " << REAL_EXE << " not defined. Did you forget to source the enviroment?" << endl; exit(1); } string command(ccbuf); free(ccbuf); - vector<string> args(argv + 1, argv + argc); - processargs(command,args); - setupenv(); + string args=processargs(rawargs); - cout << "CC=" << command << endl; + vector<char> enviroment=setupenv(); + + cerr << "CC=" << command << "ARGS=" << args << endl; + + int ret=startprocess(command,args,enviroment); + return ret; - FILE* output=_popen(command.c_str(),"r"); - char outbuf[256]; - while(fgets(outbuf, 256, output)) { - cout << outbuf; - } - cout << endl; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits