# Copyright 2014 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("//build/config/c++/c++.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/sysroot.gni")
import("//build/toolchain/toolchain.gni")

declare_args() {
  # When non empty, overrides the target rpath value. This allows a user to
  # make a Chromium build where binaries and shared libraries are meant to be
  # installed into separate directories, like /usr/bin/chromium and
  # /usr/lib/chromium for instance. It is useful when a build system that
  # generates a whole target root filesystem (like Yocto) is used on top of gn,
  # especially when cross-compiling.
  # Note: this gn arg is similar to gyp target_rpath generator flag.
  gcc_target_rpath = ""
  ldso_path = ""
}

# This config causes functions not to be automatically exported from shared
# libraries. By default, all symbols are exported but this means there are
# lots of exports that slow everything down. In general we explicitly mark
# which functiosn we want to export from components.
#
# Some third_party code assumes all functions are exported so this is separated
# into its own config so such libraries can remove this config to make symbols
# public again.
#
# See http://gcc.gnu.org/wiki/Visibility
config("symbol_visibility_hidden") {
  cflags = [ "-fvisibility=hidden" ]

  # Visibility attribute is not supported on AIX.
  if (current_os != "aix") {
    cflags_cc = [ "-fvisibility-inlines-hidden" ]
    cflags_objcc = cflags_cc
  }
}

# This config is usually set when :symbol_visibility_hidden is removed.
# It's often a good idea to set visibility explicitly, as there're flags
# which would error out otherwise (e.g. -fsanitize=cfi-unrelated-cast)
config("symbol_visibility_default") {
  cflags = [ "-fvisibility=default" ]
}

# The rpath is the dynamic library search path. Setting this config on a link
# step will put the directory where the build generates shared libraries into
# the rpath.
#
# It's important that this *not* be used for release builds we push out.
# Chrome uses some setuid binaries, and hard links preserve setuid bits. An
# unprivileged user could gain root privileges by hardlinking a setuid
# executable and then adding in whatever binaries they want to run into the lib
# directory.
#
# Example bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=520126
#
# This is required for component builds since the build generates many shared
# libraries in the build directory that we expect to be automatically loaded.
# It will be automatically applied in this case by :executable_ldconfig.
#
# In non-component builds, certain test binaries may expect to load dynamic
# libraries from the current directory. As long as these aren't distributed,
# this is OK. For these cases use something like this:
#
#  if (is_linux && !is_component_build) {
#    configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
#  }
config("rpath_for_built_shared_libraries") {
  if (!is_android) {
    # Note: Android doesn't support rpath.
    if (shlib_subdir != ".") {
      rpath_link = "${shlib_subdir}/"
    } else {
      rpath_link = "."
    }
    if (current_toolchain != default_toolchain || gcc_target_rpath == "") {
      ldflags = [
        # Want to pass "\$". GN will re-escape as required for ninja.
        "-Wl,-rpath=\$ORIGIN/${rpath_link}",
        "-Wl,-rpath-link=${rpath_link}",
      ]
    } else {
      ldflags = [
        "-Wl,-rpath=${gcc_target_rpath}",
        "-Wl,-rpath-link=${rpath_link}",
      ]
    }
    if (current_toolchain == default_toolchain && ldso_path != "") {
      ldflags += [ "-Wl,--dynamic-linker=${ldso_path}" ]
    }
  }
}

# Settings for executables.
config("executable_ldconfig") {
  # WARNING! //sandbox/linux:chrome_sandbox will not pick up this
  # config, because it is a setuid binary that needs special flags.
  # If you add things to this config, make sure you check to see
  # if they should be added to that target as well.
  ldflags = []
  if (is_android) {
    ldflags += [
      "-Bdynamic",
      "-Wl,-z,nocopyreloc",
    ]
  } else {
    # See the rpath_for... config above for why this is necessary for component
    # builds. Sanitizers use a custom libc++ where this is also necessary.
    if (is_component_build || using_sanitizer || !libcpp_is_static) {
      configs = [ ":rpath_for_built_shared_libraries" ]
    }
    if (current_cpu == "mipsel" || current_cpu == "mips64el") {
      ldflags += [ "-pie" ]
    }
  }

  if (!is_android && current_os != "aix") {
    # Find the path containing shared libraries for this toolchain
    # relative to the build directory. ${root_out_dir} will be a
    # subdirectory of ${root_build_dir} when cross compiling.
    _rpath_link = rebase_path(root_out_dir, root_build_dir)
    if (shlib_subdir != ".") {
      _rpath_link += "/$shlib_subdir"
    }
    ldflags += [
      "-Wl,-rpath-link=$_rpath_link",

      # TODO(GYP): Do we need a check on the binutils version here?
      #
      # Newer binutils don't set DT_RPATH unless you disable "new" dtags
      # and the new DT_RUNPATH doesn't work without --no-as-needed flag.
      "-Wl,--disable-new-dtags",
    ]
  }
}
