| Index: tools/gn/variables.cc | 
| diff --git a/tools/gn/variables.cc b/tools/gn/variables.cc | 
| index 644c8355edbd7a61da96d61c81c1a343c2755961..d387baeb726244d6756044c1d87fef57762b6767 100644 | 
| --- a/tools/gn/variables.cc | 
| +++ b/tools/gn/variables.cc | 
| @@ -12,368 +12,374 @@ const char kHostCpu[] = "host_cpu"; | 
| const char kHostCpu_HelpShort[] = | 
| "host_cpu: [string] The processor architecture that GN is running on."; | 
| const char kHostCpu_Help[] = | 
| -    "host_cpu: The processor architecture that GN is running on.\n" | 
| -    "\n" | 
| -    "  This is value is exposed so that cross-compile toolchains can\n" | 
| -    "  access the host architecture when needed.\n" | 
| -    "\n" | 
| -    "  The value should generally be considered read-only, but it can be\n" | 
| -    "  overriden in order to handle unusual cases where there might\n" | 
| -    "  be multiple plausible values for the host architecture (e.g., if\n" | 
| -    "  you can do either 32-bit or 64-bit builds). The value is not used\n" | 
| -    "  internally by GN for any purpose.\n" | 
| -    "\n" | 
| -    "Some possible values:\n" | 
| -    "  - \"x64\"\n" | 
| -    "  - \"x86\"\n"; | 
| +    R"(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" | 
| +)"; | 
|  | 
| const char kHostOs[] = "host_os"; | 
| const char kHostOs_HelpShort[] = | 
| "host_os: [string] The operating system that GN is running on."; | 
| const char kHostOs_Help[] = | 
| -    "host_os: [string] The operating system that GN is running on.\n" | 
| -    "\n" | 
| -    "  This value is exposed so that cross-compiles can access the host\n" | 
| -    "  build system's settings.\n" | 
| -    "\n" | 
| -    "  This value should generally be treated as read-only. It, however,\n" | 
| -    "  is not used internally by GN for any purpose.\n" | 
| -    "\n" | 
| -    "Some possible values:\n" | 
| -    "  - \"linux\"\n" | 
| -    "  - \"mac\"\n" | 
| -    "  - \"win\"\n"; | 
| +    R"(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" | 
| +)"; | 
|  | 
| const char kInvoker[] = "invoker"; | 
| const char kInvoker_HelpShort[] = | 
| "invoker: [string] The invoking scope inside a template."; | 
| const char kInvoker_Help[] = | 
| -    "invoker: [string] The invoking scope inside a template.\n" | 
| -    "\n" | 
| -    "  Inside a template invocation, this variable refers to the scope of\n" | 
| -    "  the invoker of the template. Outside of template invocations, this\n" | 
| -    "  variable is undefined.\n" | 
| -    "\n" | 
| -    "  All of the variables defined inside the template invocation are\n" | 
| -    "  accessible as members of the \"invoker\" scope. This is the way that\n" | 
| -    "  templates read values set by the callers.\n" | 
| -    "\n" | 
| -    "  This is often used with \"defined\" to see if a value is set on the\n" | 
| -    "  invoking scope.\n" | 
| -    "\n" | 
| -    "  See \"gn help template\" for more examples.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  template(\"my_template\") {\n" | 
| -    "    print(invoker.sources)       # Prints [ \"a.cc\", \"b.cc\" ]\n" | 
| -    "    print(defined(invoker.foo))  # Prints false.\n" | 
| -    "    print(defined(invoker.bar))  # Prints true.\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  my_template(\"doom_melon\") {\n" | 
| -    "    sources = [ \"a.cc\", \"b.cc\" ]\n" | 
| -    "    bar = 123\n" | 
| -    "  }\n"; | 
| +    R"(invoker: [string] The invoking scope inside a template. | 
| + | 
| +  Inside a template invocation, this variable refers to the scope of the | 
| +  invoker of the template. Outside of template invocations, this variable is | 
| +  undefined. | 
| + | 
| +  All of the variables defined inside the template invocation are accessible as | 
| +  members of the "invoker" scope. This is the way that templates read values | 
| +  set by the callers. | 
| + | 
| +  This is often used with "defined" to see if a value is set on the invoking | 
| +  scope. | 
| + | 
| +  See "gn help template" for more examples. | 
| + | 
| +Example | 
| + | 
| +  template("my_template") { | 
| +    print(invoker.sources)       # Prints [ "a.cc", "b.cc" ] | 
| +    print(defined(invoker.foo))  # Prints false. | 
| +    print(defined(invoker.bar))  # Prints true. | 
| +  } | 
| + | 
| +  my_template("doom_melon") { | 
| +    sources = [ "a.cc", "b.cc" ] | 
| +    bar = 123 | 
| +  } | 
| +)"; | 
|  | 
| const char kTargetCpu[] = "target_cpu"; | 
| const char kTargetCpu_HelpShort[] = | 
| "target_cpu: [string] The desired cpu architecture for the build."; | 
| const char kTargetCpu_Help[] = | 
| -    "target_cpu: The desired cpu architecture for the build.\n" | 
| -    "\n" | 
| -    "  This value should be used to indicate the desired architecture for\n" | 
| -    "  the primary objects of the build. It will match the cpu architecture\n" | 
| -    "  of the default toolchain, but not necessarily the current toolchain.\n" | 
| -    "\n" | 
| -    "  In many cases, this is the same as \"host_cpu\", but in the case\n" | 
| -    "  of cross-compiles, this can be set to something different. This\n" | 
| -    "  value is different from \"current_cpu\" in that it does not change\n" | 
| -    "  based on the current toolchain. When writing rules, \"current_cpu\"\n" | 
| -    "  should be used rather than \"target_cpu\" most of the time.\n" | 
| -    "\n" | 
| -    "  This value is not used internally by GN for any purpose, so it\n" | 
| -    "  may be set to whatever value is needed for the build.\n" | 
| -    "  GN defaults this value to the empty string (\"\") and the\n" | 
| -    "  configuration files should set it to an appropriate value\n" | 
| -    "  (e.g., setting it to the value of \"host_cpu\") if it is not\n" | 
| -    "  overridden on the command line or in the args.gn file.\n" | 
| -    "\n" | 
| -    "  Where practical, use one of the following list of common values:\n" | 
| -    "\n" | 
| -    "Possible values:\n" | 
| -    "  - \"x86\"\n" | 
| -    "  - \"x64\"\n" | 
| -    "  - \"arm\"\n" | 
| -    "  - \"arm64\"\n" | 
| -    "  - \"mipsel\"\n"; | 
| +    R"(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, but not necessarily the current 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 does not change based on the current | 
| +  toolchain. When writing rules, "current_cpu" should be used rather than | 
| +  "target_cpu" most of the time. | 
| + | 
| +  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. | 
| + | 
| +Possible values | 
| + | 
| +  - "x86" | 
| +  - "x64" | 
| +  - "arm" | 
| +  - "arm64" | 
| +  - "mipsel" | 
| +)"; | 
|  | 
| const char kTargetName[] = "target_name"; | 
| const char kTargetName_HelpShort[] = | 
| "target_name: [string] The name of the current target."; | 
| const char kTargetName_Help[] = | 
| -    "target_name: [string] The name of the current target.\n" | 
| -    "\n" | 
| -    "  Inside a target or template invocation, this variable refers to the\n" | 
| -    "  name given to the target or template invocation. Outside of these,\n" | 
| -    "  this variable is undefined.\n" | 
| -    "\n" | 
| -    "  This is most often used in template definitions to name targets\n" | 
| -    "  defined in the template based on the name of the invocation. This\n" | 
| -    "  is necessary both to ensure generated targets have unique names and\n" | 
| -    "  to generate a target with the exact name of the invocation that\n" | 
| -    "  other targets can depend on.\n" | 
| -    "\n" | 
| -    "  Be aware that this value will always reflect the innermost scope. So\n" | 
| -    "  when defining a target inside a template, target_name will refer to\n" | 
| -    "  the target rather than the template invocation. To get the name of the\n" | 
| -    "  template invocation in this case, you should save target_name to a\n" | 
| -    "  temporary variable outside of any target definitions.\n" | 
| -    "\n" | 
| -    "  See \"gn help template\" for more examples.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  executable(\"doom_melon\") {\n" | 
| -    "    print(target_name)    # Prints \"doom_melon\".\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  template(\"my_template\") {\n" | 
| -    "    print(target_name)    # Prints \"space_ray\" when invoked below.\n" | 
| -    "\n" | 
| -    "    executable(target_name + \"_impl\") {\n" | 
| -    "      print(target_name)  # Prints \"space_ray_impl\".\n" | 
| -    "    }\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  my_template(\"space_ray\") {\n" | 
| -    "  }\n"; | 
| +    R"(target_name: [string] The name of the current target. | 
| + | 
| +  Inside a target or template invocation, this variable refers to the name | 
| +  given to the target or template invocation. Outside of these, this variable | 
| +  is undefined. | 
| + | 
| +  This is most often used in template definitions to name targets defined in | 
| +  the template based on the name of the invocation. This is necessary both to | 
| +  ensure generated targets have unique names and to generate a target with the | 
| +  exact name of the invocation that other targets can depend on. | 
| + | 
| +  Be aware that this value will always reflect the innermost scope. So when | 
| +  defining a target inside a template, target_name will refer to the target | 
| +  rather than the template invocation. To get the name of the template | 
| +  invocation in this case, you should save target_name to a temporary variable | 
| +  outside of any target definitions. | 
| + | 
| +  See "gn help template" for more examples. | 
| + | 
| +Example | 
| + | 
| +  executable("doom_melon") { | 
| +    print(target_name)    # Prints "doom_melon". | 
| +  } | 
| + | 
| +  template("my_template") { | 
| +    print(target_name)    # Prints "space_ray" when invoked below. | 
| + | 
| +    executable(target_name + "_impl") { | 
| +      print(target_name)  # Prints "space_ray_impl". | 
| +    } | 
| +  } | 
| + | 
| +  my_template("space_ray") { | 
| +  } | 
| +)"; | 
|  | 
| const char kTargetOs[] = "target_os"; | 
| const char kTargetOs_HelpShort[] = | 
| "target_os: [string] The desired operating system for the build."; | 
| const char kTargetOs_Help[] = | 
| -    "target_os: The desired operating system for the build.\n" | 
| -    "\n" | 
| -    "  This value should be used to indicate the desired operating system\n" | 
| -    "  for the primary object(s) of the build. It will match the OS of\n" | 
| -    "  the default toolchain.\n" | 
| -    "\n" | 
| -    "  In many cases, this is the same as \"host_os\", but in the case of\n" | 
| -    "  cross-compiles, it may be different. This variable differs from\n" | 
| -    "  \"current_os\" in that it can be referenced from inside any\n" | 
| -    "  toolchain and will always return the initial value.\n" | 
| -    "\n" | 
| -    "  This should be set to the most specific value possible. So,\n" | 
| -    "  \"android\" or \"chromeos\" should be used instead of \"linux\"\n" | 
| -    "  where applicable, even though Android and ChromeOS are both Linux\n" | 
| -    "  variants. This can mean that one needs to write\n" | 
| -    "\n" | 
| -    "      if (target_os == \"android\" || target_os == \"linux\") {\n" | 
| -    "          # ...\n" | 
| -    "      }\n" | 
| -    "\n" | 
| -    "  and so forth.\n" | 
| -    "\n" | 
| -    "  This value is not used internally by GN for any purpose, so it\n" | 
| -    "  may be set to whatever value is needed for the build.\n" | 
| -    "  GN defaults this value to the empty string (\"\") and the\n" | 
| -    "  configuration files should set it to an appropriate value\n" | 
| -    "  (e.g., setting it to the value of \"host_os\") if it is not\n" | 
| -    "  set via the command line or in the args.gn file.\n" | 
| -    "\n" | 
| -    "  Where practical, use one of the following list of common values:\n" | 
| -    "\n" | 
| -    "Possible values:\n" | 
| -    "  - \"android\"\n" | 
| -    "  - \"chromeos\"\n" | 
| -    "  - \"ios\"\n" | 
| -    "  - \"linux\"\n" | 
| -    "  - \"nacl\"\n" | 
| -    "  - \"mac\"\n" | 
| -    "  - \"win\"\n"; | 
| +    R"(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. | 
| + | 
| +Possible values | 
| + | 
| +  - "android" | 
| +  - "chromeos" | 
| +  - "ios" | 
| +  - "linux" | 
| +  - "nacl" | 
| +  - "mac" | 
| +  - "win" | 
| +)"; | 
|  | 
| const char kCurrentCpu[] = "current_cpu"; | 
| const char kCurrentCpu_HelpShort[] = | 
| "current_cpu: [string] The processor architecture of the current " | 
| "toolchain."; | 
| const char kCurrentCpu_Help[] = | 
| -    "current_cpu: The processor architecture of the current toolchain.\n" | 
| -    "\n" | 
| -    "  The build configuration usually sets this value based on the value\n" | 
| -    "  of \"host_cpu\" (see \"gn help host_cpu\") and then threads\n" | 
| -    "  this through the toolchain definitions to ensure that it always\n" | 
| -    "  reflects the appropriate value.\n" | 
| -    "\n" | 
| -    "  This value is not used internally by GN for any purpose. It is\n" | 
| -    "  set it to the empty string (\"\") by default but is declared so\n" | 
| -    "  that it can be overridden on the command line if so desired.\n" | 
| -    "\n" | 
| -    "  See \"gn help target_cpu\" for a list of common values returned.\n"; | 
| +    R"(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.)"; | 
|  | 
| const char kCurrentOs[] = "current_os"; | 
| const char kCurrentOs_HelpShort[] = | 
| "current_os: [string] The operating system of the current toolchain."; | 
| const char kCurrentOs_Help[] = | 
| -    "current_os: The operating system of the current toolchain.\n" | 
| -    "\n" | 
| -    "  The build configuration usually sets this value based on the value\n" | 
| -    "  of \"target_os\" (see \"gn help target_os\"), and then threads this\n" | 
| -    "  through the toolchain definitions to ensure that it always reflects\n" | 
| -    "  the appropriate value.\n" | 
| -    "\n" | 
| -    "  This value is not used internally by GN for any purpose. It is\n" | 
| -    "  set it to the empty string (\"\") by default but is declared so\n" | 
| -    "  that it can be overridden on the command line if so desired.\n" | 
| -    "\n" | 
| -    "  See \"gn help target_os\" for a list of common values returned.\n"; | 
| +    R"(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. | 
| +)"; | 
|  | 
| const char kCurrentToolchain[] = "current_toolchain"; | 
| const char kCurrentToolchain_HelpShort[] = | 
| "current_toolchain: [string] Label of the current toolchain."; | 
| const char kCurrentToolchain_Help[] = | 
| -    "current_toolchain: Label of the current toolchain.\n" | 
| -    "\n" | 
| -    "  A fully-qualified label representing the current toolchain. You can\n" | 
| -    "  use this to make toolchain-related decisions in the build. See also\n" | 
| -    "  \"default_toolchain\".\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  if (current_toolchain == \"//build:64_bit_toolchain\") {\n" | 
| -    "    executable(\"output_thats_64_bit_only\") {\n" | 
| -    "      ...\n"; | 
| +    R"(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") { | 
| +      ... | 
| +)"; | 
|  | 
| const char kDefaultToolchain[] = "default_toolchain"; | 
| const char kDefaultToolchain_HelpShort[] = | 
| "default_toolchain: [string] Label of the default toolchain."; | 
| const char kDefaultToolchain_Help[] = | 
| -    "default_toolchain: [string] Label of the default toolchain.\n" | 
| -    "\n" | 
| -    "  A fully-qualified label representing the default toolchain, which may\n" | 
| -    "  not necessarily be the current one (see \"current_toolchain\").\n"; | 
| +    R"(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"). | 
| +)"; | 
|  | 
| const char kPythonPath[] = "python_path"; | 
| const char kPythonPath_HelpShort[] = | 
| "python_path: [string] Absolute path of Python."; | 
| const char kPythonPath_Help[] = | 
| -    "python_path: Absolute path of Python.\n" | 
| -    "\n" | 
| -    "  Normally used in toolchain definitions if running some command\n" | 
| -    "  requires Python. You will normally not need this when invoking scripts\n" | 
| -    "  since GN automatically finds it for you.\n"; | 
| +    R"(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. | 
| +)"; | 
|  | 
| const char kRootBuildDir[] = "root_build_dir"; | 
| const char kRootBuildDir_HelpShort[] = | 
| "root_build_dir: [string] Directory where build commands are run."; | 
| const char kRootBuildDir_Help[] = | 
| -  "root_build_dir: [string] Directory where build commands are run.\n" | 
| -  "\n" | 
| -  "  This is the root build output directory which will be the current\n" | 
| -  "  directory when executing all compilers and scripts.\n" | 
| -  "\n" | 
| -  "  Most often this is used with rebase_path (see \"gn help rebase_path\")\n" | 
| -  "  to convert arguments to be relative to a script's current directory.\n"; | 
| +  R"(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. | 
| +)"; | 
|  | 
| const char kRootGenDir[] = "root_gen_dir"; | 
| const char kRootGenDir_HelpShort[] = | 
| "root_gen_dir: [string] Directory for the toolchain's generated files."; | 
| const char kRootGenDir_Help[] = | 
| -    "root_gen_dir: Directory for the toolchain's generated files.\n" | 
| -    "\n" | 
| -    "  Absolute path to the root of the generated output directory tree for\n" | 
| -    "  the current toolchain. An example would be \"//out/Debug/gen\" for the\n" | 
| -    "  default toolchain, or \"//out/Debug/arm/gen\" for the \"arm\"\n" | 
| -    "  toolchain.\n" | 
| -    "\n" | 
| -    "  This is primarily useful for setting up include paths for generated\n" | 
| -    "  files. If you are passing this to a script, you will want to pass it\n" | 
| -    "  through rebase_path() (see \"gn help rebase_path\") to convert it\n" | 
| -    "  to be relative to the build directory.\n" | 
| -    "\n" | 
| -    "  See also \"target_gen_dir\" which is usually a better location for\n" | 
| -    "  generated files. It will be inside the root generated dir.\n"; | 
| +    R"(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. | 
| +)"; | 
|  | 
| const char kRootOutDir[] = "root_out_dir"; | 
| const char kRootOutDir_HelpShort[] = | 
| "root_out_dir: [string] Root directory for toolchain output files."; | 
| const char kRootOutDir_Help[] = | 
| -    "root_out_dir: [string] Root directory for toolchain output files.\n" | 
| -    "\n" | 
| -    "  Absolute path to the root of the output directory tree for the current\n" | 
| -    "  toolchain. It will not have a trailing slash.\n" | 
| -    "\n" | 
| -    "  For the default toolchain this will be the same as the root_build_dir.\n" | 
| -    "  An example would be \"//out/Debug\" for the default toolchain, or\n" | 
| -    "  \"//out/Debug/arm\" for the \"arm\" toolchain.\n" | 
| -    "\n" | 
| -    "  This is primarily useful for setting up script calls. If you are\n" | 
| -    "  passing this to a script, you will want to pass it through\n" | 
| -    "  rebase_path() (see \"gn help rebase_path\") to convert it\n" | 
| -    "  to be relative to the build directory.\n" | 
| -    "\n" | 
| -    "  See also \"target_out_dir\" which is usually a better location for\n" | 
| -    "  output files. It will be inside the root output dir.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  action(\"myscript\") {\n" | 
| -    "    # Pass the output dir to the script.\n" | 
| -    "    args = [ \"-o\", rebase_path(root_out_dir, root_build_dir) ]\n" | 
| -    "  }\n"; | 
| +    R"(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) ] | 
| +  } | 
| +)"; | 
|  | 
| const char kTargetGenDir[] = "target_gen_dir"; | 
| const char kTargetGenDir_HelpShort[] = | 
| "target_gen_dir: [string] Directory for a target's generated files."; | 
| const char kTargetGenDir_Help[] = | 
| -    "target_gen_dir: Directory for a target's generated files.\n" | 
| -    "\n" | 
| -    "  Absolute path to the target's generated file directory. This will be\n" | 
| -    "  the \"root_gen_dir\" followed by the relative path to the current\n" | 
| -    "  build file. If your file is in \"//tools/doom_melon\" then\n" | 
| -    "  target_gen_dir would be \"//out/Debug/gen/tools/doom_melon\". It will\n" | 
| -    "  not have a trailing slash.\n" | 
| -    "\n" | 
| -    "  This is primarily useful for setting up include paths for generated\n" | 
| -    "  files. If you are passing this to a script, you will want to pass it\n" | 
| -    "  through rebase_path() (see \"gn help rebase_path\") to convert it\n" | 
| -    "  to be relative to the build directory.\n" | 
| -    "\n" | 
| -    "  See also \"gn help root_gen_dir\".\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  action(\"myscript\") {\n" | 
| -    "    # Pass the generated output dir to the script.\n" | 
| -    "    args = [ \"-o\", rebase_path(target_gen_dir, root_build_dir) ]" | 
| -    "\n" | 
| -    "  }\n"; | 
| +    R"(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) ]" | 
| +  } | 
| +)"; | 
|  | 
| const char kTargetOutDir[] = "target_out_dir"; | 
| const char kTargetOutDir_HelpShort[] = | 
| "target_out_dir: [string] Directory for target output files."; | 
| const char kTargetOutDir_Help[] = | 
| -    "target_out_dir: [string] Directory for target output files.\n" | 
| -    "\n" | 
| -    "  Absolute path to the target's generated file directory. If your\n" | 
| -    "  current target is in \"//tools/doom_melon\" then this value might be\n" | 
| -    "  \"//out/Debug/obj/tools/doom_melon\". It will not have a trailing\n" | 
| -    "  slash.\n" | 
| -    "\n" | 
| -    "  This is primarily useful for setting up arguments for calling\n" | 
| -    "  scripts. If you are passing this to a script, you will want to pass it\n" | 
| -    "  through rebase_path() (see \"gn help rebase_path\") to convert it\n" | 
| -    "  to be relative to the build directory.\n" | 
| -    "\n" | 
| -    "  See also \"gn help root_out_dir\".\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  action(\"myscript\") {\n" | 
| -    "    # Pass the output dir to the script.\n" | 
| -    "    args = [ \"-o\", rebase_path(target_out_dir, root_build_dir) ]" | 
| -    "\n" | 
| -    "  }\n"; | 
| +    R"(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) ]" | 
| + | 
| +  } | 
| +)"; | 
|  | 
| // Target variables ------------------------------------------------------------ | 
|  | 
| @@ -399,296 +405,300 @@ const char kAllDependentConfigs[] = "all_dependent_configs"; | 
| const char kAllDependentConfigs_HelpShort[] = | 
| "all_dependent_configs: [label list] Configs to be forced on dependents."; | 
| const char kAllDependentConfigs_Help[] = | 
| -    "all_dependent_configs: Configs to be forced on dependents.\n" | 
| -    "\n" | 
| -    "  A list of config labels.\n" | 
| -    "\n" | 
| -    "  All targets depending on this one, and recursively, all targets\n" | 
| -    "  depending on those, will have the configs listed in this variable\n" | 
| -    "  added to them. These configs will also apply to the current target.\n" | 
| -    "\n" | 
| -    "  This addition happens in a second phase once a target and all of its\n" | 
| -    "  dependencies have been resolved. Therefore, a target will not see\n" | 
| -    "  these force-added configs in their \"configs\" variable while the\n" | 
| -    "  script is running, and then can not be removed. As a result, this\n" | 
| -    "  capability should generally only be used to add defines and include\n" | 
| -    "  directories necessary to compile a target's headers.\n" | 
| -    "\n" | 
| -    "  See also \"public_configs\".\n" | 
| +    R"(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". | 
| +)" | 
| COMMON_ORDERING_HELP; | 
|  | 
| const char kAllowCircularIncludesFrom[] = "allow_circular_includes_from"; | 
| const char kAllowCircularIncludesFrom_HelpShort[] = | 
| "allow_circular_includes_from: [label list] Permit includes from deps."; | 
| const char kAllowCircularIncludesFrom_Help[] = | 
| -    "allow_circular_includes_from: Permit includes from deps.\n" | 
| -    "\n" | 
| -    "  A list of target labels. Must be a subset of the target's \"deps\".\n" | 
| -    "  These targets will be permitted to include headers from the current\n" | 
| -    "  target despite the dependency going in the opposite direction.\n" | 
| -    "\n" | 
| -    "  When you use this, both targets must be included in a final binary\n" | 
| -    "  for it to link. To keep linker errors from happening, it is good\n" | 
| -    "  practice to have all external dependencies depend only on one of\n" | 
| -    "  the two targets, and to set the visibility on the other to enforce\n" | 
| -    "  this. Thus the targets will always be linked together in any output.\n" | 
| -    "\n" | 
| -    "Details\n" | 
| -    "\n" | 
| -    "  Normally, for a file in target A to include a file from target B,\n" | 
| -    "  A must list B as a dependency. This invariant is enforced by the\n" | 
| -    "  \"gn check\" command (and the --check flag to \"gn gen\" -- see\n" | 
| -    "  \"gn help check\").\n" | 
| -    "\n" | 
| -    "  Sometimes, two targets might be the same unit for linking purposes\n" | 
| -    "  (two source sets or static libraries that would always be linked\n" | 
| -    "  together in a final executable or shared library) and they each\n" | 
| -    "  include headers from the other: you want A to be able to include B's\n" | 
| -    "  headers, and B to include A's headers. This is not an ideal situation\n" | 
| -    "  but is sometimes unavoidable.\n" | 
| -    "\n" | 
| -    "  This list, if specified, lists which of the dependencies of the\n" | 
| -    "  current target can include header files from the current target.\n" | 
| -    "  That is, if A depends on B, B can only include headers from A if it is\n" | 
| -    "  in A's allow_circular_includes_from list. Normally includes must\n" | 
| -    "  follow the direction of dependencies, this flag allows them to go\n" | 
| -    "  in the opposite direction.\n" | 
| -    "\n" | 
| -    "Danger\n" | 
| -    "\n" | 
| -    "  In the above example, A's headers are likely to include headers from\n" | 
| -    "  A's dependencies. Those dependencies may have public_configs that\n" | 
| -    "  apply flags, defines, and include paths that make those headers work\n" | 
| -    "  properly.\n" | 
| -    "\n" | 
| -    "  With allow_circular_includes_from, B can include A's headers, and\n" | 
| -    "  transitively from A's dependencies, without having the dependencies\n" | 
| -    "  that would bring in the public_configs those headers need. The result\n" | 
| -    "  may be errors or inconsistent builds.\n" | 
| -    "\n" | 
| -    "  So when you use allow_circular_includes_from, make sure that any\n" | 
| -    "  compiler settings, flags, and include directories are the same between\n" | 
| -    "  both targets (consider putting such things in a shared config they can\n" | 
| -    "  both reference). Make sure the dependencies are also the same (you\n" | 
| -    "  might consider a group to collect such dependencies they both\n" | 
| -    "  depend on).\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  source_set(\"a\") {\n" | 
| -    "    deps = [ \":b\", \":a_b_shared_deps\" ]\n" | 
| -    "    allow_circular_includes_from = [ \":b\" ]\n" | 
| -    "    ...\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  source_set(\"b\") {\n" | 
| -    "    deps = [ \":a_b_shared_deps\" ]\n" | 
| -    "    # Sources here can include headers from a despite lack of deps.\n" | 
| -    "    ...\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  group(\"a_b_shared_deps\") {\n" | 
| -    "    public_deps = [ \":c\" ]\n" | 
| -    "  }\n"; | 
| +    R"(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" ] | 
| +  } | 
| +)"; | 
|  | 
| const char kArflags[] = "arflags"; | 
| const char kArflags_HelpShort[] = | 
| "arflags: [string list] Arguments passed to static_library archiver."; | 
| const char kArflags_Help[] = | 
| -    "arflags: Arguments passed to static_library archiver.\n" | 
| -    "\n" | 
| -    "  A list of flags passed to the archive/lib command that creates static\n" | 
| -    "  libraries.\n" | 
| -    "\n" | 
| -    "  arflags are NOT pushed to dependents, so applying arflags to source\n" | 
| -    "  sets or any other target type will be a no-op. As with ldflags,\n" | 
| -    "  you could put the arflags in a config and set that as a public or\n" | 
| -    "  \"all dependent\" config, but that will likely not be what you want.\n" | 
| -    "  If you have a chain of static libraries dependent on each other,\n" | 
| -    "  this can cause the flags to propagate up to other static libraries.\n" | 
| -    "  Due to the nature of how arflags are typically used, you will normally\n" | 
| -    "  want to apply them directly on static_library targets themselves.\n" | 
| +    R"(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. | 
| +)" | 
| COMMON_ORDERING_HELP; | 
|  | 
| const char kArgs[] = "args"; | 
| const char kArgs_HelpShort[] = | 
| "args: [string list] Arguments passed to an action."; | 
| const char kArgs_Help[] = | 
| -    "args: Arguments passed to an action.\n" | 
| -    "\n" | 
| -    "  For action and action_foreach targets, args is the list of arguments\n" | 
| -    "  to pass to the script. Typically you would use source expansion (see\n" | 
| -    "  \"gn help source_expansion\") to insert the source file names.\n" | 
| -    "\n" | 
| -    "  See also \"gn help action\" and \"gn help action_foreach\".\n"; | 
| +    R"(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". | 
| +)"; | 
|  | 
| const char kAssertNoDeps[] = "assert_no_deps"; | 
| const char kAssertNoDeps_HelpShort[] = | 
| "assert_no_deps: [label pattern list] Ensure no deps on these targets."; | 
| const char kAssertNoDeps_Help[] = | 
| -    "assert_no_deps: Ensure no deps on these targets.\n" | 
| -    "\n" | 
| -    "  A list of label patterns.\n" | 
| -    "\n" | 
| -    "  This list is a list of patterns that must not match any of the\n" | 
| -    "  transitive dependencies of the target. These include all public,\n" | 
| -    "  private, and data dependencies, and cross shared library boundaries.\n" | 
| -    "  This allows you to express that undesirable code isn't accidentally\n" | 
| -    "  added to downstream dependencies in a way that might otherwise be\n" | 
| -    "  difficult to notice.\n" | 
| -    "\n" | 
| -    "  Checking does not cross executable boundaries. If a target depends on\n" | 
| -    "  an executable, it's assumed that the executable is a tool that is\n" | 
| -    "  producing part of the build rather than something that is linked and\n" | 
| -    "  distributed. This allows assert_no_deps to express what is distributed\n" | 
| -    "  in the final target rather than depend on the internal build steps\n" | 
| -    "  (which may include non-distributable code).\n" | 
| -    "\n" | 
| -    "  See \"gn help label_pattern\" for the format of the entries in the\n" | 
| -    "  list. These patterns allow blacklisting individual targets or whole\n" | 
| -    "  directory hierarchies.\n" | 
| -    "\n" | 
| -    "  Sometimes it is desirable to enforce that many targets have no\n" | 
| -    "  dependencies on a target or set of targets. One efficient way to\n" | 
| -    "  express this is to create a group with the assert_no_deps rule on\n" | 
| -    "  it, and make that group depend on all targets you want to apply that\n" | 
| -    "  assertion to.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  executable(\"doom_melon\") {\n" | 
| -    "    deps = [ \"//foo:bar\" ]\n" | 
| -    "    ...\n" | 
| -    "    assert_no_deps = [\n" | 
| -    "      \"//evil/*\",  # Don't link any code from the evil directory.\n" | 
| -    "      \"//foo:test_support\",  # This target is also disallowed.\n" | 
| -    "    ]\n" | 
| -    "  }\n"; | 
| +    R"(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. | 
| +    ] | 
| +  } | 
| +)"; | 
|  | 
| const char kBundleRootDir[] = "bundle_root_dir"; | 
| const char kBundleRootDir_HelpShort[] = | 
| "bundle_root_dir: Expansion of {{bundle_root_dir}} in create_bundle."; | 
| const char kBundleRootDir_Help[] = | 
| -    "bundle_root_dir: Expansion of {{bundle_root_dir}} in create_bundle.\n" | 
| -    "\n" | 
| -    "  A string corresponding to a path in root_build_dir.\n" | 
| -    "\n" | 
| -    "  This string is used by the \"create_bundle\" target to expand the\n" | 
| -    "  {{bundle_root_dir}} of the \"bundle_data\" target it depends on.\n" | 
| -    "  This must correspond to a path under root_build_dir.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  bundle_data(\"info_plist\") {\n" | 
| -    "    sources = [ \"Info.plist\" ]\n" | 
| -    "    outputs = [ \"{{bundle_root_dir}}/Info.plist\" ]\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  create_bundle(\"doom_melon.app\") {\n" | 
| -    "    deps = [ \":info_plist\" ]\n" | 
| -    "    bundle_root_dir = root_build_dir + \"/doom_melon.app/Contents\"\n" | 
| -    "    bundle_resources_dir = bundle_root_dir + \"/Resources\"\n" | 
| -    "    bundle_executable_dir = bundle_root_dir + \"/MacOS\"\n" | 
| -    "    bundle_plugins_dir = bundle_root_dir + \"/PlugIns\"\n" | 
| -    "  }\n"; | 
| +    R"(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" | 
| +  } | 
| +)"; | 
|  | 
| const char kBundleResourcesDir[] = "bundle_resources_dir"; | 
| const char kBundleResourcesDir_HelpShort[] = | 
| "bundle_resources_dir: " | 
| "Expansion of {{bundle_resources_dir}} in create_bundle."; | 
| const char kBundleResourcesDir_Help[] = | 
| -    "bundle_resources_dir: " | 
| -        "Expansion of {{bundle_resources_dir}} in create_bundle.\n" | 
| -    "\n" | 
| -    "  A string corresponding to a path in $root_build_dir.\n" | 
| -    "\n" | 
| -    "  This string is used by the \"create_bundle\" target to expand the\n" | 
| -    "  {{bundle_resources_dir}} of the \"bundle_data\" target it depends on.\n" | 
| -    "  This must correspond to a path under \"bundle_root_dir\".\n" | 
| -    "\n" | 
| -    "  See \"gn help bundle_root_dir\" for examples.\n"; | 
| +    R"(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. | 
| +)"; | 
|  | 
| const char kBundleDepsFilter[] = "bundle_deps_filter"; | 
| const char kBundleDepsFilter_HelpShort[] = | 
| "bundle_deps_filter: [label list] A list of labels that are filtered out."; | 
| const char kBundleDepsFilter_Help[] = | 
| -    "bundle_deps_filter: [label list] A list of labels that are filtered out.\n" | 
| -    "\n" | 
| -    "  A list of target labels.\n" | 
| -    "\n" | 
| -    "  This list contains target label patterns that should be filtered out\n" | 
| -    "  when creating the bundle. Any target matching one of those label will\n" | 
| -    "  be removed from the dependencies of the create_bundle target.\n" | 
| -    "\n" | 
| -    "  This is mostly useful when creating application extension bundle as\n" | 
| -    "  the application extension has access to runtime resources from the\n" | 
| -    "  application bundle and thus do not require a second copy.\n" | 
| -    "\n" | 
| -    "  See \"gn help create_bundle\" for more information.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  create_bundle(\"today_extension\") {\n" | 
| -    "    deps = [\n" | 
| -    "      \"//base\"\n" | 
| -    "    ]\n" | 
| -    "    bundle_root_dir = \"$root_out_dir/today_extension.appex\"\n" | 
| -    "    bundle_deps_filter = [\n" | 
| -    "      # The extension uses //base but does not use any function calling\n" | 
| -    "      # into third_party/icu and thus does not need the icudtl.dat file.\n" | 
| -    "      \"//third_party/icu:icudata\",\n" | 
| -    "    ]\n" | 
| -    "  }\n"; | 
| +    R"(bundle_deps_filter: [label list] A list of labels that are filtered out. | 
| + | 
| +  A list of target labels. | 
| + | 
| +  This list contains target label patterns that should be filtered out when | 
| +  creating the bundle. Any target matching one of those label will be removed | 
| +  from the dependencies of the create_bundle target. | 
| + | 
| +  This is mostly useful when creating application extension bundle as the | 
| +  application extension has access to runtime resources from the application | 
| +  bundle and thus do not require a second copy. | 
| + | 
| +  See "gn help create_bundle" for more information. | 
| + | 
| +Example | 
| + | 
| +  create_bundle("today_extension") { | 
| +    deps = [ | 
| +      "//base" | 
| +    ] | 
| +    bundle_root_dir = "$root_out_dir/today_extension.appex" | 
| +    bundle_deps_filter = [ | 
| +      # The extension uses //base but does not use any function calling into | 
| +      # third_party/icu and thus does not need the icudtl.dat file. | 
| +      "//third_party/icu:icudata", | 
| +    ] | 
| +  } | 
| +)"; | 
|  | 
| const char kBundleExecutableDir[] = "bundle_executable_dir"; | 
| const char kBundleExecutableDir_HelpShort[] = | 
| "bundle_executable_dir: " | 
| "Expansion of {{bundle_executable_dir}} in create_bundle"; | 
| const char kBundleExecutableDir_Help[] = | 
| -    "bundle_executable_dir: " | 
| -        "Expansion of {{bundle_executable_dir}} in create_bundle.\n" | 
| -    "\n" | 
| -    "  A string corresponding to a path in $root_build_dir.\n" | 
| -    "\n" | 
| -    "  This string is used by the \"create_bundle\" target to expand the\n" | 
| -    "  {{bundle_executable_dir}} of the \"bundle_data\" target it depends on.\n" | 
| -    "  This must correspond to a path under \"bundle_root_dir\".\n" | 
| -    "\n" | 
| -    "  See \"gn help bundle_root_dir\" for examples.\n"; | 
| +    R"(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. | 
| +)"; | 
|  | 
| const char kBundlePlugInsDir[] = "bundle_plugins_dir"; | 
| const char kBundlePlugInsDir_HelpShort[] = | 
| "bundle_plugins_dir: " | 
| "Expansion of {{bundle_plugins_dir}} in create_bundle."; | 
| const char kBundlePlugInsDir_Help[] = | 
| -    "bundle_plugins_dir: " | 
| -        "Expansion of {{bundle_plugins_dir}} in create_bundle.\n" | 
| -    "\n" | 
| -    "  A string corresponding to a path in $root_build_dir.\n" | 
| -    "\n" | 
| -    "  This string is used by the \"create_bundle\" target to expand the\n" | 
| -    "  {{bundle_plugins_dir}} of the \"bundle_data\" target it depends on.\n" | 
| -    "  This must correspond to a path under \"bundle_root_dir\".\n" | 
| -    "\n" | 
| -    "  See \"gn help bundle_root_dir\" for examples.\n"; | 
| +    R"(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. | 
| +)"; | 
|  | 
| const char kCflags[] = "cflags"; | 
| const char kCflags_HelpShort[] = | 
| "cflags: [string list] Flags passed to all C compiler variants."; | 
| const char kCommonCflagsHelp[] = | 
| -    "cflags*: Flags passed to the C compiler.\n" | 
| -    "\n" | 
| -    "  A list of strings.\n" | 
| -    "\n" | 
| -    "  \"cflags\" are passed to all invocations of the C, C++, Objective C,\n" | 
| -    "  and Objective C++ compilers.\n" | 
| -    "\n" | 
| -    "  To target one of these variants individually, use \"cflags_c\",\n" | 
| -    "  \"cflags_cc\", \"cflags_objc\", and \"cflags_objcc\",\n" | 
| -    "  respectively. These variant-specific versions of cflags* will be\n" | 
| -    "  appended on the compiler command line after \"cflags\".\n" | 
| -    "\n" | 
| -    "  See also \"asmflags\" for flags for assembly-language files.\n" | 
| +    R"(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. | 
| +)" | 
| COMMON_ORDERING_HELP; | 
| const char* kCflags_Help = kCommonCflagsHelp; | 
|  | 
| @@ -696,12 +706,13 @@ const char kAsmflags[] = "asmflags"; | 
| const char kAsmflags_HelpShort[] = | 
| "asmflags: [string list] Flags passed to the assembler."; | 
| const char* kAsmflags_Help = | 
| -    "asmflags: Flags passed to the assembler.\n" | 
| -    "\n" | 
| -    "  A list of strings.\n" | 
| -    "\n" | 
| -    "  \"asmflags\" are passed to any invocation of a tool that takes an\n" | 
| -    "  .asm or .S file as input.\n" | 
| +    R"(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. | 
| +)" | 
| COMMON_ORDERING_HELP; | 
|  | 
| const char kCflagsC[] = "cflags_c"; | 
| @@ -728,470 +739,473 @@ const char kCheckIncludes[] = "check_includes"; | 
| const char kCheckIncludes_HelpShort[] = | 
| "check_includes: [boolean] Controls whether a target's files are checked."; | 
| const char kCheckIncludes_Help[] = | 
| -    "check_includes: [boolean] Controls whether a target's files are checked.\n" | 
| -    "\n" | 
| -    "  When true (the default), the \"gn check\" command (as well as\n" | 
| -    "  \"gn gen\" with the --check flag) will check this target's sources\n" | 
| -    "  and headers for proper dependencies.\n" | 
| -    "\n" | 
| -    "  When false, the files in this target will be skipped by default.\n" | 
| -    "  This does not affect other targets that depend on the current target,\n" | 
| -    "  it just skips checking the includes of the current target's files.\n" | 
| -    "\n" | 
| -    "  If there are a few conditionally included headers that trip up\n" | 
| -    "  checking, you can exclude headers individually by annotating them with\n" | 
| -    "  \"nogncheck\" (see \"gn help nogncheck\").\n" | 
| -    "\n" | 
| -    "  The topic \"gn help check\" has general information on how checking\n" | 
| -    "  works and advice on how to pass a check in problematic cases.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  source_set(\"busted_includes\") {\n" | 
| -    "    # This target's includes are messed up, exclude it from checking.\n" | 
| -    "    check_includes = false\n" | 
| -    "    ...\n" | 
| -    "  }\n"; | 
| +    R"(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 | 
| +    ... | 
| +  } | 
| +)"; | 
|  | 
| const char kCodeSigningArgs[] = "code_signing_args"; | 
| const char kCodeSigningArgs_HelpShort[] = | 
| "code_signing_args: [string list] Arguments passed to code signing script."; | 
| const char kCodeSigningArgs_Help[] = | 
| -    "code_signing_args: [string list] Arguments passed to code signing " | 
| -        "script.\n" | 
| -    "\n" | 
| -    "  For create_bundle targets, code_signing_args is the list of arguments\n" | 
| -    "  to pass to the code signing script. Typically you would use source\n" | 
| -    "  expansion (see \"gn help source_expansion\") to insert the source file\n" | 
| -    "  names.\n" | 
| -    "\n" | 
| -    "  See also \"gn help create_bundle\".\n"; | 
| +    R"(code_signing_args: [string list] Arguments passed to code signing script. | 
| + | 
| +  For create_bundle targets, code_signing_args is the list of arguments to pass | 
| +  to the code signing script. Typically you would use source expansion (see "gn | 
| +  help source_expansion") to insert the source file names. | 
| + | 
| +  See also "gn help create_bundle". | 
| +)"; | 
|  | 
| const char kCodeSigningScript[] = "code_signing_script"; | 
| const char kCodeSigningScript_HelpShort[] = | 
| "code_signing_script: [file name] Script for code signing."; | 
| const char kCodeSigningScript_Help[] = | 
| -    "code_signing_script: [file name] Script for code signing." | 
| -    "\n" | 
| -    "  An absolute or buildfile-relative file name of a Python script to run\n" | 
| -    "  for a create_bundle target to perform code signing step.\n" | 
| -    "\n" | 
| -    "  See also \"gn help create_bundle\".\n"; | 
| +    R"(code_signing_script: [file name] Script for code signing." | 
| + | 
| +  An absolute or buildfile-relative file name of a Python script to run for a | 
| +  create_bundle target to perform code signing step. | 
| + | 
| +  See also "gn help create_bundle". | 
| +)"; | 
|  | 
| const char kCodeSigningSources[] = "code_signing_sources"; | 
| const char kCodeSigningSources_HelpShort[] = | 
| "code_signing_sources: [file list] Sources for code signing step."; | 
| const char kCodeSigningSources_Help[] = | 
| -    "code_signing_sources: [file list] Sources for code signing step.\n" | 
| -    "\n" | 
| -    "  A list of files used as input for code signing script step of a\n" | 
| -    "  create_bundle target. Non-absolute paths will be resolved relative to\n" | 
| -    "  the current build file.\n" | 
| -    "\n" | 
| -    "  See also \"gn help create_bundle\".\n"; | 
| +    R"(code_signing_sources: [file list] Sources for code signing step. | 
| + | 
| +  A list of files used as input for code signing script step of a create_bundle | 
| +  target. Non-absolute paths will be resolved relative to the current build | 
| +  file. | 
| + | 
| +  See also "gn help create_bundle". | 
| +)"; | 
|  | 
| const char kCodeSigningOutputs[] = "code_signing_outputs"; | 
| const char kCodeSigningOutputs_HelpShort[] = | 
| "code_signing_outputs: [file list] Output files for code signing step."; | 
| const char kCodeSigningOutputs_Help[] = | 
| -    "code_signing_outputs: [file list] Output files for code signing step.\n" | 
| -    "\n" | 
| -    "  Outputs from the code signing step of a create_bundle target. Must\n" | 
| -    "  refer to files in the build directory.\n" | 
| -    "\n" | 
| -    "  See also \"gn help create_bundle\".\n"; | 
| +    R"(code_signing_outputs: [file list] Output files for code signing step. | 
| + | 
| +  Outputs from the code signing step of a create_bundle target. Must refer to | 
| +  files in the build directory. | 
| + | 
| +  See also "gn help create_bundle". | 
| +)"; | 
|  | 
| const char kCompleteStaticLib[] = "complete_static_lib"; | 
| const char kCompleteStaticLib_HelpShort[] = | 
| "complete_static_lib: [boolean] Links all deps into a static library."; | 
| const char kCompleteStaticLib_Help[] = | 
| -    "complete_static_lib: [boolean] Links all deps into a static library.\n" | 
| -    "\n" | 
| -    "  A static library normally doesn't include code from dependencies, but\n" | 
| -    "  instead forwards the static libraries and source sets in its deps up\n" | 
| -    "  the dependency chain until a linkable target (an executable or shared\n" | 
| -    "  library) is reached. The final linkable target only links each static\n" | 
| -    "  library once, even if it appears more than once in its dependency\n" | 
| -    "  graph.\n" | 
| -    "\n" | 
| -    "  In some cases the static library might be the final desired output.\n" | 
| -    "  For example, you may be producing a static library for distribution to\n" | 
| -    "  third parties. In this case, the static library should include code\n" | 
| -    "  for all dependencies in one complete package. However, complete static\n" | 
| -    "  libraries themselves are never linked into other complete static\n" | 
| -    "  libraries. All complete static libraries are for distribution and\n" | 
| -    "  linking them in would cause code duplication in this case. If the\n" | 
| -    "  static library is not for distribution, it should not be complete.\n" | 
| -    "\n" | 
| -    "  GN treats non-complete static libraries as source sets when they are\n" | 
| -    "  linked into complete static libraries. This is done because some tools\n" | 
| -    "  like AR do not handle dependent static libraries properly. This makes\n" | 
| -    "  it easier to write \"alink\" rules.\n" | 
| -    "\n" | 
| -    "  In rare cases it makes sense to list a header in more than one\n" | 
| -    "  target if it could be considered conceptually a member of both.\n" | 
| -    "  libraries.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  static_library(\"foo\") {\n" | 
| -    "    complete_static_lib = true\n" | 
| -    "    deps = [ \"bar\" ]\n" | 
| -    "  }\n"; | 
| +    R"(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" ] | 
| +  } | 
| +)"; | 
|  | 
| const char kConfigs[] = "configs"; | 
| const char kConfigs_HelpShort[] = | 
| "configs: [label list] Configs applying to this target or config."; | 
| const char kConfigs_Help[] = | 
| -    "configs: Configs applying to this target or config.\n" | 
| -    "\n" | 
| -    "  A list of config labels.\n" | 
| -    "\n" | 
| -    "Configs on a target\n" | 
| -    "\n" | 
| -    "  When used on a target, the include_dirs, defines, etc. in each config\n" | 
| -    "  are appended in the order they appear to the compile command for each\n" | 
| -    "  file in the target. They will appear after the include_dirs, defines,\n" | 
| -    "  etc. that the target sets directly.\n" | 
| -    "\n" | 
| -    "  Since configs apply after the values set on a target, directly setting\n" | 
| -    "  a compiler flag will prepend it to the command line. If you want to\n" | 
| -    "  append a flag instead, you can put that flag in a one-off config and\n" | 
| -    "  append that config to the target's configs list.\n" | 
| -    "\n" | 
| -    "  The build configuration script will generally set up the default\n" | 
| -    "  configs applying to a given target type (see \"set_defaults\").\n" | 
| -    "  When a target is being defined, it can add to or remove from this\n" | 
| -    "  list.\n" | 
| -    "\n" | 
| -    "Configs on a config\n" | 
| -    "\n" | 
| -    "  It is possible to create composite configs by specifying configs on a\n" | 
| -    "  config. One might do this to forward values, or to factor out blocks\n" | 
| -    "  of settings from very large configs into more manageable named chunks.\n" | 
| -    "\n" | 
| -    "  In this case, the composite config is expanded to be the concatenation\n" | 
| -    "  of its own values, and in order, the values from its sub-configs\n" | 
| -    "  *before* anything else happens. This has some ramifications:\n" | 
| -    "\n" | 
| -    "   - A target has no visibility into a config's sub-configs. Target\n" | 
| -    "     code only sees the name of the composite config. It can't remove\n" | 
| -    "     sub-configs or opt in to only parts of it. The composite config may\n" | 
| -    "     not even be defined before the target is.\n" | 
| -    "\n" | 
| -    "   - You can get duplication of values if a config is listed twice, say,\n" | 
| -    "     on a target and in a sub-config that also applies. In other cases,\n" | 
| -    "     the configs applying to a target are de-duped. It's expected that\n" | 
| -    "     if a config is listed as a sub-config that it is only used in that\n" | 
| -    "     context. (Note that it's possible to fix this and de-dupe, but it's\n" | 
| -    "     not normally relevant and complicates the implementation.)\n" | 
| +    R"(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.) | 
| +)" | 
| COMMON_ORDERING_HELP | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  # Configs on a target.\n" | 
| -    "  source_set(\"foo\") {\n" | 
| -    "    # Don't use the default RTTI config that BUILDCONFIG applied to us.\n" | 
| -    "    configs -= [ \"//build:no_rtti\" ]\n" | 
| -    "\n" | 
| -    "    # Add some of our own settings.\n" | 
| -    "    configs += [ \":mysettings\" ]\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  # Create a default_optimization config that forwards to one of a set\n" | 
| -    "  # of more specialized configs depending on build flags. This pattern\n" | 
| -    "  # is useful because it allows a target to opt in to either a default\n" | 
| -    "  # set, or a more specific set, while avoid duplicating the settings in\n" | 
| -    "  # two places.\n" | 
| -    "  config(\"super_optimization\") {\n" | 
| -    "    cflags = [ ... ]\n" | 
| -    "  }\n" | 
| -    "  config(\"default_optimization\") {\n" | 
| -    "    if (optimize_everything) {\n" | 
| -    "      configs = [ \":super_optimization\" ]\n" | 
| -    "    } else {\n" | 
| -    "      configs = [ \":no_optimization\" ]\n" | 
| -    "    }\n" | 
| -    "  }\n"; | 
| +R"( | 
| +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" ] | 
| +    } | 
| +  } | 
| +)"; | 
|  | 
| const char kConsole[] = "console"; | 
| const char kConsole_HelpShort[] = | 
| "console: [boolean] Run this action in the console pool."; | 
| const char kConsole_Help[] = | 
| -    "console: Run this action in the console pool.\n" | 
| -    "\n" | 
| -    "  Boolean. Defaults to false.\n" | 
| -    "\n" | 
| -    "  Actions marked \"console = true\" will be run in the built-in ninja\n" | 
| -    "  \"console\" pool. They will have access to real stdin and stdout, and\n" | 
| -    "  output will not be buffered by ninja. This can be useful for\n" | 
| -    "  long-running actions with progress logs, or actions that require user \n" | 
| -    "  input.\n" | 
| -    "\n" | 
| -    "  Only one console pool target can run at any one time in Ninja. Refer\n" | 
| -    "  to the Ninja documentation on the console pool for more info.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  action(\"long_action_with_progress_logs\") {\n" | 
| -    "    console = true\n" | 
| -    "  }\n"; | 
| +    R"(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 | 
| +  } | 
| +)"; | 
|  | 
| const char kData[] = "data"; | 
| const char kData_HelpShort[] = | 
| "data: [file list] Runtime data file dependencies."; | 
| const char kData_Help[] = | 
| -    "data: Runtime data file dependencies.\n" | 
| -    "\n" | 
| -    "  Lists files or directories required to run the given target. These are\n" | 
| -    "  typically data files or directories of data files. The paths are\n" | 
| -    "  interpreted as being relative to the current build file. Since these\n" | 
| -    "  are runtime dependencies, they do not affect which targets are built\n" | 
| -    "  or when. To declare input files to a script, use \"inputs\".\n" | 
| -    "\n" | 
| -    "  Appearing in the \"data\" section does not imply any special handling\n" | 
| -    "  such as copying them to the output directory. This is just used for\n" | 
| -    "  declaring runtime dependencies. Runtime dependencies can be queried\n" | 
| -    "  using the \"runtime_deps\" category of \"gn desc\" or written during\n" | 
| -    "  build generation via \"--runtime-deps-list-file\".\n" | 
| -    "\n" | 
| -    "  GN doesn't require data files to exist at build-time. So actions that\n" | 
| -    "  produce files that are in turn runtime dependencies can list those\n" | 
| -    "  generated files both in the \"outputs\" list as well as the \"data\"\n" | 
| -    "  list.\n" | 
| -    "\n" | 
| -    "  By convention, directories are listed with a trailing slash:\n" | 
| -    "    data = [ \"test/data/\" ]\n" | 
| -    "  However, no verification is done on these so GN doesn't enforce this.\n" | 
| -    "  The paths are just rebased and passed along when requested.\n" | 
| -    "\n" | 
| -    "  Note: On iOS and OS X, create_bundle targets will not be recursed\n" | 
| -    "  into when gathering data. See \"gn help create_bundle\" for details.\n" | 
| -    "\n" | 
| -    "  See \"gn help runtime_deps\" for how these are used.\n"; | 
| +    R"(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. | 
| + | 
| +  Note: On iOS and OS X, create_bundle targets will not be recursed into when | 
| +  gathering data. See "gn help create_bundle" for details. | 
| + | 
| +  See "gn help runtime_deps" for how these are used. | 
| +)"; | 
|  | 
| const char kDataDeps[] = "data_deps"; | 
| const char kDataDeps_HelpShort[] = | 
| "data_deps: [label list] Non-linked dependencies."; | 
| const char kDataDeps_Help[] = | 
| -    "data_deps: Non-linked dependencies.\n" | 
| -    "\n" | 
| -    "  A list of target labels.\n" | 
| -    "\n" | 
| -    "  Specifies dependencies of a target that are not actually linked into\n" | 
| -    "  the current target. Such dependencies will be built and will be\n" | 
| -    "  available at runtime.\n" | 
| -    "\n" | 
| -    "  This is normally used for things like plugins or helper programs that\n" | 
| -    "  a target needs at runtime.\n" | 
| -    "\n" | 
| -    "  Note: On iOS and OS X, create_bundle targets will not be recursed\n" | 
| -    "  into when gathering data_deps. See \"gn help create_bundle\" for\n" | 
| -    "  details.\n" | 
| -    "\n" | 
| -    "  See also \"gn help deps\" and \"gn help data\".\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  executable(\"foo\") {\n" | 
| -    "    deps = [ \"//base\" ]\n" | 
| -    "    data_deps = [ \"//plugins:my_runtime_plugin\" ]\n" | 
| -    "  }\n"; | 
| +    R"(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. | 
| + | 
| +  Note: On iOS and OS X, create_bundle targets will not be recursed into when | 
| +  gathering data_deps. See "gn help create_bundle" for details. | 
| + | 
| +  See also "gn help deps" and "gn help data". | 
| + | 
| +Example | 
| + | 
| +  executable("foo") { | 
| +    deps = [ "//base" ] | 
| +    data_deps = [ "//plugins:my_runtime_plugin" ] | 
| +  } | 
| +)"; | 
|  | 
| const char kDefines[] = "defines"; | 
| const char kDefines_HelpShort[] = | 
| "defines: [string list] C preprocessor defines."; | 
| const char kDefines_Help[] = | 
| -    "defines: C preprocessor defines.\n" | 
| -    "\n" | 
| -    "  A list of strings\n" | 
| -    "\n" | 
| -    "  These strings will be passed to the C/C++ compiler as #defines. The\n" | 
| -    "  strings may or may not include an \"=\" to assign a value.\n" | 
| +    R"(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. | 
| +)" | 
| COMMON_ORDERING_HELP | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  defines = [ \"AWESOME_FEATURE\", \"LOG_LEVEL=3\" ]\n"; | 
| +R"( | 
| +Example | 
| + | 
| +  defines = [ "AWESOME_FEATURE", "LOG_LEVEL=3" ] | 
| +)"; | 
|  | 
| const char kDepfile[] = "depfile"; | 
| const char kDepfile_HelpShort[] = | 
| "depfile: [string] File name for input dependencies for actions."; | 
| const char kDepfile_Help[] = | 
| -    "depfile: [string] File name for input dependencies for actions.\n" | 
| -    "\n" | 
| -    "  If nonempty, this string specifies that the current action or\n" | 
| -    "  action_foreach target will generate the given \".d\" file containing\n" | 
| -    "  the dependencies of the input. Empty or unset means that the script\n" | 
| -    "  doesn't generate the files.\n" | 
| -    "\n" | 
| -    "  A depfile should be used only when a target depends on files that are\n" | 
| -    "  not already specified by a target's inputs and sources. Likewise,\n" | 
| -    "  depfiles should specify only those dependencies not already included\n" | 
| -    "  in sources or inputs.\n" | 
| -    "\n" | 
| -    "  The .d file should go in the target output directory. If you have more\n" | 
| -    "  than one source file that the script is being run over, you can use\n" | 
| -    "  the output file expansions described in \"gn help action_foreach\" to\n" | 
| -    "  name the .d file according to the input." | 
| -    "\n" | 
| -    "  The format is that of a Makefile and all paths must be relative to the\n" | 
| -    "  root build directory. Only one output may be listed and it must match\n" | 
| -    "  the first output of the action.\n" | 
| -    "\n" | 
| -    "  Although depfiles are created by an action, they should not be listed\n" | 
| -    "  in the action's \"outputs\" unless another target will use the file as\n" | 
| -    "  an input.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  action_foreach(\"myscript_target\") {\n" | 
| -    "    script = \"myscript.py\"\n" | 
| -    "    sources = [ ... ]\n" | 
| -    "\n" | 
| -    "    # Locate the depfile in the output directory named like the\n" | 
| -    "    # inputs but with a \".d\" appended.\n" | 
| -    "    depfile = \"$relative_target_output_dir/{{source_name}}.d\"\n" | 
| -    "\n" | 
| -    "    # Say our script uses \"-o <d file>\" to indicate the depfile.\n" | 
| -    "    args = [ \"{{source}}\", \"-o\", depfile ]\n" | 
| -    "  }\n"; | 
| +    R"(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. | 
| + | 
| +  A depfile should be used only when a target depends on files that are not | 
| +  already specified by a target's inputs and sources. Likewise, depfiles should | 
| +  specify only those dependencies not already included in sources or inputs. | 
| + | 
| +  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 paths must be relative to the root | 
| +  build directory. Only one output may be listed and it must match the first | 
| +  output of the action. | 
| + | 
| +  Although depfiles are created by an action, they should not be listed in the | 
| +  action's "outputs" unless another target will use the file as an input. | 
| + | 
| +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 ] | 
| +  } | 
| +)"; | 
|  | 
| const char kDeps[] = "deps"; | 
| const char kDeps_HelpShort[] = | 
| "deps: [label list] Private linked dependencies."; | 
| const char kDeps_Help[] = | 
| -    "deps: Private linked dependencies.\n" | 
| -    "\n" | 
| -    "  A list of target labels.\n" | 
| -    "\n" | 
| -    "  Specifies private dependencies of a target. Private dependencies are\n" | 
| -    "  propagated up the dependency tree and linked to dependant targets, but\n" | 
| -    "  do not grant the ability to include headers from the dependency.\n" | 
| -    "  Public configs are not forwarded.\n" | 
| -    "\n" | 
| -    "Details of dependency propagation\n" | 
| -    "\n" | 
| -    "  Source sets, shared libraries, and non-complete static libraries\n" | 
| -    "  will be propagated up the dependency tree across groups, non-complete\n" | 
| -    "  static libraries and source sets.\n" | 
| -    "\n" | 
| -    "  Executables, shared libraries, and complete static libraries will\n" | 
| -    "  link all propagated targets and stop propagation. Actions and copy\n" | 
| -    "  steps also stop propagation, allowing them to take a library as an\n" | 
| -    "  input but not force dependants to link to it.\n" | 
| -    "\n" | 
| -    "  Propagation of all_dependent_configs and public_configs happens\n" | 
| -    "  independently of target type. all_dependent_configs are always\n" | 
| -    "  propagated across all types of targets, and public_configs\n" | 
| -    "  are always propagated across public deps of all types of targets.\n" | 
| -    "\n" | 
| -    "  Data dependencies are propagated differently. See\n" | 
| -    "  \"gn help data_deps\" and \"gn help runtime_deps\".\n" | 
| -    "\n" | 
| -    "  See also \"public_deps\".\n"; | 
| +    R"(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". | 
| +)"; | 
|  | 
| const char kIncludeDirs[] = "include_dirs"; | 
| const char kIncludeDirs_HelpShort[] = | 
| "include_dirs: [directory list] Additional include directories."; | 
| const char kIncludeDirs_Help[] = | 
| -    "include_dirs: Additional include directories.\n" | 
| -    "\n" | 
| -    "  A list of source directories.\n" | 
| -    "\n" | 
| -    "  The directories in this list will be added to the include path for\n" | 
| -    "  the files in the affected target.\n" | 
| +    R"(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. | 
| +)" | 
| COMMON_ORDERING_HELP | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  include_dirs = [ \"src/include\", \"//third_party/foo\" ]\n"; | 
| +R"( | 
| +Example | 
| + | 
| +  include_dirs = [ "src/include", "//third_party/foo" ] | 
| +)"; | 
|  | 
| const char kInputs[] = "inputs"; | 
| const char kInputs_HelpShort[] = | 
| "inputs: [file list] Additional compile-time dependencies."; | 
| const char kInputs_Help[] = | 
| -    "inputs: Additional compile-time dependencies.\n" | 
| -    "\n" | 
| -    "  Inputs are compile-time dependencies of the current target. This means\n" | 
| -    "  that all inputs must be available before compiling any of the sources\n" | 
| -    "  or executing any actions.\n" | 
| -    "\n" | 
| -    "  Inputs are typically only used for action and action_foreach targets.\n" | 
| -    "\n" | 
| -    "Inputs for actions\n" | 
| -    "\n" | 
| -    "  For action and action_foreach targets, inputs should be the inputs to\n" | 
| -    "  script that don't vary. These should be all .py files that the script\n" | 
| -    "  uses via imports (the main script itself will be an implicit dependency" | 
| -                                                                            "\n" | 
| -    "  of the action so need not be listed).\n" | 
| -    "\n" | 
| -    "  For action targets, inputs and sources are treated the same, but from\n" | 
| -    "  a style perspective, it's recommended to follow the same rule as\n" | 
| -    "  action_foreach and put helper files in the inputs, and the data used\n" | 
| -    "  by the script (if any) in sources.\n" | 
| -    "\n" | 
| -    "  Note that another way to declare input dependencies from an action\n" | 
| -    "  is to have the action write a depfile (see \"gn help depfile\"). This\n" | 
| -    "  allows the script to dynamically write input dependencies, that might\n" | 
| -    "  not be known until actually executing the script. This is more\n" | 
| -    "  efficient than doing processing while running GN to determine the\n" | 
| -    "  inputs, and is easier to keep in-sync than hardcoding the list.\n" | 
| -    "\n" | 
| -    "Script input gotchas\n" | 
| -    "\n" | 
| -    "  It may be tempting to write a script that enumerates all files in a\n" | 
| -    "  directory as inputs. Don't do this! Even if you specify all the files\n" | 
| -    "  in the inputs or sources in the GN target (or worse, enumerate the\n" | 
| -    "  files in an exec_script call when running GN, which will be slow), the\n" | 
| -    "  dependencies will be broken.\n" | 
| -    "\n" | 
| -    "  The problem happens if a file is ever removed because the inputs are\n" | 
| -    "  not listed on the command line to the script. Because the script\n" | 
| -    "  hasn't changed and all inputs are up to date, the script will not\n" | 
| -    "  re-run and you will get a stale build. Instead, either list all\n" | 
| -    "  inputs on the command line to the script, or if there are many, create\n" | 
| -    "  a separate list file that the script reads. As long as this file is\n" | 
| -    "  listed in the inputs, the build will detect when it has changed in any\n" | 
| -    "  way and the action will re-run.\n" | 
| -    "\n" | 
| -    "Inputs for binary targets\n" | 
| -    "\n" | 
| -    "  Any input dependencies will be resolved before compiling any sources.\n" | 
| -    "  Normally, all actions that a target depends on will be run before any\n" | 
| -    "  files in a target are compiled. So if you depend on generated headers,\n" | 
| -    "  you do not typically need to list them in the inputs section.\n" | 
| -    "\n" | 
| -    "  Inputs for binary targets will be treated as implicit dependencies,\n" | 
| -    "  meaning that changes in any of the inputs will force all sources in\n" | 
| -    "  the target to be recompiled. If an input only applies to a subset of\n" | 
| -    "  source files, you may want to split those into a separate target to\n" | 
| -    "  avoid unnecessary recompiles.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  action(\"myscript\") {\n" | 
| -    "    script = \"domything.py\"\n" | 
| -    "    inputs = [ \"input.data\" ]\n" | 
| -    "  }\n"; | 
| +    R"(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 implicit dependencies, meaning | 
| +  that changes in any of the inputs will force all sources in the target to be | 
| +  recompiled. If an input only applies to a subset of source files, you may | 
| +  want to split those into a separate target to avoid unnecessary recompiles. | 
| + | 
| +Example | 
| + | 
| +  action("myscript") { | 
| +    script = "domything.py" | 
| +    inputs = [ "input.data" ] | 
| +  } | 
| +)"; | 
|  | 
| const char kLdflags[] = "ldflags"; | 
| const char kLdflags_HelpShort[] = | 
| "ldflags: [string list] Flags passed to the linker."; | 
| const char kLdflags_Help[] = | 
| -    "ldflags: Flags passed to the linker.\n" | 
| -    "\n" | 
| -    "  A list of strings.\n" | 
| -    "\n" | 
| -    "  These flags are passed on the command-line to the linker and generally\n" | 
| -    "  specify various linking options. Most targets will not need these and\n" | 
| -    "  will use \"libs\" and \"lib_dirs\" instead.\n" | 
| -    "\n" | 
| -    "  ldflags are NOT pushed to dependents, so applying ldflags to source\n" | 
| -    "  sets or static libraries will be a no-op. If you want to apply ldflags\n" | 
| -    "  to dependent targets, put them in a config and set it in the\n" | 
| -    "  all_dependent_configs or public_configs.\n" | 
| +    R"(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. | 
| +)" | 
| COMMON_ORDERING_HELP; | 
|  | 
| #define COMMON_LIB_INHERITANCE_HELP \ | 
| @@ -1212,597 +1226,602 @@ const char kLibDirs[] = "lib_dirs"; | 
| const char kLibDirs_HelpShort[] = | 
| "lib_dirs: [directory list] Additional library directories."; | 
| const char kLibDirs_Help[] = | 
| -    "lib_dirs: Additional library directories.\n" | 
| -    "\n" | 
| -    "  A list of directories.\n" | 
| -    "\n" | 
| -    "  Specifies additional directories passed to the linker for searching\n" | 
| -    "  for the required libraries. If an item is not an absolute path, it\n" | 
| -    "  will be treated as being relative to the current build file.\n" | 
| +    R"(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. | 
| +)" | 
| COMMON_LIB_INHERITANCE_HELP | 
| COMMON_ORDERING_HELP | 
| LIBS_AND_LIB_DIRS_ORDERING_HELP | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  lib_dirs = [ \"/usr/lib/foo\", \"lib/doom_melon\" ]\n"; | 
| +R"( | 
| +Example | 
| + | 
| +  lib_dirs = [ "/usr/lib/foo", "lib/doom_melon" ] | 
| +)"; | 
|  | 
| const char kLibs[] = "libs"; | 
| const char kLibs_HelpShort[] = | 
| "libs: [string list] Additional libraries to link."; | 
| const char kLibs_Help[] = | 
| -    "libs: Additional libraries to link.\n" | 
| -    "\n" | 
| -    "  A list of library names or library paths.\n" | 
| -    "\n" | 
| -    "  These libraries will be linked into the final binary (executable or\n" | 
| -    "  shared library) containing the current target.\n" | 
| +    R"(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. | 
| +)" | 
| COMMON_LIB_INHERITANCE_HELP | 
| -    "\n" | 
| -    "Types of libs\n" | 
| -    "\n" | 
| -    "  There are several different things that can be expressed in libs:\n" | 
| -    "\n" | 
| -    "  File paths\n" | 
| -    "      Values containing '/' will be treated as references to files in\n" | 
| -    "      the checkout. They will be rebased to be relative to the build\n" | 
| -    "      directory and specified in the \"libs\" for linker tools. This\n" | 
| -    "      facility should be used for libraries that are checked in to the\n" | 
| -    "      version control. For libraries that are generated by the build,\n" | 
| -    "      use normal GN deps to link them.\n" | 
| -    "\n" | 
| -    "  System libraries\n" | 
| -    "      Values not containing '/' will be treated as system library names.\n" | 
| -    "      These will be passed unmodified to the linker and prefixed with\n" | 
| -    "      the \"lib_prefix\" attribute of the linker tool. Generally you\n" | 
| -    "      would set the \"lib_dirs\" so the given library is found. Your\n" | 
| -    "      BUILD.gn file should not specify the switch (like \"-l\"): this\n" | 
| -    "      will be encoded in the \"lib_prefix\" of the tool.\n" | 
| -    "\n" | 
| -    "  Apple frameworks\n" | 
| -    "      System libraries ending in \".framework\" will be special-cased:\n" | 
| -    "      the switch \"-framework\" will be prepended instead of the\n" | 
| -    "      lib_prefix, and the \".framework\" suffix will be trimmed. This is\n" | 
| -    "      to support the way Mac links framework dependencies.\n" | 
| +R"( | 
| +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. | 
| +)" | 
| COMMON_ORDERING_HELP | 
| LIBS_AND_LIB_DIRS_ORDERING_HELP | 
| -    "\n" | 
| -    "Examples\n" | 
| -    "\n" | 
| -    "  On Windows:\n" | 
| -    "    libs = [ \"ctl3d.lib\" ]\n" | 
| -    "\n" | 
| -    "  On Linux:\n" | 
| -    "    libs = [ \"ld\" ]\n"; | 
| +R"( | 
| +Examples | 
| + | 
| +  On Windows: | 
| +    libs = [ "ctl3d.lib" ] | 
| + | 
| +  On Linux: | 
| +    libs = [ "ld" ] | 
| +)"; | 
|  | 
| const char kOutputExtension[] = "output_extension"; | 
| const char kOutputExtension_HelpShort[] = | 
| "output_extension: [string] Value to use for the output's file extension."; | 
| const char kOutputExtension_Help[] = | 
| -    "output_extension: Value to use for the output's file extension.\n" | 
| -    "\n" | 
| -    "  Normally the file extension for a target is based on the target\n" | 
| -    "  type and the operating system, but in rare cases you will need to\n" | 
| -    "  override the name (for example to use \"libfreetype.so.6\" instead\n" | 
| -    "  of libfreetype.so on Linux).\n" | 
| -    "\n" | 
| -    "  This value should not include a leading dot. If undefined, the default\n" | 
| -    "  specified on the tool will be used. If set to the empty string, no\n" | 
| -    "  output extension will be used.\n" | 
| -    "\n" | 
| -    "  The output_extension will be used to set the \"{{output_extension}}\"\n" | 
| -    "  expansion which the linker tool will generally use to specify the\n" | 
| -    "  output file name. See \"gn help tool\".\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  shared_library(\"freetype\") {\n" | 
| -    "    if (is_linux) {\n" | 
| -    "      # Call the output \"libfreetype.so.6\"\n" | 
| -    "      output_extension = \"so.6\"\n" | 
| -    "    }\n" | 
| -    "    ...\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  # On Windows, generate a \"mysettings.cpl\" control panel applet.\n" | 
| -    "  # Control panel applets are actually special shared libraries.\n" | 
| -    "  if (is_win) {\n" | 
| -    "    shared_library(\"mysettings\") {\n" | 
| -    "      output_extension = \"cpl\"\n" | 
| -    "      ...\n" | 
| -    "    }\n" | 
| -    "  }\n"; | 
| +    R"(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" | 
| +      ... | 
| +    } | 
| +  } | 
| +)"; | 
|  | 
| const char kOutputDir[] = "output_dir"; | 
| const char kOutputDir_HelpShort[] = | 
| "output_dir: [directory] Directory to put output file in."; | 
| const char kOutputDir_Help[] = | 
| -    "output_dir: [directory] Directory to put output file in.\n" | 
| -    "\n" | 
| -    "  For library and executable targets, overrides the directory for the\n" | 
| -    "  final output. This must be in the root_build_dir or a child thereof.\n" | 
| -    "\n" | 
| -    "  This should generally be in the root_out_dir or a subdirectory thereof\n" | 
| -    "  (the root_out_dir will be the same as the root_build_dir for the\n" | 
| -    "  default toolchain, and will be a subdirectory for other toolchains).\n" | 
| -    "  Not putting the output in a subdirectory of root_out_dir can result\n" | 
| -    "  in collisions between different toolchains, so you will need to take\n" | 
| -    "  steps to ensure that your target is only present in one toolchain.\n" | 
| -    "\n" | 
| -    "  Normally the toolchain specifies the output directory for libraries\n" | 
| -    "  and executables (see \"gn help tool\"). You will have to consult that\n" | 
| -    "  for the default location. The default location will be used if\n" | 
| -    "  output_dir is undefined or empty.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  shared_library(\"doom_melon\") {\n" | 
| -    "    output_dir = \"$root_out_dir/plugin_libs\"\n" | 
| -    "    ...\n" | 
| -    "  }\n"; | 
| +    R"(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" | 
| +    ... | 
| +  } | 
| +)"; | 
|  | 
| const char kOutputName[] = "output_name"; | 
| const char kOutputName_HelpShort[] = | 
| "output_name: [string] Name for the output file other than the default."; | 
| const char kOutputName_Help[] = | 
| -    "output_name: Define a name for the output file other than the default.\n" | 
| -    "\n" | 
| -    "  Normally the output name of a target will be based on the target name,\n" | 
| -    "  so the target \"//foo/bar:bar_unittests\" will generate an output\n" | 
| -    "  file such as \"bar_unittests.exe\" (using Windows as an example).\n" | 
| -    "\n" | 
| -    "  Sometimes you will want an alternate name to avoid collisions or\n" | 
| -    "  if the internal name isn't appropriate for public distribution.\n" | 
| -    "\n" | 
| -    "  The output name should have no extension or prefixes, these will be\n" | 
| -    "  added using the default system rules. For example, on Linux an output\n" | 
| -    "  name of \"foo\" will produce a shared library \"libfoo.so\". There\n" | 
| -    "  is no way to override the output prefix of a linker tool on a per-\n" | 
| -    "  target basis. If you need more flexibility, create a copy target\n" | 
| -    "  to produce the file you want.\n" | 
| -    "\n" | 
| -    "  This variable is valid for all binary output target types.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  static_library(\"doom_melon\") {\n" | 
| -    "    output_name = \"fluffy_bunny\"\n" | 
| -    "  }\n"; | 
| +    R"(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" | 
| +  } | 
| +)"; | 
|  | 
| const char kOutputPrefixOverride[] = "output_prefix_override"; | 
| const char kOutputPrefixOverride_HelpShort[] = | 
| "output_prefix_override: [boolean] Don't use prefix for output name."; | 
| const char kOutputPrefixOverride_Help[] = | 
| -    "output_prefix_override: Don't use prefix for output name.\n" | 
| -    "\n" | 
| -    "  A boolean that overrides the output prefix for a target. Defaults to\n" | 
| -    "  false.\n" | 
| -    "\n" | 
| -    "  Some systems use prefixes for the names of the final target output\n" | 
| -    "  file. The normal example is \"libfoo.so\" on Linux for a target\n" | 
| -    "  named \"foo\".\n" | 
| -    "\n" | 
| -    "  The output prefix for a given target type is specified on the linker\n" | 
| -    "  tool (see \"gn help tool\"). Sometimes this prefix is undesired.\n" | 
| -    "\n" | 
| -    "  See also \"gn help output_extension\".\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  shared_library(\"doom_melon\") {\n" | 
| -    "    # Normally this will produce \"libdoom_melon.so\" on Linux, setting\n" | 
| -    "    # Setting this flag will produce \"doom_melon.so\".\n" | 
| -    "    output_prefix_override = true\n" | 
| -    "    ...\n" | 
| -    "  }\n"; | 
| +    R"(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 this flag | 
| +    # will produce "doom_melon.so". | 
| +    output_prefix_override = true | 
| +    ... | 
| +  } | 
| +)"; | 
|  | 
| const char kOutputs[] = "outputs"; | 
| const char kOutputs_HelpShort[] = | 
| "outputs: [file list] Output files for actions and copy targets."; | 
| const char kOutputs_Help[] = | 
| -    "outputs: Output files for actions and copy targets.\n" | 
| -    "\n" | 
| -    "  Outputs is valid for \"copy\", \"action\", and \"action_foreach\"\n" | 
| -    "  target types and indicates the resulting files. Outputs must always\n" | 
| -    "  refer to files in the build directory.\n" | 
| -    "\n" | 
| -    "  copy\n" | 
| -    "    Copy targets should have exactly one entry in the outputs list. If\n" | 
| -    "    there is exactly one source, this can be a literal file name or a\n" | 
| -    "    source expansion. If there is more than one source, this must\n" | 
| -    "    contain a source expansion to map a single input name to a single\n" | 
| -    "    output name. See \"gn help copy\".\n" | 
| -    "\n" | 
| -    "  action_foreach\n" | 
| -    "    Action_foreach targets must always use source expansions to map\n" | 
| -    "    input files to output files. There can be more than one output,\n" | 
| -    "    which means that each invocation of the script will produce a set of\n" | 
| -    "    files (presumably based on the name of the input file). See\n" | 
| -    "    \"gn help action_foreach\".\n" | 
| -    "\n" | 
| -    "  action\n" | 
| -    "    Action targets (excluding action_foreach) must list literal output\n" | 
| -    "    file(s) with no source expansions. See \"gn help action\".\n"; | 
| +    R"(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". | 
| +)"; | 
|  | 
| const char kPrecompiledHeader[] = "precompiled_header"; | 
| const char kPrecompiledHeader_HelpShort[] = | 
| "precompiled_header: [string] Header file to precompile."; | 
| const char kPrecompiledHeader_Help[] = | 
| -    "precompiled_header: [string] Header file to precompile.\n" | 
| -    "\n" | 
| -    "  Precompiled headers will be used when a target specifies this\n" | 
| -    "  value, or a config applying to this target specifies this value.\n" | 
| -    "  In addition, the tool corresponding to the source files must also\n" | 
| -    "  specify precompiled headers (see \"gn help tool\"). The tool\n" | 
| -    "  will also specify what type of precompiled headers to use.\n" | 
| -    "\n" | 
| -    "  The precompiled header/source variables can be specified on a target\n" | 
| -    "  or a config, but must be the same for all configs applying to a given\n" | 
| -    "  target since a target can only have one precompiled header.\n" | 
| -    "\n" | 
| -    "MSVC precompiled headers\n" | 
| -    "\n" | 
| -    "  When using MSVC-style precompiled headers, the \"precompiled_header\"\n" | 
| -    "  value is a string corresponding to the header. This is NOT a path\n" | 
| -    "  to a file that GN recognises, but rather the exact string that appears\n" | 
| -    "  in quotes after an #include line in source code. The compiler will\n" | 
| -    "  match this string against includes or forced includes (/FI).\n" | 
| -    "\n" | 
| -    "  MSVC also requires a source file to compile the header with. This must\n" | 
| -    "  be specified by the \"precompiled_source\" value. In contrast to the\n" | 
| -    "  header value, this IS a GN-style file name, and tells GN which source\n" | 
| -    "  file to compile to make the .pch file used for subsequent compiles.\n" | 
| -    "\n" | 
| -    "  If you use both C and C++ sources, the precompiled header and source\n" | 
| -    "  file will be compiled using both tools. You will want to make sure\n" | 
| -    "  to wrap C++ includes in __cplusplus #ifdefs so the file will compile\n" | 
| -    "  in C mode.\n" | 
| -    "\n" | 
| -    "  For example, if the toolchain specifies MSVC headers:\n" | 
| -    "\n" | 
| -    "    toolchain(\"vc_x64\") {\n" | 
| -    "      ...\n" | 
| -    "      tool(\"cxx\") {\n" | 
| -    "        precompiled_header_type = \"msvc\"\n" | 
| -    "        ...\n" | 
| -    "\n" | 
| -    "  You might make a config like this:\n" | 
| -    "\n" | 
| -    "    config(\"use_precompiled_headers\") {\n" | 
| -    "      precompiled_header = \"build/precompile.h\"\n" | 
| -    "      precompiled_source = \"//build/precompile.cc\"\n" | 
| -    "\n" | 
| -    "      # Either your source files should #include \"build/precompile.h\"\n" | 
| -    "      # first, or you can do this to force-include the header.\n" | 
| -    "      cflags = [ \"/FI$precompiled_header\" ]\n" | 
| -    "    }\n" | 
| -    "\n" | 
| -    "  And then define a target that uses the config:\n" | 
| -    "\n" | 
| -    "    executable(\"doom_melon\") {\n" | 
| -    "      configs += [ \":use_precompiled_headers\" ]\n" | 
| -    "      ...\n" | 
| -    "\n"; | 
| +    R"(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" ] | 
| +      ... | 
| +)"; | 
|  | 
| const char kPrecompiledSource[] = "precompiled_source"; | 
| const char kPrecompiledSource_HelpShort[] = | 
| "precompiled_source: [file name] Source file to precompile."; | 
| const char kPrecompiledSource_Help[] = | 
| -    "precompiled_source: [file name] Source file to precompile.\n" | 
| -    "\n" | 
| -    "  The source file that goes along with the precompiled_header when\n" | 
| -    "  using \"msvc\"-style precompiled headers. It will be implicitly added\n" | 
| -    "  to the sources of the target. See \"gn help precompiled_header\".\n"; | 
| +    R"(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". | 
| +)"; | 
|  | 
| const char kProductType[] = "product_type"; | 
| const char kProductType_HelpShort[] = | 
| "product_type: [string] Product type for Xcode projects."; | 
| const char kProductType_Help[] = | 
| -    "product_type: Product type for Xcode projects.\n" | 
| -    "\n" | 
| -    "  Correspond to the type of the product of a create_bundle target. Only\n" | 
| -    "  meaningful to Xcode (used as part of the Xcode project generation).\n" | 
| -    "\n" | 
| -    "  When generating Xcode project files, only create_bundle target with\n" | 
| -    "  a non-empty product_type will have a corresponding target in Xcode\n" | 
| -    "  project.\n"; | 
| +    R"(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. | 
| +)"; | 
|  | 
| const char kPublic[] = "public"; | 
| const char kPublic_HelpShort[] = | 
| "public: [file list] Declare public header files for a target."; | 
| const char kPublic_Help[] = | 
| -    "public: Declare public header files for a target.\n" | 
| -    "\n" | 
| -    "  A list of files that other targets can include. These permissions are\n" | 
| -    "  checked via the \"check\" command (see \"gn help check\").\n" | 
| -    "\n" | 
| -    "  If no public files are declared, other targets (assuming they have\n" | 
| -    "  visibility to depend on this target can include any file in the\n" | 
| -    "  sources list. If this variable is defined on a target, dependent\n" | 
| -    "  targets may only include files on this whitelist.\n" | 
| -    "\n" | 
| -    "  Header file permissions are also subject to visibility. A target\n" | 
| -    "  must be visible to another target to include any files from it at all\n" | 
| -    "  and the public headers indicate which subset of those files are\n" | 
| -    "  permitted. See \"gn help visibility\" for more.\n" | 
| -    "\n" | 
| -    "  Public files are inherited through the dependency tree. So if there is\n" | 
| -    "  a dependency A -> B -> C, then A can include C's public headers.\n" | 
| -    "  However, the same is NOT true of visibility, so unless A is in C's\n" | 
| -    "  visibility list, the include will be rejected.\n" | 
| -    "\n" | 
| -    "  GN only knows about files declared in the \"sources\" and \"public\"\n" | 
| -    "  sections of targets. If a file is included that is not known to the\n" | 
| -    "  build, it will be allowed.\n" | 
| -    "\n" | 
| -    "Examples\n" | 
| -    "\n" | 
| -    "  These exact files are public:\n" | 
| -    "    public = [ \"foo.h\", \"bar.h\" ]\n" | 
| -    "\n" | 
| -    "  No files are public (no targets may include headers from this one):\n" | 
| -    "    public = []\n"; | 
| +    R"(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 = [] | 
| +)"; | 
|  | 
| const char kPublicConfigs[] = "public_configs"; | 
| const char kPublicConfigs_HelpShort[] = | 
| "public_configs: [label list] Configs applied to dependents."; | 
| const char kPublicConfigs_Help[] = | 
| -    "public_configs: Configs to be applied on dependents.\n" | 
| -    "\n" | 
| -    "  A list of config labels.\n" | 
| -    "\n" | 
| -    "  Targets directly depending on this one will have the configs listed in\n" | 
| -    "  this variable added to them. These configs will also apply to the\n" | 
| -    "  current target.\n" | 
| -    "\n" | 
| -    "  This addition happens in a second phase once a target and all of its\n" | 
| -    "  dependencies have been resolved. Therefore, a target will not see\n" | 
| -    "  these force-added configs in their \"configs\" variable while the\n" | 
| -    "  script is running, and then can not be removed. As a result, this\n" | 
| -    "  capability should generally only be used to add defines and include\n" | 
| -    "  directories necessary to compile a target's headers.\n" | 
| -    "\n" | 
| -    "  See also \"all_dependent_configs\".\n" | 
| +    R"(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". | 
| +)" | 
| COMMON_ORDERING_HELP; | 
|  | 
| const char kPublicDeps[] = "public_deps"; | 
| const char kPublicDeps_HelpShort[] = | 
| "public_deps: [label list] Declare public dependencies."; | 
| const char kPublicDeps_Help[] = | 
| -    "public_deps: Declare public dependencies.\n" | 
| -    "\n" | 
| -    "  Public dependencies are like private dependencies (see\n" | 
| -    "  \"gn help deps\") but additionally express that the current target\n" | 
| -    "  exposes the listed deps as part of its public API.\n" | 
| -    "\n" | 
| -    "  This has several ramifications:\n" | 
| -    "\n" | 
| -    "    - public_configs that are part of the dependency are forwarded\n" | 
| -    "      to direct dependents.\n" | 
| -    "\n" | 
| -    "    - Public headers in the dependency are usable by dependents\n" | 
| -    "      (includes do not require a direct dependency or visibility).\n" | 
| -    "\n" | 
| -    "    - If the current target is a shared library, other shared libraries\n" | 
| -    "      that it publicly depends on (directly or indirectly) are\n" | 
| -    "      propagated up the dependency tree to dependents for linking.\n" | 
| -    "\n" | 
| -    "Discussion\n" | 
| -    "\n" | 
| -    "  Say you have three targets: A -> B -> C. C's visibility may allow\n" | 
| -    "  B to depend on it but not A. Normally, this would prevent A from\n" | 
| -    "  including any headers from C, and C's public_configs would apply\n" | 
| -    "  only to B.\n" | 
| -    "\n" | 
| -    "  If B lists C in its public_deps instead of regular deps, A will now\n" | 
| -    "  inherit C's public_configs and the ability to include C's public\n" | 
| -    "  headers.\n" | 
| -    "\n" | 
| -    "  Generally if you are writing a target B and you include C's headers\n" | 
| -    "  as part of B's public headers, or targets depending on B should\n" | 
| -    "  consider B and C to be part of a unit, you should use public_deps\n" | 
| -    "  instead of deps.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  # This target can include files from \"c\" but not from\n" | 
| -    "  # \"super_secret_implementation_details\".\n" | 
| -    "  executable(\"a\") {\n" | 
| -    "    deps = [ \":b\" ]\n" | 
| -    "  }\n" | 
| -    "\n" | 
| -    "  shared_library(\"b\") {\n" | 
| -    "    deps = [ \":super_secret_implementation_details\" ]\n" | 
| -    "    public_deps = [ \":c\" ]\n" | 
| -    "  }\n"; | 
| +    R"(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" ] | 
| +  } | 
| +)"; | 
|  | 
| const char kResponseFileContents[] = "response_file_contents"; | 
| const char kResponseFileContents_HelpShort[] = | 
| "response_file_contents: [string list] Contents of .rsp file for actions."; | 
| const char kResponseFileContents_Help[] = | 
| -    "response_file_contents: Contents of a response file for actions.\n" | 
| -    "\n" | 
| -    "  Sometimes the arguments passed to a script can be too long for the\n" | 
| -    "  system's command-line capabilities. This is especially the case on\n" | 
| -    "  Windows where the maximum command-line length is less than 8K. A\n" | 
| -    "  response file allows you to pass an unlimited amount of data to a\n" | 
| -    "  script in a temporary file for an action or action_foreach target.\n" | 
| -    "\n" | 
| -    "  If the response_file_contents variable is defined and non-empty, the\n" | 
| -    "  list will be treated as script args (including possibly substitution\n" | 
| -    "  patterns) that will be written to a temporary file at build time.\n" | 
| -    "  The name of the temporary file will be substituted for\n" | 
| -    "  \"{{response_file_name}}\" in the script args.\n" | 
| -    "\n" | 
| -    "  The response file contents will always be quoted and escaped\n" | 
| -    "  according to Unix shell rules. To parse the response file, the Python\n" | 
| -    "  script should use \"shlex.split(file_contents)\".\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  action(\"process_lots_of_files\") {\n" | 
| -    "    script = \"process.py\",\n" | 
| -    "    inputs = [ ... huge list of files ... ]\n" | 
| -    "\n" | 
| -    "    # Write all the inputs to a response file for the script. Also,\n" | 
| -    "    # make the paths relative to the script working directory.\n" | 
| -    "    response_file_contents = rebase_path(inputs, root_build_dir)\n" | 
| -    "\n" | 
| -    "    # The script expects the name of the response file in --file-list.\n" | 
| -    "    args = [\n" | 
| -    "      \"--enable-foo\",\n" | 
| -    "      \"--file-list={{response_file_name}}\",\n" | 
| -    "    ]\n" | 
| -    "  }\n"; | 
| +   R"*(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}}", | 
| +    ] | 
| +  } | 
| +)*"; | 
|  | 
| const char kScript[] = "script"; | 
| const char kScript_HelpShort[] = | 
| "script: [file name] Script file for actions."; | 
| const char kScript_Help[] = | 
| -    "script: Script file for actions.\n" | 
| -    "\n" | 
| -    "  An absolute or buildfile-relative file name of a Python script to run\n" | 
| -    "  for a action and action_foreach targets (see \"gn help action\" and\n" | 
| -    "  \"gn help action_foreach\").\n"; | 
| +    R"(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"). | 
| +)"; | 
|  | 
| const char kSources[] = "sources"; | 
| const char kSources_HelpShort[] = | 
| "sources: [file list] Source files for a target."; | 
| const char kSources_Help[] = | 
| -    "sources: Source files for a target\n" | 
| -    "\n" | 
| -    "  A list of files. Non-absolute paths will be resolved relative to the\n" | 
| -    "  current build file.\n" | 
| -    "\n" | 
| -    "Sources for binary targets\n" | 
| -    "\n" | 
| -    "  For binary targets (source sets, executables, and libraries), the\n" | 
| -    "  known file types will be compiled with the associated tools. Unknown\n" | 
| -    "  file types and headers will be skipped. However, you should still\n" | 
| -    "  list all C/C+ header files so GN knows about the existance of those\n" | 
| -    "  files for the purposes of include checking.\n" | 
| -    "\n" | 
| -    "  As a special case, a file ending in \".def\" will be treated as a\n" | 
| -    "  Windows module definition file. It will be appended to the link\n" | 
| -    "  line with a preceeding \"/DEF:\" string. There must be at most one\n" | 
| -    "  .def file in a target and they do not cross dependency boundaries\n" | 
| -    "  (so specifying a .def file in a static library or source set will have\n" | 
| -    "  no effect on the executable or shared library they're linked into).\n" | 
| -    "\n" | 
| -    "Sources for non-binary targets\n" | 
| -    "\n" | 
| -    "  action_foreach\n" | 
| -    "    The sources are the set of files that the script will be executed\n" | 
| -    "    over. The script will run once per file.\n" | 
| -    "\n" | 
| -    "  action\n" | 
| -    "    The sources will be treated the same as inputs. See " | 
| -         "\"gn help inputs\"\n" | 
| -    "    for more information and usage advice.\n" | 
| -    "\n" | 
| -    "  copy\n" | 
| -    "    The source are the source files to copy.\n"; | 
| +    R"(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. | 
| +)"; | 
|  | 
| const char kTestonly[] = "testonly"; | 
| const char kTestonly_HelpShort[] = | 
| "testonly: [boolean] Declares a target must only be used for testing."; | 
| const char kTestonly_Help[] = | 
| -    "testonly: Declares a target must only be used for testing.\n" | 
| -    "\n" | 
| -    "  Boolean. Defaults to false.\n" | 
| -    "\n" | 
| -    "  When a target is marked \"testonly = true\", it must only be depended\n" | 
| -    "  on by other test-only targets. Otherwise, GN will issue an error\n" | 
| -    "  that the depenedency is not allowed.\n" | 
| -    "\n" | 
| -    "  This feature is intended to prevent accidentally shipping test code\n" | 
| -    "  in a final product.\n" | 
| -    "\n" | 
| -    "Example\n" | 
| -    "\n" | 
| -    "  source_set(\"test_support\") {\n" | 
| -    "    testonly = true\n" | 
| -    "    ...\n" | 
| -    "  }\n"; | 
| +    R"(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 | 
| +    ... | 
| +  } | 
| +)"; | 
|  | 
| const char kVisibility[] = "visibility"; | 
| const char kVisibility_HelpShort[] = | 
| "visibility: [label list] A list of labels that can depend on a target."; | 
| const char kVisibility_Help[] = | 
| -    "visibility: A list of labels that can depend on a target.\n" | 
| -    "\n" | 
| -    "  A list of labels and label patterns that define which targets can\n" | 
| -    "  depend on the current one. These permissions are checked via the\n" | 
| -    "  \"check\" command (see \"gn help check\").\n" | 
| -    "\n" | 
| -    "  If visibility is not defined, it defaults to public (\"*\").\n" | 
| -    "\n" | 
| -    "  If visibility is defined, only the targets with labels that match it\n" | 
| -    "  can depend on the current target. The empty list means no targets\n" | 
| -    "  can depend on the current target.\n" | 
| -    "\n" | 
| -    "  Tip: Often you will want the same visibility for all targets in a\n" | 
| -    "  BUILD file. In this case you can just put the definition at the top,\n" | 
| -    "  outside of any target, and the targets will inherit that scope and see\n" | 
| -    "  the definition.\n" | 
| -    "\n" | 
| -    "Patterns\n" | 
| -    "\n" | 
| -    "  See \"gn help label_pattern\" for more details on what types of\n" | 
| -    "  patterns are supported. If a toolchain is specified, only targets\n" | 
| -    "  in that toolchain will be matched. If a toolchain is not specified on\n" | 
| -    "  a pattern, targets in all toolchains will be matched.\n" | 
| -    "\n" | 
| -    "Examples\n" | 
| -    "\n" | 
| -    "  Only targets in the current buildfile (\"private\"):\n" | 
| -    "    visibility = [ \":*\" ]\n" | 
| -    "\n" | 
| -    "  No targets (used for targets that should be leaf nodes):\n" | 
| -    "    visibility = []\n" | 
| -    "\n" | 
| -    "  Any target (\"public\", the default):\n" | 
| -    "    visibility = [ \"*\" ]\n" | 
| -    "\n" | 
| -    "  All targets in the current directory and any subdirectory:\n" | 
| -    "    visibility = [ \"./*\" ]\n" | 
| -    "\n" | 
| -    "  Any target in \"//bar/BUILD.gn\":\n" | 
| -    "    visibility = [ \"//bar:*\" ]\n" | 
| -    "\n" | 
| -    "  Any target in \"//bar/\" or any subdirectory thereof:\n" | 
| -    "    visibility = [ \"//bar/*\" ]\n" | 
| -    "\n" | 
| -    "  Just these specific targets:\n" | 
| -    "    visibility = [ \":mything\", \"//foo:something_else\" ]\n" | 
| -    "\n" | 
| -    "  Any target in the current directory and any subdirectory thereof, plus\n" | 
| -    "  any targets in \"//bar/\" and any subdirectory thereof.\n" | 
| -    "    visibility = [ \"./*\", \"//bar/*\" ]\n"; | 
| +    R"(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/*" ] | 
| +)"; | 
|  | 
| const char kWriteRuntimeDeps[] = "write_runtime_deps"; | 
| const char kWriteRuntimeDeps_HelpShort[] = | 
| "write_runtime_deps: Writes the target's runtime_deps to the given path."; | 
| const char kWriteRuntimeDeps_Help[] = | 
| -    "write_runtime_deps: Writes the target's runtime_deps to the given path.\n" | 
| -    "\n" | 
| -    "  Does not synchronously write the file, but rather schedules it\n" | 
| -    "  to be written at the end of generation.\n" | 
| -    "\n" | 
| -    "  If the file exists and the contents are identical to that being\n" | 
| -    "  written, the file will not be updated. This will prevent unnecessary\n" | 
| -    "  rebuilds of targets that depend on this file.\n" | 
| -    "\n" | 
| -    "  Path must be within the output directory.\n" | 
| -    "\n" | 
| -    "  See \"gn help runtime_deps\" for how the runtime dependencies are\n" | 
| -    "  computed.\n" | 
| -    "\n" | 
| -    "  The format of this file will list one file per line with no escaping.\n" | 
| -    "  The files will be relative to the root_build_dir. The first line of\n" | 
| -    "  the file will be the main output file of the target itself. The file\n" | 
| -    "  contents will be the same as requesting the runtime deps be written on\n" | 
| -    "  the command line (see \"gn help --runtime-deps-list-file\").\n"; | 
| +    R"(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"). | 
| +)"; | 
|  | 
| // ----------------------------------------------------------------------------- | 
|  | 
|  |