parent
ccbd58eb4d
commit
40638e5aaa
@ -84,6 +84,8 @@ stdenv.mkDerivation (finalAttrs: {
|
|||||||
./patches/Use-system-toolchain-for-usr-bin.patch
|
./patches/Use-system-toolchain-for-usr-bin.patch
|
||||||
# Suppress warnings due to newer SDKs with unknown keys
|
# Suppress warnings due to newer SDKs with unknown keys
|
||||||
./patches/Suppress-unknown-key-warnings.patch
|
./patches/Suppress-unknown-key-warnings.patch
|
||||||
|
# Don't pipe stdout / stderr of processes launched by xcrun
|
||||||
|
./patches/fix-interactive-apps.patch
|
||||||
];
|
];
|
||||||
|
|
||||||
prePatch = ''
|
prePatch = ''
|
||||||
|
|||||||
141
pkgs/by-name/xc/xcbuild/patches/fix-interactive-apps.patch
Normal file
141
pkgs/by-name/xc/xcbuild/patches/fix-interactive-apps.patch
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
diff --git a/Libraries/process/Headers/process/DefaultLauncher.h b/Libraries/process/Headers/process/DefaultLauncher.h
|
||||||
|
index cee6e145..698ffe84 100644
|
||||||
|
--- a/Libraries/process/Headers/process/DefaultLauncher.h
|
||||||
|
+++ b/Libraries/process/Headers/process/DefaultLauncher.h
|
||||||
|
@@ -20,11 +20,14 @@ namespace process {
|
||||||
|
*/
|
||||||
|
class DefaultLauncher : public Launcher {
|
||||||
|
public:
|
||||||
|
- DefaultLauncher();
|
||||||
|
+ DefaultLauncher(bool sync_output);
|
||||||
|
~DefaultLauncher();
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ext::optional<int> launch(libutil::Filesystem *filesystem, Context const *context);
|
||||||
|
+
|
||||||
|
+private:
|
||||||
|
+ bool sync_output_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
diff --git a/Libraries/process/Sources/DefaultLauncher.cpp b/Libraries/process/Sources/DefaultLauncher.cpp
|
||||||
|
index a7f14e1a..e9aaf330 100644
|
||||||
|
--- a/Libraries/process/Sources/DefaultLauncher.cpp
|
||||||
|
+++ b/Libraries/process/Sources/DefaultLauncher.cpp
|
||||||
|
@@ -91,9 +91,18 @@ EscapedToken(const WideString &token)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+namespace {
|
||||||
|
+ enum class PipeStatus {
|
||||||
|
+ UNUSED,
|
||||||
|
+ CREATED,
|
||||||
|
+ ERROR
|
||||||
|
+ };
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
DefaultLauncher::
|
||||||
|
-DefaultLauncher() :
|
||||||
|
- Launcher()
|
||||||
|
+DefaultLauncher(bool sync_output) :
|
||||||
|
+ Launcher(),
|
||||||
|
+ sync_output_{sync_output}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -199,10 +208,14 @@ launch(Filesystem *filesystem, Context const *context)
|
||||||
|
|
||||||
|
/* Setup parent-child stdout/stderr pipe. */
|
||||||
|
int pfd[2];
|
||||||
|
- bool pipe_setup_success = true;
|
||||||
|
- if (pipe(pfd) == -1) {
|
||||||
|
- ::perror("pipe");
|
||||||
|
- pipe_setup_success = false;
|
||||||
|
+ PipeStatus pipe_status = PipeStatus::UNUSED;
|
||||||
|
+ if (sync_output_) {
|
||||||
|
+ if (pipe(pfd) == -1) {
|
||||||
|
+ ::perror("pipe");
|
||||||
|
+ pipe_status = PipeStatus::ERROR;
|
||||||
|
+ } else {
|
||||||
|
+ pipe_status = PipeStatus::CREATED;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -214,22 +227,25 @@ launch(Filesystem *filesystem, Context const *context)
|
||||||
|
return ext::nullopt;
|
||||||
|
} else if (pid == 0) {
|
||||||
|
/* Fork succeeded, new process. */
|
||||||
|
- if (pipe_setup_success) {
|
||||||
|
- /* Setup pipe to parent, redirecting both stdout and stderr */
|
||||||
|
- dup2(pfd[1], STDOUT_FILENO);
|
||||||
|
- dup2(pfd[1], STDERR_FILENO);
|
||||||
|
- close(pfd[0]);
|
||||||
|
- close(pfd[1]);
|
||||||
|
- } else {
|
||||||
|
- /* No parent-child pipe setup, just ignore outputs from child */
|
||||||
|
- int nullfd = open("/dev/null", O_WRONLY);
|
||||||
|
- if (nullfd == -1) {
|
||||||
|
- ::perror("open");
|
||||||
|
- ::_exit(1);
|
||||||
|
- }
|
||||||
|
- dup2(nullfd, STDOUT_FILENO);
|
||||||
|
- dup2(nullfd, STDERR_FILENO);
|
||||||
|
- close(nullfd);
|
||||||
|
+ switch (pipe_status) {
|
||||||
|
+ case PipeStatus::CREATED:
|
||||||
|
+ /* Setup pipe to parent, redirecting both stdout and stderr */
|
||||||
|
+ dup2(pfd[1], STDOUT_FILENO);
|
||||||
|
+ dup2(pfd[1], STDERR_FILENO);
|
||||||
|
+ close(pfd[0]);
|
||||||
|
+ close(pfd[1]);
|
||||||
|
+ break;
|
||||||
|
+ case PipeStatus::ERROR:
|
||||||
|
+ /* No parent-child pipe setup, just ignore outputs from child */
|
||||||
|
+ int nullfd = open("/dev/null", O_WRONLY);
|
||||||
|
+ if (nullfd == -1) {
|
||||||
|
+ ::perror("open");
|
||||||
|
+ ::_exit(1);
|
||||||
|
+ }
|
||||||
|
+ dup2(nullfd, STDOUT_FILENO);
|
||||||
|
+ dup2(nullfd, STDERR_FILENO);
|
||||||
|
+ close(nullfd);
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (::chdir(cDirectory) == -1) {
|
||||||
|
@@ -243,7 +259,7 @@ launch(Filesystem *filesystem, Context const *context)
|
||||||
|
return ext::nullopt;
|
||||||
|
} else {
|
||||||
|
/* Fork succeeded, existing process. */
|
||||||
|
- if (pipe_setup_success) {
|
||||||
|
+ if (pipe_status == PipeStatus::CREATED) {
|
||||||
|
close(pfd[1]);
|
||||||
|
/* Read child's stdout/stderr through pipe, and output stdout */
|
||||||
|
while (true) {
|
||||||
|
diff --git a/Libraries/xcdriver/Tools/xcbuild.cpp b/Libraries/xcdriver/Tools/xcbuild.cpp
|
||||||
|
index 3a1baadc..c9340ff5 100644
|
||||||
|
--- a/Libraries/xcdriver/Tools/xcbuild.cpp
|
||||||
|
+++ b/Libraries/xcdriver/Tools/xcbuild.cpp
|
||||||
|
@@ -19,7 +19,7 @@ main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
DefaultFilesystem filesystem = DefaultFilesystem();
|
||||||
|
process::DefaultContext processContext = process::DefaultContext();
|
||||||
|
- process::DefaultLauncher processLauncher = process::DefaultLauncher();
|
||||||
|
+ process::DefaultLauncher processLauncher = process::DefaultLauncher(true);
|
||||||
|
process::DefaultUser user = process::DefaultUser();
|
||||||
|
return xcdriver::Driver::Run(&user, &processContext, &processLauncher, &filesystem);
|
||||||
|
}
|
||||||
|
diff --git a/Libraries/xcsdk/Tools/xcrun.cpp b/Libraries/xcsdk/Tools/xcrun.cpp
|
||||||
|
index 9d6d4576..c177b273 100644
|
||||||
|
--- a/Libraries/xcsdk/Tools/xcrun.cpp
|
||||||
|
+++ b/Libraries/xcsdk/Tools/xcrun.cpp
|
||||||
|
@@ -469,7 +469,7 @@ main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
DefaultFilesystem filesystem = DefaultFilesystem();
|
||||||
|
process::DefaultContext processContext = process::DefaultContext();
|
||||||
|
- process::DefaultLauncher processLauncher = process::DefaultLauncher();
|
||||||
|
+ process::DefaultLauncher processLauncher = process::DefaultLauncher(false);
|
||||||
|
process::DefaultUser user = process::DefaultUser();
|
||||||
|
return Run(&filesystem, &user, &processContext, &processLauncher);
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user