# 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("//build/config/c++/c++.gni") import("//build/config/clang/clang.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build/config/sysroot.gni") import("//build/toolchain/toolchain.gni") assert(is_posix) 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 = [] 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), ] # This condition should match the one in buildtools/third_party/libc++abi. if ((is_linux && current_cpu == "arm") || is_fuchsia) { cflags_c += [ "-isystem" + rebase_path("$libunwind_prefix/include", root_build_dir) ] cflags_cc += [ "-isystem" + rebase_path("$libunwind_prefix/include", root_build_dir) ] } # Make sure we don't link against libc++ or libstdc++. if (is_clang) { ldflags += [ "-nostdlib++" ] } else { ldflags += [ "-nodefaultlibs" ] # Unfortunately, there's no way to disable linking against just # libc++ (besides using clang instead of clang++); -nodefaultlibs # removes all of the default libraries, so add back the ones that we # need. libs += [ "c", "m", ] if (!is_mac && !is_fuchsia && !is_android) { libs += [ "gcc_s", "rt", ] } if (is_mac && using_sanitizer) { lib_dirs += [ "//third_party/llvm-build/Release+Asserts/lib/clang/$clang_version/lib/darwin" ] if (is_asan) { libs += [ "clang_rt.asan_osx_dynamic" ] } } } } 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) ] asmflags += sysroot_flags ldflags += 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(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, ] } } }