# pylint: disable=g-bad-file-header
# Copyright 2016 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Configuring the C++ toolchain on Unix platforms."""

load(
    "@bazel_tools//tools/cpp:lib_cc_configure.bzl",
    "auto_configure_fail",
    "auto_configure_warning",
    "escape_string",
    "get_env_var",
    "resolve_labels",
    "split_escaped",
    "which",
)

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.

    Args:
      repo_ctx: repository_ctx object.
      path: an include path to be sanitized.

    Returns:
      Sanitized include path that can be written to the crosstoot. Resulting path
      is absolute if it is outside the repository and relative otherwise.
    """

    repo_root = str(repo_ctx.path("."))

    # We're on UNIX, so the path delimiter is '/'.
    repo_root += "/"
    path = str(repo_ctx.path(path))
    if path.startswith(repo_root):
        return escape_string(path[len(repo_root):])
    return escape_string(path)

def _get_value(it):
    """Convert `it` in serialized protobuf format."""
    if type(it) == "int":
        return str(it)
    elif type(it) == "bool":
        return "true" if it else "false"
    else:
        return "\"%s\"" % it

def _build_crosstool(d, prefix = "  "):
    """Convert `d` to a string version of a CROSSTOOL file content."""
    lines = []
    for k in d:
        if type(d[k]) == "list":
            for it in d[k]:
                lines.append("%s%s: %s" % (prefix, k, _get_value(it)))
        else:
            lines.append("%s%s: %s" % (prefix, k, _get_value(d[k])))
    return "\n".join(lines)

def _build_tool_path(d):
    """Build the list of %-escaped tool_path for the CROSSTOOL file."""
    lines = []
    for k in d:
        lines.append("  tool_path {name: \"%s\" path: \"%s\" }" % (k, escape_string(d[k])))
    return "\n".join(lines)

def _find_tool(repository_ctx, tool, overriden_tools):
    """Find a tool for repository, taking overriden tools into account."""
    if tool in overriden_tools:
        return overriden_tools[tool]
    return which(repository_ctx, tool, "/usr/bin/" + tool)

def _get_tool_paths(repository_ctx, overriden_tools):
    """Compute the path to the various tools. Doesn't %-escape the result!"""
    return dict({
        k: _find_tool(repository_ctx, k, overriden_tools)
        for k in [
            "ar",
            "ld",
            "cpp",
            "gcc",
            "dwp",
            "gcov",
            "nm",
            "objcopy",
            "objdump",
            "strip",
        ]
    }.items())

def _escaped_cplus_include_paths(repository_ctx):
    """Use ${CPLUS_INCLUDE_PATH} to compute the %-escaped list of flags for cxxflag."""
    if "CPLUS_INCLUDE_PATH" in repository_ctx.os.environ:
        result = []
        for p in repository_ctx.os.environ["CPLUS_INCLUDE_PATH"].split(":"):
            p = escape_string(str(repository_ctx.path(p)))  # Normalize the path
            result.append("-I" + p)
        return result
    else:
        return []

_INC_DIR_MARKER_BEGIN = "#include <...>"

# OSX add " (framework directory)" at the end of line, strip it.
_OSX_FRAMEWORK_SUFFIX = " (framework directory)"
_OSX_FRAMEWORK_SUFFIX_LEN = len(_OSX_FRAMEWORK_SUFFIX)

def _cxx_inc_convert(path):
    """Convert path returned by cc -E xc++ in a complete path. Doesn't %-escape the path!"""
    path = path.strip()
    if path.endswith(_OSX_FRAMEWORK_SUFFIX):
        path = path[:-_OSX_FRAMEWORK_SUFFIX_LEN].strip()
    return path

def get_escaped_cxx_inc_directories(repository_ctx, cc, lang_flag, additional_flags = []):
    """Compute the list of default %-escaped C++ include directories."""
    result = repository_ctx.execute([cc, "-E", lang_flag, "-", "-v"] + additional_flags)
    index1 = result.stderr.find(_INC_DIR_MARKER_BEGIN)
    if index1 == -1:
        return []
    index1 = result.stderr.find("\n", index1)
    if index1 == -1:
        return []
    index2 = result.stderr.rfind("\n ")
    if index2 == -1 or index2 < index1:
        return []
    index2 = result.stderr.find("\n", index2 + 1)
    if index2 == -1:
        inc_dirs = result.stderr[index1 + 1:]
    else:
        inc_dirs = result.stderr[index1 + 1:index2].strip()

    return [
        _prepare_include_path(repository_ctx, _cxx_inc_convert(p))
        for p in inc_dirs.split("\n")
    ]

def _is_compiler_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,
        option,
        "-o",
        "/dev/null",
        "-c",
        str(repository_ctx.path("tools/cpp/empty.cc")),
    ])
    return result.stderr.find(option) == -1

def _is_linker_option_supported(repository_ctx, cc, option, pattern):
    """Checks that `option` is supported by the C linker. Doesn't %-escape the option."""
    result = repository_ctx.execute([
        cc,
        option,
        "-o",
        "/dev/null",
        str(repository_ctx.path("tools/cpp/empty.cc")),
    ])
    return result.stderr.find(pattern) == -1

def _is_gold_supported(repository_ctx, cc):
    """Checks that `gold` is supported by the C compiler."""
    result = repository_ctx.execute([
        cc,
        "-fuse-ld=gold",
        "-o",
        "/dev/null",
        # Some macos clang versions don't fail when setting -fuse-ld=gold, adding
        # these lines to force it to. This also means that we will not detect
        # gold when only a very old (year 2010 and older) is present.
        "-Wl,--start-lib",
        "-Wl,--end-lib",
        str(repository_ctx.path("tools/cpp/empty.cc")),
    ])
    return result.return_code == 0

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

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

def _get_no_canonical_prefixes_opt(repository_ctx, cc):
    # If the compiler sometimes rewrites paths in the .d files without symlinks
    # (ie when they're shorter), it confuses Bazel's logic for verifying all
    # #included header files are listed as inputs to the action.

    # The '-fno-canonical-system-headers' should be enough, but clang does not
    # support it, so we also try '-no-canonical-prefixes' if first option does
    # not work.
    opt = _add_compiler_option_if_supported(
        repository_ctx,
        cc,
        "-fno-canonical-system-headers",
    )
    if len(opt) == 0:
        return _add_compiler_option_if_supported(
            repository_ctx,
            cc,
            "-no-canonical-prefixes",
        )
    return opt

def _crosstool_content(repository_ctx, cc, cpu_value, darwin):
    """Return the content for the CROSSTOOL file, in a dictionary."""
    supports_gold_linker = _is_gold_supported(repository_ctx, cc)
    cc_path = repository_ctx.path(cc)
    if not str(cc_path).startswith(str(repository_ctx.path(".")) + "/"):
        # cc is outside the repository, set -B
        bin_search_flag = ["-B" + escape_string(str(cc_path.dirname))]
    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, "-xc") +
        get_escaped_cxx_inc_directories(repository_ctx, cc, "-xc++") +
        get_escaped_cxx_inc_directories(
            repository_ctx,
            cc,
            "-xc",
            _get_no_canonical_prefixes_opt(repository_ctx, cc),
        ) +
        get_escaped_cxx_inc_directories(
            repository_ctx,
            cc,
            "-xc++",
            _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)),
        "builtin_sysroot": "",
        "compiler": escape_string(get_env_var(repository_ctx, "BAZEL_COMPILER", "compiler", False)),
        "host_system_name": escape_string(get_env_var(repository_ctx, "BAZEL_HOST_SYSTEM", "local", False)),
        "needsPic": True,
        "supports_gold_linker": supports_gold_linker,
        "supports_incremental_linker": False,
        "supports_fission": False,
        "supports_interface_shared_objects": False,
        "supports_normalizing_ar": False,
        "supports_start_end_lib": supports_gold_linker,
        "target_libc": "macosx" if darwin else escape_string(get_env_var(repository_ctx, "BAZEL_TARGET_LIBC", "local", False)),
        "target_cpu": escape_string(get_env_var(repository_ctx, "BAZEL_TARGET_CPU", cpu_value, False)),
        "target_system_name": escape_string(get_env_var(repository_ctx, "BAZEL_TARGET_SYSTEM", "local", False)),
        "cxx_flag": [
            "-std=c++0x",
        ] + _escaped_cplus_include_paths(repository_ctx),
        "linker_flag": (
            ["-fuse-ld=gold"] if supports_gold_linker else []
        ) + _add_linker_option_if_supported(
            repository_ctx,
            cc,
            "-Wl,-no-as-needed",
            "-no-as-needed",
        ) + _add_linker_option_if_supported(
            repository_ctx,
            cc,
            "-Wl,-z,relro,-z,now",
            "-z",
        ) + (
            [
                "-undefined",
                "dynamic_lookup",
                "-headerpad_max_install_names",
            ] if darwin else bin_search_flag + [
                # Always have -B/usr/bin, see https://github.com/bazelbuild/bazel/issues/760.
                "-B/usr/bin",
                # Gold linker only? Can we enable this by default?
                # "-Wl,--warn-execstack",
                # "-Wl,--detect-odr-violations"
            ] + _add_compiler_option_if_supported(
                # Have gcc return the exit code from ld.
                repository_ctx,
                cc,
                "-pass-exit-codes",
            )
        ) + split_escaped(
            get_env_var(repository_ctx, "BAZEL_LINKOPTS", "-lstdc++:-lm", False),
            ":",
        ),
        "cxx_builtin_include_directory": escaped_cxx_include_directories,
        "objcopy_embed_flag": ["-I", "binary"],
        "unfiltered_cxx_flag": _get_no_canonical_prefixes_opt(repository_ctx, cc) + [
            # Make C++ compilation deterministic. Use linkstamping instead of these
            # compiler symbols.
            "-Wno-builtin-macro-redefined",
            "-D__DATE__=\\\"redacted\\\"",
            "-D__TIMESTAMP__=\\\"redacted\\\"",
            "-D__TIME__=\\\"redacted\\\"",
        ],
        "compiler_flag": [
            # Security hardening requires optimization.
            # We need to undef it as some distributions now have it enabled by default.
            "-U_FORTIFY_SOURCE",
            "-fstack-protector",
            # All warnings are enabled. Maybe enable -Werror as well?
            "-Wall",
            # Enable a few more warnings that aren't part of -Wall.
        ] + ((
            _add_compiler_option_if_supported(repository_ctx, cc, "-Wthread-safety") +
            _add_compiler_option_if_supported(repository_ctx, cc, "-Wself-assign")
        ) if darwin else bin_search_flag + [
            # Always have -B/usr/bin, see https://github.com/bazelbuild/bazel/issues/760.
            "-B/usr/bin",
        ]) + (
            # Disable problematic warnings.
            _add_compiler_option_if_supported(repository_ctx, cc, "-Wunused-but-set-parameter") +
            # has false positives
            _add_compiler_option_if_supported(repository_ctx, cc, "-Wno-free-nonheap-object") +
            # Enable coloring even if there's no attached terminal. Bazel removes the
            # escape sequences if --nocolor is specified.
            _add_compiler_option_if_supported(repository_ctx, cc, "-fcolor-diagnostics")
        ) + [
            # Keep stack frames for debugging, even in opt mode.
            "-fno-omit-frame-pointer",
        ],
    }

def _opt_content(repository_ctx, cc, darwin):
    """Return the content of the opt specific section of the CROSSTOOL file."""
    return {
        "compiler_flag": [
            # No debug symbols.
            # Maybe we should enable https://gcc.gnu.org/wiki/DebugFission for opt or
            # even generally? However, that can't happen here, as it requires special
            # handling in Bazel.
            "-g0",

            # Conservative choice for -O
            # -O3 can increase binary size and even slow down the resulting binaries.
            # Profile first and / or use FDO if you need better performance than this.
            "-O2",

            # Security hardening on by default.
            # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
            "-D_FORTIFY_SOURCE=1",

            # Disable assertions
            "-DNDEBUG",

            # Removal of unused code and data at link time (can this increase binary size in some cases?).
            "-ffunction-sections",
            "-fdata-sections",
        ],
        "linker_flag": (
            [] if darwin else _add_linker_option_if_supported(
                repository_ctx,
                cc,
                "-Wl,--gc-sections",
                "-gc-sections",
            )
        ),
    }

def _dbg_content():
    """Return the content of the dbg specific section of the CROSSTOOL file."""

    # Enable debug symbols
    return {"compiler_flag": "-g"}

def get_env(repository_ctx):
    """Convert the environment in a list of export if in Homebrew. Doesn't %-escape the result!"""
    env = repository_ctx.os.environ
    if "HOMEBREW_RUBY_PATH" in env:
        return "\n".join([
            "export %s='%s'" % (k, env[k].replace("'", "'\\''"))
            for k in env
            if k != "_" and k.find(".") == -1
        ])
    else:
        return ""

def _coverage_feature(repository_ctx, darwin):
    use_llvm_cov = "1" == get_env_var(
        repository_ctx,
        "BAZEL_USE_LLVM_NATIVE_COVERAGE",
        default = "0",
        enable_warning = False,
    )
    if darwin or use_llvm_cov:
        compile_flags = """flag_group {
        flag: '-fprofile-instr-generate'
        flag: '-fcoverage-mapping'
      }"""
        link_flags = """flag_group {
        flag: '-fprofile-instr-generate'
      }"""
    else:
        # gcc requires --coverage being passed for compilation and linking
        # https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#Instrumentation-Options
        compile_flags = """flag_group {
        flag: '--coverage'
      }"""
        link_flags = """flag_group {
        flag: '--coverage'
      }"""

    # Note that we also set --coverage for c++-link-nodeps-dynamic-library. The
    # generated code contains references to gcov symbols, and the dynamic linker
    # can't resolve them unless the library is linked against gcov.
    return """
    feature {
      name: 'coverage'
      provides: 'profile'
      flag_set {
        action: 'preprocess-assemble'
        action: 'c-compile'
        action: 'c++-compile'
        action: 'c++-header-parsing'
        action: 'c++-header-preprocessing'
        action: 'c++-module-compile'
        """ + compile_flags + """
      }
      flag_set {
        action: 'c++-link-dynamic-library'
        action: 'c++-link-nodeps-dynamic-library'
        action: 'c++-link-executable'
        """ + link_flags + """
      }
    }
  """

def _find_generic(repository_ctx, name, env_name, overriden_tools, warn = False):
    """Find a generic C++ toolchain tool. Doesn't %-escape the result."""

    if name in overriden_tools:
        return overriden_tools[name]

    result = name
    env_value = repository_ctx.os.environ.get(env_name)
    env_value_with_paren = ""
    if env_value != None:
        env_value = env_value.strip()
        if env_value:
            result = env_value
            env_value_with_paren = " (%s)" % env_value
    if result.startswith("/"):
        # Absolute path, maybe we should make this suported by our which function.
        return result
    result = repository_ctx.which(result)
    if result == None:
        msg = ("Cannot find %s or %s%s; either correct your path or set the %s" +
               " environment variable") % (name, env_name, env_value_with_paren, env_name)
        if warn:
            auto_configure_warning(msg)
        else:
            auto_configure_fail(msg)
    return result

def find_cc(repository_ctx, overriden_tools):
    return _find_generic(repository_ctx, "gcc", "CC", overriden_tools)

def configure_unix_toolchain(repository_ctx, cpu_value, overriden_tools):
    """Configure C++ toolchain on Unix platforms."""
    paths = resolve_labels(repository_ctx, [
        "@bazel_tools//tools/cpp:BUILD.tpl",
        "@bazel_tools//tools/cpp:CROSSTOOL.tpl",
        "@bazel_tools//tools/cpp:linux_cc_wrapper.sh.tpl",
        "@bazel_tools//tools/cpp:osx_cc_wrapper.sh.tpl",
    ])

    repository_ctx.file("tools/cpp/empty.cc", "int main() {}")
    darwin = cpu_value == "darwin"

    cc = _find_generic(repository_ctx, "gcc", "CC", overriden_tools)
    overriden_tools = dict(overriden_tools)
    overriden_tools["gcc"] = cc
    overriden_tools["gcov"] = _find_generic(
        repository_ctx,
        "gcov",
        "GCOV",
        overriden_tools,
        warn = True,
    )
    if darwin:
        overriden_tools["gcc"] = "cc_wrapper.sh"
        overriden_tools["ar"] = "/usr/bin/libtool"

    tool_paths = _get_tool_paths(repository_ctx, overriden_tools)
    crosstool_content = _crosstool_content(repository_ctx, cc, cpu_value, darwin)
    opt_content = _opt_content(repository_ctx, cc, darwin)
    dbg_content = _dbg_content()

    repository_ctx.template(
        "BUILD",
        paths["@bazel_tools//tools/cpp:BUILD.tpl"],
        {
            "%{name}": cpu_value,
            "%{supports_param_files}": "0" if darwin else "1",
            "%{cc_compiler_deps}": ":cc_wrapper" if darwin else ":empty",
            "%{compiler}": get_env_var(
                repository_ctx,
                "BAZEL_COMPILER",
                "compiler",
                False,
            ),
        },
    )

    cc_wrapper_src = (
        "@bazel_tools//tools/cpp:osx_cc_wrapper.sh.tpl" if darwin else "@bazel_tools//tools/cpp:linux_cc_wrapper.sh.tpl"
    )
    repository_ctx.template(
        "cc_wrapper.sh",
        paths[cc_wrapper_src],
        {
            "%{cc}": escape_string(str(cc)),
            "%{env}": escape_string(get_env(repository_ctx)),
        },
    )

    repository_ctx.template(
        "CROSSTOOL",
        paths["@bazel_tools//tools/cpp:CROSSTOOL.tpl"],
        {
            "%{cpu}": escape_string(cpu_value),
            "%{default_toolchain_name}": escape_string(
                get_env_var(
                    repository_ctx,
                    "CC_TOOLCHAIN_NAME",
                    "local",
                    False,
                ),
            ),
            "%{toolchain_name}": escape_string(
                get_env_var(repository_ctx, "CC_TOOLCHAIN_NAME", "local", False),
            ),
            "%{content}": _build_crosstool(crosstool_content) + "\n" +
                          _build_tool_path(tool_paths),
            "%{opt_content}": _build_crosstool(opt_content, "    "),
            "%{dbg_content}": _build_crosstool(dbg_content, "    "),
            "%{cxx_builtin_include_directory}": "",
            "%{coverage}": _coverage_feature(repository_ctx, darwin),
            "%{msvc_env_tmp}": "",
            "%{msvc_env_path}": "",
            "%{msvc_env_include}": "",
            "%{msvc_env_lib}": "",
            "%{msvc_cl_path}": "",
            "%{msvc_ml_path}": "",
            "%{msvc_link_path}": "",
            "%{msvc_lib_path}": "",
            "%{msys_x64_mingw_content}": "",
            "%{dbg_mode_debug}": "",
            "%{fastbuild_mode_debug}": "",
            "%{compilation_mode_content}": "",
        },
    )
