diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2003-08-04 02:32:15 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2003-08-04 02:32:15 (GMT) |
commit | 8a31793c89be483bcf6d44fff0785b894172e35a (patch) | |
tree | 18fac48dce25c738edb3d8e7a0a8f6d134963c7a /Source | |
parent | c7f1198a0062a24edf3166e5f4cfcdcbb8b556f7 (diff) | |
download | CMake-8a31793c89be483bcf6d44fff0785b894172e35a.zip CMake-8a31793c89be483bcf6d44fff0785b894172e35a.tar.gz CMake-8a31793c89be483bcf6d44fff0785b894172e35a.tar.bz2 |
ENH: Add back the kwsysProcess RunCommand, now is in parallel
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmSystemTools.cxx | 131 | ||||
-rw-r--r-- | Source/cmSystemTools.h | 17 |
2 files changed, 147 insertions, 1 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index dd75b8c..51ec308 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -22,6 +22,7 @@ #include <cmsys/RegularExpression.hxx> #include <cmsys/Directory.hxx> +#include <cmsys/Process.h> // support for realpath call #ifndef _WIN32 @@ -292,7 +293,135 @@ bool cmSystemTools::IsOff(const char* val) v == "N" || cmSystemTools::IsNOTFOUND(v.c_str()) || v == "IGNORE"); } - +bool cmSystemTools::RunSingleCommand( + const char* command, + std::string* output, + int *retVal, + const char* dir, + bool verbose, + int timeout) +{ + if(s_DisableRunCommandOutput) + { + verbose = false; + } + + std::vector<std::string> args; + std::string arg; + + // Split the command into an argv array. + for(const char* c = command; *c;) + { + // Skip over whitespace. + while(*c == ' ' || *c == '\t') + { + ++c; + } + arg = ""; + if(*c == '"') + { + // Parse a quoted argument. + ++c; + while(*c && *c != '"') + { + if(*c == '\\') + { + ++c; + if(*c) + { + arg.append(1, *c); + ++c; + } + } + else + { + arg.append(1, *c); + ++c; + } + } + if(*c) + { + ++c; + } + args.push_back(arg); + } + else if(*c) + { + // Parse an unquoted argument. + while(*c && *c != ' ' && *c != '\t') + { + arg.append(1, *c); + ++c; + } + args.push_back(arg); + } + } + + std::vector<const char*> argv; + for(std::vector<std::string>::const_iterator a = args.begin(); + a != args.end(); ++a) + { + argv.push_back(a->c_str()); + } + argv.push_back(0); + + if(argv.size() < 2) + { + return false; + } + + if ( output ) + { + *output = ""; + } + cmsysProcess* cp = cmsysProcess_New(); + cmsysProcess_SetCommand(cp, &*argv.begin()); + cmsysProcess_SetWorkingDirectory(cp, dir); + cmsysProcess_SetTimeout(cp, timeout); + cmsysProcess_Execute(cp); + + char* data; + int length; + while(cmsysProcess_WaitForData(cp, (cmsysProcess_Pipe_STDOUT | + cmsysProcess_Pipe_STDERR), + &data, &length, 0)) + { + if ( output ) + { + output->append(data, length); + } + if(verbose) + { + std::cout.write(data, length); + } + } + + cmsysProcess_WaitForExit(cp, 0); + + bool result = true; + if(cmsysProcess_GetState(cp) == cmsysProcess_State_Exited) + { + if ( retVal ) + { + *retVal = cmsysProcess_GetExitValue(cp); + } + else + { + if ( cmsysProcess_GetExitValue(cp) != 0 ) + { + result = false; + } + } + } + else + { + result = false; + } + + cmsysProcess_Delete(cp); + + return result; +} bool cmSystemTools::RunCommand(const char* command, std::string& output, const char* dir, diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index a25b9d9..7f26b25 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -162,6 +162,23 @@ public: static bool RunCommand(const char* command, std::string& output, int &retVal, const char* directory = 0, bool verbose = true, int timeout = 0); + /** + * Run a single executable command and put the stdout and stderr + * in output. + * + * If verbose is false, no user-viewable output from the program + * being run will be generated. + * + * If timeout is specified, the command will be terminated after + * timeout expires. Timeout is specified in seconds. + * + * Argument retVal should be a pointer to the location where the + * exit code will be stored. If the retVal is not specified and + * the program exits with a code other than 0, then the this + * function will return false. + */ + static bool RunSingleCommand(const char* command, std::string* output = 0, + int* retVal = 0, const char* dir = 0, bool verbose = true, int timeout = 0); static void EnableMessages() { s_DisableMessages = false; } static void DisableMessages() { s_DisableMessages = true; } |