/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include #include // IWYU pragma: keep #include #include #include #include #include #include class cmUVProcessChain; class cmUVProcessChainBuilder { public: enum Stream { Stream_INPUT = 0, Stream_OUTPUT = 1, Stream_ERROR = 2, }; cmUVProcessChainBuilder(); cmUVProcessChainBuilder& AddCommand( const std::vector& arguments); cmUVProcessChainBuilder& SetNoStream(Stream stdio); cmUVProcessChainBuilder& SetBuiltinStream(Stream stdio); cmUVProcessChainBuilder& SetExternalStream(Stream stdio, int fd); cmUVProcessChain Start() const; private: enum StdioType { None, Builtin, External, }; friend class cmUVProcessChain; struct StdioConfiguration { StdioType Type; int FileDescriptor; }; struct ProcessConfiguration { std::vector Arguments; }; std::array Stdio; std::vector Processes; }; class cmUVProcessChain { public: struct Status { int64_t ExitStatus; int TermSignal; }; 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 GetStatus() const; const Status* GetStatus(std::size_t index) const; private: friend class cmUVProcessChainBuilder; cmUVProcessChain(); struct InternalData; std::unique_ptr Data; };