Skip to content

Commit

Permalink
Fix incorrect include directories when -no-canonical-prefixes is pass…
Browse files Browse the repository at this point in the history
…ed to clang

With e99279b we started passing -no-canonical-prefixes to clang, but that
causes inconsistent directories used in .d files and system include
directories. The solution is to pass -no-canonical-prefixes also when asking
clang for system include directories.

Interestingly, clang in debian breaks when called like:
`clang -E -xc++ - -v -no-canonical-prefixes`
we have to pass absolute path to the binary like:
`/usr/bin/clang -E -xc++ - -v -no-canonical-prefixes`
then it works.

Fixes #4572.

RELNOTES: None.
PiperOrigin-RevId: 186210671
  • Loading branch information
hlopko authored and Copybara-Service committed Feb 19, 2018
1 parent 2a2aa7a commit b3d52b1
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions tools/cpp/unix_cc_configure.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ load(
"tpl",
)

def _uniq(iterable):
"""Remove duplicates from a list."""

unique_elements = {element: None for element in iterable}
return unique_elements.keys()

def _prepare_include_path(repo_ctx, path):
"""Resolve and sanitize include path before outputting it into the crosstool.
Expand Down Expand Up @@ -123,9 +129,9 @@ def _cxx_inc_convert(path):
return path


def get_escaped_cxx_inc_directories(repository_ctx, cc):
def get_escaped_cxx_inc_directories(repository_ctx, cc, additional_flags = []):
"""Compute the list of default %-escaped C++ include directories."""
result = repository_ctx.execute([cc, "-E", "-xc++", "-", "-v"])
result = repository_ctx.execute([cc, "-E", "-xc++", "-", "-v"] + additional_flags)
index1 = result.stderr.find(_INC_DIR_MARKER_BEGIN)
if index1 == -1:
return []
Expand All @@ -145,7 +151,7 @@ def get_escaped_cxx_inc_directories(repository_ctx, cc):
for p in inc_dirs.split("\n")]


def _add_option_if_supported(repository_ctx, cc, option):
def _is_option_supported(repository_ctx, cc, option):
"""Checks that `option` is supported by the C compiler. Doesn't %-escape the option."""
result = repository_ctx.execute([
cc,
Expand All @@ -155,7 +161,12 @@ def _add_option_if_supported(repository_ctx, cc, option):
"-c",
str(repository_ctx.path("tools/cpp/empty.cc"))
])
return [option] if result.stderr.find(option) == -1 else []
return result.stderr.find(option) == -1


def _add_option_if_supported(repository_ctx, cc, option):
"""Returns `[option]` if supported, `[]` otherwise. Doesn't %-escape the option."""
return [option] if _is_option_supported(repository_ctx, cc, option) else []


def _is_gold_supported(repository_ctx, cc):
Expand Down Expand Up @@ -199,6 +210,11 @@ def _crosstool_content(repository_ctx, cc, cpu_value, darwin):
else:
# cc is inside the repository, don't set -B.
bin_search_flag = []

escaped_cxx_include_directories = _uniq(
get_escaped_cxx_inc_directories(repository_ctx, cc) +
get_escaped_cxx_inc_directories(
repository_ctx, cc, _get_no_canonical_prefixes_opt(repository_ctx, cc)))
return {
"abi_version": escape_string(get_env_var(repository_ctx, "ABI_VERSION", "local", False)),
"abi_libc_version": escape_string(get_env_var(repository_ctx, "ABI_LIBC_VERSION", "local", False)),
Expand Down Expand Up @@ -242,7 +258,7 @@ def _crosstool_content(repository_ctx, cc, cpu_value, darwin):
# Have gcc return the exit code from ld.
repository_ctx, cc, "-pass-exit-codes")
),
"cxx_builtin_include_directory": get_escaped_cxx_inc_directories(repository_ctx, cc),
"cxx_builtin_include_directory": escaped_cxx_include_directories,
"objcopy_embed_flag": ["-I", "binary"],
"unfiltered_cxx_flag":
_get_no_canonical_prefixes_opt(repository_ctx, cc) + [
Expand Down

0 comments on commit b3d52b1

Please sign in to comment.