GN Reference

This page is automatically generated from gn help --markdown all.

--args: Specifies build arguments overrides.

  See "gn help buildargs" for an overview of how build arguments work.

  Most operations take a build directory. The build arguments are taken
  from the previous build done in that directory. If a command specifies
  --args, it will override the previous arguments stored in the build
  directory, and use the specified ones.

  The args specified will be saved to the build directory for subsequent
  commands. Specifying --args="" will clear all build arguments.

Formatting

  The value of the switch is interpreted in GN syntax. For typical usage
  of string arguments, you will need to be careful about escaping of
  quotes.

Examples

  gn gen out/Default --args="foo=\"bar\""

  gn gen out/Default --args='foo="bar" enable=true blah=7'

  gn check out/Default --args=""
    Clears existing build args from the directory.

  gn desc out/Default --args="some_list=[1, false, \"foo\"]"


--[no]color: Forces colored output on or off.

  Normally GN will try to detect whether it is outputting to a terminal
  and will enable or disable color accordingly. Use of these switches
  will override the default.

Examples

  gn gen out/Default --color

  gn gen out/Default --nocolor


--dotfile: Override the name of the “.gn” file.

  Normally GN loads the ".gn"file  from the source root for some basic
  configuration (see "gn help dotfile"). This flag allows you to
  use a different file.

  Note that this interacts with "--root" in a possibly incorrect way.
  It would be nice to test the edge cases and document or fix.


--fail-on-unused-args: Treat unused build args as fatal errors.

  If you set a value in a build's "gn args" and never use it in the
  build (in a declare_args() block), GN will normally print an error
  but not fail the build.

  In many cases engineers would use build args to enable or disable
  features that would sometimes get removed. It would by annoying to
  block work for typically benign problems. In Chrome in particular,
  flags might be configured for build bots in a separate infrastructure
  repository, or a declare_args block might be changed in a third party
  repository. Treating these errors as blocking forced complex multi-
  way patches to land what would otherwise be simple changes.

  In some cases, such concerns are not as important, and a mismatch
  in build flags between the invoker of the build and the build files
  represents a critical mismatch that should be immediately fixed. Such
  users can set this flag to force GN to fail in that case.


--markdown: Write help output in the Markdown format.

--[no]color: Forces colored output on or off.

  Normally GN will try to detect whether it is outputting to a terminal
  and will enable or disable color accordingly. Use of these switches
  will override the default.

Examples

  gn gen out/Default --color

  gn gen out/Default --nocolor


-q: Quiet mode. Don't print output on success.

  This is useful when running as a part of another script.


--root: Explicitly specify source root.

  Normally GN will look up in the directory tree from the current
  directory to find a ".gn" file. The source root directory specifies
  the meaning of "//" beginning with paths, and the BUILD.gn file
  in that directory will be the first thing loaded.

  Specifying --root allows GN to do builds in a specific directory
  regardless of the current directory.

Examples

  gn gen //out/Default --root=/home/baracko/src

  gn desc //out/Default --root="C:\Users\BObama\My Documents\foo"


--runtime-deps-list-file: Save runtime dependencies for targets in file.

  --runtime-deps-list-file=<filename>

  Where <filename> is a text file consisting of the labels, one per
  line, of the targets for which runtime dependencies are desired.

  See "gn help runtime_deps" for a description of how runtime
  dependencies are computed.

Runtime deps output file

  For each target requested, GN will write a separate runtime dependency
  file. The runtime dependency file will be in the output directory
  alongside the output file of the target, with a ".runtime_deps"
  extension. For example, if the target "//foo:bar" is listed in the
  input file, and that target produces an output file "bar.so", GN
  will create a file "bar.so.runtime_deps" in the build directory.

  If a source set, action, copy, or group is listed, the runtime deps
  file will correspond to the .stamp file corresponding to that target.
  This is probably not useful; the use-case for this feature is
  generally executable targets.

  The runtime dependency file will list one file per line, with no
  escaping. The files will be relative to the root_build_dir. The first
  line of the file will be the main output file of the target itself
  (in the above example, "bar.so").


--script-executable: Set the executable used to execute scripts.

  By default GN searches the PATH for Python to execute scripts in
  action targets and exec_script calls. This flag allows the
  specification of a specific Python executable or potentially
  a different language interpreter.


--threads: Specify number of worker threads.

  GN runs many threads to load and run build files. This can make
  debugging challenging. Or you may want to experiment with different
  values to see how it affects performance.

  The parameter is the number of worker threads. This does not count the
  main thread (so there are always at least two).

Examples

  gen gen out/Default --threads=1


--time: Outputs a summary of how long everything took.

  Hopefully self-explanatory.

Examples

  gn gen out/Default --time


--tracelog: Writes a Chrome-compatible trace log to the given file.

  The trace log will show file loads, executions, scripts, and writes.
  This allows performance analysis of the generation step.

  To view the trace, open Chrome and navigate to "chrome://tracing/",
  then press "Load" and specify the file you passed to this parameter.

Examples

  gn gen out/Default --tracelog=mytrace.trace


-v: Verbose logging.

  This will spew logging events to the console for debugging issues.
  Good luck!


gn args <out_dir> [--list] [--short] [--args]

  See also "gn help buildargs" for a more high-level overview of how
  build arguments work.

Usage

  gn args <out_dir>
      Open the arguments for the given build directory in an editor
      (as specified by the EDITOR environment variable). If the given
      build directory doesn't exist, it will be created and an empty
      args file will be opened in the editor. You would type something
      like this into that file:
          enable_doom_melon=false
          os="android"

      Note: you can edit the build args manually by editing the file
      "args.gn" in the build directory and then running
      "gn gen <out_dir>".

  gn args <out_dir> --list[=<exact_arg>] [--short]
      Lists all build arguments available in the current configuration,
      or, if an exact_arg is specified for the list flag, just that one
      build argument.

      The output will list the declaration location, default value, and
      comment preceeding the declaration. If --short is specified,
      only the names and values will be printed.

      If the out_dir is specified, the build configuration will be
      taken from that build directory. The reason this is needed is that
      the definition of some arguments is dependent on the build
      configuration, so setting some values might add, remove, or change
      the default values for other arguments. Specifying your exact
      configuration allows the proper arguments to be displayed.

      Instead of specifying the out_dir, you can also use the
      command-line flag to specify the build configuration:
        --args=<exact list of args to use>

Examples

  gn args out/Debug
    Opens an editor with the args for out/Debug.

  gn args out/Debug --list --short
    Prints all arguments with their default values for the out/Debug
    build.

  gn args out/Debug --list=target_cpu
    Prints information about the "target_cpu" argument for the out/Debug
    build.

  gn args --list --args="os=\"android\" enable_doom_melon=true"
    Prints all arguments with the default values for a build with the
    given arguments set (which may affect the values of other
    arguments).


gn check <out_dir> [<label_pattern>] [--force]

  GN's include header checker validates that the includes for C-like
  source files match the build dependency graph.

  "gn check" is the same thing as "gn gen" with the "--check" flag
  except that this command does not write out any build files. It's
  intended to be an easy way to manually trigger include file checking.

  The <label_pattern> can take exact labels or patterns that match more
  than one (although not general regular expressions). If specified,
  only those matching targets will be checked. See
  "gn help label_pattern" for details.

Command-specific switches

  --force
      Ignores specifications of "check_includes = false" and checks
      all target's files that match the target label.

What gets checked

  The .gn file may specify a list of targets to be checked. Only these
  targets will be checked if no label_pattern is specified on the
  command line. Otherwise, the command-line list is used instead. See
  "gn help dotfile".

  Targets can opt-out from checking with "check_includes = false"
  (see "gn help check_includes").

  For targets being checked:

    - GN opens all C-like source files in the targets to be checked and
      scans the top for includes.

    - Includes with a "nogncheck" annotation are skipped (see
      "gn help nogncheck").

    - Only includes using "quotes" are checked. <brackets> are assumed
      to be system includes.

    - Include paths are assumed to be relative to either the source root
      or the "root_gen_dir" and must include all the path components.
      (It might be nice in the future to incorporate GN's knowledge of
      the include path to handle other include styles.)

    - GN does not run the preprocessor so will not understand
      conditional includes.

    - Only includes matching known files in the build are checked:
      includes matching unknown paths are ignored.

  For an include to be valid:

    - The included file must be in the current target, or there must
      be a path following only public dependencies to a target with the
      file in it ("gn path" is a good way to diagnose problems).

    - There can be multiple targets with an included file: only one
      needs to be valid for the include to be allowed.

    - If there are only "sources" in a target, all are considered to
      be public and can be included by other targets with a valid public
      dependency path.

    - If a target lists files as "public", only those files are
      able to be included by other targets. Anything in the sources
      will be considered private and will not be includable regardless
      of dependency paths.

    - Ouptuts from actions are treated like public sources on that
      target.

    - A target can include headers from a target that depends on it
      if the other target is annotated accordingly. See
      "gn help allow_circular_includes_from".

Advice on fixing problems

  If you have a third party project that uses relative includes,
  it's generally best to exclude that target from checking altogether
  via "check_includes = false".

  If you have conditional includes, make sure the build conditions
  and the preprocessor conditions match, and annotate the line with
  "nogncheck" (see "gn help nogncheck" for an example).

  If two targets are hopelessly intertwined, use the
  "allow_circular_includes_from" annotation. Ideally each should have
  identical dependencies so configs inherited from those dependencies
  are consistent (see "gn help allow_circular_includes_from").

  If you have a standalone header file or files that need to be shared
  between a few targets, you can consider making a source_set listing
  only those headers as public sources. With only header files, the
  source set will be a no-op from a build perspective, but will give a
  central place to refer to those headers. That source set's files
  will still need to pass "gn check" in isolation.

  In rare cases it makes sense to list a header in more than one
  target if it could be considered conceptually a member of both.

Examples

  gn check out/Debug
      Check everything.

  gn check out/Default //foo:bar
      Check only the files in the //foo:bar target.

  gn check out/Default "//foo/*
      Check only the files in targets in the //foo directory tree.


gn clean <out_dir>

  Deletes the contents of the output directory except for args.gn and
  creates a Ninja build environment sufficient to regenerate the build.


gn desc <out_dir> [] [--blame]

  Displays information about a given target or config. The build
  build parameters will be taken for the build in the given <out_dir>.

  The <label or pattern> can be a target label, a config label, or a
  label pattern (see "gn help label_pattern"). A label pattern will
  only match targets.

Possibilities for

  (If unspecified an overall summary will be displayed.)

  all_dependent_configs
  allow_circular_includes_from
  arflags [--blame]
  args
  cflags [--blame]
  cflags_cc [--blame]
  cflags_cxx [--blame]
  check_includes
  configs [--tree] (see below)
  defines [--blame]
  depfile
  deps [--all] [--tree] (see below)
  include_dirs [--blame]
  inputs
  ldflags [--blame]
  lib_dirs
  libs
  outputs
  public_configs
  public
  script
  sources
  testonly
  visibility

  runtime_deps
      Compute all runtime deps for the given target. This is a
      computed list and does not correspond to any GN variable, unlike
      most other values here.

      The output is a list of file names relative to the build
      directory. See "gn help runtime_deps" for how this is computed.
      This also works with "--blame" to see the source of the
      dependency.

Shared flags

  --all-toolchains
      Normally only inputs in the default toolchain will be included.
      This switch will turn on matching all toolchains.

      For example, a file is in a target might be compiled twice:
      once in the default toolchain and once in a secondary one. Without
      this flag, only the default toolchain one will be matched by
      wildcards. With this flag, both will be matched.

Target flags

  --blame
      Used with any value specified on a config, this will name
      the config that cause that target to get the flag. This doesn't
      currently work for libs and lib_dirs because those are inherited
      and are more complicated to figure out the blame (patches
      welcome).

Configs

  The "configs" section will list all configs that apply. For targets
  this will include configs specified in the "configs" variable of
  the target, and also configs pushed onto this target via public
  or "all dependent" configs.

  Configs can have child configs. Specifying --tree will show the
  hierarchy.

Printing deps

  Deps will include all public, private, and data deps (TODO this could
  be clarified and enhanced) sorted in order applying. The following
  may be used:

  --all
      Collects all recursive dependencies and prints a sorted flat list.
      Also usable with --tree (see below).

  --as=(buildfile|label|output)
      How to print targets.

      buildfile
          Prints the build files where the given target was declared as
          file names.
      label  (default)
          Prints the label of the target.
      output
          Prints the first output file for the target relative to the
          root build directory.

  --testonly=(true|false)
      Restrict outputs to targets with the testonly flag set
      accordingly. When unspecified, the target's testonly flags are
      ignored.

  --tree
      Print a dependency tree. By default, duplicates will be elided
      with "..." but when --all and -tree are used together, no
      eliding will be performed.

      The "deps", "public_deps", and "data_deps" will all be
      included in the tree.

      Tree output can not be used with the filtering or output flags:
      --as, --type, --testonly.

  --type=(action|copy|executable|group|loadable_module|shared_library|
          source_set|static_library)
      Restrict outputs to targets matching the given type. If
      unspecified, no filtering will be performed.

Note

  This command will show the full name of directories and source files,
  but when directories and source paths are written to the build file,
  they will be adjusted to be relative to the build directory. So the
  values for paths displayed by this command won't match (but should
  mean the same thing).

Examples

  gn desc out/Debug //base:base
      Summarizes the given target.

  gn desc out/Foo :base_unittests deps --tree
      Shows a dependency tree of the "base_unittests" project in
      the current directory.

  gn desc out/Debug //base defines --blame
      Shows defines set for the //base:base target, annotated by where
      each one was set from.


gn format [--dump-tree] [--in-place] [--stdin] BUILD.gn

  Formats .gn file to a standard format.

  The contents of some lists ('sources', 'deps', etc.) will be sorted to
  a canonical order. To suppress this, you can add a comment of the form
  "# NOSORT" immediately preceeding the assignment. e.g.

  # NOSORT
  sources = [
    "z.cc",
    "a.cc",
  ]

Arguments

  --dry-run
      Does not change or output anything, but sets the process exit code
      based on whether output would be different than what's on disk.
      This is useful for presubmit/lint-type checks.
      - Exit code 0: successful format, matches on disk.
      - Exit code 1: general failure (parse error, etc.)
      - Exit code 2: successful format, but differs from on disk.

  --dump-tree
      For debugging only, dumps the parse tree.

  --in-place
      Instead of writing the formatted file to stdout, replace the input
      file with the formatted output. If no reformatting is required,
      the input file will not be touched, and nothing printed.

  --stdin
      Read input from stdin (and write to stdout). Not compatible with
      --in-place of course.

Examples

  gn format //some/BUILD.gn
  gn format some\BUILD.gn
  gn format /abspath/some/BUILD.gn
  gn format --stdin


gn gen: Generate ninja files.

  gn gen [<ide options>] <out_dir>

  Generates ninja files from the current tree and puts them in the given
  output directory.

  The output directory can be a source-repo-absolute path name such as:
      //out/foo
  Or it can be a directory relative to the current directory such as:
      out/foo

  See "gn help switches" for the common command-line switches.

IDE options

  GN optionally generates files for IDE. Possibilities for <ide options>

  --ide=<ide_name>
      Generate files for an IDE. Currently supported values:
      "eclipse" - Eclipse CDT settings file.
      "vs" - Visual Studio project/solution files.
             (default Visual Studio version: 2015)
      "vs2013" - Visual Studio 2013 project/solution files.
      "vs2015" - Visual Studio 2015 project/solution files.
      "xcode" - Xcode workspace/solution files.
      "qtcreator" - QtCreator project files.

  --filters=<path_prefixes>
      Semicolon-separated list of label patterns used to limit the set
      of generated projects (see "gn help label_pattern"). Only
      matching targets will be included to the solution. Only used for
      Visual Studio and Xcode.

Visual Studio Flags

  --sln=<file_name>
      Override default sln file name ("all"). Solution file is written
      to the root build directory.

Xcode Flags

  --workspace=<file_name>
      Override defaut workspace file name ("all"). The workspace file
      is written to the root build directory.

  --ninja-extra-args=<string>
      This string is passed without any quoting to the ninja invocation
      command-line. Can be used to configure ninja flags, like "-j" if
      using goma for example.

  --root-target=<target_name>
      Name of the target corresponding to "All" target in Xcode.
      If unset, "All" invokes ninja without any target
      and builds everything.

QtCreator Flags

  --root-target=<target_name>
      Name of the root target for which the QtCreator project will be
      generated to contain files of it and its dependencies. If unset, 
      the whole build graph will be omitted.


Eclipse IDE Support

  GN DOES NOT generate Eclipse CDT projects. Instead, it generates a
  settings file which can be imported into an Eclipse CDT project. The
  XML file contains a list of include paths and defines. Because GN does
  not generate a full .cproject definition, it is not possible to
  properly define includes/defines for each file individually.
  Instead, one set of includes/defines is generated for the entire
  project. This works fairly well but may still result in a few indexer
  issues here and there.


gn help

  Yo dawg, I heard you like help on your help so I put help on the help
  in the help.

  You can also use "all" as the parameter to get all help at once.

Switches

  --markdown
      Format output in markdown syntax.

Example

  gn help --markdown all
      Dump all help to stdout in markdown format.


gn ls <out_dir> [<label_pattern>] [--all-toolchains] [--as=...]

      [--type=...] [--testonly=...]

  Lists all targets matching the given pattern for the given build
  directory. By default, only targets in the default toolchain will
  be matched unless a toolchain is explicitly supplied.

  If the label pattern is unspecified, list all targets. The label
  pattern is not a general regular expression (see
  "gn help label_pattern"). If you need more complex expressions,
  pipe the result through grep.

Options

  --as=(buildfile|label|output)
      How to print targets.

      buildfile
          Prints the build files where the given target was declared as
          file names.
      label  (default)
          Prints the label of the target.
      output
          Prints the first output file for the target relative to the
          root build directory.

  --all-toolchains
      Normally only inputs in the default toolchain will be included.
      This switch will turn on matching all toolchains.

      For example, a file is in a target might be compiled twice:
      once in the default toolchain and once in a secondary one. Without
      this flag, only the default toolchain one will be matched by
      wildcards. With this flag, both will be matched.

  --testonly=(true|false)
      Restrict outputs to targets with the testonly flag set
      accordingly. When unspecified, the target's testonly flags are
      ignored.

  --type=(action|copy|executable|group|loadable_module|shared_library|
          source_set|static_library)
      Restrict outputs to targets matching the given type. If
      unspecified, no filtering will be performed.

Examples

  gn ls out/Debug
      Lists all targets in the default toolchain.

  gn ls out/Debug "//base/*"
      Lists all targets in the directory base and all subdirectories.

  gn ls out/Debug "//base:*"
      Lists all targets defined in //base/BUILD.gn.

  gn ls out/Debug //base --as=output
      Lists the build output file for //base:base

  gn ls out/Debug --type=executable
      Lists all executables produced by the build.

  gn ls out/Debug "//base/*" --as=output | xargs ninja -C out/Debug
      Builds all targets in //base and all subdirectories.

  gn ls out/Debug //base --all-toolchains
      Lists all variants of the target //base:base (it may be referenced
      in multiple toolchains).


gn path <out_dir> <target_one> <target_two>

  Finds paths of dependencies between two targets. Each unique path
  will be printed in one group, and groups will be separate by newlines.
  The two targets can appear in either order: paths will be found going
  in either direction.

  By default, a single path will be printed. If there is a path with
  only public dependencies, the shortest public path will be printed.
  Otherwise, the shortest path using either public or private
  dependencies will be printed. If --with-data is specified, data deps
  will also be considered. If there are multiple shortest paths, an
  arbitrary one will be selected.

Options

  --all
     Prints all paths found rather than just the first one. Public paths
     will be printed first in order of increasing length, followed by
     non-public paths in order of increasing length.

  --public
     Considers only public paths. Can't be used with --with-data.

  --with-data
     Additionally follows data deps. Without this flag, only public and
     private linked deps will be followed. Can't be used with --public.

Example

  gn path out/Default //base //tools/gn


gn refs <out_dir> (<label_pattern>|||@<response_file>) [--all]*

        [--all-toolchains] [--as=...] [--testonly=...] [--type=...]

  Finds reverse dependencies (which targets reference something). The
  input is a list containing:

   - Target label: The result will be which targets depend on it.

   - Config label: The result will be which targets list the given
     config in its "configs" or "public_configs" list.

   - Label pattern: The result will be which targets depend on any
     target matching the given pattern. Patterns will not match
     configs. These are not general regular expressions, see
     "gn help label_pattern" for details.

   - File name: The result will be which targets list the given file in
     its "inputs", "sources", "public", "data", or "outputs".
     Any input that does not contain wildcards and does not match a
     target or a config will be treated as a file.

   - Response file: If the input starts with an "@", it will be
     interpreted as a path to a file containing a list of labels or
     file names, one per line. This allows us to handle long lists
     of inputs without worrying about command line limits.

Options

  --all
      When used without --tree, will recurse and display all unique
      dependencies of the given targets. For example, if the input is
      a target, this will output all targets that depend directly or
      indirectly on the input. If the input is a file, this will output
      all targets that depend directly or indirectly on that file.

      When used with --tree, turns off eliding to show a complete tree.

  --all-toolchains
      Normally only inputs in the default toolchain will be included.
      This switch will turn on matching all toolchains.

      For example, a file is in a target might be compiled twice:
      once in the default toolchain and once in a secondary one. Without
      this flag, only the default toolchain one will be matched by
      wildcards. With this flag, both will be matched.

  --as=(buildfile|label|output)
      How to print targets.

      buildfile
          Prints the build files where the given target was declared as
          file names.
      label  (default)
          Prints the label of the target.
      output
          Prints the first output file for the target relative to the
          root build directory.

  -q
     Quiet. If nothing matches, don't print any output. Without this
     option, if there are no matches there will be an informational
     message printed which might interfere with scripts processing the
     output.

  --testonly=(true|false)
      Restrict outputs to targets with the testonly flag set
      accordingly. When unspecified, the target's testonly flags are
      ignored.

  --tree
      Outputs a reverse dependency tree from the given target.
      Duplicates will be elided. Combine with --all to see a full
      dependency tree.

      Tree output can not be used with the filtering or output flags:
      --as, --type, --testonly.

  --type=(action|copy|executable|group|loadable_module|shared_library|
          source_set|static_library)
      Restrict outputs to targets matching the given type. If
      unspecified, no filtering will be performed.

Examples (target input)

  gn refs out/Debug //tools/gn:gn
      Find all targets depending on the given exact target name.

  gn refs out/Debug //base:i18n --as=buildfiles | xargs gvim
      Edit all .gn files containing references to //base:i18n

  gn refs out/Debug //base --all
      List all targets depending directly or indirectly on //base:base.

  gn refs out/Debug "//base/*"
      List all targets depending directly on any target in //base or
      its subdirectories.

  gn refs out/Debug "//base:*"
      List all targets depending directly on any target in
      //base/BUILD.gn.

  gn refs out/Debug //base --tree
      Print a reverse dependency tree of //base:base

Examples (file input)

  gn refs out/Debug //base/macros.h
      Print target(s) listing //base/macros.h as a source.

  gn refs out/Debug //base/macros.h --tree
      Display a reverse dependency tree to get to the given file. This
      will show how dependencies will reference that file.

  gn refs out/Debug //base/macros.h //base/at_exit.h --all
      Display all unique targets with some dependency path to a target
      containing either of the given files as a source.

  gn refs out/Debug //base/macros.h --testonly=true --type=executable
          --all --as=output
      Display the executable file names of all test executables
      potentially affected by a change to the given file.


action: Declare a target that runs a script a single time.

  This target type allows you to run a script a single time to produce
  or more output files. If you want to run a script once for each of a
  set of input files, see "gn help action_foreach".

Inputs

  In an action the "sources" and "inputs" are treated the same:
  they're both input dependencies on script execution with no special
  handling. If you want to pass the sources to your script, you must do
  so explicitly by including them in the "args". Note also that this
  means there is no special handling of paths since GN doesn't know
  which of the args are paths and not. You will want to use
  rebase_path() to convert paths to be relative to the root_build_dir.

  You can dynamically write input dependencies (for incremental rebuilds
  if an input file changes) by writing a depfile when the script is run
  (see "gn help depfile"). This is more flexible than "inputs".

  If the command line length is very long, you can use response files
  to pass args to your script. See "gn help response_file_contents".

  It is recommended you put inputs to your script in the "sources"
  variable, and stuff like other Python files required to run your
  script in the "inputs" variable.

  The "deps" and "public_deps" for an action will always be
  completed before any part of the action is run so it can depend on
  the output of previous steps. The "data_deps" will be built if the
  action is built, but may not have completed before all steps of the
  action are started. This can give additional parallelism in the build
  for runtime-only dependencies.

Outputs

  You should specify files created by your script by specifying them in
  the "outputs".

  The script will be executed with the given arguments with the current
  directory being that of the root build directory. If you pass files
  to your script, see "gn help rebase_path" for how to convert
  file names to be relative to the build directory (file names in the
  sources, outputs, and inputs will be all treated as relative to the
  current build file and converted as needed automatically).

File name handling

  All output files must be inside the output directory of the build.
  You would generally use |$target_out_dir| or |$target_gen_dir| to
  reference the output or generated intermediate file directories,
  respectively.

Variables

  args, console, data, data_deps, depfile, deps, inputs, outputs*,
  response_file_contents, script*, sources
  * = required

Example

  action("run_this_guy_once") {
    script = "doprocessing.py"
    sources = [ "my_configuration.txt" ]
    outputs = [ "$target_gen_dir/insightful_output.txt" ]

    # Our script imports this Python file so we want to rebuild if it
    # changes.
    inputs = [ "helper_library.py" ]

    # Note that we have to manually pass the sources to our script if
    # the script needs them as inputs.
    args = [ "--out", rebase_path(target_gen_dir, root_build_dir) ] +
           rebase_path(sources, root_build_dir)
  }


action_foreach: Declare a target that runs a script over a set of files.

  This target type allows you to run a script once-per-file over a set
  of sources. If you want to run a script once that takes many files as
  input, see "gn help action".

Inputs

  The script will be run once per file in the "sources" variable. The
  "outputs" variable should specify one or more files with a source
  expansion pattern in it (see "gn help source_expansion"). The output
  file(s) for each script invocation should be unique. Normally you
  use "{{source_name_part}}" in each output file.

  If your script takes additional data as input, such as a shared
  configuration file or a Python module it uses, those files should be
  listed in the "inputs" variable. These files are treated as
  dependencies of each script invocation.

  If the command line length is very long, you can use response files
  to pass args to your script. See "gn help response_file_contents".

  You can dynamically write input dependencies (for incremental rebuilds
  if an input file changes) by writing a depfile when the script is run
  (see "gn help depfile"). This is more flexible than "inputs".

  The "deps" and "public_deps" for an action will always be
  completed before any part of the action is run so it can depend on
  the output of previous steps. The "data_deps" will be built if the
  action is built, but may not have completed before all steps of the
  action are started. This can give additional parallelism in the build
  for runtime-only dependencies.

Outputs

  The script will be executed with the given arguments with the current
  directory being that of the root build directory. If you pass files
  to your script, see "gn help rebase_path" for how to convert
  file names to be relative to the build directory (file names in the
  sources, outputs, and inputs will be all treated as relative to the
  current build file and converted as needed automatically).

File name handling

  All output files must be inside the output directory of the build.
  You would generally use |$target_out_dir| or |$target_gen_dir| to
  reference the output or generated intermediate file directories,
  respectively.

Variables

  args, console, data, data_deps, depfile, deps, inputs, outputs*,
  response_file_contents, script*, sources*
  * = required

Example

  # Runs the script over each IDL file. The IDL script will generate
  # both a .cc and a .h file for each input.
  action_foreach("my_idl") {
    script = "idl_processor.py"
    sources = [ "foo.idl", "bar.idl" ]

    # Our script reads this file each time, so we need to list is as a
    # dependency so we can rebuild if it changes.
    inputs = [ "my_configuration.txt" ]

    # Transformation from source file name to output file names.
    outputs = [ "$target_gen_dir/{{source_name_part}}.h",
                "$target_gen_dir/{{source_name_part}}.cc" ]

    # Note that since "args" is opaque to GN, if you specify paths
    # here, you will need to convert it to be relative to the build
    # directory using "rebase_path()".
    args = [
      "{{source}}",
      "-o",
      rebase_path(relative_target_gen_dir, root_build_dir) +
        "/{{source_name_part}}.h" ]
  }



assert: Assert an expression is true at generation time.

  assert(<condition> [, <error string>])

  If the condition is false, the build will fail with an error. If the
  optional second argument is provided, that string will be printed
  with the error message.

Examples:

  assert(is_win)
  assert(defined(sources), "Sources must be defined")


bundle_data: [iOS/OS X] Declare a target without output.

  This target type allows to declare data that is required at runtime.
  It is used to inform "create_bundle" targets of the files to copy
  into generated bundle, see "gn help create_bundle" for help.

  The target must define a list of files as "sources" and a single
  "outputs". If there are multiple files, source expansions must be
  used to express the output. The output must reference a file inside
  of {{bundle_root_dir}}.

  This target can be used on all platforms though it is designed only to
  generate iOS/OS X bundle. In cross-platform projects, it is advised to
  put it behind iOS/Mac conditionals.

  See "gn help create_bundle" for more information.

Variables

  sources*, outputs*, deps, data_deps, public_deps, visibility
  * = required

Examples

  bundle_data("icudata") {
    sources = [ "sources/data/in/icudtl.dat" ]
    outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
  }

  bundle_data("base_unittests_bundle_data]") {
    sources = [ "test/data" ]
    outputs = [
      "{{bundle_resources_dir}}/{{source_root_relative_dir}}/" +
          "{{source_file_part}}"
    ]
  }

  bundle_data("material_typography_bundle_data") {
    sources = [
      "src/MaterialTypography.bundle/Roboto-Bold.ttf",
      "src/MaterialTypography.bundle/Roboto-Italic.ttf",
      "src/MaterialTypography.bundle/Roboto-Regular.ttf",
      "src/MaterialTypography.bundle/Roboto-Thin.ttf",
    ]
    outputs = [
      "{{bundle_resources_dir}}/MaterialTypography.bundle/"
          "{{source_file_part}}"
    ]
  }


config: Defines a configuration object.

  Configuration objects can be applied to targets and specify sets of
  compiler flags, includes, defines, etc. They provide a way to
  conveniently group sets of this configuration information.

  A config is referenced by its label just like a target.

  The values in a config are additive only. If you want to remove a flag
  you need to remove the corresponding config that sets it. The final
  set of flags, defines, etc. for a target is generated in this order:

   1. The values specified directly on the target (rather than using a
      config.
   2. The configs specified in the target's "configs" list, in order.
   3. Public_configs from a breadth-first traversal of the dependency
      tree in the order that the targets appear in "deps".
   4. All dependent configs from a breadth-first traversal of the
      dependency tree in the order that the targets appear in "deps".

Variables valid in a config definition

  Flags: cflags, cflags_c, cflags_cc, cflags_objc, cflags_objcc,
         asmflags, defines, include_dirs, ldflags, lib_dirs, libs,
         precompiled_header, precompiled_source
  Nested configs: configs

Variables on a target used to apply configs

  all_dependent_configs, configs, public_configs

Example

  config("myconfig") {
    includes = [ "include/common" ]
    defines = [ "ENABLE_DOOM_MELON" ]
  }

  executable("mything") {
    configs = [ ":myconfig" ]
  }


copy: Declare a target that copies files.

File name handling

  All output files must be inside the output directory of the build.
  You would generally use |$target_out_dir| or |$target_gen_dir| to
  reference the output or generated intermediate file directories,
  respectively.

  Both "sources" and "outputs" must be specified. Sources can include
  as many files as you want, but there can only be one item in the
  outputs list (plural is used for the name for consistency with
  other target types).

  If there is more than one source file, your output name should specify
  a mapping from each source file to an output file name using source
  expansion (see "gn help source_expansion"). The placeholders will
  look like "{{source_name_part}}", for example.

Examples

  # Write a rule that copies a checked-in DLL to the output directory.
  copy("mydll") {
    sources = [ "mydll.dll" ]
    outputs = [ "$target_out_dir/mydll.dll" ]
  }

  # Write a rule to copy several files to the target generated files
  # directory.
  copy("myfiles") {
    sources = [ "data1.dat", "data2.dat", "data3.dat" ]

    # Use source expansion to generate output files with the
    # corresponding file names in the gen dir. This will just copy each
    # file.
    outputs = [ "$target_gen_dir/{{source_file_part}}" ]
  }


create_bundle: [iOS/OS X] Build an OS X / iOS bundle.

  This target generates an iOS/OS X bundle (which is a directory with a
  well-know structure). This target does not define any sources, instead
  they are computed from all "bundle_data" target this one depends on
  transitively (the recursion stops at "create_bundle" targets).

  The "bundle_*_dir" properties must be defined. They will be used for
  the expansion of {{bundle_*_dir}} rules in "bundle_data" outputs.

  This target can be used on all platforms though it is designed only to
  generate iOS/OS X bundle. In cross-platform projects, it is advised to
  put it behind iOS/Mac conditionals.

Variables

  bundle_root_dir*, bundle_resources_dir*, bundle_executable_dir*,
  bundle_plugins_dir*, deps, data_deps, public_deps, visibility,
  product_type
  * = required

Example

  # Defines a template to create an application. On most platform, this
  # is just an alias for an "executable" target, but on iOS/OS X, it
  # builds an application bundle.
  template("app") {
    if (!is_ios && !is_mac) {
      executable(target_name) {
        forward_variables_from(invoker, "*")
      }
    } else {
      app_name = target_name
      gen_path = target_gen_dir

      action("${app_name}_generate_info_plist") {
        script = [ "//build/ios/ios_gen_plist.py" ]
        sources = [ "templates/Info.plist" ]
        outputs = [ "$gen_path/Info.plist" ]
        args = rebase_path(sources, root_build_dir) +
               rebase_path(outputs, root_build_dir)
      }

      bundle_data("${app_name}_bundle_info_plist") {
        deps = [ ":${app_name}_generate_info_plist" ]
        sources = [ "$gen_path/Info.plist" ]
        outputs = [ "{{bundle_root_dir}}/Info.plist" ]
      }

      executable("${app_name}_generate_executable") {
        forward_variables_from(invoker, "*", [
                                                "output_name",
                                                "visibility",
                                               ])
        output_name =
            rebase_path("$gen_path/$app_name", root_build_dir)
      }

      bundle_data("${app_name}_bundle_executable") {
        deps = [ ":${app_name}_generate_executable" ]
        sources = [ "$gen_path/$app_name" ]
        outputs = [ "{{bundle_executable_dir}}/$app_name" ]
      }

      create_bundle("${app_name}.app") {
        product_type = "com.apple.product-type.application"
        deps = [
          ":${app_name}_bundle_executable",
          ":${app_name}_bundle_info_plist",
        ]
        if (is_ios) {
          bundle_root_dir = "${root_build_dir}/$target_name"
          bundle_resources_dir = bundle_root_dir
          bundle_executable_dir = bundle_root_dir
          bundle_plugins_dir = bundle_root_dir + "/Plugins"
        } else {
          bundle_root_dir = "${root_build_dir}/target_name/Contents"
          bundle_resources_dir = bundle_root_dir + "/Resources"
          bundle_executable_dir = bundle_root_dir + "/MacOS"
          bundle_plugins_dir = bundle_root_dir + "/Plugins"
        }
      }

      group(target_name) {
        forward_variables_from(invoker, ["visibility"])
        deps = [ ":${app_name}.app" ]
      }
    }
  }


declare_args: Declare build arguments.

  Introduces the given arguments into the current scope. If they are
  not specified on the command line or in a toolchain's arguments,
  the default values given in the declare_args block will be used.
  However, these defaults will not override command-line values.

  See also "gn help buildargs" for an overview.

  The precise behavior of declare args is:

   1. The declare_arg block executes. Any variables in the enclosing
      scope are available for reading.

   2. At the end of executing the block, any variables set within that
      scope are saved globally as build arguments, with their current
      values being saved as the "default value" for that argument.

   3. User-defined overrides are applied. Anything set in "gn args"
      now overrides any default values. The resulting set of variables
      is promoted to be readable from the following code in the file.

  This has some ramifications that may not be obvious:

    - You should not perform difficult work inside a declare_args block
      since this only sets a default value that may be discarded. In
      particular, don't use the result of exec_script() to set the
      default value. If you want to have a script-defined default, set
      some default "undefined" value like [], "", or -1, and after
      the declare_args block, call exec_script if the value is unset by
      the user.

    - Any code inside of the declare_args block will see the default
      values of previous variables defined in the block rather than
      the user-overridden value. This can be surprising because you will
      be used to seeing the overridden value. If you need to make the
      default value of one arg dependent on the possibly-overridden
      value of another, write two separate declare_args blocks:

        declare_args() {
          enable_foo = true
        }
        declare_args() {
          # Bar defaults to same user-overridden state as foo.
          enable_bar = enable_foo
        }

Example

  declare_args() {
    enable_teleporter = true
    enable_doom_melon = false
  }

  If you want to override the (default disabled) Doom Melon:
    gn --args="enable_doom_melon=true enable_teleporter=false"
  This also sets the teleporter, but it's already defaulted to on so
  it will have no effect.


defined: Returns whether an identifier is defined.

  Returns true if the given argument is defined. This is most useful in
  templates to assert that the caller set things up properly.

  You can pass an identifier:
    defined(foo)
  which will return true or false depending on whether foo is defined in
  the current scope.

  You can also check a named scope:
    defined(foo.bar)
  which will return true or false depending on whether bar is defined in
  the named scope foo. It will throw an error if foo is not defined or
  is not a scope.

Example:

  template("mytemplate") {
    # To help users call this template properly...
    assert(defined(invoker.sources), "Sources must be defined")

    # If we want to accept an optional "values" argument, we don't
    # want to dereference something that may not be defined.
    if (defined(invoker.values)) {
      values = invoker.values
    } else {
      values = "some default value"
    }
  }


exec_script: Synchronously run a script and return the output.

  exec_script(filename,
              arguments = [],
              input_conversion = "",
              file_dependencies = [])

  Runs the given script, returning the stdout of the script. The build
  generation will fail if the script does not exist or returns a nonzero
  exit code.

  The current directory when executing the script will be the root
  build directory. If you are passing file names, you will want to use
  the rebase_path() function to make file names relative to this
  path (see "gn help rebase_path").

Arguments:

  filename:
      File name of python script to execute. Non-absolute names will
      be treated as relative to the current build file.

  arguments:
      A list of strings to be passed to the script as arguments.
      May be unspecified or the empty list which means no arguments.

  input_conversion:
      Controls how the file is read and parsed.
      See "gn help input_conversion".

      If unspecified, defaults to the empty string which causes the
      script result to be discarded. exec script will return None.

  dependencies:
      (Optional) A list of files that this script reads or otherwise
      depends on. These dependencies will be added to the build result
      such that if any of them change, the build will be regenerated and
      the script will be re-run.

      The script itself will be an implicit dependency so you do not
      need to list it.

Example:

  all_lines = exec_script(
      "myscript.py", [some_input], "list lines",
      [ rebase_path("data_file.txt", root_build_dir) ])

  # This example just calls the script with no arguments and discards
  # the result.
  exec_script("//foo/bar/myscript.py")


executable: Declare an executable target.

Variables

  Flags: cflags, cflags_c, cflags_cc, cflags_objc, cflags_objcc,
         asmflags, defines, include_dirs, ldflags, lib_dirs, libs,
         precompiled_header, precompiled_source
  Deps: data_deps, deps, public_deps
  Dependent configs: all_dependent_configs, public_configs
  General: check_includes, configs, data, inputs, output_name,
           output_extension, public, sources, testonly, visibility


foreach: Iterate over a list.

  foreach(<loop_var>, <list>) {
    <loop contents>
  }

  Executes the loop contents block over each item in the list,
  assigning the loop_var to each item in sequence. The loop_var will be
  a copy so assigning to it will not mutate the list.

  The block does not introduce a new scope, so that variable assignments
  inside the loop will be visible once the loop terminates.

  The loop variable will temporarily shadow any existing variables with
  the same name for the duration of the loop. After the loop terminates
  the loop variable will no longer be in scope, and the previous value
  (if any) will be restored.

Example

  mylist = [ "a", "b", "c" ]
  foreach(i, mylist) {
    print(i)
  }

  Prints:
  a
  b
  c


forward_variables_from: Copies variables from a different scope.

  forward_variables_from(from_scope, variable_list_or_star,
                         variable_to_not_forward_list = [])

  Copies the given variables from the given scope to the local scope
  if they exist. This is normally used in the context of templates to
  use the values of variables defined in the template invocation to
  a template-defined target.

  The variables in the given variable_list will be copied if they exist
  in the given scope or any enclosing scope. If they do not exist,
  nothing will happen and they be left undefined in the current scope.

  As a special case, if the variable_list is a string with the value of
  "*", all variables from the given scope will be copied. "*" only
  copies variables set directly on the from_scope, not enclosing ones.
  Otherwise it would duplicate all global variables.

  When an explicit list of variables is supplied, if the variable exists
  in the current (destination) scope already, an error will be thrown.
  If "*" is specified, variables in the current scope will be
  clobbered (the latter is important because most targets have an
  implicit configs list, which means it wouldn't work at all if it
  didn't clobber).

  The sources assignment filter (see "gn help set_sources_assignment_filter")
  is never applied by this function. It's assumed than any desired
  filtering was already done when sources was set on the from_scope.

  If variables_to_not_forward_list is non-empty, then it must contains
  a list of variable names that will not be forwarded. This is mostly
  useful when variable_list_or_star has a value of "*".

Examples

  # This is a common action template. It would invoke a script with
  # some given parameters, and wants to use the various types of deps
  # and the visibility from the invoker if it's defined. It also injects
  # an additional dependency to all targets.
  template("my_test") {
    action(target_name) {
      forward_variables_from(invoker, [ "data_deps", "deps",
                                        "public_deps", "visibility" ])
      # Add our test code to the dependencies.
      # "deps" may or may not be defined at this point.
      if (defined(deps)) {
        deps += [ "//tools/doom_melon" ]
      } else {
        deps = [ "//tools/doom_melon" ]
      }
    }
  }

  # This is a template around either a target whose type depends on a
  # global variable. It forwards all values from the invoker.
  template("my_wrapper") {
    target(my_wrapper_target_type, target_name) {
      forward_variables_from(invoker, "*")
    }
  }

  # A template that wraps another. It adds behavior based on one 
  # variable, and forwards all others to the nested target.
  template("my_ios_test_app") {
    ios_test_app(target_name) {
      forward_variables_from(invoker, "*", ["test_bundle_name"])
      if (!defined(extra_substitutions)) {
        extra_substitutions = []
      }
      extra_substitutions += [ "BUNDLE_ID_TEST_NAME=$test_bundle_name" ]
    }
  }


get_label_info: Get an attribute from a target's label.

  get_label_info(target_label, what)

  Given the label of a target, returns some attribute of that target.
  The target need not have been previously defined in the same file,
  since none of the attributes depend on the actual target definition,
  only the label itself.

  See also "gn help get_target_outputs".

Possible values for the “what” parameter

  "name"
      The short name of the target. This will match the value of the
      "target_name" variable inside that target's declaration. For the
      label "//foo/bar:baz" this will return "baz".

  "dir"
      The directory containing the target's definition, with no slash at
      the end. For the label "//foo/bar:baz" this will return
      "//foo/bar".

  "target_gen_dir"
      The generated file directory for the target. This will match the
      value of the "target_gen_dir" variable when inside that target's
      declaration.

  "root_gen_dir"
      The root of the generated file tree for the target. This will
      match the value of the "root_gen_dir" variable when inside that
      target's declaration.

  "target_out_dir
      The output directory for the target. This will match the
      value of the "target_out_dir" variable when inside that target's
      declaration.

  "root_out_dir"
      The root of the output file tree for the target. This will
      match the value of the "root_out_dir" variable when inside that
      target's declaration.

  "label_no_toolchain"
      The fully qualified version of this label, not including the
      toolchain. For the input ":bar" it might return
      "//foo:bar".

  "label_with_toolchain"
      The fully qualified version of this label, including the
      toolchain. For the input ":bar" it might return
      "//foo:bar(//toolchain:x64)".

  "toolchain"
      The label of the toolchain. This will match the value of the
      "current_toolchain" variable when inside that target's
      declaration.

Examples

  get_label_info(":foo", "name")
  # Returns string "foo".

  get_label_info("//foo/bar:baz", "gen_dir")
  # Returns string "//out/Debug/gen/foo/bar".


get_path_info: Extract parts of a file or directory name.

  get_path_info(input, what)

  The first argument is either a string representing a file or
  directory name, or a list of such strings. If the input is a list
  the return value will be a list containing the result of applying the
  rule to each item in the input.

Possible values for the “what” parameter

  "file"
      The substring after the last slash in the path, including the name
      and extension. If the input ends in a slash, the empty string will
      be returned.
        "foo/bar.txt" => "bar.txt"
        "bar.txt" => "bar.txt"
        "foo/" => ""
        "" => ""

  "name"
     The substring of the file name not including the extension.
        "foo/bar.txt" => "bar"
        "foo/bar" => "bar"
        "foo/" => ""

  "extension"
      The substring following the last period following the last slash,
      or the empty string if not found. The period is not included.
        "foo/bar.txt" => "txt"
        "foo/bar" => ""

  "dir"
      The directory portion of the name, not including the slash.
        "foo/bar.txt" => "foo"
        "//foo/bar" => "//foo"
        "foo" => "."

      The result will never end in a slash, so if the resulting
      is empty, the system ("/") or source ("//") roots, a "."
      will be appended such that it is always legal to append a slash
      and a filename and get a valid path.

  "out_dir"
      The output file directory corresponding to the path of the
      given file, not including a trailing slash.
        "//foo/bar/baz.txt" => "//out/Default/obj/foo/bar"
  "gen_dir"
      The generated file directory corresponding to the path of the
      given file, not including a trailing slash.
        "//foo/bar/baz.txt" => "//out/Default/gen/foo/bar"

  "abspath"
      The full absolute path name to the file or directory. It will be
      resolved relative to the current directory, and then the source-
      absolute version will be returned. If the input is system-
      absolute, the same input will be returned.
        "foo/bar.txt" => "//mydir/foo/bar.txt"
        "foo/" => "//mydir/foo/"
        "//foo/bar" => "//foo/bar"  (already absolute)
        "/usr/include" => "/usr/include"  (already absolute)

      If you want to make the path relative to another directory, or to
      be system-absolute, see rebase_path().

Examples

  sources = [ "foo.cc", "foo.h" ]
  result = get_path_info(source, "abspath")
  # result will be [ "//mydir/foo.cc", "//mydir/foo.h" ]

  result = get_path_info("//foo/bar/baz.cc", "dir")
  # result will be "//foo/bar"

  # Extract the source-absolute directory name,
  result = get_path_info(get_path_info(path, "dir"), "abspath")


get_target_outputs: [file list] Get the list of outputs from a target.

  get_target_outputs(target_label)

  Returns a list of output files for the named target. The named target
  must have been previously defined in the current file before this
  function is called (it can't reference targets in other files because
  there isn't a defined execution order, and it obviously can't
  reference targets that are defined after the function call).

  Only copy and action targets are supported. The outputs from binary
  targets will depend on the toolchain definition which won't
  necessarily have been loaded by the time a given line of code has run,
  and source sets and groups have no useful output file.

Return value

  The names in the resulting list will be absolute file paths (normally
  like "//out/Debug/bar.exe", depending on the build directory).

  action targets: this will just return the files specified in the
  "outputs" variable of the target.

  action_foreach targets: this will return the result of applying
  the output template to the sources (see "gn help source_expansion").
  This will be the same result (though with guaranteed absolute file
  paths), as process_file_template will return for those inputs
  (see "gn help process_file_template").

  binary targets (executables, libraries): this will return a list
  of the resulting binary file(s). The "main output" (the actual
  binary or library) will always be the 0th element in the result.
  Depending on the platform and output type, there may be other output
  files as well (like import libraries) which will follow.

  source sets and groups: this will return a list containing the path of
  the "stamp" file that Ninja will produce once all outputs are
  generated. This probably isn't very useful.

Example

  # Say this action generates a bunch of C source files.
  action_foreach("my_action") {
    sources = [ ... ]
    outputs = [ ... ]
  }

  # Compile the resulting source files into a source set.
  source_set("my_lib") {
    sources = get_target_outputs(":my_action")
  }


getenv: Get an environment variable.

  value = getenv(env_var_name)

  Returns the value of the given enironment variable. If the value is
  not found, it will try to look up the variable with the "opposite"
  case (based on the case of the first letter of the variable), but
  is otherwise case-sensitive.

  If the environment variable is not found, the empty string will be
  returned. Note: it might be nice to extend this if we had the concept
  of "none" in the language to indicate lookup failure.

Example:

  home_dir = getenv("HOME")


group: Declare a named group of targets.

  This target type allows you to create meta-targets that just collect a
  set of dependencies into one named target. Groups can additionally
  specify configs that apply to their dependents.

  Depending on a group is exactly like depending directly on that
  group's deps. 

Variables

  Deps: data_deps, deps, public_deps
  Dependent configs: all_dependent_configs, public_configs

Example

  group("all") {
    deps = [
      "//project:runner",
      "//project:unit_tests",
    ]
  }


import: Import a file into the current scope.

  The import command loads the rules and variables resulting from
  executing the given file into the current scope.

  By convention, imported files are named with a .gni extension.

  An import is different than a C++ "include". The imported file is
  executed in a standalone environment from the caller of the import
  command. The results of this execution are cached for other files that
  import the same .gni file.

  Note that you can not import a BUILD.gn file that's otherwise used
  in the build. Files must either be imported or implicitly loaded as
  a result of deps rules, but not both.

  The imported file's scope will be merged with the scope at the point
  import was called. If there is a conflict (both the current scope and
  the imported file define some variable or rule with the same name but
  different value), a runtime error will be thrown. Therefore, it's good
  practice to minimize the stuff that an imported file defines.

  Variables and templates beginning with an underscore '_' are
  considered private and will not be imported. Imported files can use
  such variables for internal computation without affecting other files.

Examples:

  import("//build/rules/idl_compilation_rule.gni")

  # Looks in the current directory.
  import("my_vars.gni")


loadable_module: Declare a loadable module target.

  This target type allows you to create an object file that is (and can
  only be) loaded and unloaded at runtime.

  A loadable module will be specified on the linker line for targets
  listing the loadable module in its "deps". If you don't want this
  (if you don't need to dynamically load the library at runtime), then
  you should use a "shared_library" target type instead.

Variables

  Flags: cflags, cflags_c, cflags_cc, cflags_objc, cflags_objcc,
         asmflags, defines, include_dirs, ldflags, lib_dirs, libs,
         precompiled_header, precompiled_source
  Deps: data_deps, deps, public_deps
  Dependent configs: all_dependent_configs, public_configs
  General: check_includes, configs, data, inputs, output_name,
           output_extension, public, sources, testonly, visibility


print: Prints to the console.

  Prints all arguments to the console separated by spaces. A newline is
  automatically appended to the end.

  This function is intended for debugging. Note that build files are run
  in parallel so you may get interleaved prints. A buildfile may also
  be executed more than once in parallel in the context of different
  toolchains so the prints from one file may be duplicated or
  interleaved with itself.

Examples:

  print("Hello world")

  print(sources, deps)


process_file_template: Do template expansion over a list of files.

  process_file_template(source_list, template)

  process_file_template applies a template list to a source file list,
  returning the result of applying each template to each source. This is
  typically used for computing output file names from input files.

  In most cases, get_target_outputs() will give the same result with
  shorter, more maintainable code. This function should only be used
  when that function can't be used (like there's no target or the target
  is defined in another build file).

Arguments:

  The source_list is a list of file names.

  The template can be a string or a list. If it is a list, multiple
  output strings are generated for each input.

  The template should contain source expansions to which each name in
  the source list is applied. See "gn help source_expansion".

Example:

  sources = [
    "foo.idl",
    "bar.idl",
  ]
  myoutputs = process_file_template(
      sources,
      [ "$target_gen_dir/{{source_name_part}}.cc",
        "$target_gen_dir/{{source_name_part}}.h" ])

 The result in this case will be:
    [ "//out/Debug/foo.cc"
      "//out/Debug/foo.h"
      "//out/Debug/bar.cc"
      "//out/Debug/bar.h" ]


read_file: Read a file into a variable.

  read_file(filename, input_conversion)

  Whitespace will be trimmed from the end of the file. Throws an error
  if the file can not be opened.

Arguments:

  filename
      Filename to read, relative to the build file.

  input_conversion
      Controls how the file is read and parsed.
      See "gn help input_conversion".

Example

  lines = read_file("foo.txt", "list lines")


rebase_path: Rebase a file or directory to another location.

  converted = rebase_path(input,
                          new_base = "",
                          current_base = ".")

  Takes a string argument representing a file name, or a list of such
  strings and converts it/them to be relative to a different base
  directory.

  When invoking the compiler or scripts, GN will automatically convert
  sources and include directories to be relative to the build directory.
  However, if you're passing files directly in the "args" array or
  doing other manual manipulations where GN doesn't know something is
  a file name, you will need to convert paths to be relative to what
  your tool is expecting.

  The common case is to use this to convert paths relative to the
  current directory to be relative to the build directory (which will
  be the current directory when executing scripts).

  If you want to convert a file path to be source-absolute (that is,
  beginning with a double slash like "//foo/bar"), you should use
  the get_path_info() function. This function won't work because it will
  always make relative paths, and it needs to support making paths
  relative to the source root, so can't also generate source-absolute
  paths without more special-cases.

Arguments

  input
      A string or list of strings representing file or directory names
      These can be relative paths ("foo/bar.txt"), system absolute
      paths ("/foo/bar.txt"), or source absolute paths
      ("//foo/bar.txt").

  new_base
      The directory to convert the paths to be relative to. This can be
      an absolute path or a relative path (which will be treated
      as being relative to the current BUILD-file's directory).

      As a special case, if new_base is the empty string (the default),
      all paths will be converted to system-absolute native style paths
      with system path separators. This is useful for invoking external
      programs.

  current_base
      Directory representing the base for relative paths in the input.
      If this is not an absolute path, it will be treated as being
      relative to the current build file. Use "." (the default) to
      convert paths from the current BUILD-file's directory.

Return value

  The return value will be the same type as the input value (either a
  string or a list of strings). All relative and source-absolute file
  names will be converted to be relative to the requested output
  System-absolute paths will be unchanged.

  Whether an output path will end in a slash will match whether the
  corresponding input path ends in a slash. It will return "." or
  "./" (depending on whether the input ends in a slash) to avoid
  returning empty strings. This means if you want a root path
  ("//" or "/") not ending in a slash, you can add a dot ("//.").

Example

  # Convert a file in the current directory to be relative to the build
  # directory (the current dir when executing compilers and scripts).
  foo = rebase_path("myfile.txt", root_build_dir)
  # might produce "../../project/myfile.txt".

  # Convert a file to be system absolute:
  foo = rebase_path("myfile.txt")
  # Might produce "D:\source\project\myfile.txt" on Windows or
  # "/home/you/source/project/myfile.txt" on Linux.

  # Typical usage for converting to the build directory for a script.
  action("myscript") {
    # Don't convert sources, GN will automatically convert these to be
    # relative to the build directory when it constructs the command
    # line for your script.
    sources = [ "foo.txt", "bar.txt" ]

    # Extra file args passed manually need to be explicitly converted
    # to be relative to the build directory:
    args = [
      "--data",
      rebase_path("//mything/data/input.dat", root_build_dir),
      "--rel",
      rebase_path("relative_path.txt", root_build_dir)
    ] + rebase_path(sources, root_build_dir)
  }


set_default_toolchain: Sets the default toolchain name.

  set_default_toolchain(toolchain_label)

  The given label should identify a toolchain definition (see
  "help toolchain"). This toolchain will be used for all targets
  unless otherwise specified.

  This function is only valid to call during the processing of the build
  configuration file. Since the build configuration file is processed
  separately for each toolchain, this function will be a no-op when
  called under any non-default toolchains.

  For example, the default toolchain should be appropriate for the
  current environment. If the current environment is 32-bit and 
  somebody references a target with a 64-bit toolchain, we wouldn't
  want processing of the build config file for the 64-bit toolchain to
  reset the default toolchain to 64-bit, we want to keep it 32-bits.

Argument:

  toolchain_label
      Toolchain name.

Example:

  set_default_toolchain("//build/config/win:vs32")

set_defaults: Set default values for a target type.

  set_defaults(<target_type_name>) { <values...> }

  Sets the default values for a given target type. Whenever
  target_type_name is seen in the future, the values specified in
  set_default's block will be copied into the current scope.

  When the target type is used, the variable copying is very strict.
  If a variable with that name is already in scope, the build will fail
  with an error.

  set_defaults can be used for built-in target types ("executable",
  "shared_library", etc.) and custom ones defined via the "template"
  command.

Example:

  set_defaults("static_library") {
    configs = [ "//tools/mything:settings" ]
  }

  static_library("mylib")
    # The configs will be auto-populated as above. You can remove it if
    # you don't want the default for a particular default:
    configs -= "//tools/mything:settings"
  }


set_sources_assignment_filter: Set a pattern to filter source files.

  The sources assignment filter is a list of patterns that remove files
  from the list implicitly whenever the "sources" variable is
  assigned to. This is intended to be used to globally filter out files
  with platform-specific naming schemes when they don't apply, for
  example, you may want to filter out all "*_win.cc" files on non-
  Windows platforms.

  Typically this will be called once in the master build config script
  to set up the filter for the current platform. Subsequent calls will
  overwrite the previous values.

  If you want to bypass the filter and add a file even if it might
  be filtered out, call set_sources_assignment_filter([]) to clear the
  list of filters. This will apply until the current scope exits

How to use patterns

  File patterns are VERY limited regular expressions. They must match
  the entire input string to be counted as a match. In regular
  expression parlance, there is an implicit "^...$" surrounding your
  input. If you want to match a substring, you need to use wildcards at
  the beginning and end.

  There are only two special tokens understood by the pattern matcher.
  Everything else is a literal.

   * Matches zero or more of any character. It does not depend on the
     preceding character (in regular expression parlance it is
     equivalent to ".*").

  \b Matches a path boundary. This will match the beginning or end of
     a string, or a slash.

Pattern examples

  "*asdf*"
      Matches a string containing "asdf" anywhere.

  "asdf"
      Matches only the exact string "asdf".

  "*.cc"
      Matches strings ending in the literal ".cc".

  "\bwin/*"
      Matches "win/foo" and "foo/win/bar.cc" but not "iwin/foo".

Sources assignment example

  # Filter out all _win files.
  set_sources_assignment_filter([ "*_win.cc", "*_win.h" ])
  sources = [ "a.cc", "b_win.cc" ]
  print(sources)
  # Will print [ "a.cc" ]. b_win one was filtered out.


shared_library: Declare a shared library target.

  A shared library will be specified on the linker line for targets
  listing the shared library in its "deps". If you don't want this
  (say you dynamically load the library at runtime), then you should
  depend on the shared library via "data_deps" or, on Darwin
  platforms, use a "loadable_module" target type instead.

Variables

  Flags: cflags, cflags_c, cflags_cc, cflags_objc, cflags_objcc,
         asmflags, defines, include_dirs, ldflags, lib_dirs, libs,
         precompiled_header, precompiled_source
  Deps: data_deps, deps, public_deps
  Dependent configs: all_dependent_configs, public_configs
  General: check_includes, configs, data, inputs, output_name,
           output_extension, public, sources, testonly, visibility


source_set: Declare a source set target.

  A source set is a collection of sources that get compiled, but are not
  linked to produce any kind of library. Instead, the resulting object
  files are implicitly added to the linker line of all targets that
  depend on the source set.

  In most cases, a source set will behave like a static library, except
  no actual library file will be produced. This will make the build go
  a little faster by skipping creation of a large static library, while
  maintaining the organizational benefits of focused build targets.

  The main difference between a source set and a static library is
  around handling of exported symbols. Most linkers assume declaring
  a function exported means exported from the static library. The linker
  can then do dead code elimination to delete code not reachable from
  exported functions.

  A source set will not do this code elimination since there is no link
  step. This allows you to link many sources sets into a shared library
  and have the "exported symbol" notation indicate "export from the
  final shared library and not from the intermediate targets." There is
  no way to express this concept when linking multiple static libraries
  into a shared library.

Variables

  Flags: cflags, cflags_c, cflags_cc, cflags_objc, cflags_objcc,
         asmflags, defines, include_dirs, ldflags, lib_dirs, libs,
         precompiled_header, precompiled_source
  Deps: data_deps, deps, public_deps
  Dependent configs: all_dependent_configs, public_configs
  General: check_includes, configs, data, inputs, output_name,
           output_extension, public, sources, testonly, visibility


static_library: Declare a static library target.

  Make a ".a" / ".lib" file.

  If you only need the static library for intermediate results in the
  build, you should consider a source_set instead since it will skip
  the (potentially slow) step of creating the intermediate library file.

Variables

  Flags: cflags, cflags_c, cflags_cc, cflags_objc, cflags_objcc,
         asmflags, defines, include_dirs, ldflags, lib_dirs, libs,
         precompiled_header, precompiled_source
  Deps: data_deps, deps, public_deps
  Dependent configs: all_dependent_configs, public_configs
  General: check_includes, configs, data, inputs, output_name,
           output_extension, public, sources, testonly, visibility


target: Declare an target with the given programmatic type.

  target(target_type_string, target_name_string) { ... }

  The target() function is a way to invoke a built-in target or template
  with a type determined at runtime. This is useful for cases where the
  type of a target might not be known statically.

  Only templates and built-in target functions are supported for the
  target_type_string parameter. Arbitrary functions, configs, and
  toolchains are not supported.

  The call:
    target("source_set", "doom_melon") {
  Is equivalent to:
    source_set("doom_melon") {

Example

  if (foo_build_as_shared) {
    my_type = "shared_library"
  } else {
    my_type = "source_set"
  }

  target(my_type, "foo") {
    ...
  }


template: Define a template rule.

  A template defines a custom name that acts like a function. It
  provides a way to add to the built-in target types.

  The template() function is used to declare a template. To invoke the
  template, just use the name of the template like any other target
  type.

  Often you will want to declare your template in a special file that
  other files will import (see "gn help import") so your template
  rule can be shared across build files.

Variables and templates:

  When you call template() it creates a closure around all variables
  currently in scope with the code in the template block. When the
  template is invoked, the closure will be executed.

  When the template is invoked, the code in the caller is executed and
  passed to the template code as an implicit "invoker" variable. The
  template uses this to read state out of the invoking code.

  One thing explicitly excluded from the closure is the "current
  directory" against which relative file names are resolved. The
  current directory will be that of the invoking code, since typically
  that code specifies the file names. This means all files internal
  to the template should use absolute names.

  A template will typically forward some or all variables from the
  invoking scope to a target that it defines. Often, such variables
  might be optional. Use the pattern:

    if (defined(invoker.deps)) {
      deps = invoker.deps
    }

  The function forward_variables_from() provides a shortcut to forward
  one or more or possibly all variables in this manner:

    forward_variables_from(invoker, ["deps", "public_deps"])

Target naming:

  Your template should almost always define a built-in target with the
  name the template invoker specified. For example, if you have an IDL
  template and somebody does:
    idl("foo") {...
  you will normally want this to expand to something defining a
  source_set or static_library named "foo" (among other things you may
  need). This way, when another target specifies a dependency on
  "foo", the static_library or source_set will be linked.

  It is also important that any other targets your template expands to
  have globally unique names, or you will get collisions.

  Access the invoking name in your template via the implicit
  "target_name" variable. This should also be the basis for how other
  targets that a template expands to ensure uniqueness.

  A typical example would be a template that defines an action to
  generate some source files, and a source_set to compile that source.
  Your template would name the source_set "target_name" because
  that's what you want external targets to depend on to link your code.
  And you would name the action something like "${target_name}_action"
  to make it unique. The source set would have a dependency on the
  action to make it run.

Example of defining a template:

  template("my_idl") {
    # Be nice and help callers debug problems by checking that the
    # variables the template requires are defined. This gives a nice
    # message rather than giving the user an error about an
    # undefined variable in the file defining the template
    #
    # You can also use defined() to give default values to variables
    # unspecified by the invoker.
    assert(defined(invoker.sources),
           "Need sources in $target_name listing the idl files.")

    # Name of the intermediate target that does the code gen. This must
    # incorporate the target name so it's unique across template
    # instantiations.
    code_gen_target_name = target_name + "_code_gen"

    # Intermediate target to convert IDL to C source. Note that the name
    # is based on the name the invoker of the template specified. This
    # way, each time the template is invoked we get a unique
    # intermediate action name (since all target names are in the global
    # scope).
    action_foreach(code_gen_target_name) {
      # Access the scope defined by the invoker via the implicit
      # "invoker" variable.
      sources = invoker.sources

      # Note that we need an absolute path for our script file name.
      # The current directory when executing this code will be that of
      # the invoker (this is why we can use the "sources" directly
      # above without having to rebase all of the paths). But if we need
      # to reference a script relative to the template file, we'll need
      # to use an absolute path instead.
      script = "//tools/idl/idl_code_generator.py"

      # Tell GN how to expand output names given the sources.
      # See "gn help source_expansion" for more.
      outputs = [ "$target_gen_dir/{{source_name_part}}.cc",
                  "$target_gen_dir/{{source_name_part}}.h" ]
    }

    # Name the source set the same as the template invocation so
    # instancing this template produces something that other targets
    # can link to in their deps.
    source_set(target_name) {
      # Generates the list of sources, we get these from the
      # action_foreach above.
      sources = get_target_outputs(":$code_gen_target_name")

      # This target depends on the files produced by the above code gen
      # target.
      deps = [ ":$code_gen_target_name" ]
    }
  }

Example of invoking the resulting template:

  # This calls the template code above, defining target_name to be
  # "foo_idl_files" and "invoker" to be the set of stuff defined in
  # the curly brackets.
  my_idl("foo_idl_files") {
    # Goes into the template as "invoker.sources".
    sources = [ "foo.idl", "bar.idl" ]
  }

  # Here is a target that depends on our template.
  executable("my_exe") {
    # Depend on the name we gave the template call above. Internally,
    # this will produce a dependency from executable to the source_set
    # inside the template (since it has this name), which will in turn
    # depend on the code gen action.
    deps = [ ":foo_idl_files" ]
  }


tool: Specify arguments to a toolchain tool.

Usage:

  tool(<tool type>) {
    <tool variables...>
  }

Tool types

    Compiler tools:
      "cc": C compiler
      "cxx": C++ compiler
      "objc": Objective C compiler
      "objcxx": Objective C++ compiler
      "rc": Resource compiler (Windows .rc files)
      "asm": Assembler

    Linker tools:
      "alink": Linker for static libraries (archives)
      "solink": Linker for shared libraries
      "link": Linker for executables

    Other tools:
      "stamp": Tool for creating stamp files
      "copy": Tool to copy files.

    Platform specific tools:
      "copy_bundle_data": [iOS, OS X] Tool to copy files in a bundle.
      "compile_xcassets": [iOS, OS X] Tool to compile asset catalogs.

Tool variables

    command  [string with substitutions]
        Valid for: all tools (required)

        The command to run.

    default_output_dir  [string with substitutions]
        Valid for: linker tools

        Default directory name for the output file relative to the
        root_build_dir. It can contain other substitution patterns.
        This will be the default value for the {{output_dir}} expansion
        (discussed below) but will be overridden by the "output_dir"
        variable in a target, if one is specified.

        GN doesn't do anything with this string other than pass it
        along, potentially with target-specific overrides. It is the
        tool's job to use the expansion so that the files will be in
        the right place.

    default_output_extension  [string]
        Valid for: linker tools

        Extension for the main output of a linkable tool. It includes
        the leading dot. This will be the default value for the
        {{output_extension}} expansion (discussed below) but will be
        overridden by by the "output extension" variable in a target,
        if one is specified. Empty string means no extension.

        GN doesn't actually do anything with this extension other than
        pass it along, potentially with target-specific overrides. One
        would typically use the {{output_extension}} value in the
        "outputs" to read this value.

        Example: default_output_extension = ".exe"

    depfile  [string with substitutions]
        Valid for: compiler tools (optional)

        If the tool can write ".d" files, this specifies the name of
        the resulting file. These files are used to list header file
        dependencies (or other implicit input dependencies) that are
        discovered at build time. See also "depsformat".

        Example: depfile = "{{output}}.d"

    depsformat  [string]
        Valid for: compiler tools (when depfile is specified)

        Format for the deps outputs. This is either "gcc" or "msvc".
        See the ninja documentation for "deps" for more information.

        Example: depsformat = "gcc"

    description  [string with substitutions, optional]
        Valid for: all tools

        What to print when the command is run.

        Example: description = "Compiling {{source}}"

    lib_switch  [string, optional, link tools only]
    lib_dir_switch  [string, optional, link tools only]
        Valid for: Linker tools except "alink"

        These strings will be prepended to the libraries and library
        search directories, respectively, because linkers differ on how
        specify them. If you specified:
          lib_switch = "-l"
          lib_dir_switch = "-L"
        then the "{{libs}}" expansion for [ "freetype", "expat"]
        would be "-lfreetype -lexpat".

    outputs  [list of strings with substitutions]
        Valid for: Linker and compiler tools (required)

        An array of names for the output files the tool produces. These
        are relative to the build output directory. There must always be
        at least one output file. There can be more than one output (a
        linker might produce a library and an import library, for
        example).

        This array just declares to GN what files the tool will
        produce. It is your responsibility to specify the tool command
        that actually produces these files.

        If you specify more than one output for shared library links,
        you should consider setting link_output, depend_output, and
        runtime_link_output. Otherwise, the first entry in the
        outputs list should always be the main output which will be
        linked to.

        Example for a compiler tool that produces .obj files:
          outputs = [
            "{{source_out_dir}}/{{source_name_part}}.obj"
          ]

        Example for a linker tool that produces a .dll and a .lib. The
        use of {{target_output_name}}, {{output_extension}} and
        {{output_dir}} allows the target to override these values.
          outputs = [
            "{{output_dir}}/{{target_output_name}}{{output_extension}}",
            "{{output_dir}}/{{target_output_name}}.lib",
          ]

    link_output  [string with substitutions]
    depend_output  [string with substitutions]
    runtime_link_output  [string with substitutions]
        Valid for: "solink" only (optional)

        These three files specify which of the outputs from the solink
        tool should be used for linking and dependency tracking. These
        should match entries in the "outputs". If unspecified, the
        first item in the "outputs" array will be used for all. See
        "Separate linking and dependencies for shared libraries"
        below for more. If link_output is set but runtime_link_output
        is not set, runtime_link_output defaults to link_output.

        On Windows, where the tools produce a .dll shared library and
        a .lib import library, you will want the first two to be the
        import library and the third one to be the .dll file.
        On Linux, if you're not doing the separate linking/dependency
        optimization, all of these should be the .so output.

    output_prefix  [string]
        Valid for: Linker tools (optional)

        Prefix to use for the output name. Defaults to empty. This
        prefix will be prepended to the name of the target (or the
        output_name if one is manually specified for it) if the prefix
        is not already there. The result will show up in the
        {{output_name}} substitution pattern.

        Individual targets can opt-out of the output prefix by setting:
          output_prefix_override = true
        (see "gn help output_prefix_override").

        This is typically used to prepend "lib" to libraries on
        Posix systems:
          output_prefix = "lib"

    precompiled_header_type  [string]
        Valid for: "cc", "cxx", "objc", "objcxx"

        Type of precompiled headers. If undefined or the empty string,
        precompiled headers will not be used for this tool. Otherwise
        use "gcc" or "msvc".

        For precompiled headers to be used for a given target, the
        target (or a config applied to it) must also specify a
        "precompiled_header" and, for "msvc"-style headers, a
        "precompiled_source" value. If the type is "gcc", then both
        "precompiled_header" and "precompiled_source" must resolve
        to the same file, despite the different formats required for each.
        See "gn help precompiled_header" for more.

    restat  [boolean]
        Valid for: all tools (optional, defaults to false)

        Requests that Ninja check the file timestamp after this tool has
        run to determine if anything changed. Set this if your tool has
        the ability to skip writing output if the output file has not
        changed.

        Normally, Ninja will assume that when a tool runs the output
        be new and downstream dependents must be rebuild. When this is
        set to trye, Ninja can skip rebuilding downstream dependents for
        input changes that don't actually affect the output.

        Example:
          restat = true

    rspfile  [string with substitutions]
        Valid for: all tools (optional)

        Name of the response file. If empty, no response file will be
        used. See "rspfile_content".

    rspfile_content  [string with substitutions]
        Valid for: all tools (required when "rspfile" is specified)

        The contents to be written to the response file. This may
        include all or part of the command to send to the tool which
        allows you to get around OS command-line length limits.

        This example adds the inputs and libraries to a response file,
        but passes the linker flags directly on the command line:
          tool("link") {
            command = "link -o {{output}} {{ldflags}} @{{output}}.rsp"
            rspfile = "{{output}}.rsp"
            rspfile_content = "{{inputs}} {{solibs}} {{libs}}"
          }

Expansions for tool variables

  All paths are relative to the root build directory, which is the
  current directory for running all tools. These expansions are
  available to all tools:

    {{label}}
        The label of the current target. This is typically used in the
        "description" field for link tools. The toolchain will be
        omitted from the label for targets in the default toolchain, and
        will be included for targets in other toolchains.

    {{label_name}}
        The short name of the label of the target. This is the part
        after the colon. For "//foo/bar:baz" this will be "baz".
        Unlike {{target_output_name}}, this is not affected by the
        "output_prefix" in the tool or the "output_name" set
        on the target.

    {{output}}
        The relative path and name of the output(s) of the current
        build step. If there is more than one output, this will expand
        to a list of all of them.
        Example: "out/base/my_file.o"

    {{target_gen_dir}}
    {{target_out_dir}}
        The directory of the generated file and output directories,
        respectively, for the current target. There is no trailing
        slash. See also {{output_dir}} for linker tools.
        Example: "out/base/test"

    {{target_output_name}}
        The short name of the current target with no path information,
        or the value of the "output_name" variable if one is specified
        in the target. This will include the "output_prefix" if any.
        See also {{label_name}}.
        Example: "libfoo" for the target named "foo" and an
        output prefix for the linker tool of "lib".

  Compiler tools have the notion of a single input and a single output,
  along with a set of compiler-specific flags. The following expansions
  are available:

    {{asmflags}}
    {{cflags}}
    {{cflags_c}}
    {{cflags_cc}}
    {{cflags_objc}}
    {{cflags_objcc}}
    {{defines}}
    {{include_dirs}}
        Strings correspond that to the processed flags/defines/include
        directories specified for the target.
        Example: "--enable-foo --enable-bar"

        Defines will be prefixed by "-D" and include directories will
        be prefixed by "-I" (these work with Posix tools as well as
        Microsoft ones).

    {{source}}
        The relative path and name of the current input file.
        Example: "../../base/my_file.cc"

    {{source_file_part}}
        The file part of the source including the extension (with no
        directory information).
        Example: "foo.cc"

    {{source_name_part}}
        The filename part of the source file with no directory or
        extension.
        Example: "foo"

    {{source_gen_dir}}
    {{source_out_dir}}
        The directory in the generated file and output directories,
        respectively, for the current input file. If the source file
        is in the same directory as the target is declared in, they will
        will be the same as the "target" versions above.
        Example: "gen/base/test"

  Linker tools have multiple inputs and (potentially) multiple outputs
  The static library tool ("alink") is not considered a linker tool.
  The following expansions are available:

    {{inputs}}
    {{inputs_newline}}
        Expands to the inputs to the link step. This will be a list of
        object files and static libraries.
        Example: "obj/foo.o obj/bar.o obj/somelibrary.a"

        The "_newline" version will separate the input files with
        newlines instead of spaces. This is useful in response files:
        some linkers can take a "-filelist" flag which expects newline
        separated files, and some Microsoft tools have a fixed-sized
        buffer for parsing each line of a response file.

    {{ldflags}}
        Expands to the processed set of ldflags and library search paths
        specified for the target.
        Example: "-m64 -fPIC -pthread -L/usr/local/mylib"

    {{libs}}
        Expands to the list of system libraries to link to. Each will
        be prefixed by the "lib_prefix".

        As a special case to support Mac, libraries with names ending in
        ".framework" will be added to the {{libs}} with "-framework"
        preceeding it, and the lib prefix will be ignored.

        Example: "-lfoo -lbar"

    {{output_dir}}
        The value of the "output_dir" variable in the target, or the
        the value of the "default_output_dir" value in the tool if the
        target does not override the output directory. This will be
        relative to the root_build_dir and will not end in a slash.
        Will be "." for output to the root_build_dir.

        This is subtly different than {{target_out_dir}} which is
        defined by GN based on the target's path and not overridable.
        {{output_dir}} is for the final output, {{target_out_dir}} is
        generally for object files and other outputs.

        Usually {{output_dir}} would be defined in terms of either
        {{target_out_dir}} or {{root_out_dir}}

    {{output_extension}}
        The value of the "output_extension" variable in the target,
        or the value of the "default_output_extension" value in the
        tool if the target does not specify an output extension.
        Example: ".so"

    {{solibs}}
        Extra libraries from shared library dependencide not specified
        in the {{inputs}}. This is the list of link_output files from
        shared libraries (if the solink tool specifies a "link_output"
        variable separate from the "depend_output").

        These should generally be treated the same as libs by your tool.
        Example: "libfoo.so libbar.so"

  The static library ("alink") tool allows {{arflags}} plus the common
  tool substitutions.

  The copy tool allows the common compiler/linker substitutions, plus
  {{source}} which is the source of the copy. The stamp tool allows
  only the common tool substitutions.

  The copy_bundle_data and compile_xcassets tools only allows the common
  tool substitutions. Both tools are required to create iOS/OS X bundles
  and need only be defined on those platforms.

  The copy_bundle_data tool will be called with one source and needs to
  copy (optionally optimizing the data representation) to its output. It
  may be called with a directory as input and it needs to be recursively
  copied.

  The compile_xcassets tool will be called with one or more source (each
  an asset catalog) that needs to be compiled to a single output.

Separate linking and dependencies for shared libraries

  Shared libraries are special in that not all changes to them require
  that dependent targets be re-linked. If the shared library is changed
  but no imports or exports are different, dependent code needn't be
  relinked, which can speed up the build.

  If your link step can output a list of exports from a shared library
  and writes the file only if the new one is different, the timestamp of
  this file can be used for triggering re-links, while the actual shared
  library would be used for linking.

  You will need to specify
    restat = true
  in the linker tool to make this work, so Ninja will detect if the
  timestamp of the dependency file has changed after linking (otherwise
  it will always assume that running a command updates the output):

    tool("solink") {
      command = "..."
      outputs = [
        "{{output_dir}}/{{target_output_name}}{{output_extension}}",
        "{{output_dir}}/{{target_output_name}}{{output_extension}}.TOC",
      ]
      link_output =
        "{{output_dir}}/{{target_output_name}}{{output_extension}}"
      depend_output =
        "{{output_dir}}/{{target_output_name}}{{output_extension}}.TOC"
      restat = true
    }

Example

  toolchain("my_toolchain") {
    # Put these at the top to apply to all tools below.
    lib_prefix = "-l"
    lib_dir_prefix = "-L"

    tool("cc") {
      command = "gcc {{source}} -o {{output}}"
      outputs = [ "{{source_out_dir}}/{{source_name_part}}.o" ]
      description = "GCC {{source}}"
    }
    tool("cxx") {
      command = "g++ {{source}} -o {{output}}"
      outputs = [ "{{source_out_dir}}/{{source_name_part}}.o" ]
      description = "G++ {{source}}"
    }
  }


toolchain: Defines a toolchain.

  A toolchain is a set of commands and build flags used to compile the
  source code. You can have more than one toolchain in use at once in
  a build.

Functions and variables

  tool()
    The tool() function call specifies the commands commands to run for
    a given step. See "gn help tool".

  toolchain_args()
    List of arguments to pass to the toolchain when invoking this
    toolchain. This applies only to non-default toolchains. See
    "gn help toolchain_args" for more.

  deps
    Dependencies of this toolchain. These dependencies will be resolved
    before any target in the toolchain is compiled. To avoid circular
    dependencies these must be targets defined in another toolchain.

    This is expressed as a list of targets, and generally these targets
    will always specify a toolchain:
      deps = [ "//foo/bar:baz(//build/toolchain:bootstrap)" ]

    This concept is somewhat inefficient to express in Ninja (it
    requires a lot of duplicate of rules) so should only be used when
    absolutely necessary.

  concurrent_links
    In integer expressing the number of links that Ninja will perform in
    parallel. GN will create a pool for shared library and executable
    link steps with this many processes. Since linking is memory- and
    I/O-intensive, projects with many large targets may want to limit
    the number of parallel steps to avoid overloading the computer.
    Since creating static libraries is generally not as intensive
    there is no limit to "alink" steps.

    Defaults to 0 which Ninja interprets as "no limit".

    The value used will be the one from the default toolchain of the
    current build.

Invoking targets in toolchains:

  By default, when a target depends on another, there is an implicit
  toolchain label that is inherited, so the dependee has the same one
  as the dependent.

  You can override this and refer to any other toolchain by explicitly
  labeling the toolchain to use. For example:
    data_deps = [ "//plugins:mine(//toolchains:plugin_toolchain)" ]
  The string "//build/toolchains:plugin_toolchain" is a label that
  identifies the toolchain declaration for compiling the sources.

  To load a file in an alternate toolchain, GN does the following:

   1. Loads the file with the toolchain definition in it (as determined
      by the toolchain label).
   2. Re-runs the master build configuration file, applying the
      arguments specified by the toolchain_args section of the toolchain
      definition (see "gn help toolchain_args").
   3. Loads the destination build file in the context of the
      configuration file in the previous step.

Example:

  toolchain("plugin_toolchain") {
    concurrent_links = 8

    tool("cc") {
      command = "gcc {{source}}"
      ...
    }

    toolchain_args() {
      is_plugin = true
      is_32bit = true
      is_64bit = false
    }
  }


toolchain_args: Set build arguments for toolchain build setup.

  Used inside a toolchain definition to pass arguments to an alternate
  toolchain's invocation of the build.

  When you specify a target using an alternate toolchain, the master
  build configuration file is re-interpreted in the context of that
  toolchain (see "gn help toolchain"). The toolchain_args function
  allows you to control the arguments passed into this alternate
  invocation of the build.

  Any default system arguments or arguments passed in on the command-
  line will also be passed to the alternate invocation unless explicitly
  overridden by toolchain_args.

  The toolchain_args will be ignored when the toolchain being defined
  is the default. In this case, it's expected you want the default
  argument values.

  See also "gn help buildargs" for an overview of these arguments.

Example:

  toolchain("my_weird_toolchain") {
    ...
    toolchain_args() {
      # Override the system values for a generic Posix system.
      is_win = false
      is_posix = true

      # Pass this new value for specific setup for my toolchain.
      is_my_weird_system = true
    }
  }


write_file: Write a file to disk.

  write_file(filename, data)

  If data is a list, the list will be written one-item-per-line with no
  quoting or brackets.

  If the file exists and the contents are identical to that being
  written, the file will not be updated. This will prevent unnecessary
  rebuilds of targets that depend on this file.

  One use for write_file is to write a list of inputs to an script
  that might be too long for the command line. However, it is
  preferrable to use response files for this purpose. See
  "gn help response_file_contents".

  TODO(brettw) we probably need an optional third argument to control
  list formatting.

Arguments

  filename
      Filename to write. This must be within the output directory.

  data:
      The list or string to write.


current_cpu: The processor architecture of the current toolchain.

  The build configuration usually sets this value based on the value
  of "host_cpu" (see "gn help host_cpu") and then threads
  this through the toolchain definitions to ensure that it always
  reflects the appropriate value.

  This value is not used internally by GN for any purpose. It is
  set it to the empty string ("") by default but is declared so
  that it can be overridden on the command line if so desired.

  See "gn help target_cpu" for a list of common values returned.


current_os: The operating system of the current toolchain.

  The build configuration usually sets this value based on the value
  of "target_os" (see "gn help target_os"), and then threads this
  through the toolchain definitions to ensure that it always reflects
  the appropriate value.

  This value is not used internally by GN for any purpose. It is
  set it to the empty string ("") by default but is declared so
  that it can be overridden on the command line if so desired.

  See "gn help target_os" for a list of common values returned.


current_toolchain: Label of the current toolchain.

  A fully-qualified label representing the current toolchain. You can
  use this to make toolchain-related decisions in the build. See also
  "default_toolchain".

Example

  if (current_toolchain == "//build:64_bit_toolchain") {
    executable("output_thats_64_bit_only") {
      ...


default_toolchain: [string] Label of the default toolchain.

  A fully-qualified label representing the default toolchain, which may
  not necessarily be the current one (see "current_toolchain").


host_cpu: The processor architecture that GN is running on.

  This is value is exposed so that cross-compile toolchains can
  access the host architecture when needed.

  The value should generally be considered read-only, but it can be
  overriden in order to handle unusual cases where there might
  be multiple plausible values for the host architecture (e.g., if
  you can do either 32-bit or 64-bit builds). The value is not used
  internally by GN for any purpose.

Some possible values:

  - "x64"
  - "x86"


host_os: [string] The operating system that GN is running on.

  This value is exposed so that cross-compiles can access the host
  build system's settings.

  This value should generally be treated as read-only. It, however,
  is not used internally by GN for any purpose.

Some possible values:

  - "linux"
  - "mac"
  - "win"


python_path: Absolute path of Python.

  Normally used in toolchain definitions if running some command
  requires Python. You will normally not need this when invoking scripts
  since GN automatically finds it for you.


root_build_dir: [string] Directory where build commands are run.

  This is the root build output directory which will be the current
  directory when executing all compilers and scripts.

  Most often this is used with rebase_path (see "gn help rebase_path")
  to convert arguments to be relative to a script's current directory.


root_gen_dir: Directory for the toolchain's generated files.

  Absolute path to the root of the generated output directory tree for
  the current toolchain. An example would be "//out/Debug/gen" for the
  default toolchain, or "//out/Debug/arm/gen" for the "arm"
  toolchain.

  This is primarily useful for setting up include paths for generated
  files. If you are passing this to a script, you will want to pass it
  through rebase_path() (see "gn help rebase_path") to convert it
  to be relative to the build directory.

  See also "target_gen_dir" which is usually a better location for
  generated files. It will be inside the root generated dir.


root_out_dir: [string] Root directory for toolchain output files.

  Absolute path to the root of the output directory tree for the current
  toolchain. It will not have a trailing slash.

  For the default toolchain this will be the same as the root_build_dir.
  An example would be "//out/Debug" for the default toolchain, or
  "//out/Debug/arm" for the "arm" toolchain.

  This is primarily useful for setting up script calls. If you are
  passing this to a script, you will want to pass it through
  rebase_path() (see "gn help rebase_path") to convert it
  to be relative to the build directory.

  See also "target_out_dir" which is usually a better location for
  output files. It will be inside the root output dir.

Example

  action("myscript") {
    # Pass the output dir to the script.
    args = [ "-o", rebase_path(root_out_dir, root_build_dir) ]
  }


target_cpu: The desired cpu architecture for the build.

  This value should be used to indicate the desired architecture for
  the primary objects of the build. It will match the cpu architecture
  of the default toolchain.

  In many cases, this is the same as "host_cpu", but in the case
  of cross-compiles, this can be set to something different. This 
  value is different from "current_cpu" in that it can be referenced
  from inside any toolchain. This value can also be ignored if it is
  not needed or meaningful for a project.

  This value is not used internally by GN for any purpose, so it
  may be set to whatever value is needed for the build.
  GN defaults this value to the empty string ("") and the
  configuration files should set it to an appropriate value
  (e.g., setting it to the value of "host_cpu") if it is not
  overridden on the command line or in the args.gn file.

  Where practical, use one of the following list of common values:

Possible values:

  - "x86"
  - "x64"
  - "arm"
  - "arm64"
  - "mipsel"


target_gen_dir: Directory for a target's generated files.

  Absolute path to the target's generated file directory. This will be
  the "root_gen_dir" followed by the relative path to the current
  build file. If your file is in "//tools/doom_melon" then
  target_gen_dir would be "//out/Debug/gen/tools/doom_melon". It will
  not have a trailing slash.

  This is primarily useful for setting up include paths for generated
  files. If you are passing this to a script, you will want to pass it
  through rebase_path() (see "gn help rebase_path") to convert it
  to be relative to the build directory.

  See also "gn help root_gen_dir".

Example

  action("myscript") {
    # Pass the generated output dir to the script.
    args = [ "-o", rebase_path(target_gen_dir, root_build_dir) ]
  }


target_os: The desired operating system for the build.

  This value should be used to indicate the desired operating system
  for the primary object(s) of the build. It will match the OS of
  the default toolchain.

  In many cases, this is the same as "host_os", but in the case of
  cross-compiles, it may be different. This variable differs from
  "current_os" in that it can be referenced from inside any
  toolchain and will always return the initial value.

  This should be set to the most specific value possible. So,
  "android" or "chromeos" should be used instead of "linux"
  where applicable, even though Android and ChromeOS are both Linux
  variants. This can mean that one needs to write

      if (target_os == "android" || target_os == "linux") {
          # ...
      }

  and so forth.

  This value is not used internally by GN for any purpose, so it
  may be set to whatever value is needed for the build.
  GN defaults this value to the empty string ("") and the
  configuration files should set it to an appropriate value
  (e.g., setting it to the value of "host_os") if it is not
  set via the command line or in the args.gn file.

  Where practical, use one of the following list of common values:

Possible values:

  - "android"
  - "chromeos"
  - "ios"
  - "linux"
  - "nacl"
  - "mac"
  - "win"


target_out_dir: [string] Directory for target output files.

  Absolute path to the target's generated file directory. If your
  current target is in "//tools/doom_melon" then this value might be
  "//out/Debug/obj/tools/doom_melon". It will not have a trailing
  slash.

  This is primarily useful for setting up arguments for calling
  scripts. If you are passing this to a script, you will want to pass it
  through rebase_path() (see "gn help rebase_path") to convert it
  to be relative to the build directory.

  See also "gn help root_out_dir".

Example

  action("myscript") {
    # Pass the output dir to the script.
    args = [ "-o", rebase_path(target_out_dir, root_build_dir) ]
  }


all_dependent_configs: Configs to be forced on dependents.

  A list of config labels.

  All targets depending on this one, and recursively, all targets
  depending on those, will have the configs listed in this variable
  added to them. These configs will also apply to the current target.

  This addition happens in a second phase once a target and all of its
  dependencies have been resolved. Therefore, a target will not see
  these force-added configs in their "configs" variable while the
  script is running, and then can not be removed. As a result, this
  capability should generally only be used to add defines and include
  directories necessary to compile a target's headers.

  See also "public_configs".

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


allow_circular_includes_from: Permit includes from deps.

  A list of target labels. Must be a subset of the target's "deps".
  These targets will be permitted to include headers from the current
  target despite the dependency going in the opposite direction.

  When you use this, both targets must be included in a final binary
  for it to link. To keep linker errors from happening, it is good
  practice to have all external dependencies depend only on one of
  the two targets, and to set the visibility on the other to enforce
  this. Thus the targets will always be linked together in any output.

Details

  Normally, for a file in target A to include a file from target B,
  A must list B as a dependency. This invariant is enforced by the
  "gn check" command (and the --check flag to "gn gen" -- see
  "gn help check").

  Sometimes, two targets might be the same unit for linking purposes
  (two source sets or static libraries that would always be linked
  together in a final executable or shared library) and they each
  include headers from the other: you want A to be able to include B's
  headers, and B to include A's headers. This is not an ideal situation
  but is sometimes unavoidable.

  This list, if specified, lists which of the dependencies of the
  current target can include header files from the current target.
  That is, if A depends on B, B can only include headers from A if it is
  in A's allow_circular_includes_from list. Normally includes must
  follow the direction of dependencies, this flag allows them to go
  in the opposite direction.

Danger

  In the above example, A's headers are likely to include headers from
  A's dependencies. Those dependencies may have public_configs that
  apply flags, defines, and include paths that make those headers work
  properly.

  With allow_circular_includes_from, B can include A's headers, and
  transitively from A's dependencies, without having the dependencies
  that would bring in the public_configs those headers need. The result
  may be errors or inconsistent builds.

  So when you use allow_circular_includes_from, make sure that any
  compiler settings, flags, and include directories are the same between
  both targets (consider putting such things in a shared config they can
  both reference). Make sure the dependencies are also the same (you
  might consider a group to collect such dependencies they both
  depend on).

Example

  source_set("a") {
    deps = [ ":b", ":a_b_shared_deps" ]
    allow_circular_includes_from = [ ":b" ]
    ...
  }

  source_set("b") {
    deps = [ ":a_b_shared_deps" ]
    # Sources here can include headers from a despite lack of deps.
    ...
  }

  group("a_b_shared_deps") {
    public_deps = [ ":c" ]
  }


arflags: Arguments passed to static_library archiver.

  A list of flags passed to the archive/lib command that creates static
  libraries.

  arflags are NOT pushed to dependents, so applying arflags to source
  sets or any other target type will be a no-op. As with ldflags,
  you could put the arflags in a config and set that as a public or
  "all dependent" config, but that will likely not be what you want.
  If you have a chain of static libraries dependent on each other,
  this can cause the flags to propagate up to other static libraries.
  Due to the nature of how arflags are typically used, you will normally
  want to apply them directly on static_library targets themselves.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


args: Arguments passed to an action.

  For action and action_foreach targets, args is the list of arguments
  to pass to the script. Typically you would use source expansion (see
  "gn help source_expansion") to insert the source file names.

  See also "gn help action" and "gn help action_foreach".


asmflags: Flags passed to the assembler.

  A list of strings.

  "asmflags" are passed to any invocation of a tool that takes an
  .asm or .S file as input.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


assert_no_deps: Ensure no deps on these targets.

  A list of label patterns.

  This list is a list of patterns that must not match any of the
  transitive dependencies of the target. These include all public,
  private, and data dependencies, and cross shared library boundaries.
  This allows you to express that undesirable code isn't accidentally
  added to downstream dependencies in a way that might otherwise be
  difficult to notice.

  Checking does not cross executable boundaries. If a target depends on
  an executable, it's assumed that the executable is a tool that is
  producing part of the build rather than something that is linked and
  distributed. This allows assert_no_deps to express what is distributed
  in the final target rather than depend on the internal build steps
  (which may include non-distributable code).

  See "gn help label_pattern" for the format of the entries in the
  list. These patterns allow blacklisting individual targets or whole
  directory hierarchies.

  Sometimes it is desirable to enforce that many targets have no
  dependencies on a target or set of targets. One efficient way to
  express this is to create a group with the assert_no_deps rule on
  it, and make that group depend on all targets you want to apply that
  assertion to.

Example

  executable("doom_melon") {
    deps = [ "//foo:bar" ]
    ...
    assert_no_deps = [
      "//evil/*",  # Don't link any code from the evil directory.
      "//foo:test_support",  # This target is also disallowed.
    ]
  }


bundle_executable_dir: Expansion of {{bundle_executable_dir}} in create_bundle.

  A string corresponding to a path in $root_build_dir.

  This string is used by the "create_bundle" target to expand the
  {{bundle_executable_dir}} of the "bundle_data" target it depends on.
  This must correspond to a path under "bundle_root_dir".

  See "gn help bundle_root_dir" for examples.


bundle_plugins_dir: Expansion of {{bundle_plugins_dir}} in create_bundle.

  A string corresponding to a path in $root_build_dir.

  This string is used by the "create_bundle" target to expand the
  {{bundle_plugins_dir}} of the "bundle_data" target it depends on.
  This must correspond to a path under "bundle_root_dir".

  See "gn help bundle_root_dir" for examples.


bundle_resources_dir: Expansion of {{bundle_resources_dir}} in create_bundle.

  A string corresponding to a path in $root_build_dir.

  This string is used by the "create_bundle" target to expand the
  {{bundle_resources_dir}} of the "bundle_data" target it depends on.
  This must correspond to a path under "bundle_root_dir".

  See "gn help bundle_root_dir" for examples.


bundle_root_dir: Expansion of {{bundle_root_dir}} in create_bundle.

  A string corresponding to a path in root_build_dir.

  This string is used by the "create_bundle" target to expand the
  {{bundle_root_dir}} of the "bundle_data" target it depends on.
  This must correspond to a path under root_build_dir.

Example

  bundle_data("info_plist") {
    sources = [ "Info.plist" ]
    outputs = [ "{{bundle_root_dir}}/Info.plist" ]
  }

  create_bundle("doom_melon.app") {
    deps = [ ":info_plist" ]
    bundle_root_dir = root_build_dir + "/doom_melon.app/Contents"
    bundle_resources_dir = bundle_root_dir + "/Resources"
    bundle_executable_dir = bundle_root_dir + "/MacOS"
    bundle_plugins_dir = bundle_root_dir + "/PlugIns"
  }


cflags*: Flags passed to the C compiler.

  A list of strings.

  "cflags" are passed to all invocations of the C, C++, Objective C,
  and Objective C++ compilers.

  To target one of these variants individually, use "cflags_c",
  "cflags_cc", "cflags_objc", and "cflags_objcc",
  respectively. These variant-specific versions of cflags* will be
  appended on the compiler command line after "cflags".

  See also "asmflags" for flags for assembly-language files.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


cflags*: Flags passed to the C compiler.

  A list of strings.

  "cflags" are passed to all invocations of the C, C++, Objective C,
  and Objective C++ compilers.

  To target one of these variants individually, use "cflags_c",
  "cflags_cc", "cflags_objc", and "cflags_objcc",
  respectively. These variant-specific versions of cflags* will be
  appended on the compiler command line after "cflags".

  See also "asmflags" for flags for assembly-language files.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


cflags*: Flags passed to the C compiler.

  A list of strings.

  "cflags" are passed to all invocations of the C, C++, Objective C,
  and Objective C++ compilers.

  To target one of these variants individually, use "cflags_c",
  "cflags_cc", "cflags_objc", and "cflags_objcc",
  respectively. These variant-specific versions of cflags* will be
  appended on the compiler command line after "cflags".

  See also "asmflags" for flags for assembly-language files.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


cflags*: Flags passed to the C compiler.

  A list of strings.

  "cflags" are passed to all invocations of the C, C++, Objective C,
  and Objective C++ compilers.

  To target one of these variants individually, use "cflags_c",
  "cflags_cc", "cflags_objc", and "cflags_objcc",
  respectively. These variant-specific versions of cflags* will be
  appended on the compiler command line after "cflags".

  See also "asmflags" for flags for assembly-language files.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


cflags*: Flags passed to the C compiler.

  A list of strings.

  "cflags" are passed to all invocations of the C, C++, Objective C,
  and Objective C++ compilers.

  To target one of these variants individually, use "cflags_c",
  "cflags_cc", "cflags_objc", and "cflags_objcc",
  respectively. These variant-specific versions of cflags* will be
  appended on the compiler command line after "cflags".

  See also "asmflags" for flags for assembly-language files.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


check_includes: [boolean] Controls whether a target's files are checked.

  When true (the default), the "gn check" command (as well as
  "gn gen" with the --check flag) will check this target's sources
  and headers for proper dependencies.

  When false, the files in this target will be skipped by default.
  This does not affect other targets that depend on the current target,
  it just skips checking the includes of the current target's files.

  If there are a few conditionally included headers that trip up
  checking, you can exclude headers individually by annotating them with
  "nogncheck" (see "gn help nogncheck").

  The topic "gn help check" has general information on how checking
  works and advice on how to pass a check in problematic cases.

Example

  source_set("busted_includes") {
    # This target's includes are messed up, exclude it from checking.
    check_includes = false
    ...
  }


complete_static_lib: [boolean] Links all deps into a static library.

  A static library normally doesn't include code from dependencies, but
  instead forwards the static libraries and source sets in its deps up
  the dependency chain until a linkable target (an executable or shared
  library) is reached. The final linkable target only links each static
  library once, even if it appears more than once in its dependency
  graph.

  In some cases the static library might be the final desired output.
  For example, you may be producing a static library for distribution to
  third parties. In this case, the static library should include code
  for all dependencies in one complete package. However, complete static
  libraries themselves are never linked into other complete static
  libraries. All complete static libraries are for distribution and
  linking them in would cause code duplication in this case. If the
  static library is not for distribution, it should not be complete.

  GN treats non-complete static libraries as source sets when they are
  linked into complete static libraries. This is done because some tools
  like AR do not handle dependent static libraries properly. This makes
  it easier to write "alink" rules.

  In rare cases it makes sense to list a header in more than one
  target if it could be considered conceptually a member of both.
  libraries.

Example

  static_library("foo") {
    complete_static_lib = true
    deps = [ "bar" ]
  }


configs: Configs applying to this target or config.

  A list of config labels.

Configs on a target

  When used on a target, the include_dirs, defines, etc. in each config
  are appended in the order they appear to the compile command for each
  file in the target. They will appear after the include_dirs, defines,
  etc. that the target sets directly.

  Since configs apply after the values set on a target, directly setting
  a compiler flag will prepend it to the command line. If you want to
  append a flag instead, you can put that flag in a one-off config and
  append that config to the target's configs list.

  The build configuration script will generally set up the default
  configs applying to a given target type (see "set_defaults").
  When a target is being defined, it can add to or remove from this
  list.

Configs on a config

  It is possible to create composite configs by specifying configs on a
  config. One might do this to forward values, or to factor out blocks
  of settings from very large configs into more manageable named chunks.

  In this case, the composite config is expanded to be the concatenation
  of its own values, and in order, the values from its sub-configs
  *before* anything else happens. This has some ramifications:

   - A target has no visibility into a config's sub-configs. Target
     code only sees the name of the composite config. It can't remove
     sub-configs or opt in to only parts of it. The composite config may
     not even be defined before the target is.

   - You can get duplication of values if a config is listed twice, say,
     on a target and in a sub-config that also applies. In other cases,
     the configs applying to a target are de-duped. It's expected that
     if a config is listed as a sub-config that it is only used in that
     context. (Note that it's possible to fix this and de-dupe, but it's
     not normally relevant and complicates the implementation.)

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.

Example

  # Configs on a target.
  source_set("foo") {
    # Don't use the default RTTI config that BUILDCONFIG applied to us.
    configs -= [ "//build:no_rtti" ]

    # Add some of our own settings.
    configs += [ ":mysettings" ]
  }

  # Create a default_optimization config that forwards to one of a set
  # of more specialized configs depending on build flags. This pattern
  # is useful because it allows a target to opt in to either a default
  # set, or a more specific set, while avoid duplicating the settings in
  # two places.
  config("super_optimization") {
    cflags = [ ... ]
  }
  config("default_optimization") {
    if (optimize_everything) {
      configs = [ ":super_optimization" ]
    } else {
      configs = [ ":no_optimization" ]
    }
  }


console: Run this action in the console pool.

  Boolean. Defaults to false.

  Actions marked "console = true" will be run in the built-in ninja
  "console" pool. They will have access to real stdin and stdout, and
  output will not be buffered by ninja. This can be useful for
  long-running actions with progress logs, or actions that require user 
  input.

  Only one console pool target can run at any one time in Ninja. Refer
  to the Ninja documentation on the console pool for more info.

Example

  action("long_action_with_progress_logs") {
    console = true
  }


data: Runtime data file dependencies.

  Lists files or directories required to run the given target. These are
  typically data files or directories of data files. The paths are
  interpreted as being relative to the current build file. Since these
  are runtime dependencies, they do not affect which targets are built
  or when. To declare input files to a script, use "inputs".

  Appearing in the "data" section does not imply any special handling
  such as copying them to the output directory. This is just used for
  declaring runtime dependencies. Runtime dependencies can be queried
  using the "runtime_deps" category of "gn desc" or written during
  build generation via "--runtime-deps-list-file".

  GN doesn't require data files to exist at build-time. So actions that
  produce files that are in turn runtime dependencies can list those
  generated files both in the "outputs" list as well as the "data"
  list.

  By convention, directories are listed with a trailing slash:
    data = [ "test/data/" ]
  However, no verification is done on these so GN doesn't enforce this.
  The paths are just rebased and passed along when requested.

  See "gn help runtime_deps" for how these are used.


data_deps: Non-linked dependencies.

  A list of target labels.

  Specifies dependencies of a target that are not actually linked into
  the current target. Such dependencies will be built and will be
  available at runtime.

  This is normally used for things like plugins or helper programs that
  a target needs at runtime.

  See also "gn help deps" and "gn help data".

Example

  executable("foo") {
    deps = [ "//base" ]
    data_deps = [ "//plugins:my_runtime_plugin" ]
  }


defines: C preprocessor defines.

  A list of strings

  These strings will be passed to the C/C++ compiler as #defines. The
  strings may or may not include an "=" to assign a value.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.

Example

  defines = [ "AWESOME_FEATURE", "LOG_LEVEL=3" ]


depfile: [string] File name for input dependencies for actions.

  If nonempty, this string specifies that the current action or
  action_foreach target will generate the given ".d" file containing
  the dependencies of the input. Empty or unset means that the script
  doesn't generate the files.

  The .d file should go in the target output directory. If you have more
  than one source file that the script is being run over, you can use
  the output file expansions described in "gn help action_foreach" to
  name the .d file according to the input.
  The format is that of a Makefile, and all of the paths should be
  relative to the root build directory.

Example

  action_foreach("myscript_target") {
    script = "myscript.py"
    sources = [ ... ]

    # Locate the depfile in the output directory named like the
    # inputs but with a ".d" appended.
    depfile = "$relative_target_output_dir/{{source_name}}.d"

    # Say our script uses "-o <d file>" to indicate the depfile.
    args = [ "{{source}}", "-o", depfile ]
  }


deps: Private linked dependencies.

  A list of target labels.

  Specifies private dependencies of a target. Private dependencies are
  propagated up the dependency tree and linked to dependant targets, but
  do not grant the ability to include headers from the dependency.
  Public configs are not forwarded.

Details of dependency propagation

  Source sets, shared libraries, and non-complete static libraries
  will be propagated up the dependency tree across groups, non-complete
  static libraries and source sets.

  Executables, shared libraries, and complete static libraries will
  link all propagated targets and stop propagation. Actions and copy
  steps also stop propagation, allowing them to take a library as an
  input but not force dependants to link to it.

  Propagation of all_dependent_configs and public_configs happens
  independently of target type. all_dependent_configs are always
  propagated across all types of targets, and public_configs
  are always propagated across public deps of all types of targets.

  Data dependencies are propagated differently. See
  "gn help data_deps" and "gn help runtime_deps".

  See also "public_deps".


include_dirs: Additional include directories.

  A list of source directories.

  The directories in this list will be added to the include path for
  the files in the affected target.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.

Example

  include_dirs = [ "src/include", "//third_party/foo" ]


inputs: Additional compile-time dependencies.

  Inputs are compile-time dependencies of the current target. This means
  that all inputs must be available before compiling any of the sources
  or executing any actions.

  Inputs are typically only used for action and action_foreach targets.

Inputs for actions

  For action and action_foreach targets, inputs should be the inputs to
  script that don't vary. These should be all .py files that the script
  uses via imports (the main script itself will be an implicit dependency
  of the action so need not be listed).

  For action targets, inputs and sources are treated the same, but from
  a style perspective, it's recommended to follow the same rule as
  action_foreach and put helper files in the inputs, and the data used
  by the script (if any) in sources.

  Note that another way to declare input dependencies from an action
  is to have the action write a depfile (see "gn help depfile"). This
  allows the script to dynamically write input dependencies, that might
  not be known until actually executing the script. This is more
  efficient than doing processing while running GN to determine the
  inputs, and is easier to keep in-sync than hardcoding the list.

Script input gotchas

  It may be tempting to write a script that enumerates all files in a
  directory as inputs. Don't do this! Even if you specify all the files
  in the inputs or sources in the GN target (or worse, enumerate the
  files in an exec_script call when running GN, which will be slow), the
  dependencies will be broken.

  The problem happens if a file is ever removed because the inputs are
  not listed on the command line to the script. Because the script
  hasn't changed and all inputs are up-to-date, the script will not
  re-run and you will get a stale build. Instead, either list all
  inputs on the command line to the script, or if there are many, create
  a separate list file that the script reads. As long as this file is
  listed in the inputs, the build will detect when it has changed in any
  way and the action will re-run.

Inputs for binary targets

  Any input dependencies will be resolved before compiling any sources.
  Normally, all actions that a target depends on will be run before any
  files in a target are compiled. So if you depend on generated headers,
  you do not typically need to list them in the inputs section.

  Inputs for binary targets will be treated as order-only dependencies,
  meaning that they will be forced up-to-date before compiling or
  any files in the target, but changes in the inputs will not
  necessarily force the target to compile. This is because it is
  expected that the compiler will report the precise list of input
  dependencies required to recompile each file once the initial build
  is done.

Example

  action("myscript") {
    script = "domything.py"
    inputs = [ "input.data" ]
  }


ldflags: Flags passed to the linker.

  A list of strings.

  These flags are passed on the command-line to the linker and generally
  specify various linking options. Most targets will not need these and
  will use "libs" and "lib_dirs" instead.

  ldflags are NOT pushed to dependents, so applying ldflags to source
  sets or static libraries will be a no-op. If you want to apply ldflags
  to dependent targets, put them in a config and set it in the
  all_dependent_configs or public_configs.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


lib_dirs: Additional library directories.

  A list of directories.

  Specifies additional directories passed to the linker for searching
  for the required libraries. If an item is not an absolute path, it
  will be treated as being relative to the current build file.

  libs and lib_dirs work differently than other flags in two respects.
  First, then are inherited across static library boundaries until a
  shared library or executable target is reached. Second, they are
  uniquified so each one is only passed once (the first instance of it
  will be the one used).

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.

  For "libs" and "lib_dirs" only, the values propagated from
  dependencies (as described above) are applied last assuming they
  are not already in the list.

Example

  lib_dirs = [ "/usr/lib/foo", "lib/doom_melon" ]


libs: Additional libraries to link.

  A list of library names or library paths.

  These libraries will be linked into the final binary (executable or
  shared library) containing the current target.

  libs and lib_dirs work differently than other flags in two respects.
  First, then are inherited across static library boundaries until a
  shared library or executable target is reached. Second, they are
  uniquified so each one is only passed once (the first instance of it
  will be the one used).

Types of libs

  There are several different things that can be expressed in libs:

  File paths
      Values containing '/' will be treated as references to files in
      the checkout. They will be rebased to be relative to the build
      directory and specified in the "libs" for linker tools. This
      facility should be used for libraries that are checked in to the
      version control. For libraries that are generated by the build,
      use normal GN deps to link them.

  System libraries
      Values not containing '/' will be treated as system library names.
      These will be passed unmodified to the linker and prefixed with
      the "lib_prefix" attribute of the linker tool. Generally you
      would set the "lib_dirs" so the given library is found. Your
      BUILD.gn file should not specify the switch (like "-l"): this
      will be encoded in the "lib_prefix" of the tool.

  Apple frameworks
      System libraries ending in ".framework" will be special-cased:
      the switch "-framework" will be prepended instead of the
      lib_prefix, and the ".framework" suffix will be trimmed. This is
      to support the way Mac links framework dependencies.

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.

  For "libs" and "lib_dirs" only, the values propagated from
  dependencies (as described above) are applied last assuming they
  are not already in the list.

Examples

  On Windows:
    libs = [ "ctl3d.lib" ]

  On Linux:
    libs = [ "ld" ]


output_dir: [directory] Directory to put output file in.

  For library and executable targets, overrides the directory for the
  final output. This must be in the root_build_dir or a child thereof.

  This should generally be in the root_out_dir or a subdirectory thereof
  (the root_out_dir will be the same as the root_build_dir for the
  default toolchain, and will be a subdirectory for other toolchains).
  Not putting the output in a subdirectory of root_out_dir can result
  in collisions between different toolchains, so you will need to take
  steps to ensure that your target is only present in one toolchain.

  Normally the toolchain specifies the output directory for libraries
  and executables (see "gn help tool"). You will have to consult that
  for the default location. The default location will be used if
  output_dir is undefined or empty.

Example

  shared_library("doom_melon") {
    output_dir = "$root_out_dir/plugin_libs"
    ...
  }


output_extension: Value to use for the output's file extension.

  Normally the file extension for a target is based on the target
  type and the operating system, but in rare cases you will need to
  override the name (for example to use "libfreetype.so.6" instead
  of libfreetype.so on Linux).

  This value should not include a leading dot. If undefined, the default
  specified on the tool will be used. If set to the empty string, no
  output extension will be used.

  The output_extension will be used to set the "{{output_extension}}"
  expansion which the linker tool will generally use to specify the
  output file name. See "gn help tool".

Example

  shared_library("freetype") {
    if (is_linux) {
      # Call the output "libfreetype.so.6"
      output_extension = "so.6"
    }
    ...
  }

  # On Windows, generate a "mysettings.cpl" control panel applet.
  # Control panel applets are actually special shared libraries.
  if (is_win) {
    shared_library("mysettings") {
      output_extension = "cpl"
      ...
    }
  }


output_name: Define a name for the output file other than the default.

  Normally the output name of a target will be based on the target name,
  so the target "//foo/bar:bar_unittests" will generate an output
  file such as "bar_unittests.exe" (using Windows as an example).

  Sometimes you will want an alternate name to avoid collisions or
  if the internal name isn't appropriate for public distribution.

  The output name should have no extension or prefixes, these will be
  added using the default system rules. For example, on Linux an output
  name of "foo" will produce a shared library "libfoo.so". There
  is no way to override the output prefix of a linker tool on a per-
  target basis. If you need more flexibility, create a copy target
  to produce the file you want.

  This variable is valid for all binary output target types.

Example

  static_library("doom_melon") {
    output_name = "fluffy_bunny"
  }


output_prefix_override: Don't use prefix for output name.

  A boolean that overrides the output prefix for a target. Defaults to
  false.

  Some systems use prefixes for the names of the final target output
  file. The normal example is "libfoo.so" on Linux for a target
  named "foo".

  The output prefix for a given target type is specified on the linker
  tool (see "gn help tool"). Sometimes this prefix is undesired.

  See also "gn help output_extension".

Example

  shared_library("doom_melon") {
    # Normally this will produce "libdoom_melon.so" on Linux, setting
    # Setting this flag will produce "doom_melon.so".
    output_prefix_override = true
    ...
  }


outputs: Output files for actions and copy targets.

  Outputs is valid for "copy", "action", and "action_foreach"
  target types and indicates the resulting files. Outputs must always
  refer to files in the build directory.

  copy
    Copy targets should have exactly one entry in the outputs list. If
    there is exactly one source, this can be a literal file name or a
    source expansion. If there is more than one source, this must
    contain a source expansion to map a single input name to a single
    output name. See "gn help copy".

  action_foreach
    Action_foreach targets must always use source expansions to map
    input files to output files. There can be more than one output,
    which means that each invocation of the script will produce a set of
    files (presumably based on the name of the input file). See
    "gn help action_foreach".

  action
    Action targets (excluding action_foreach) must list literal output
    file(s) with no source expansions. See "gn help action".


precompiled_header: [string] Header file to precompile.

  Precompiled headers will be used when a target specifies this
  value, or a config applying to this target specifies this value.
  In addition, the tool corresponding to the source files must also
  specify precompiled headers (see "gn help tool"). The tool
  will also specify what type of precompiled headers to use.

  The precompiled header/source variables can be specified on a target
  or a config, but must be the same for all configs applying to a given
  target since a target can only have one precompiled header.

MSVC precompiled headers

  When using MSVC-style precompiled headers, the "precompiled_header"
  value is a string corresponding to the header. This is NOT a path
  to a file that GN recognises, but rather the exact string that appears
  in quotes after an #include line in source code. The compiler will
  match this string against includes or forced includes (/FI).

  MSVC also requires a source file to compile the header with. This must
  be specified by the "precompiled_source" value. In contrast to the
  header value, this IS a GN-style file name, and tells GN which source
  file to compile to make the .pch file used for subsequent compiles.

  If you use both C and C++ sources, the precompiled header and source
  file will be compiled using both tools. You will want to make sure
  to wrap C++ includes in __cplusplus #ifdefs so the file will compile
  in C mode.

  For example, if the toolchain specifies MSVC headers:

    toolchain("vc_x64") {
      ...
      tool("cxx") {
        precompiled_header_type = "msvc"
        ...

  You might make a config like this:

    config("use_precompiled_headers") {
      precompiled_header = "build/precompile.h"
      precompiled_source = "//build/precompile.cc"

      # Either your source files should #include "build/precompile.h"
      # first, or you can do this to force-include the header.
      cflags = [ "/FI$precompiled_header" ]
    }

  And then define a target that uses the config:

    executable("doom_melon") {
      configs += [ ":use_precompiled_headers" ]
      ...



precompiled_source: [file name] Source file to precompile.

  The source file that goes along with the precompiled_header when
  using "msvc"-style precompiled headers. It will be implicitly added
  to the sources of the target. See "gn help precompiled_header".


product_type: Product type for Xcode projects.

  Correspond to the type of the product of a create_bundle target. Only
  meaningful to Xcode (used as part of the Xcode project generation).

  When generating Xcode project files, only create_bundle target with
  a non-empty product_type will have a corresponding target in Xcode
  project.


public: Declare public header files for a target.

  A list of files that other targets can include. These permissions are
  checked via the "check" command (see "gn help check").

  If no public files are declared, other targets (assuming they have
  visibility to depend on this target can include any file in the
  sources list. If this variable is defined on a target, dependent
  targets may only include files on this whitelist.

  Header file permissions are also subject to visibility. A target
  must be visible to another target to include any files from it at all
  and the public headers indicate which subset of those files are
  permitted. See "gn help visibility" for more.

  Public files are inherited through the dependency tree. So if there is
  a dependency A -> B -> C, then A can include C's public headers.
  However, the same is NOT true of visibility, so unless A is in C's
  visibility list, the include will be rejected.

  GN only knows about files declared in the "sources" and "public"
  sections of targets. If a file is included that is not known to the
  build, it will be allowed.

Examples

  These exact files are public:
    public = [ "foo.h", "bar.h" ]

  No files are public (no targets may include headers from this one):
    public = []


public_configs: Configs to be applied on dependents.

  A list of config labels.

  Targets directly depending on this one will have the configs listed in
  this variable added to them. These configs will also apply to the
  current target.

  This addition happens in a second phase once a target and all of its
  dependencies have been resolved. Therefore, a target will not see
  these force-added configs in their "configs" variable while the
  script is running, and then can not be removed. As a result, this
  capability should generally only be used to add defines and include
  directories necessary to compile a target's headers.

  See also "all_dependent_configs".

Ordering of flags and values

  1. Those set on the current target (not in a config).
  2. Those set on the "configs" on the target in order that the
     configs appear in the list.
  3. Those set on the "all_dependent_configs" on the target in order
     that the configs appear in the list.
  4. Those set on the "public_configs" on the target in order that
     those configs appear in the list.
  5. all_dependent_configs pulled from dependencies, in the order of
     the "deps" list. This is done recursively. If a config appears
     more than once, only the first occurance will be used.
  6. public_configs pulled from dependencies, in the order of the
     "deps" list. If a dependency is public, they will be applied
     recursively.


public_deps: Declare public dependencies.

  Public dependencies are like private dependencies (see
  "gn help deps") but additionally express that the current target
  exposes the listed deps as part of its public API.

  This has several ramifications:

    - public_configs that are part of the dependency are forwarded
      to direct dependents.

    - Public headers in the dependency are usable by dependents
      (includes do not require a direct dependency or visibility).

    - If the current target is a shared library, other shared libraries
      that it publicly depends on (directly or indirectly) are
      propagated up the dependency tree to dependents for linking.

Discussion

  Say you have three targets: A -> B -> C. C's visibility may allow
  B to depend on it but not A. Normally, this would prevent A from
  including any headers from C, and C's public_configs would apply
  only to B.

  If B lists C in its public_deps instead of regular deps, A will now
  inherit C's public_configs and the ability to include C's public
  headers.

  Generally if you are writing a target B and you include C's headers
  as part of B's public headers, or targets depending on B should
  consider B and C to be part of a unit, you should use public_deps
  instead of deps.

Example

  # This target can include files from "c" but not from
  # "super_secret_implementation_details".
  executable("a") {
    deps = [ ":b" ]
  }

  shared_library("b") {
    deps = [ ":super_secret_implementation_details" ]
    public_deps = [ ":c" ]
  }


response_file_contents: Contents of a response file for actions.

  Sometimes the arguments passed to a script can be too long for the
  system's command-line capabilities. This is especially the case on
  Windows where the maximum command-line length is less than 8K. A
  response file allows you to pass an unlimited amount of data to a
  script in a temporary file for an action or action_foreach target.

  If the response_file_contents variable is defined and non-empty, the
  list will be treated as script args (including possibly substitution
  patterns) that will be written to a temporary file at build time.
  The name of the temporary file will be substituted for
  "{{response_file_name}}" in the script args.

  The response file contents will always be quoted and escaped
  according to Unix shell rules. To parse the response file, the Python
  script should use "shlex.split(file_contents)".

Example

  action("process_lots_of_files") {
    script = "process.py",
    inputs = [ ... huge list of files ... ]

    # Write all the inputs to a response file for the script. Also,
    # make the paths relative to the script working directory.
    response_file_contents = rebase_path(inputs, root_build_dir)

    # The script expects the name of the response file in --file-list.
    args = [
      "--enable-foo",
      "--file-list={{response_file_name}}",
    ]
  }


script: Script file for actions.

  An absolute or buildfile-relative file name of a Python script to run
  for a action and action_foreach targets (see "gn help action" and
  "gn help action_foreach").


sources: Source files for a target

  A list of files. Non-absolute paths will be resolved relative to the
  current build file.

Sources for binary targets

  For binary targets (source sets, executables, and libraries), the
  known file types will be compiled with the associated tools. Unknown
  file types and headers will be skipped. However, you should still
  list all C/C+ header files so GN knows about the existance of those
  files for the purposes of include checking.

  As a special case, a file ending in ".def" will be treated as a
  Windows module definition file. It will be appended to the link
  line with a preceeding "/DEF:" string. There must be at most one
  .def file in a target and they do not cross dependency boundaries
  (so specifying a .def file in a static library or source set will have
  no effect on the executable or shared library they're linked into).

Sources for non-binary targets

  action_foreach
    The sources are the set of files that the script will be executed
    over. The script will run once per file.

  action
    The sources will be treated the same as inputs. See "gn help inputs"
    for more information and usage advice.

  copy
    The source are the source files to copy.


testonly: Declares a target must only be used for testing.

  Boolean. Defaults to false.

  When a target is marked "testonly = true", it must only be depended
  on by other test-only targets. Otherwise, GN will issue an error
  that the depenedency is not allowed.

  This feature is intended to prevent accidentally shipping test code
  in a final product.

Example

  source_set("test_support") {
    testonly = true
    ...
  }


visibility: A list of labels that can depend on a target.

  A list of labels and label patterns that define which targets can
  depend on the current one. These permissions are checked via the
  "check" command (see "gn help check").

  If visibility is not defined, it defaults to public ("*").

  If visibility is defined, only the targets with labels that match it
  can depend on the current target. The empty list means no targets
  can depend on the current target.

  Tip: Often you will want the same visibility for all targets in a
  BUILD file. In this case you can just put the definition at the top,
  outside of any target, and the targets will inherit that scope and see
  the definition.

Patterns

  See "gn help label_pattern" for more details on what types of
  patterns are supported. If a toolchain is specified, only targets
  in that toolchain will be matched. If a toolchain is not specified on
  a pattern, targets in all toolchains will be matched.

Examples

  Only targets in the current buildfile ("private"):
    visibility = [ ":*" ]

  No targets (used for targets that should be leaf nodes):
    visibility = []

  Any target ("public", the default):
    visibility = [ "*" ]

  All targets in the current directory and any subdirectory:
    visibility = [ "./*" ]

  Any target in "//bar/BUILD.gn":
    visibility = [ "//bar:*" ]

  Any target in "//bar/" or any subdirectory thereof:
    visibility = [ "//bar/*" ]

  Just these specific targets:
    visibility = [ ":mything", "//foo:something_else" ]

  Any target in the current directory and any subdirectory thereof, plus
  any targets in "//bar/" and any subdirectory thereof.
    visibility = [ "./*", "//bar/*" ]


write_runtime_deps: Writes the target's runtime_deps to the given path.

  Does not synchronously write the file, but rather schedules it
  to be written at the end of generation.

  If the file exists and the contents are identical to that being
  written, the file will not be updated. This will prevent unnecessary
  rebuilds of targets that depend on this file.

  Path must be within the output directory.

  See "gn help runtime_deps" for how the runtime dependencies are
  computed.

  The format of this file will list one file per line with no escaping.
  The files will be relative to the root_build_dir. The first line of
  the file will be the main output file of the target itself. The file
  contents will be the same as requesting the runtime deps be written on
  the command line (see "gn help --runtime-deps-list-file").


Build Arguments Overview

  Build arguments are variables passed in from outside of the build
  that build files can query to determine how the build works.

How build arguments are set

  First, system default arguments are set based on the current system.
  The built-in arguments are:
   - host_cpu
   - host_os
   - current_cpu
   - current_os
   - target_cpu
   - target_os

  If specified, arguments from the --args command line flag are used. If
  that flag is not specified, args from previous builds in the build
  directory will be used (this is in the file args.gn in the build
  directory).

  Last, for targets being compiled with a non-default toolchain, the
  toolchain overrides are applied. These are specified in the
  toolchain_args section of a toolchain definition. The use-case for
  this is that a toolchain may be building code for a different
  platform, and that it may want to always specify Posix, for example.
  See "gn help toolchain_args" for more.

  If you specify an override for a build argument that never appears in
  a "declare_args" call, a nonfatal error will be displayed.

Examples

  gn args out/FooBar
      Create the directory out/FooBar and open an editor. You would type
      something like this into that file:
          enable_doom_melon=false
          os="android"

  gn gen out/FooBar --args="enable_doom_melon=true os=\"android\""
      This will overwrite the build directory with the given arguments.
      (Note that the quotes inside the args command will usually need to
      be escaped for your shell to pass through strings values.)

How build arguments are used

  If you want to use an argument, you use declare_args() and specify
  default values. These default values will apply if none of the steps
  listed in the "How build arguments are set" section above apply to
  the given argument, but the defaults will not override any of these.

  Often, the root build config file will declare global arguments that
  will be passed to all buildfiles. Individual build files can also
  specify arguments that apply only to those files. It is also useful
  to specify build args in an "import"-ed file if you want such
  arguments to apply to multiple buildfiles.


.gn file

  When gn starts, it will search the current directory and parent
  directories for a file called ".gn". This indicates the source root.
  You can override this detection by using the --root command-line
  argument

  The .gn file in the source root will be executed. The syntax is the
  same as a buildfile, but with very limited build setup-specific
  meaning.

  If you specify --root, by default GN will look for the file .gn in
  that directory. If you want to specify a different file, you can
  additionally pass --dotfile:

    gn gen out/Debug --root=/home/build --dotfile=/home/my_gn_file.gn

Variables

  buildconfig [required]
      Label of the build config file. This file will be used to set up
      the build file execution environment for each toolchain.

  check_targets [optional]
      A list of labels and label patterns that should be checked when
      running "gn check" or "gn gen --check". If unspecified, all
      targets will be checked. If it is the empty list, no targets will
      be checked.

      The format of this list is identical to that of "visibility"
      so see "gn help visibility" for examples.

  exec_script_whitelist [optional]
      A list of .gn/.gni files (not labels) that have permission to call
      the exec_script function. If this list is defined, calls to
      exec_script will be checked against this list and GN will fail if
      the current file isn't in the list.

      This is to allow the use of exec_script to be restricted since
      is easy to use inappropriately. Wildcards are not supported.
      Files in the secondary_source tree (if defined) should be
      referenced by ignoring the secondary tree and naming them as if
      they are in the main tree.

      If unspecified, the ability to call exec_script is unrestricted.

      Example:
        exec_script_whitelist = [
          "//base/BUILD.gn",
          "//build/my_config.gni",
        ]

  root [optional]
      Label of the root build target. The GN build will start by loading
      the build file containing this target name. This defaults to
      "//:" which will cause the file //BUILD.gn to be loaded.

  secondary_source [optional]
      Label of an alternate directory tree to find input files. When
      searching for a BUILD.gn file (or the build config file discussed
      above), the file will first be looked for in the source root.
      If it's not found, the secondary source root will be checked
      (which would contain a parallel directory hierarchy).

      This behavior is intended to be used when BUILD.gn files can't be
      checked in to certain source directories for whatever reason.

      The secondary source root must be inside the main source tree.

Example .gn file contents

  buildconfig = "//build/config/BUILDCONFIG.gn"

  check_targets = [
    "//doom_melon/*",  # Check everything in this subtree.
    "//tools:mind_controlling_ant",  # Check this specific target.
  ]

  root = "//:root"

  secondary_source = "//build/config/temporary_buildfiles/"


GN build language grammar

Tokens

  GN build files are read as sequences of tokens.  While splitting the
  file into tokens, the next token is the longest sequence of characters
  that form a valid token.

White space and comments

  White space is comprised of spaces (U+0020), horizontal tabs (U+0009),
  carriage returns (U+000D), and newlines (U+000A).

  Comments start at the character "#" and stop at the next newline.

  White space and comments are ignored except that they may separate
  tokens that would otherwise combine into a single token.

Identifiers

  Identifiers name variables and functions.

      identifier = letter { letter | digit } .
      letter     = "A" ... "Z" | "a" ... "z" | "_" .
      digit      = "0" ... "9" .

Keywords

  The following keywords are reserved and may not be used as
  identifiers:

          else    false   if      true

Integer literals

  An integer literal represents a decimal integer value.

      integer = [ "-" ] digit { digit } .

  Leading zeros and negative zero are disallowed.

String literals

  A string literal represents a string value consisting of the quoted
  characters with possible escape sequences and variable expansions.

      string           = `"` { char | escape | expansion } `"` .
      escape           = `\` ( "$" | `"` | char ) .
      BracketExpansion = "{" ( identifier | ArrayAccess | ScopeAccess ) "}" .
      Hex              = "0x" [0-9A-Fa-f][0-9A-Fa-f]
      expansion        = "$" ( identifier | BracketExpansion | Hex ) .
      char             = /* any character except "$", `"`, or newline */ .

  After a backslash, certain sequences represent special characters:

          \"    U+0022    quotation mark
          \$    U+0024    dollar sign
          \\    U+005C    backslash

  All other backslashes represent themselves.

  To insert an arbitrary byte value, use $0xFF. For example, to
  insert a newline character: "Line one$0x0ALine two".

Punctuation

  The following character sequences represent punctuation:

          +       +=      ==      !=      (       )
          -       -=      <       <=      [       ]
          !       =       >       >=      {       }
                          &&      ||      .       ,

Grammar

  The input tokens form a syntax tree following a context-free grammar:

      File = StatementList .

      Statement     = Assignment | Call | Condition .
      Assignment    = identifier AssignOp Expr .
      Call          = identifier "(" [ ExprList ] ")" [ Block ] .
      Condition     = "if" "(" Expr ")" Block
                      [ "else" ( Condition | Block ) ] .
      Block         = "{" StatementList "}" .
      StatementList = { Statement } .

      ArrayAccess = identifier "[" { identifier | integer } "]" .
      ScopeAccess = identifier "." identifier .
      Expr        = UnaryExpr | Expr BinaryOp Expr .
      UnaryExpr   = PrimaryExpr | UnaryOp UnaryExpr .
      PrimaryExpr = identifier | integer | string | Call
                  | ArrayAccess | ScopeAccess
                  | "(" Expr ")"
                  | "[" [ ExprList [ "," ] ] "]" .
      ExprList    = Expr { "," Expr } .

      AssignOp = "=" | "+=" | "-=" .
      UnaryOp  = "!" .
      BinaryOp = "+" | "-"                  // highest priority
               | "<" | "<=" | ">" | ">="
               | "==" | "!="
               | "&&"
               | "||" .                     // lowest priority

  All binary operators are left-associative.


input_conversion: Specifies how to transform input to a variable.

  input_conversion is an argument to read_file and exec_script that
  specifies how the result of the read operation should be converted
  into a variable.

  "" (the default)
      Discard the result and return None.

  "list lines"
      Return the file contents as a list, with a string for each line.
      The newlines will not be present in the result. The last line may
      or may not end in a newline.

      After splitting, each individual line will be trimmed of
      whitespace on both ends.

  "scope"
      Execute the block as GN code and return a scope with the
      resulting values in it. If the input was:
        a = [ "hello.cc", "world.cc" ]
        b = 26
      and you read the result into a variable named "val", then you
      could access contents the "." operator on "val":
        sources = val.a
        some_count = val.b

  "string"
      Return the file contents into a single string.

  "value"
      Parse the input as if it was a literal rvalue in a buildfile.
      Examples of typical program output using this mode:
        [ "foo", "bar" ]     (result will be a list)
      or
        "foo bar"            (result will be a string)
      or
        5                    (result will be an integer)

      Note that if the input is empty, the result will be a null value
      which will produce an error if assigned to a variable.

  "trim ..."
      Prefixing any of the other transformations with the word "trim"
      will result in whitespace being trimmed from the beginning and end
      of the result before processing.

      Examples: "trim string" or "trim list lines"

      Note that "trim value" is useless because the value parser skips
      whitespace anyway.


Label patterns

  A label pattern is a way of expressing one or more labels in a portion
  of the source tree. They are not general regular expressions.

  They can take the following forms only:

   - Explicit (no wildcard):
       "//foo/bar:baz"
       ":baz"

   - Wildcard target names:
       "//foo/bar:*" (all targets in the //foo/bar/BUILD.gn file)
       ":*"  (all targets in the current build file)

   - Wildcard directory names ("*" is only supported at the end)
       "*"  (all targets)
       "//foo/bar/*"  (all targets in any subdir of //foo/bar)
       "./*"  (all targets in the current build file or sub dirs)

  Any of the above forms can additionally take an explicit toolchain.
  In this case, the toolchain must be fully qualified (no wildcards
  are supported in the toolchain name).

    "//foo:bar(//build/toochain:mac)"
        An explicit target in an explicit toolchain.

    ":*(//build/toolchain/linux:32bit)"
        All targets in the current build file using the 32-bit Linux
        toolchain.

    "//foo/*(//build/toolchain:win)"
        All targets in //foo and any subdirectory using the Windows
        toolchain.


nogncheck: Skip an include line from checking.

  GN's header checker helps validate that the includes match the build
  dependency graph. Sometimes an include might be conditional or
  otherwise problematic, but you want to specifically allow it. In this
  case, it can be whitelisted.

  Include lines containing the substring "nogncheck" will be excluded
  from header checking. The most common case is a conditional include:

    #if defined(ENABLE_DOOM_MELON)
    #include "tools/doom_melon/doom_melon.h"  // nogncheck
    #endif

  If the build file has a conditional dependency on the corresponding
  target that matches the conditional include, everything will always
  link correctly:

    source_set("mytarget") {
      ...
      if (enable_doom_melon) {
        defines = [ "ENABLE_DOOM_MELON" ]
        deps += [ "//tools/doom_melon" ]
      }

  But GN's header checker does not understand preprocessor directives,
  won't know it matches the build dependencies, and will flag this
  include as incorrect when the condition is false.

More information

  The topic "gn help check" has general information on how checking
  works and advice on fixing problems. Targets can also opt-out of
  checking, see "gn help check_includes".


Runtime dependencies

  Runtime dependencies of a target are exposed via the "runtime_deps"
  category of "gn desc" (see "gn help desc") or they can be written
  at build generation time via write_runtime_deps(), or
  --runtime-deps-list-file (see "gn help --runtime-deps-list-file").

  To a first approximation, the runtime dependencies of a target are
  the set of "data" files, data directories, and the shared libraries
  from all transitive dependencies. Executables, shared libraries, and
  loadable modules are considered runtime dependencies of themselves.

Executables

  Executable targets and those executable targets' transitive
  dependencies are not considered unless that executable is listed in
  "data_deps". Otherwise, GN assumes that the executable (and
  everything it requires) is a build-time dependency only.

Actions and copies

  Action and copy targets that are listed as "data_deps" will have all
  of their outputs and data files considered as runtime dependencies.
  Action and copy targets that are "deps" or "public_deps" will have
  only their data files considered as runtime dependencies. These
  targets can list an output file in both the "outputs" and "data"
  lists to force an output file as a runtime dependency in all cases.

  The different rules for deps and data_deps are to express build-time
  (deps) vs. run-time (data_deps) outputs. If GN counted all build-time
  copy steps as data dependencies, there would be a lot of extra stuff,
  and if GN counted all run-time dependencies as regular deps, the
  build's parallelism would be unnecessarily constrained.

  This rule can sometimes lead to unintuitive results. For example,
  given the three targets:
    A  --[data_deps]-->  B  --[deps]-->  ACTION
  GN would say that A does not have runtime deps on the result of the
  ACTION, which is often correct. But the purpose of the B target might
  be to collect many actions into one logic unit, and the "data"-ness
  of A's dependency is lost. Solutions:

   - List the outputs of the action in it's data section (if the
     results of that action are always runtime files).
   - Have B list the action in data_deps (if the outputs of the actions
     are always runtime files).
   - Have B list the action in both deps and data deps (if the outputs
     might be used in both contexts and you don't care about unnecessary
     entries in the list of files required at runtime).
   - Split B into run-time and build-time versions with the appropriate
     "deps" for each.

Static libraries and source sets

  The results of static_library or source_set targets are not considered
  runtime dependencies since these are assumed to be intermediate
  targets only. If you need to list a static library as a runtime
  dependency, you can manually compute the .a/.lib file name for the
  current platform and list it in the "data" list of a target
  (possibly on the static library target itself).

Multiple outputs

  When a tool produces more than one output, only the first output
  is considered. For example, a shared library target may produce a
  .dll and a .lib file on Windows. Only the .dll file will be considered
  a runtime dependency. This applies only to linker tools, scripts and
  copy steps with multiple outputs will also get all outputs listed.


How Source Expansion Works

  Source expansion is used for the action_foreach and copy target types
  to map source file names to output file names or arguments.

  To perform source expansion in the outputs, GN maps every entry in the
  sources to every entry in the outputs list, producing the cross
  product of all combinations, expanding placeholders (see below).

  Source expansion in the args works similarly, but performing the
  placeholder substitution produces a different set of arguments for
  each invocation of the script.

  If no placeholders are found, the outputs or args list will be treated
  as a static list of literal file names that do not depend on the
  sources.

  See "gn help copy" and "gn help action_foreach" for more on how
  this is applied.

Placeholders

  This section discusses only placeholders for actions. There are other
  placeholders used in the definition of tools. See "gn help tool" for
  those.

  {{source}}
      The name of the source file including directory (*). This will
      generally be used for specifying inputs to a script in the
      "args" variable.
        "//foo/bar/baz.txt" => "../../foo/bar/baz.txt"

  {{source_file_part}}
      The file part of the source including the extension.
        "//foo/bar/baz.txt" => "baz.txt"

  {{source_name_part}}
      The filename part of the source file with no directory or
      extension. This will generally be used for specifying a
      transformation from a source file to a destination file with the
      same name but different extension.
        "//foo/bar/baz.txt" => "baz"

  {{source_dir}}
      The directory (*) containing the source file with no
      trailing slash.
        "//foo/bar/baz.txt" => "../../foo/bar"

  {{source_root_relative_dir}}
      The path to the source file's directory relative to the source
      root, with no leading "//" or trailing slashes. If the path is
      system-absolute, (beginning in a single slash) this will just
      return the path with no trailing slash. This value will always
      be the same, regardless of whether it appears in the "outputs"
      or "args" section.
        "//foo/bar/baz.txt" => "foo/bar"

  {{source_gen_dir}}
      The generated file directory (*) corresponding to the source
      file's path. This will be different than the target's generated
      file directory if the source file is in a different directory
      than the BUILD.gn file.
        "//foo/bar/baz.txt" => "gen/foo/bar"

  {{source_out_dir}}
      The object file directory (*) corresponding to the source file's
      path, relative to the build directory. this us be different than
      the target's out directory if the source file is in a different
      directory than the build.gn file.
        "//foo/bar/baz.txt" => "obj/foo/bar"

(*) Note on directories

  Paths containing directories (except the source_root_relative_dir)
  will be different depending on what context the expansion is evaluated
  in. Generally it should "just work" but it means you can't
  concatenate strings containing these values with reasonable results.

  Details: source expansions can be used in the "outputs" variable,
  the "args" variable, and in calls to "process_file_template". The
  "args" are passed to a script which is run from the build directory,
  so these directories will relative to the build directory for the
  script to find. In the other cases, the directories will be source-
  absolute (begin with a "//") because the results of those expansions
  will be handled by GN internally.

Examples

  Non-varying outputs:
    action("hardcoded_outputs") {
      sources = [ "input1.idl", "input2.idl" ]
      outputs = [ "$target_out_dir/output1.dat",
                  "$target_out_dir/output2.dat" ]
    }
  The outputs in this case will be the two literal files given.

  Varying outputs:
    action_foreach("varying_outputs") {
      sources = [ "input1.idl", "input2.idl" ]
      outputs = [ "{{source_gen_dir}}/{{source_name_part}}.h",
                  "{{source_gen_dir}}/{{source_name_part}}.cc" ]
    }
  Performing source expansion will result in the following output names:
    //out/Debug/obj/mydirectory/input1.h
    //out/Debug/obj/mydirectory/input1.cc
    //out/Debug/obj/mydirectory/input2.h
    //out/Debug/obj/mydirectory/input2.cc


**Available global switches ** Do “gn help --the_switch_you_want_help_on” for more. Individual commands may take command-specific switches not listed here. See the help on your specific command for more.


** \--args**: Specifies build arguments overrides. ** \--color**: Force colored output. ** \--dotfile**: Override the name of the ".gn" file. ** \--fail-on-unused-args**: Treat unused build args as fatal errors. ** \--markdown**: Write help output in the Markdown format. ** \--nocolor**: Force non-colored output. ** -q**: Quiet mode. Don't print output on success. ** \--root**: Explicitly specify source root. ** \--runtime-deps-list-file**: Save runtime dependencies for targets in file. ** \--script-executable**: Set the executable used to execute scripts. ** \--threads**: Specify number of worker threads. ** \--time**: Outputs a summary of how long everything took. ** \--tracelog**: Writes a Chrome-compatible trace log to the given file. ** -v**: Verbose logging. ** \--version**: Prints the GN version number and exits.