mirror of
https://github.com/reactos/CMake.git
synced 2025-01-09 05:00:35 +00:00
721b7e3e56
Use the KWSys Process "MergeOutput" option to give each test child process the same pipe for both stdout and stderr. This allows natural merging of stdout and stderr together instead of merging on arbitrary buffered read boundaries as before.
80 lines
2.4 KiB
C++
80 lines
2.4 KiB
C++
/*============================================================================
|
|
CMake - Cross Platform Makefile Generator
|
|
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
|
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
see accompanying file Copyright.txt for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the License for more information.
|
|
============================================================================*/
|
|
#ifndef cmProcess_h
|
|
#define cmProcess_h
|
|
|
|
|
|
#include "cmStandardIncludes.h"
|
|
#include <cmsys/Process.h>
|
|
|
|
|
|
/** \class cmProcess
|
|
* \brief run a process with c++
|
|
*
|
|
* cmProcess wraps the kwsys process stuff in a c++ class.
|
|
*/
|
|
class cmProcess
|
|
{
|
|
public:
|
|
cmProcess();
|
|
~cmProcess();
|
|
const char* GetCommand() { return this->Command.c_str();}
|
|
void SetCommand(const char* command);
|
|
void SetCommandArguments(std::vector<std::string> const& arg);
|
|
void SetWorkingDirectory(const char* dir) { this->WorkingDirectory = dir;}
|
|
void SetTimeout(double t) { this->Timeout = t;}
|
|
// Return true if the process starts
|
|
bool StartProcess();
|
|
|
|
// return the process status
|
|
int GetProcessStatus();
|
|
// Report the status of the program
|
|
int ReportStatus();
|
|
int GetId() { return this->Id; }
|
|
void SetId(int id) { this->Id = id;}
|
|
int GetExitValue() { return this->ExitValue;}
|
|
double GetTotalTime() { return this->TotalTime;}
|
|
int GetExitException();
|
|
/**
|
|
* Read one line of output but block for no more than timeout.
|
|
* Returns:
|
|
* cmsysProcess_Pipe_None = Process terminated and all output read
|
|
* cmsysProcess_Pipe_STDOUT = Line came from stdout or stderr
|
|
* cmsysProcess_Pipe_Timeout = Timeout expired while waiting
|
|
*/
|
|
int GetNextOutputLine(std::string& line, double timeout);
|
|
private:
|
|
double Timeout;
|
|
double StartTime;
|
|
double TotalTime;
|
|
cmsysProcess* Process;
|
|
class Buffer: public std::vector<char>
|
|
{
|
|
// Half-open index range of partial line already scanned.
|
|
size_type First;
|
|
size_type Last;
|
|
public:
|
|
Buffer(): First(0), Last(0) {}
|
|
bool GetLine(std::string& line);
|
|
bool GetLast(std::string& line);
|
|
};
|
|
Buffer Output;
|
|
std::string Command;
|
|
std::string WorkingDirectory;
|
|
std::vector<std::string> Arguments;
|
|
std::vector<const char*> ProcessArgs;
|
|
int Id;
|
|
int ExitValue;
|
|
};
|
|
|
|
#endif
|