ENH: Added OUTPUT_STRIP_TRAILING_WHITESPACE and ERROR_STRIP_TRAILING_WHITESPACE options to EXECUTE_PROCESS command. These allow it to behave more like the old EXEC_PROGRAM command that it is supposed to replace.
This commit is contained in:
parent
641a0ad878
commit
e593fbf6ee
|
@ -19,7 +19,15 @@
|
|||
|
||||
#include <cmsys/Process.h>
|
||||
|
||||
void cmExecuteProcessCommandFixText(std::vector<char>& output);
|
||||
#include <ctype.h> /* isspace */
|
||||
|
||||
static bool cmExecuteProcessCommandIsWhitespace(char c)
|
||||
{
|
||||
return (isspace((int)c) || c == '\n' || c == '\r');
|
||||
}
|
||||
|
||||
void cmExecuteProcessCommandFixText(std::vector<char>& output,
|
||||
bool strip_trailing_whitespace);
|
||||
|
||||
// cmExecuteProcessCommand
|
||||
bool cmExecuteProcessCommand
|
||||
|
@ -36,6 +44,8 @@ bool cmExecuteProcessCommand
|
|||
size_t command_index = 0;
|
||||
bool output_quiet = false;
|
||||
bool error_quiet = false;
|
||||
bool output_strip_trailing_whitespace = false;
|
||||
bool error_strip_trailing_whitespace = false;
|
||||
std::string timeout_string;
|
||||
std::string input_file;
|
||||
std::string output_file;
|
||||
|
@ -166,10 +176,27 @@ bool cmExecuteProcessCommand
|
|||
doing_command = false;
|
||||
error_quiet = true;
|
||||
}
|
||||
else if(args[i] == "OUTPUT_STRIP_TRAILING_WHITESPACE")
|
||||
{
|
||||
doing_command = false;
|
||||
output_strip_trailing_whitespace = true;
|
||||
}
|
||||
else if(args[i] == "ERROR_STRIP_TRAILING_WHITESPACE")
|
||||
{
|
||||
doing_command = false;
|
||||
error_strip_trailing_whitespace = true;
|
||||
}
|
||||
else if(doing_command)
|
||||
{
|
||||
cmds[command_index].push_back(args[i].c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << " given unknown argument \"" << args[i] << "\".";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !this->Makefile->CanIWriteThisFile(output_file.c_str()) )
|
||||
|
@ -294,8 +321,10 @@ bool cmExecuteProcessCommand
|
|||
cmsysProcess_WaitForExit(cp, 0);
|
||||
|
||||
// Fix the text in the output strings.
|
||||
cmExecuteProcessCommandFixText(tempOutput);
|
||||
cmExecuteProcessCommandFixText(tempError);
|
||||
cmExecuteProcessCommandFixText(tempOutput,
|
||||
output_strip_trailing_whitespace);
|
||||
cmExecuteProcessCommandFixText(tempError,
|
||||
error_strip_trailing_whitespace);
|
||||
|
||||
// Store the output obtained.
|
||||
if(!output_variable.empty() && tempOutput.size())
|
||||
|
@ -344,7 +373,8 @@ bool cmExecuteProcessCommand
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmExecuteProcessCommandFixText(std::vector<char>& output)
|
||||
void cmExecuteProcessCommandFixText(std::vector<char>& output,
|
||||
bool strip_trailing_whitespace)
|
||||
{
|
||||
// Remove \0 characters and the \r part of \r\n pairs.
|
||||
unsigned int in_index = 0;
|
||||
|
@ -358,6 +388,18 @@ void cmExecuteProcessCommandFixText(std::vector<char>& output)
|
|||
output[out_index++] = c;
|
||||
}
|
||||
}
|
||||
|
||||
// Remove trailing whitespace if requested.
|
||||
if(strip_trailing_whitespace)
|
||||
{
|
||||
while(out_index > 0 &&
|
||||
cmExecuteProcessCommandIsWhitespace(output[out_index-1]))
|
||||
{
|
||||
--out_index;
|
||||
}
|
||||
}
|
||||
|
||||
// Shrink the vector to the size needed.
|
||||
output.resize(out_index);
|
||||
|
||||
// Put a terminator on the text string.
|
||||
|
|
|
@ -78,7 +78,9 @@ public:
|
|||
" [OUTPUT_FILE <file>]\n"
|
||||
" [ERROR_FILE <file>]\n"
|
||||
" [OUTPUT_QUIET]\n"
|
||||
" [ERROR_QUIET])\n"
|
||||
" [ERROR_QUIET]\n"
|
||||
" [OUTPUT_STRIP_TRAILING_WHITESPACE]\n"
|
||||
" [ERROR_STRIP_TRAILING_WHITESPACE])\n"
|
||||
"Runs the given sequence of one or more commands with the standard "
|
||||
"output of each process piped to the standard input of the next. "
|
||||
"A single standard error pipe is used for all processes. "
|
||||
|
|
Loading…
Reference in New Issue