Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  BUILD.gn   Sprache: unbekannt

 
Spracherkennung für: .gn vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

# Copyright (c) 2013 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("//chromium/build/config/clang/clang.gni")
import("//chromium/build/config/compiler/compiler.gni")
import("//chromium/build/config/rust.gni")
import("//chromium/build/config/sanitizers/sanitizers.gni")
import("//chromium/build/config/win/visual_studio_version.gni")
import("//chromium/build/toolchain/cc_wrapper.gni")
import("//chromium/build/toolchain/goma.gni")
import("//chromium/build/toolchain/rbe.gni")
import("//chromium/build/toolchain/toolchain.gni")

# Should only be running on Windows.
assert(is_win)

# Setup the Visual Studio state.
#
# Its arguments are the VS path and the compiler wrapper tool. It will write
# "environment.x86" and "environment.x64" to the build directory and return a
# list to us.

# This tool will is used as a wrapper for various commands below.
tool_wrapper_path = rebase_path("tool_wrapper.py", root_build_dir)

if (use_rbe) {
  goma_prefix = ""
  rbe_prefix = "${rbe_bin_dir}/rewrapper -cfg=${rbe_cc_cfg_file} -exec_root=${rbe_exec_root} "
  clang_prefix = rbe_prefix
} else if (use_goma) {
  if (host_os == "win") {
    goma_prefix = "$goma_dir/gomacc.exe "
  } else {
    goma_prefix = "$goma_dir/gomacc "
  }
  clang_prefix = goma_prefix
} else {
  goma_prefix = ""
  if (cc_wrapper != "") {
    clang_prefix = cc_wrapper + " "
  } else {
    clang_prefix = ""
  }
}

# Copy the VS runtime DLL for the default toolchain to the root build directory
# so things will run.
if (current_toolchain == default_toolchain) {
  if (is_debug) {
    configuration_name = "Debug"
  } else {
    configuration_name = "Release"
  }
  exec_script("../../vs_toolchain.py",
              [
                "copy_dlls",
                rebase_path(root_build_dir),
                configuration_name,
                target_cpu,
              ])
}

if (host_os == "win") {
  clang_cl = "clang-cl.exe"
} else {
  clang_cl = "clang-cl"
}

# Parameters:
#   environment: File name of environment file.
#
# You would also define a toolchain_args variable with at least these set:
#   target_cpu: target_cpu to pass as a build arg
#   current_os: current_os to pass as a build arg
template("msvc_toolchain") {
  toolchain(target_name) {
    # When invoking this toolchain not as the default one, these args will be
    # passed to the build. They are ignored when this is the default toolchain.
    assert(defined(invoker.toolchain_args))
    toolchain_args = {
      if (defined(invoker.toolchain_args)) {
        forward_variables_from(invoker.toolchain_args, "*")
      }

      # This value needs to be passed through unchanged.
      host_toolchain = host_toolchain
    }

    # Make these apply to all tools below.
    lib_switch = ""
    lib_dir_switch = "/LIBPATH:"

    # Object files go in this directory.
    object_subdir = "{{target_out_dir}}/{{label_name}}"

    env = invoker.environment

    cl = invoker.cl

    if (use_lld) {
      if (host_os == "win") {
        lld_link = "lld-link.exe"
      } else {
        lld_link = "lld-link"
      }
      prefix = rebase_path("$clang_base_path/bin", root_build_dir)

      # lld-link includes a replacement for lib.exe that can produce thin
      # archives and understands bitcode (for lto builds).
      link = "$prefix/$lld_link"
      if (host_os == "win") {
        # Flip the slashes so that copy/paste of the commands works.
        link = string_replace(link, "/", "\\")
      }
      lib = "$link /lib"
      if (host_os != "win") {
        # See comment adding --rsp-quoting to $cl above for more information.
        link = "$link --rsp-quoting=posix"
      }
    } else {
      lib = "lib.exe"
      link = "link.exe"
    }

    # If possible, pass system includes as flags to the compiler.  When that's
    # not possible, load a full environment file (containing %INCLUDE% and
    # %PATH%) -- e.g. 32-bit MSVS builds require %PATH% to be set and just
    # passing in a list of include directories isn't enough.
    if (defined(invoker.sys_include_flags)) {
      env_wrapper = ""
      sys_include_flags =
          "${invoker.sys_include_flags} "  # Note trailing space.
    } else {
      # clang-cl doesn't need this env hoop, so omit it there.
      assert((defined(toolchain_args.is_clang) && !toolchain_args.is_clang) ||
             !is_clang)
      env_wrapper = "ninja -t msvc -e $env -- "  # Note trailing space.
      sys_include_flags = ""
    }

    # ninja does not have -t msvc other than windows, and lld doesn't depend on
    # mt.exe in PATH on non-Windows, so it's not needed there anyways.
    if (host_os != "win") {
      linker_wrapper = ""
      sys_lib_flags = "${invoker.sys_lib_flags} "  # Note trailing space.
    } else if (defined(invoker.sys_lib_flags)) {
      # Invoke ninja as wrapper instead of tool wrapper, because python
      # invocation requires higher cpu usage compared to ninja invocation, and
      # the python wrapper is only needed to work around link.exe problems.
      # TODO(thakis): Remove wrapper once lld-link can merge manifests without
      # relying on mt.exe being in %PATH% on Windows, https://crbug.com/872740
      linker_wrapper = "ninja -t msvc -e $env -- "  # Note trailing space.
      sys_lib_flags = "${invoker.sys_lib_flags} "  # Note trailing space.
    } else {
      # Note trailing space:
      linker_wrapper =
          "$python_path $tool_wrapper_path link-wrapper $env False "
      sys_lib_flags = ""
    }

    if (defined(toolchain_args.use_clang_coverage)) {
      toolchain_use_clang_coverage = toolchain_args.use_clang_coverage
    } else {
      toolchain_use_clang_coverage = use_clang_coverage
    }

    if (toolchain_use_clang_coverage) {
      assert(toolchain_args.is_clang,
             "use_clang_coverage should only be used with Clang")
      if (defined(toolchain_args.coverage_instrumentation_input_file)) {
        toolchain_coverage_instrumentation_input_file =
            toolchain_args.coverage_instrumentation_input_file
      } else {
        toolchain_coverage_instrumentation_input_file =
            coverage_instrumentation_input_file
      }

      coverage_wrapper =
          rebase_path("//chromium/build/toolchain/clang_code_coverage_wrapper.py",
                      root_build_dir)
      coverage_wrapper = coverage_wrapper + " --target-os=" + target_os
      if (toolchain_coverage_instrumentation_input_file != "") {
        coverage_wrapper =
            coverage_wrapper + " --files-to-instrument=" +
            rebase_path(toolchain_coverage_instrumentation_input_file,
                        root_build_dir)
      }
      coverage_wrapper = "$python_path " + coverage_wrapper + " "
    } else {
      coverage_wrapper = ""
    }

    # Disabled with cc_wrapper because of https://github.com/mozilla/sccache/issues/1013
    if (toolchain_args.is_clang && cc_wrapper == "") {
      # This flag omits system includes from /showIncludes output, to reduce the
      # amount of data to parse and store in .ninja_deps. We do this on non-Windows too,
      # and already make sure rebuilds after win sdk / libc++ / clang header updates happen via
      # changing commandline flags.
      show_includes = "/showIncludes:user"
    } else {
      show_includes = "/showIncludes"
    }

    tool("cc") {
      precompiled_header_type = "msvc"
      pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"

      # Label names may have spaces in them so the pdbname must be quoted. The
      # source and output don't need to be quoted because GN knows they're a
      # full file name and will quote automatically when necessary.
      depsformat = "msvc"
      description = "CC {{output}}"
      outputs = [ "$object_subdir/{{source_name_part}}.obj" ]

      # Note that the code coverage wrapper scripts assumes that {{source}}
      # comes immediately after /c.
      command = "$coverage_wrapper$env_wrapper$cl /c {{source}} /nologo $show_includes $sys_include_flags{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} /Fo{{output}} /Fd\"$pdbname\""
    }

    tool("cxx") {
      precompiled_header_type = "msvc"

      # The PDB name needs to be different between C and C++ compiled files.
      pdbname = "{{target_out_dir}}/{{label_name}}_cc.pdb"

      # See comment in CC tool about quoting.
      depsformat = "msvc"
      description = "CXX {{output}}"
      outputs = [ "$object_subdir/{{source_name_part}}.obj" ]

      # Note that the code coverage wrapper scripts assumes that {{source}}
      # comes immediately after /c.
      command = "$coverage_wrapper$env_wrapper$cl /c {{source}} /Fo{{output}} /nologo $show_includes $sys_include_flags{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} /Fd\"$pdbname\""
    }

    tool("rc") {
      command = "$python_path $tool_wrapper_path rc-wrapper $env rc.exe /nologo $sys_include_flags{{defines}} {{include_dirs}} /fo{{output}} {{source}}"
      depsformat = "msvc"
      outputs = [ "$object_subdir/{{source_name_part}}.res" ]
      description = "RC {{output}}"
    }

    tool("asm") {
      is_msvc_assembler = true

      if (toolchain_args.target_cpu == "arm64") {
        if (is_clang) {
          prefix = rebase_path("$clang_base_path/bin", root_build_dir)
          ml = "${clang_prefix}${prefix}/${clang_cl} --target=arm64-windows"
          if (host_os == "win") {
            # Flip the slashes so that copy/paste of the command works.
            ml = string_replace(ml, "/", "\\")
          }
          ml += " -c -o{{output}}"
          is_msvc_assembler = false
        } else {
          # Only affects Arm builds with is_clang = false, implemented for building
          # V8 for Windows on Arm systems with the MSVC toolchain.
          ml = "armasm64.exe"
        }
      } else {
        # x86/x64 builds always use the MSVC assembler.
        if (toolchain_args.target_cpu == "x64") {
          ml = "ml64.exe"
        } else {
          ml = "ml.exe"
        }
      }

      if (is_msvc_assembler) {
        ml += " /nologo /Fo{{output}}"

        # Suppress final-stage linking on x64/x86 builds. (Armasm64 does not
        # require /c because it doesn't support linking.)
        if (toolchain_args.target_cpu != "arm64") {
          ml += " /c"
        }
        if (use_lld) {
          # Wrap ml(64).exe with a script that makes its output deterministic.
          # It's lld only because the script zaps obj Timestamp which
          # link.exe /incremental looks at.
          # TODO(https://crbug.com/762167): If we end up writing an llvm-ml64,
          # make sure it has deterministic output (maybe with /Brepro or
          # something) and remove this wrapper.
          ml_py = rebase_path("ml.py", root_build_dir)
          ml = "$python_path $ml_py $ml"
        }
      }
      if (toolchain_args.target_cpu != "arm64" || is_clang) {
        command = "$python_path $tool_wrapper_path asm-wrapper $env $ml {{defines}} {{include_dirs}} {{asmflags}} {{source}}"
      } else {
        # armasm64.exe does not support definitions passed via the command line.
        # (Fortunately, they're not needed for compiling the V8 snapshot, which
        # is the only time this assembler is required.)
        command = "$python_path $tool_wrapper_path asm-wrapper $env $ml {{include_dirs}} {{asmflags}} {{source}}"
      }

      description = "ASM {{output}}"
      outputs = [ "$object_subdir/{{source_name_part}}.obj" ]
    }

    if (toolchain_has_rust) {
      tool("rust_staticlib") {
        rust_outfile = "{{target_out_dir}}/{{crate_name}}.lib"
        depfile = "{{crate_name}}.d"
        command = "${rust_prefix}/rustc $rustc_common_args --emit=dep-info={{target_out_dir}}/$depfile,link -o $rust_outfile"
        description = "RUST $rust_outfile"
        outputs = [ rust_outfile ]
      }

      tool("rust_rlib") {
        rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.rlib"
        depfile = "{{crate_name}}.d"
        command = "${rust_prefix}/rustc $rustc_common_args --emit=dep-info={{target_out_dir}}/$depfile,link -o $rust_outfile"
        description = "RUST $rust_outfile"
        outputs = [ rust_outfile ]
      }

      if (rustc_can_link) {
        tool("rust_bin") {
          rust_outfile = "{{root_out_dir}}/{{crate_name}}.exe"
          depfile = "{{crate_name}}.d"
          command = "${rust_prefix}/rustc $rustc_common_args --emit=dep-info={{target_out_dir}}/$depfile,link -o $rust_outfile"
          description = "RUST $rust_outfile"
          outputs = [ rust_outfile ]
        }

        tool("rust_cdylib") {
          rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.dll"
          depfile = "{{crate_name}}.d"
          command = "${rust_prefix}/rustc $rustc_common_args --emit=dep-info={{target_out_dir}}/$depfile,link -o $rust_outfile"
          description = "RUST $rust_outfile"
          outputs = [ rust_outfile ]
        }

        tool("rust_macro") {
          rust_outfile = "{{target_out_dir}}/lib{{crate_name}}.dll"
          depfile = "{{crate_name}}.d"
          command = "${rust_prefix}/rustc $rustc_common_args --emit=dep-info={{target_out_dir}}/$depfile,link -o $rust_outfile"
          description = "RUST $rust_outfile"
          outputs = [ rust_outfile ]
        }
      }
    }

    tool("alink") {
      rspfile = "{{output}}.rsp"
      command = "$linker_wrapper$lib /OUT:{{output}} /nologo ${sys_lib_flags}{{arflags}} @$rspfile"
      description = "LIB {{output}}"
      outputs = [
        # Ignore {{output_extension}} and always use .lib, there's no reason to
        # allow targets to override this extension on Windows.
        "{{output_dir}}/{{target_output_name}}.lib",
      ]
      default_output_extension = ".lib"
      default_output_dir = "{{target_out_dir}}"

      # The use of inputs_newline is to work around a fixed per-line buffer
      # size in the linker.
      rspfile_content = "{{inputs_newline}}"
    }

    tool("solink") {
      # E.g. "foo.dll":
      dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
      libname = "${dllname}.lib"  # e.g. foo.dll.lib
      pdbname = "${dllname}.pdb"
      rspfile = "${dllname}.rsp"
      pool = "//chromium/build/toolchain:link_pool($default_toolchain)"

      command = "$linker_wrapper$link /OUT:$dllname /nologo ${sys_lib_flags}/IMPLIB:$libname /DLL /PDB:$pdbname @$rspfile"

      default_output_extension = ".dll"
      default_output_dir = "{{root_out_dir}}"
      description = "LINK(DLL) {{output}}"
      outputs = [
        dllname,
        libname,
        pdbname,
      ]
      link_output = libname
      depend_output = libname
      runtime_outputs = [
        dllname,
        pdbname,
      ]

      # Since the above commands only updates the .lib file when it changes, ask
      # Ninja to check if the timestamp actually changed to know if downstream
      # dependencies should be recompiled.
      restat = true

      # The use of inputs_newline is to work around a fixed per-line buffer
      # size in the linker.
      rspfile_content =
          "{{libs}} {{solibs}} {{inputs_newline}} {{ldflags}} {{rlibs}}"
    }

    tool("solink_module") {
      # E.g. "foo.dll":
      dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
      pdbname = "${dllname}.pdb"
      rspfile = "${dllname}.rsp"
      pool = "//chromium/build/toolchain:link_pool($default_toolchain)"

      command = "$linker_wrapper$link /OUT:$dllname /nologo ${sys_lib_flags}/DLL /PDB:$pdbname @$rspfile"

      default_output_extension = ".dll"
      default_output_dir = "{{root_out_dir}}"
      description = "LINK_MODULE(DLL) {{output}}"
      outputs = [
        dllname,
        pdbname,
      ]
      runtime_outputs = outputs

      # The use of inputs_newline is to work around a fixed per-line buffer
      # size in the linker.
      rspfile_content =
          "{{libs}} {{solibs}} {{inputs_newline}} {{ldflags}} {{rlibs}}"
    }

    tool("link") {
      exename = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
      pdbname = "$exename.pdb"
      rspfile = "$exename.rsp"
      pool = "//chromium/build/toolchain:link_pool($default_toolchain)"

      command = "$linker_wrapper$link /OUT:$exename /nologo ${sys_lib_flags} /PDB:$pdbname @$rspfile"

      default_output_extension = ".exe"
      default_output_dir = "{{root_out_dir}}"
      description = "LINK {{output}}"
      outputs = [
        exename,
        pdbname,
      ]
      runtime_outputs = outputs

      # The use of inputs_newline is to work around a fixed per-line buffer
      # size in the linker.
      rspfile_content =
          "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}} {{rlibs}}"
    }

    # These two are really entirely generic, but have to be repeated in
    # each toolchain because GN doesn't allow a template to be used here.
    # See //build/toolchain/toolchain.gni for details.
    tool("stamp") {
      command = stamp_command
      description = stamp_description
      pool = "//chromium/build/toolchain:action_pool($default_toolchain)"
    }
    tool("copy") {
      command = copy_command
      description = copy_description
      pool = "//chromium/build/toolchain:action_pool($default_toolchain)"
    }

    tool("action") {
      pool = "//chromium/build/toolchain:action_pool($default_toolchain)"
    }
  }
}

template("win_toolchains") {
  assert(defined(invoker.toolchain_arch))
  toolchain_arch = invoker.toolchain_arch

  win_toolchain_data = exec_script("setup_toolchain.py",
                                   [
                                     visual_studio_path,
                                     windows_sdk_path,
                                     visual_studio_runtime_dirs,
                                     "win",
                                     toolchain_arch,
                                     "environment." + toolchain_arch,
                                   ],
                                   "scope")

  # The toolchain using MSVC only makes sense when not doing cross builds.
  # Chromium exclusively uses the win_clang_ toolchain below, but V8 and
  # WebRTC still use this MSVC toolchain in some cases.
  if (host_os == "win") {
    msvc_toolchain(target_name) {
      environment = "environment." + toolchain_arch
      cl = "${goma_prefix}\"${win_toolchain_data.vc_bin_dir}/cl.exe\""

      toolchain_args = {
        if (defined(invoker.toolchain_args)) {
          forward_variables_from(invoker.toolchain_args, "*")
        }
        is_clang = false
        use_clang_coverage = false
        current_os = "win"
        target_cpu = "arm64"
      }
    }
  }

  msvc_toolchain("win_clang_" + target_name) {
    environment = "environment." + toolchain_arch
    prefix = rebase_path("$clang_base_path/bin", root_build_dir)
    cl = "${clang_prefix}$prefix/${clang_cl}"
    _clang_lib_dir =
        rebase_path("$clang_base_path/lib/clang/$clang_version/lib/windows",
                    root_build_dir)
    if (host_os == "win") {
      # Flip the slashes so that copy/paste of the command works.
      cl = string_replace(cl, "/", "\\")

      # And to match the other -libpath flags.
      _clang_lib_dir = string_replace(_clang_lib_dir, "/", "\\")
    }

    sys_include_flags = "${win_toolchain_data.include_flags_imsvc}"
    sys_lib_flags =
        "-libpath:$_clang_lib_dir ${win_toolchain_data.libpath_flags}"

    toolchain_args = {
      if (defined(invoker.toolchain_args)) {
        forward_variables_from(invoker.toolchain_args, "*")
      }
      is_clang = true
      current_os = "win"
      target_cpu = "arm64"
    }
  }
}

if (target_cpu == "x86" || target_cpu == "x64") {
  win_toolchains("x86") {
    toolchain_arch = "x86"
  }
  win_toolchains("x64") {
    toolchain_arch = "x64"
  }
}

if (target_cpu == "arm64") {
  win_toolchains("arm64") {
    toolchain_arch = "arm64"
  }
  win_toolchains(host_cpu) {
    toolchain_arch = host_cpu
  }
}

# The nacl_win64 toolchain is nearly identical to the plain x64 toolchain.
# It's used solely for building nacl64.exe (//components/nacl/broker:nacl64).
# The only reason it's a separate toolchain is so that it can force
# is_component_build to false in the toolchain_args() block, because
# building nacl64.exe in component style does not work.
win_toolchains("nacl_win64") {
  toolchain_arch = "x64"
  toolchain_args = {
    is_component_build = false
  }
}

# WinUWP toolchains. Only define these when targeting them.

if (target_os == "winuwp") {
  assert(target_cpu == "x64" || target_cpu == "x86" || target_cpu == "arm" ||
         target_cpu == "arm64")
  store_cpu_toolchain_data = exec_script("setup_toolchain.py",
                                         [
                                           visual_studio_path,
                                           windows_sdk_path,
                                           visual_studio_runtime_dirs,
                                           target_os,
                                           target_cpu,
                                           "environment.store_" + target_cpu,
                                         ],
                                         "scope")

  msvc_toolchain("uwp_" + target_cpu) {
    environment = "environment.store_" + target_cpu
    cl = "${goma_prefix}\"${store_cpu_toolchain_data.vc_bin_dir}/cl.exe\""
    toolchain_args = {
      current_os = "winuwp"
      target_cpu = target_cpu
      is_clang = false
    }
  }
}

[ Dauer der Verarbeitung: 0.35 Sekunden  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge