# 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/profiler.gni") import("//build/toolchain/rbe.gni") # 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") { # Note that -fvisibility-inlines-hidden is set globally in the compiler # config since that can almost always be applied. if (!enable_profiling && !disable_hidden_visibility) { defines = [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ] cflags = [ "-fvisibility=hidden" ] } } # Settings for executables and shared libraries. config("executable_ldconfig") { if (is_android) { ldflags = [ "-Bdynamic", "-Wl,-z,nocopyreloc", ] } else { # Android doesn't support rpath. ldflags = [ # Want to pass "\$". GN will re-escape as required for ninja. "-Wl,-rpath=\$ORIGIN/", "-Wl,-rpath-link=", # 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", ] } } config("no_exceptions") { no_exceptions_flags = [ "-fno-exceptions" ] cflags_cc = no_exceptions_flags cflags_objcc = no_exceptions_flags } config("relative_paths") { # Make builds independent of absolute file path. The file names # embedded in debugging information will be expressed as relative to # the build directory, e.g. "../.." for an "out/subdir" under //. # This is consistent with the file names in __FILE__ expansions # (e.g. in assertion messages), which the compiler doesn't provide a # way to remap. That way source file names in logging and # symbolization can all be treated the same way. This won't go well # if root_build_dir is not a subdirectory //, but there isn't a better # option to keep all source file name references uniformly relative to # a single root. cflags = [] cflags_objcc = [] absolute_path = rebase_path("//") relative_path = "" if (use_rbe) { # objc builds are always local even when rbe is enabled. cflags_objcc += [ # This makes sure that the DW_AT_comp_dir string (the current # directory while running the compiler, which is the basis for all # relative source file names in the DWARF info) is represented as # relative to //. "-fdebug-prefix-map=$absolute_path=$relative_path", ] } else { cflags += [ "-fdebug-prefix-map=$absolute_path=$relative_path", ] } cflags += [ # This makes sure that include directories in the toolchain are # represented as relative to the build directory (because that's how # we invoke the compiler), rather than absolute. This can affect # __FILE__ expansions (e.g. assertions in system headers). We # normally run a compiler that's someplace within the source tree # (//buildtools/...), so its absolute installation path will have a # prefix matching absolute_path and hence be mapped to relative_path # in the debugging information, so this should actually be # superfluous for purposes of the debugging information. "-no-canonical-prefixes", ] }