cmake/Source/cmUVProcessChain.h

116 lines
2.3 KiB
C
Raw Normal View History

2019-11-11 23:01:05 +01:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
2021-09-14 00:13:48 +02:00
#pragma once
2019-11-11 23:01:05 +01:00
#include <array>
2020-08-30 11:54:41 +02:00
#include <cstddef> // IWYU pragma: keep
2020-02-01 23:06:01 +01:00
#include <cstdint>
2019-11-11 23:01:05 +01:00
#include <iosfwd>
2020-02-01 23:06:01 +01:00
#include <memory>
2019-11-11 23:01:05 +01:00
#include <string>
2023-07-02 19:51:09 +02:00
#include <utility>
2019-11-11 23:01:05 +01:00
#include <vector>
2020-08-30 11:54:41 +02:00
#include <cm3p/uv.h>
2019-11-11 23:01:05 +01:00
class cmUVProcessChain;
class cmUVProcessChainBuilder
{
public:
enum Stream
{
Stream_INPUT = 0,
Stream_OUTPUT = 1,
Stream_ERROR = 2,
};
cmUVProcessChainBuilder();
cmUVProcessChainBuilder& AddCommand(
const std::vector<std::string>& arguments);
cmUVProcessChainBuilder& SetNoStream(Stream stdio);
cmUVProcessChainBuilder& SetBuiltinStream(Stream stdio);
2023-07-02 19:51:09 +02:00
cmUVProcessChainBuilder& SetMergedBuiltinStreams();
2019-11-11 23:01:05 +01:00
cmUVProcessChainBuilder& SetExternalStream(Stream stdio, int fd);
2023-07-02 19:51:09 +02:00
cmUVProcessChainBuilder& SetWorkingDirectory(std::string dir);
2019-11-11 23:01:05 +01:00
cmUVProcessChain Start() const;
private:
enum StdioType
{
None,
Builtin,
External,
};
friend class cmUVProcessChain;
struct StdioConfiguration
{
StdioType Type;
int FileDescriptor;
};
struct ProcessConfiguration
{
std::vector<std::string> Arguments;
};
std::array<StdioConfiguration, 3> Stdio;
std::vector<ProcessConfiguration> Processes;
2023-07-02 19:51:09 +02:00
std::string WorkingDirectory;
bool MergedBuiltinStreams = false;
2019-11-11 23:01:05 +01:00
};
class cmUVProcessChain
{
public:
2023-07-02 19:51:09 +02:00
enum class ExceptionCode
{
None,
Fault,
Illegal,
Interrupt,
Numerical,
Other,
};
2019-11-11 23:01:05 +01:00
struct Status
{
int64_t ExitStatus;
int TermSignal;
2023-07-02 19:51:09 +02:00
std::pair<ExceptionCode, std::string> GetException() const;
2019-11-11 23:01:05 +01:00
};
cmUVProcessChain(const cmUVProcessChain& other) = delete;
cmUVProcessChain(cmUVProcessChain&& other) noexcept;
~cmUVProcessChain();
cmUVProcessChain& operator=(const cmUVProcessChain& other) = delete;
cmUVProcessChain& operator=(cmUVProcessChain&& other) noexcept;
uv_loop_t& GetLoop();
// FIXME: Add stdin support
std::istream* OutputStream();
std::istream* ErrorStream();
bool Valid() const;
bool Wait(int64_t milliseconds = -1);
std::vector<const Status*> GetStatus() const;
const Status* GetStatus(std::size_t index) const;
2023-07-02 19:51:09 +02:00
bool Finished() const;
2019-11-11 23:01:05 +01:00
private:
friend class cmUVProcessChainBuilder;
cmUVProcessChain();
struct InternalData;
std::unique_ptr<InternalData> Data;
};