|  | # 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. | 
|  |  | 
|  | # Toolchain-related configuration that may be needed outside the context of the | 
|  | # toolchain() rules themselves. | 
|  |  | 
|  | import("//build_overrides/build.gni") | 
|  | import("//build/config/chrome_build.gni") | 
|  |  | 
|  | declare_args() { | 
|  | # If this is set to true, or if LLVM_FORCE_HEAD_REVISION is set to 1 | 
|  | # in the environment, we use the revision in the llvm repo to determine | 
|  | # the CLANG_REVISION to use, instead of the version hard-coded into | 
|  | # //tools/clang/scripts/update.py. This should only be used in | 
|  | # conjunction with setting LLVM_FORCE_HEAD_REVISION in the | 
|  | # environment when `gclient runhooks` is run as well. | 
|  | llvm_force_head_revision = false | 
|  |  | 
|  | # Compile with Xcode version of clang instead of hermetic version shipped | 
|  | # with the build. Used on iOS to ship official builds (as they are built | 
|  | # with the version of clang shipped with Xcode). | 
|  | use_xcode_clang = is_ios && is_official_build | 
|  |  | 
|  | # Used for binary size analysis. | 
|  | # Currently disabled on LLD because of a bug (fixed upstream). | 
|  | # See https://crbug.com/716209. | 
|  | generate_linker_map = is_android && is_official_build | 
|  |  | 
|  | # Use absolute file paths in the compiler diagnostics and __FILE__ macro | 
|  | # if needed. | 
|  | msvc_use_absolute_paths = false | 
|  | } | 
|  |  | 
|  | if (generate_linker_map) { | 
|  | assert( | 
|  | is_official_build, | 
|  | "Linker map files should only be generated when is_official_build = true") | 
|  | assert(current_os == "android" || target_os == "linux", | 
|  | "Linker map files should only be generated for Android and Linux") | 
|  | } | 
|  |  | 
|  | # The path to the hermetic install of Xcode. Only relevant when | 
|  | # use_system_xcode = false. | 
|  | hermetic_xcode_path = | 
|  | rebase_path("//build/${target_os}_files/Xcode.app", "", root_build_dir) | 
|  |  | 
|  | declare_args() { | 
|  | if (is_clang) { | 
|  | # Clang compiler version. Clang files are placed at version-dependent paths. | 
|  | clang_version = "7.0.0" | 
|  | } | 
|  | } | 
|  |  | 
|  | # Check target_os here instead of is_ios as this file is loaded for secondary | 
|  | # toolchain (host toolchain in particular) but the argument is the same for | 
|  | # all toolchains. | 
|  | assert(!use_xcode_clang || target_os == "ios", | 
|  | "Using Xcode's clang is only supported in iOS builds") | 
|  |  | 
|  | # Subdirectory within root_out_dir for shared library files. | 
|  | # TODO(agrieve): GYP sets this to "lib" for Linux & Android, but this won't work | 
|  | #     in GN until support for loadable_module() is added. | 
|  | #     See: https://codereview.chromium.org/1236503002/ | 
|  | shlib_subdir = "." | 
|  |  | 
|  | # Root out dir for shared library files. | 
|  | root_shlib_dir = root_out_dir | 
|  | if (shlib_subdir != ".") { | 
|  | root_shlib_dir += "/$shlib_subdir" | 
|  | } | 
|  |  | 
|  | # Extension for shared library files (including leading dot). | 
|  | if (is_mac || is_ios) { | 
|  | shlib_extension = ".dylib" | 
|  | } else if (is_android && is_component_build) { | 
|  | # By appending .cr, we prevent name collisions with libraries already | 
|  | # loaded by the Android zygote. | 
|  | shlib_extension = ".cr.so" | 
|  | } else if (is_posix || is_fuchsia) { | 
|  | shlib_extension = ".so" | 
|  | } else if (is_win) { | 
|  | shlib_extension = ".dll" | 
|  | } else { | 
|  | assert(false, "Platform not supported") | 
|  | } | 
|  |  | 
|  | # Prefix for shared library files. | 
|  | if (is_posix || is_fuchsia) { | 
|  | shlib_prefix = "lib" | 
|  | } else { | 
|  | shlib_prefix = "" | 
|  | } | 
|  |  | 
|  | # While other "tool"s in a toolchain are specific to the target of that | 
|  | # toolchain, the "stamp" and "copy" tools are really generic to the host; | 
|  | # but each toolchain must define them separately.  GN doesn't allow a | 
|  | # template instantiation inside a toolchain definition, so some boilerplate | 
|  | # has to be repeated in each toolchain to define these two tools.  These | 
|  | # four variables reduce the duplication in that boilerplate. | 
|  | stamp_description = "STAMP {{output}}" | 
|  | copy_description = "COPY {{source}} {{output}}" | 
|  | if (host_os == "win") { | 
|  | _tool_wrapper_path = | 
|  | rebase_path("//build/toolchain/win/tool_wrapper.py", root_build_dir) | 
|  |  | 
|  | stamp_command = "cmd /c type nul > \"{{output}}\"" | 
|  | copy_command = | 
|  | "$python_path $_tool_wrapper_path recursive-mirror {{source}} {{output}}" | 
|  | } else { | 
|  | stamp_command = "touch {{output}}" | 
|  | copy_command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})" | 
|  | } |