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
This commit is contained in:
Jakob Buchgraber 2020-02-14 02:47:45 -08:00 committed by TensorFlower Gardener
parent 2084931948
commit fe03adf6e6
3 changed files with 34 additions and 14 deletions

View File

@ -39,6 +39,7 @@ load(
)
load(
"//third_party/remote_config:common.bzl",
"err_out",
"get_bash_bin",
"get_cpu_value",
"get_python_bin",
@ -273,20 +274,21 @@ def _get_cxx_inc_directories_impl(repository_ctx, cc, lang_is_cpp, tf_sysroot):
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 @@ def _cuda_include_path(repository_ctx, cuda_config):
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 @@ def find_cuda_config(repository_ctx, script_path, cuda_libraries):
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()])

View File

@ -21,6 +21,7 @@ load(
)
load(
"//third_party/remote_config:common.bzl",
"err_out",
"execute",
"files_exist",
"get_bash_bin",
@ -116,20 +117,21 @@ def _get_cxx_inc_directories_impl(repository_ctx, cc, lang_is_cpp):
"-",
"-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)))

View File

@ -260,3 +260,19 @@ def realpath(repository_ctx, path, bash_bin = None):
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