| # 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, |
| ] |
| } |
| } |
| } |