# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//buildtools/deps_revisions.gni")
import("//build/config/c++/c++.gni")
import("//build/config/clang/clang.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/sysroot.gni")
import("//build/toolchain/toolchain.gni")

# TODO(crbug.com/830987): Come up with a better name for is POSIX + Fuchsia
# configuration.
assert(is_posix || is_fuchsia)

group("posix") {
  visibility = [ "//:optimize_gn_gen" ]
}

# This is included by reference in the //build/config/compiler:runtime_library
# config that is applied to all targets. It is here to separate out the logic
# that is Posix-only. Please see that target for advice on what should go in
# :runtime_library vs. :compiler.
config("runtime_library") {
  asmflags = []
  cflags = []
  cflags_c = []
  cflags_cc = []
  cflags_objc = []
  cflags_objcc = []
  defines = []
  ldflags = []
  lib_dirs = []
  libs = []

  if (use_custom_libcxx) {
    if (libcpp_is_static) {
      # Don't leak any symbols on a static build.
      defines += [
        "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
        "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
      ]
    }
    if (!is_clang) {
      # Gcc has a built-in abs() definition with default visibility.
      # If it was not disabled, it would conflict with libc++'s abs()
      # with hidden visibility.
      cflags += [ "-fno-builtin-abs" ]
    }
    cflags_cc += [
      "-nostdinc++",
      "-isystem" + rebase_path("$libcxx_prefix/include", root_build_dir),
      "-isystem" + rebase_path("$libcxxabi_prefix/include", root_build_dir),
    ]
    defines += [
      "CR_LIBCXX_REVISION=$libcxx_svn_revision",
      "CR_LIBCXXABI_REVISION=$libcxxabi_svn_revision",
    ]

    # Make sure we don't link against libc++ or libstdc++.
    if (is_clang) {
      # //build/config/android:runtime_library adds -nostdlib, which suppresses
      # linking against all system libraries.  -nostdlib++ would be redundant,
      # and would generate an unused warning in this case.
      if (!is_android) {
        ldflags += [ "-nostdlib++" ]
      }
    } else {
      ldflags += [ "-nodefaultlibs" ]

      # Unfortunately, there's no way to disable linking against just libc++
      # (gcc doesn't have -notstdlib++:
      # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83931); -nodefaultlibs
      # removes all of the default libraries, so add back the ones that we need.
      libs += [
        "c",
        "gcc_s",
        "m",
        "rt",
      ]
    }
  }

  if (!is_mac && !is_ios && sysroot != "") {
    # Pass the sysroot to all C compiler variants, the assembler, and linker.
    sysroot_flags = [ "--sysroot=" + rebase_path(sysroot, root_build_dir) ]
    if (is_linux) {
      # This is here so that all files get recompiled after a sysroot roll and
      # when turning the sysroot on or off. (defines are passed via the command
      # line, and build system rebuilds things when their commandline
      # changes). Nothing should ever read this define.
      sysroot_hash =
          exec_script("//build/linux/sysroot_scripts/install-sysroot.py",
                      [ "--print-hash=$current_cpu" ],
                      "trim string",
                      [ "//build/linux/sysroot_scripts/sysroots.json" ])
      defines += [ "CR_SYSROOT_HASH=$sysroot_hash" ]
    }
    asmflags += sysroot_flags

    link_sysroot_flags =
        [ "--sysroot=" + rebase_path(link_sysroot, root_build_dir) ]
    ldflags += link_sysroot_flags

    # When use_custom_libcxx=true, some -isystem flags get passed to
    # cflags_cc to set up libc++ include paths.  We want to make sure
    # the sysroot includes take lower precendence than the libc++
    # ones, so they must appear later in the command line.  However,
    # the gn reference states "These variant-specific versions of
    # cflags* will be appended on the compiler command line after
    # 'cflags'."  Because of this, we must set the sysroot flags for
    # all cflags variants instead of using 'cflags' directly.
    cflags_c += sysroot_flags
    cflags_cc += sysroot_flags
    cflags_objc += sysroot_flags
    cflags_objcc += sysroot_flags

    # Need to get some linker flags out of the sysroot.
    ld_paths = exec_script("sysroot_ld_path.py",
                           [
                             rebase_path("//build/linux/sysroot_ld_path.sh",
                                         root_build_dir),
                             rebase_path(link_sysroot),
                           ],
                           "list lines")
    foreach(ld_path, ld_paths) {
      ld_path = rebase_path(ld_path, root_build_dir)
      ldflags += [
        "-L" + ld_path,
        "-Wl,-rpath-link=" + ld_path,
      ]
    }
  }
}
