Workaround an RBE bug where stderr is merged with stdout.
Any code path using exec_result.stderr won't work with RBE due to
a bug where the service returns stderr as stdout.
PiperOrigin-RevId: 295107492
Change-Id: I5738d46f7bb4cc049636a6f6625abc782d2d1e29
diff --git a/third_party/gpus/cuda_configure.bzl b/third_party/gpus/cuda_configure.bzl
index 5cdc5eb..c15f3c0 100644
--- a/third_party/gpus/cuda_configure.bzl
+++ b/third_party/gpus/cuda_configure.bzl
@@ -39,6 +39,7 @@
)
load(
"//third_party/remote_config:common.bzl",
+ "err_out",
"get_bash_bin",
"get_cpu_value",
"get_python_bin",
@@ -273,20 +274,21 @@
sysroot += ["--sysroot", tf_sysroot]
result = raw_exec(repository_ctx, [cc, "-E", "-x" + lang, "-", "-v"] +
sysroot)
- index1 = result.stderr.find(_INC_DIR_MARKER_BEGIN)
+ stderr = err_out(result)
+ index1 = stderr.find(_INC_DIR_MARKER_BEGIN)
if index1 == -1:
return []
- index1 = result.stderr.find("\n", index1)
+ index1 = stderr.find("\n", index1)
if index1 == -1:
return []
- index2 = result.stderr.rfind("\n ")
+ index2 = stderr.rfind("\n ")
if index2 == -1 or index2 < index1:
return []
- index2 = result.stderr.find("\n", index2 + 1)
+ index2 = stderr.find("\n", index2 + 1)
if index2 == -1:
- inc_dirs = result.stderr[index1 + 1:]
+ inc_dirs = stderr[index1 + 1:]
else:
- inc_dirs = result.stderr[index1 + 1:index2].strip()
+ inc_dirs = stderr[index1 + 1:index2].strip()
return [
_normalize_include_path(repository_ctx, _cxx_inc_convert(p))
@@ -346,7 +348,7 @@
cmd = "%s -v /dev/null -o /dev/null ; [ $? -eq 1 ]" % str(nvcc_path)
result = raw_exec(repository_ctx, [get_bash_bin(repository_ctx), "-c", cmd])
target_dir = ""
- for one_line in result.stderr.splitlines():
+ for one_line in err_out(result).splitlines():
if one_line.startswith("#$ _TARGET_DIR_="):
target_dir = (
cuda_config.cuda_toolkit_path + "/" + one_line.replace(
@@ -600,7 +602,7 @@
script_path,
] + cuda_libraries)
if exec_result.return_code:
- auto_configure_fail("Failed to run find_cuda_config.py: %s" % exec_result.stderr)
+ auto_configure_fail("Failed to run find_cuda_config.py: %s" % err_out(exec_result))
# Parse the dict from stdout.
return dict([tuple(x.split(": ")) for x in exec_result.stdout.splitlines()])
diff --git a/third_party/gpus/rocm_configure.bzl b/third_party/gpus/rocm_configure.bzl
index d552f7a..de885f7 100644
--- a/third_party/gpus/rocm_configure.bzl
+++ b/third_party/gpus/rocm_configure.bzl
@@ -21,6 +21,7 @@
)
load(
"//third_party/remote_config:common.bzl",
+ "err_out",
"execute",
"files_exist",
"get_bash_bin",
@@ -116,20 +117,21 @@
"-",
"-v",
])
- index1 = result.stderr.find(_INC_DIR_MARKER_BEGIN)
+ stderr = err_out(result)
+ index1 = stderr.find(_INC_DIR_MARKER_BEGIN)
if index1 == -1:
return []
- index1 = result.stderr.find("\n", index1)
+ index1 = stderr.find("\n", index1)
if index1 == -1:
return []
- index2 = result.stderr.rfind("\n ")
+ index2 = stderr.rfind("\n ")
if index2 == -1 or index2 < index1:
return []
- index2 = result.stderr.find("\n", index2 + 1)
+ index2 = stderr.find("\n", index2 + 1)
if index2 == -1:
- inc_dirs = result.stderr[index1 + 1:]
+ inc_dirs = stderr[index1 + 1:]
else:
- inc_dirs = result.stderr[index1 + 1:index2].strip()
+ inc_dirs = stderr[index1 + 1:index2].strip()
return [
str(repository_ctx.path(_cxx_inc_convert(p)))
diff --git a/third_party/remote_config/common.bzl b/third_party/remote_config/common.bzl
index c7c1e8d..6f6e4be 100644
--- a/third_party/remote_config/common.bzl
+++ b/third_party/remote_config/common.bzl
@@ -260,3 +260,19 @@
bash_bin = get_bash_bin(repository_ctx)
return execute(repository_ctx, [bash_bin, "-c", "realpath %s" % path]).stdout.strip()
+
+def err_out(result):
+ """Returns stderr if set, else stdout.
+
+ This function is a workaround for a bug in RBE where stderr is returned as stdout. Instead
+ of using result.stderr use err_out(result) instead.
+
+ Args:
+ result: the exec_result.
+
+ Returns:
+ The stderr if set, else stdout
+ """
+ if len(result.stderr) == 0:
+ return result.stdout
+ return result.stderr