1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "tools/gn/variables.h"
6
7namespace variables {
8
9// Built-in variables ----------------------------------------------------------
10
11const char kCpuArch[] = "cpu_arch";
12const char kCpuArch_HelpShort[] =
13    "cpu_arch: [string] Current processor architecture.";
14const char kCpuArch_Help[] =
15    "cpu_arch: Current processor architecture.\n"
16    "\n"
17    "  The initial value is based on the current architecture of the host\n"
18    "  system. However, the build configuration can set this to any value.\n"
19    "\n"
20    "  This value is not used internally by GN for any purpose, so you can\n"
21    "  set it to whatever value is relevant to your build.\n"
22    "\n"
23    "Possible initial values set by GN:\n"
24    "  - \"x86\"\n"
25    "  - \"x64\"\n"
26    "  - \"arm\"\n"
27    "  - \"mipsel\"\n";
28
29const char kCurrentToolchain[] = "current_toolchain";
30const char kCurrentToolchain_HelpShort[] =
31    "current_toolchain: [string] Label of the current toolchain.";
32const char kCurrentToolchain_Help[] =
33    "current_toolchain: Label of the current toolchain.\n"
34    "\n"
35    "  A fully-qualified label representing the current toolchain. You can\n"
36    "  use this to make toolchain-related decisions in the build. See also\n"
37    "  \"default_toolchain\".\n"
38    "\n"
39    "Example:\n"
40    "\n"
41    "  if (current_toolchain == \"//build:64_bit_toolchain\") {\n"
42    "    executable(\"output_thats_64_bit_only\") {\n"
43    "      ...\n";
44
45const char kBuildCpuArch[] = "build_cpu_arch";
46const char kBuildCpuArch_HelpShort[] =
47    "build_cpu_arch: [string] The default value for the \"cpu_arch\" "
48    "variable.";
49const char kBuildCpuArch_Help[] =
50    "build_cpu_arch: The default value for the \"cpu_arch\" variable.\n"
51    "\n"
52    "  This value has the same definition as \"cpu_arch\" (see\n"
53    "  \"gn help cpu_arch\") but should be treated as read-only. This is so\n"
54    "  the build can override the \"cpu_arch\" variable for doing\n"
55    "  cross-compiles, but can still access the host build system's CPU\n"
56    "  architecture.\n";
57
58const char kBuildOs[] = "build_os";
59const char kBuildOs_HelpShort[] =
60    "build_os: [string] The default value for the \"os\" variable.";
61const char kBuildOs_Help[] =
62    "build_os: [string] The default value for the \"os\" variable.\n"
63    "\n"
64    "  This value has the same definition as \"os\" (see \"gn help os\") but\n"
65    "  should be treated as read-only. This is so the build can override\n"
66    "  the \"os\" variable for doing cross-compiles, but can still access\n"
67    "  the host build system's operating system type.\n";
68
69const char kDefaultToolchain[] = "default_toolchain";
70const char kDefaultToolchain_HelpShort[] =
71    "default_toolchain: [string] Label of the default toolchain.";
72const char kDefaultToolchain_Help[] =
73    "default_toolchain: [string] Label of the default toolchain.\n"
74    "\n"
75    "  A fully-qualified label representing the default toolchain, which may\n"
76    "  not necessarily be the current one (see \"current_toolchain\").\n";
77
78const char kOs[] = "os";
79const char kOs_HelpShort[] =
80    "os: [string] Indicates the operating system of the current build.";
81const char kOs_Help[] =
82    "os: Indicates the operating system of the current build."
83    "\n"
84    "  This value is set by default based on the current host operating\n"
85    "  system. The build configuration can override the value to anything\n"
86    "  it wants, or it can be set via the build arguments on the command\n"
87    "  line.\n"
88    "\n"
89    "  If you want to know the default value without any overrides, you can\n"
90    "  use \"default_os\" (see \"gn help default_os\").\n"
91    "\n"
92    "  Note that this returns the most specific value. So even though\n"
93    "  Android and ChromeOS are both Linux, the more specific value will\n"
94    "  be returned.\n"
95    "\n"
96    "Some possible values:\n"
97    "  - \"amiga\"\n"
98    "  - \"android\"\n"
99    "  - \"chromeos\"\n"
100    "  - \"ios\"\n"
101    "  - \"linux\"\n"
102    "  - \"mac\"\n"
103    "  - \"win\"\n";
104
105const char kPythonPath[] = "python_path";
106const char kPythonPath_HelpShort[] =
107    "python_path: [string] Absolute path of Python.";
108const char kPythonPath_Help[] =
109    "python_path: Absolute path of Python.\n"
110    "\n"
111    "  Normally used in toolchain definitions if running some command\n"
112    "  requires Python. You will normally not need this when invoking scripts\n"
113    "  since GN automatically finds it for you.\n";
114
115const char kRootBuildDir[] = "root_build_dir";
116const char kRootBuildDir_HelpShort[] =
117  "root_build_dir: [string] Directory where build commands are run.";
118const char kRootBuildDir_Help[] =
119  "root_build_dir: [string] Directory where build commands are run.\n"
120  "\n"
121  "  This is the root build output directory which will be the current\n"
122  "  directory when executing all compilers and scripts.\n"
123  "\n"
124  "  Most often this is used with rebase_path (see \"gn help rebase_path\")\n"
125  "  to convert arguments to be relative to a script's current directory.\n";
126
127const char kRootGenDir[] = "root_gen_dir";
128const char kRootGenDir_HelpShort[] =
129    "root_gen_dir: [string] Directory for the toolchain's generated files.";
130const char kRootGenDir_Help[] =
131    "root_gen_dir: Directory for the toolchain's generated files.\n"
132    "\n"
133    "  Absolute path to the root of the generated output directory tree for\n"
134    "  the current toolchain. An example value might be \"//out/Debug/gen\".\n"
135    "  It will not have a trailing slash.\n"
136    "\n"
137    "  This is primarily useful for setting up include paths for generated\n"
138    "  files. If you are passing this to a script, you will want to pass it\n"
139    "  through rebase_path() (see \"gn help rebase_path\") to convert it\n"
140    "  to be relative to the build directory.\n"
141    "\n"
142    "  See also \"target_gen_dir\" which is usually a better location for\n"
143    "  generated files. It will be inside the root generated dir.\n";
144
145const char kRootOutDir[] = "root_out_dir";
146const char kRootOutDir_HelpShort[] =
147    "root_out_dir: [string] Root directory for toolchain output files.";
148const char kRootOutDir_Help[] =
149    "root_out_dir: [string] Root directory for toolchain output files.\n"
150    "\n"
151    "  Absolute path to the root of the output directory tree for the current\n"
152    "  toolchain. An example value might be \"//out/Debug/gen\". It will not\n"
153    "  have a trailing slash.\n"
154    "\n"
155    "  This is primarily useful for setting up script calls. If you are\n"
156    "  passing this to a script, you will want to pass it through\n"
157    "  rebase_path() (see \"gn help rebase_path\") to convert it\n"
158    "  to be relative to the build directory.\n"
159    "\n"
160    "  See also \"target_out_dir\" which is usually a better location for\n"
161    "  output files. It will be inside the root output dir.\n"
162    "\n"
163    "Example:\n"
164    "\n"
165    "  action(\"myscript\") {\n"
166    "    # Pass the output dir to the script.\n"
167    "    args = [ \"-o\", rebase_path(root_out_dir, root_build_dir) ]\n"
168    "  }\n";
169
170const char kTargetGenDir[] = "target_gen_dir";
171const char kTargetGenDir_HelpShort[] =
172    "target_gen_dir: [string] Directory for a target's generated files.";
173const char kTargetGenDir_Help[] =
174    "target_gen_dir: Directory for a target's generated files.\n"
175    "\n"
176    "  Absolute path to the target's generated file directory. If your\n"
177    "  current target is in \"//tools/doom_melon\" then this value might be\n"
178    "  \"//out/Debug/gen/tools/doom_melon\". It will not have a trailing\n"
179    "  slash.\n"
180    "\n"
181    "  This is primarily useful for setting up include paths for generated\n"
182    "  files. If you are passing this to a script, you will want to pass it\n"
183    "  through rebase_path() (see \"gn help rebase_path\") to convert it\n"
184    "  to be relative to the build directory.\n"
185    "\n"
186    "  See also \"gn help root_gen_dir\".\n"
187    "\n"
188    "Example:\n"
189    "\n"
190    "  action(\"myscript\") {\n"
191    "    # Pass the generated output dir to the script.\n"
192    "    args = [ \"-o\", rebase_path(target_gen_dir, root_build_dir) ]"
193    "\n"
194    "  }\n";
195
196const char kTargetOutDir[] = "target_out_dir";
197const char kTargetOutDir_HelpShort[] =
198    "target_out_dir: [string] Directory for target output files.";
199const char kTargetOutDir_Help[] =
200    "target_out_dir: [string] Directory for target output files.\n"
201    "\n"
202    "  Absolute path to the target's generated file directory. If your\n"
203    "  current target is in \"//tools/doom_melon\" then this value might be\n"
204    "  \"//out/Debug/obj/tools/doom_melon\". It will not have a trailing\n"
205    "  slash.\n"
206    "\n"
207    "  This is primarily useful for setting up arguments for calling\n"
208    "  scripts. If you are passing this to a script, you will want to pass it\n"
209    "  through rebase_path() (see \"gn help rebase_path\") to convert it\n"
210    "  to be relative to the build directory.\n"
211    "\n"
212    "  See also \"gn help root_out_dir\".\n"
213    "\n"
214    "Example:\n"
215    "\n"
216    "  action(\"myscript\") {\n"
217    "    # Pass the output dir to the script.\n"
218    "    args = [ \"-o\", rebase_path(target_out_dir, root_build_dir) ]"
219    "\n"
220    "  }\n";
221
222// Target variables ------------------------------------------------------------
223
224#define COMMON_ORDERING_HELP \
225    "\n" \
226    "Ordering of flags and values:\n" \
227    "\n" \
228    "  1. Those set on the current target (not in a config).\n" \
229    "  2. Those set on the \"configs\" on the target in order that the\n" \
230    "     configs appear in the list.\n" \
231    "  3. Those set on the \"all_dependent_configs\" on the target in order\n" \
232    "     that the configs appear in the list.\n" \
233    "  4. Those set on the \"public_configs\" on the target in order that\n" \
234    "     those configs appear in the list.\n" \
235    "  5. all_dependent_configs pulled from dependencies, in the order of\n" \
236    "     the \"deps\" list. This is done recursively. If a config appears\n" \
237    "     more than once, only the first occurance will be used.\n" \
238    "  6. public_configs pulled from dependencies, in the order of the\n" \
239    "     \"deps\" list. If a dependency has " \
240              "\"forward_dependent_configs_from\",\n" \
241    "     or are public dependencies, they will be applied recursively.\n"
242
243const char kAllDependentConfigs[] = "all_dependent_configs";
244const char kAllDependentConfigs_HelpShort[] =
245    "all_dependent_configs: [label list] Configs to be forced on dependents.";
246const char kAllDependentConfigs_Help[] =
247    "all_dependent_configs: Configs to be forced on dependents.\n"
248    "\n"
249    "  A list of config labels.\n"
250    "\n"
251    "  All targets depending on this one, and recursively, all targets\n"
252    "  depending on those, will have the configs listed in this variable\n"
253    "  added to them. These configs will also apply to the current target.\n"
254    "\n"
255    "  This addition happens in a second phase once a target and all of its\n"
256    "  dependencies have been resolved. Therefore, a target will not see\n"
257    "  these force-added configs in their \"configs\" variable while the\n"
258    "  script is running, and then can not be removed. As a result, this\n"
259    "  capability should generally only be used to add defines and include\n"
260    "  directories necessary to compile a target's headers.\n"
261    "\n"
262    "  See also \"public_configs\".\n"
263    COMMON_ORDERING_HELP;
264
265const char kAllowCircularIncludesFrom[] = "allow_circular_includes_from";
266const char kAllowCircularIncludesFrom_HelpShort[] =
267    "allow_circular_includes_from: [label list] Permit includes from deps.";
268const char kAllowCircularIncludesFrom_Help[] =
269    "allow_circular_includes_from: Permit includes from deps.\n"
270    "\n"
271    "  A list of target labels. Must be a subset of the target's \"deps\".\n"
272    "  These targets will be permitted to include headers from the current\n"
273    "  target despite the dependency going in the opposite direction.\n"
274    "\n"
275    "Tedious exposition\n"
276    "\n"
277    "  Normally, for a file in target A to include a file from target B,\n"
278    "  A must list B as a dependency. This invariant is enforced by the\n"
279    "  \"gn check\" command (and the --check flag to \"gn gen\").\n"
280    "\n"
281    "  Sometimes, two targets might be the same unit for linking purposes\n"
282    "  (two source sets or static libraries that would always be linked\n"
283    "  together in a final executable or shared library). In this case,\n"
284    "  you want A to be able to include B's headers, and B to include A's\n"
285    "  headers.\n"
286    "\n"
287    "  This list, if specified, lists which of the dependencies of the\n"
288    "  current target can include header files from the current target.\n"
289    "  That is, if A depends on B, B can only include headers from A if it is\n"
290    "  in A's allow_circular_includes_from list.\n"
291    "\n"
292    "Example\n"
293    "\n"
294    "  source_set(\"a\") {\n"
295    "    deps = [ \":b\", \":c\" ]\n"
296    "    allow_circular_includes_from = [ \":b\" ]\n"
297    "    ...\n"
298    "  }\n";
299
300const char kArgs[] = "args";
301const char kArgs_HelpShort[] =
302    "args: [string list] Arguments passed to an action.";
303const char kArgs_Help[] =
304    "args: Arguments passed to an action.\n"
305    "\n"
306    "  For action and action_foreach targets, args is the list of arguments\n"
307    "  to pass to the script. Typically you would use source expansion (see\n"
308    "  \"gn help source_expansion\") to insert the source file names.\n"
309    "\n"
310    "  See also \"gn help action\" and \"gn help action_foreach\".\n";
311
312const char kCflags[] = "cflags";
313const char kCflags_HelpShort[] =
314    "cflags: [string list] Flags passed to all C compiler variants.";
315const char kCommonCflagsHelp[] =
316    "cflags*: Flags passed to the C compiler.\n"
317    "\n"
318    "  A list of strings.\n"
319    "\n"
320    "  \"cflags\" are passed to all invocations of the C, C++, Objective C,\n"
321    "  and Objective C++ compilers.\n"
322    "\n"
323    "  To target one of these variants individually, use \"cflags_c\",\n"
324    "  \"cflags_cc\", \"cflags_objc\", and \"cflags_objcc\", respectively.\n"
325    "  These variant-specific versions will be appended to the \"cflags\".\n"
326    COMMON_ORDERING_HELP;
327const char* kCflags_Help = kCommonCflagsHelp;
328
329const char kCflagsC[] = "cflags_c";
330const char kCflagsC_HelpShort[] =
331    "cflags_c: [string list] Flags passed to the C compiler.";
332const char* kCflagsC_Help = kCommonCflagsHelp;
333
334const char kCflagsCC[] = "cflags_cc";
335const char kCflagsCC_HelpShort[] =
336    "cflags_cc: [string list] Flags passed to the C++ compiler.";
337const char* kCflagsCC_Help = kCommonCflagsHelp;
338
339const char kCflagsObjC[] = "cflags_objc";
340const char kCflagsObjC_HelpShort[] =
341    "cflags_objc: [string list] Flags passed to the Objective C compiler.";
342const char* kCflagsObjC_Help = kCommonCflagsHelp;
343
344const char kCflagsObjCC[] = "cflags_objcc";
345const char kCflagsObjCC_HelpShort[] =
346    "cflags_objcc: [string list] Flags passed to the Objective C++ compiler.";
347const char* kCflagsObjCC_Help = kCommonCflagsHelp;
348
349const char kCheckIncludes[] = "check_includes";
350const char kCheckIncludes_HelpShort[] =
351    "check_includes: [boolean] Controls whether a target's files are checked.";
352const char kCheckIncludes_Help[] =
353    "check_includes: [boolean] Controls whether a target's files are checked.\n"
354    "\n"
355    "  When true (the default), the \"gn check\" command (as well as\n"
356    "  \"gn gen\" with the --check flag) will check this target's sources\n"
357    "  and headers for proper dependencies.\n"
358    "\n"
359    "  When false, the files in this target will be skipped by default.\n"
360    "  This does not affect other targets that depend on the current target,\n"
361    "  it just skips checking the includes of the current target's files.\n"
362    "\n"
363    "Example\n"
364    "\n"
365    "  source_set(\"busted_includes\") {\n"
366    "    # This target's includes are messed up, exclude it from checking.\n"
367    "    check_includes = false\n"
368    "    ...\n"
369    "  }\n";
370
371const char kCompleteStaticLib[] = "complete_static_lib";
372const char kCompleteStaticLib_HelpShort[] =
373    "complete_static_lib: [boolean] Links all deps into a static library.";
374const char kCompleteStaticLib_Help[] =
375    "complete_static_lib: [boolean] Links all deps into a static library.\n"
376    "\n"
377    "  A static library normally doesn't include code from dependencies, but\n"
378    "  instead forwards the static libraries and source sets in its deps up\n"
379    "  the dependency chain until a linkable target (an executable or shared\n"
380    "  library) is reached. The final linkable target only links each static\n"
381    "  library once, even if it appears more than once in its dependency\n"
382    "  graph.\n"
383    "\n"
384    "  In some cases the static library might be the final desired output.\n"
385    "  For example, you may be producing a static library for distribution to\n"
386    "  third parties. In this case, the static library should include code\n"
387    "  for all dependencies in one complete package. Since GN does not unpack\n"
388    "  static libraries to forward their contents up the dependency chain,\n"
389    "  it is an error for complete static libraries to depend on other static\n"
390    "  libraries.\n"
391    "\n"
392    "Example\n"
393    "\n"
394    "  static_library(\"foo\") {\n"
395    "    complete_static_lib = true\n"
396    "    deps = [ \"bar\" ]\n"
397    "  }\n";
398
399const char kConfigs[] = "configs";
400const char kConfigs_HelpShort[] =
401    "configs: [label list] Configs applying to this target.";
402const char kConfigs_Help[] =
403    "configs: Configs applying to this target.\n"
404    "\n"
405    "  A list of config labels.\n"
406    "\n"
407    "  The include_dirs, defines, etc. in each config are appended in the\n"
408    "  order they appear to the compile command for each file in the target.\n"
409    "  They will appear after the include_dirs, defines, etc. that the target\n"
410    "  sets directly.\n"
411    "\n"
412    "  The build configuration script will generally set up the default\n"
413    "  configs applying to a given target type (see \"set_defaults\").\n"
414    "  When a target is being defined, it can add to or remove from this\n"
415    "  list.\n"
416    COMMON_ORDERING_HELP
417    "\n"
418    "Example:\n"
419    "  static_library(\"foo\") {\n"
420    "    configs -= \"//build:no_rtti\"  # Don't use the default RTTI config.\n"
421    "    configs += \":mysettings\"      # Add some of our own settings.\n"
422    "  }\n";
423
424const char kData[] = "data";
425const char kData_HelpShort[] =
426    "data: [file list] Runtime data file dependencies.";
427const char kData_Help[] =
428    "data: Runtime data file dependencies.\n"
429    "\n"
430    "  Lists files required to run the given target. These are typically\n"
431    "  data files.\n"
432    "\n"
433    "  Appearing in the \"data\" section does not imply any special handling\n"
434    "  such as copying them to the output directory. This is just used for\n"
435    "  declaring runtime dependencies. There currently isn't a good use for\n"
436    "  these but it is envisioned that test data can be listed here for use\n"
437    "  running automated tests.\n"
438    "\n"
439    "  See also \"gn help inputs\" and \"gn help data_deps\", both of\n"
440    "  which actually affect the build in concrete ways.\n";
441
442const char kDataDeps[] = "data_deps";
443const char kDataDeps_HelpShort[] =
444    "data_deps: [label list] Non-linked dependencies.";
445const char kDataDeps_Help[] =
446    "data_deps: Non-linked dependencies.\n"
447    "\n"
448    "  A list of target labels.\n"
449    "\n"
450    "  Specifies dependencies of a target that are not actually linked into\n"
451    "  the current target. Such dependencies will built and will be available\n"
452    "  at runtime.\n"
453    "\n"
454    "  This is normally used for things like plugins or helper programs that\n"
455    "  a target needs at runtime.\n"
456    "\n"
457    "  See also \"gn help deps\" and \"gn help data\".\n"
458    "\n"
459    "Example:\n"
460    "  executable(\"foo\") {\n"
461    "    deps = [ \"//base\" ]\n"
462    "    data_deps = [ \"//plugins:my_runtime_plugin\" ]\n"
463    "  }\n";
464
465const char kDefines[] = "defines";
466const char kDefines_HelpShort[] =
467    "defines: [string list] C preprocessor defines.";
468const char kDefines_Help[] =
469    "defines: C preprocessor defines.\n"
470    "\n"
471    "  A list of strings\n"
472    "\n"
473    "  These strings will be passed to the C/C++ compiler as #defines. The\n"
474    "  strings may or may not include an \"=\" to assign a value.\n"
475    COMMON_ORDERING_HELP
476    "\n"
477    "Example:\n"
478    "  defines = [ \"AWESOME_FEATURE\", \"LOG_LEVEL=3\" ]\n";
479
480const char kDepfile[] = "depfile";
481const char kDepfile_HelpShort[] =
482    "depfile: [string] File name for input dependencies for actions.";
483const char kDepfile_Help[] =
484    "depfile: [string] File name for input dependencies for actions.\n"
485    "\n"
486    "  If nonempty, this string specifies that the current action or\n"
487    "  action_foreach target will generate the given \".d\" file containing\n"
488    "  the dependencies of the input. Empty or unset means that the script\n"
489    "  doesn't generate the files.\n"
490    "\n"
491    "  The .d file should go in the target output directory. If you have more\n"
492    "  than one source file that the script is being run over, you can use\n"
493    "  the output file expansions described in \"gn help action_foreach\" to\n"
494    "  name the .d file according to the input."
495    "\n"
496    "  The format is that of a Makefile, and all of the paths should be\n"
497    "  relative to the root build directory.\n"
498    "\n"
499    "Example:\n"
500    "  action_foreach(\"myscript_target\") {\n"
501    "    script = \"myscript.py\"\n"
502    "    sources = [ ... ]\n"
503    "\n"
504    "    # Locate the depfile in the output directory named like the\n"
505    "    # inputs but with a \".d\" appended.\n"
506    "    depfile = \"$relative_target_output_dir/{{source_name}}.d\"\n"
507    "\n"
508    "    # Say our script uses \"-o <d file>\" to indicate the depfile.\n"
509    "    args = [ \"{{source}}\", \"-o\", depfile ]\n"
510    "  }\n";
511
512const char kDeps[] = "deps";
513const char kDeps_HelpShort[] =
514    "deps: [label list] Private linked dependencies.";
515const char kDeps_Help[] =
516    "deps: Private linked dependencies.\n"
517    "\n"
518    "  A list of target labels.\n"
519    "\n"
520    "  Specifies private dependencies of a target. Shared and dynamic\n"
521    "  libraries will be linked into the current target. Other target types\n"
522    "  that can't be linked (like actions and groups) listed in \"deps\" will\n"
523    "  be treated as \"data_deps\". Likewise, if the current target isn't\n"
524    "  linkable, then all deps will be treated as \"data_deps\".\n"
525    "\n"
526    "  These dependencies are private in that it does not grant dependent\n"
527    "  targets the ability to include headers from the dependency, and direct\n"
528    "  dependent configs are not forwarded.\n"
529    "\n"
530    "  See also \"public_deps\" and \"data_deps\".\n";
531
532const char kForwardDependentConfigsFrom[] = "forward_dependent_configs_from";
533const char kForwardDependentConfigsFrom_HelpShort[] =
534    "forward_dependent_configs_from: [label list] Forward dependent's configs.";
535const char kForwardDependentConfigsFrom_Help[] =
536    "forward_dependent_configs_from\n"
537    "\n"
538    "  A list of target labels.\n"
539    "\n"
540    "  Exposes the public_configs from a private dependent target as\n"
541    "  public_configs of the current one. Each label in this list\n"
542    "  must also be in the deps.\n"
543    "\n"
544    "  Generally you should use public_deps instead of this variable to\n"
545    "  express the concept of exposing a dependency as part of a target's\n"
546    "  public API. We're considering removing this variable.\n"
547    "\n"
548    "Discussion\n"
549    "\n"
550    "  Sometimes you depend on a child library that exports some necessary\n"
551    "  configuration via public_configs. If your target in turn exposes the\n"
552    "  child library's headers in its public headers, it might mean that\n"
553    "  targets that depend on you won't work: they'll be seeing the child\n"
554    "  library's code but not the necessary configuration. This list\n"
555    "  specifies which of your deps' direct dependent configs to expose as\n"
556    "  your own.\n"
557    "\n"
558    "Examples\n"
559    "\n"
560    "  If we use a given library \"a\" from our public headers:\n"
561    "\n"
562    "    deps = [ \":a\", \":b\", ... ]\n"
563    "    forward_dependent_configs_from = [ \":a\" ]\n"
564    "\n"
565    "  This example makes a \"transparent\" target that forwards a dependency\n"
566    "  to another:\n"
567    "\n"
568    "    group(\"frob\") {\n"
569    "      if (use_system_frob) {\n"
570    "        deps = \":system_frob\"\n"
571    "      } else {\n"
572    "        deps = \"//third_party/fallback_frob\"\n"
573    "      }\n"
574    "      forward_dependent_configs_from = deps\n"
575    "    }\n";
576
577const char kIncludeDirs[] = "include_dirs";
578const char kIncludeDirs_HelpShort[] =
579    "include_dirs: [directory list] Additional include directories.";
580const char kIncludeDirs_Help[] =
581    "include_dirs: Additional include directories.\n"
582    "\n"
583    "  A list of source directories.\n"
584    "\n"
585    "  The directories in this list will be added to the include path for\n"
586    "  the files in the affected target.\n"
587    COMMON_ORDERING_HELP
588    "\n"
589    "Example:\n"
590    "  include_dirs = [ \"src/include\", \"//third_party/foo\" ]\n";
591
592const char kInputs[] = "inputs";
593const char kInputs_HelpShort[] =
594    "inputs: [file list] Additional compile-time dependencies.";
595const char kInputs_Help[] =
596    "inputs: Additional compile-time dependencies.\n"
597    "\n"
598    "  Inputs are compile-time dependencies of the current target. This means\n"
599    "  that all inputs must be available before compiling any of the sources\n"
600    "  or executing any actions.\n"
601    "\n"
602    "  Inputs are typically only used for action and action_foreach targets.\n"
603    "\n"
604    "Inputs for actions\n"
605    "\n"
606    "  For action and action_foreach targets, inputs should be the inputs to\n"
607    "  script that don't vary. These should be all .py files that the script\n"
608    "  uses via imports (the main script itself will be an implcit dependency\n"
609    "  of the action so need not be listed).\n"
610    "\n"
611    "  For action targets, inputs should be the entire set of inputs the\n"
612    "  script needs. For action_foreach targets, inputs should be the set of\n"
613    "  dependencies that don't change. These will be applied to each script\n"
614    "  invocation over the sources.\n"
615    "\n"
616    "  Note that another way to declare input dependencies from an action\n"
617    "  is to have the action write a depfile (see \"gn help depfile\"). This\n"
618    "  allows the script to dynamically write input dependencies, that might\n"
619    "  not be known until actually executing the script. This is more\n"
620    "  efficient than doing processing while running GN to determine the\n"
621    "  inputs, and is easier to keep in-sync than hardcoding the list.\n"
622    "\n"
623    "Inputs for binary targets\n"
624    "\n"
625    "  Any input dependencies will be resolved before compiling any sources.\n"
626    "  Normally, all actions that a target depends on will be run before any\n"
627    "  files in a target are compiled. So if you depend on generated headers,\n"
628    "  you do not typically need to list them in the inputs section.\n"
629    "\n"
630    "Example\n"
631    "\n"
632    "  action(\"myscript\") {\n"
633    "    script = \"domything.py\"\n"
634    "    inputs = [ \"input.data\" ]\n"
635    "  }\n";
636
637const char kLdflags[] = "ldflags";
638const char kLdflags_HelpShort[] =
639    "ldflags: [string list] Flags passed to the linker.";
640const char kLdflags_Help[] =
641    "ldflags: Flags passed to the linker.\n"
642    "\n"
643    "  A list of strings.\n"
644    "\n"
645    "  These flags are passed on the command-line to the linker and generally\n"
646    "  specify various linking options. Most targets will not need these and\n"
647    "  will use \"libs\" and \"lib_dirs\" instead.\n"
648    "\n"
649    "  ldflags are NOT pushed to dependents, so applying ldflags to source\n"
650    "  sets or static libraries will be a no-op. If you want to apply ldflags\n"
651    "  to dependent targets, put them in a config and set it in the\n"
652    "  all_dependent_configs or public_configs.\n";
653
654#define COMMON_LIB_INHERITANCE_HELP \
655    "\n" \
656    "  libs and lib_dirs work differently than other flags in two respects.\n" \
657    "  First, then are inherited across static library boundaries until a\n" \
658    "  shared library or executable target is reached. Second, they are\n" \
659    "  uniquified so each one is only passed once (the first instance of it\n" \
660    "  will be the one used).\n"
661
662const char kLibDirs[] = "lib_dirs";
663const char kLibDirs_HelpShort[] =
664    "lib_dirs: [directory list] Additional library directories.";
665const char kLibDirs_Help[] =
666    "lib_dirs: Additional library directories.\n"
667    "\n"
668    "  A list of directories.\n"
669    "\n"
670    "  Specifies additional directories passed to the linker for searching\n"
671    "  for the required libraries. If an item is not an absolute path, it\n"
672    "  will be treated as being relative to the current build file.\n"
673    COMMON_LIB_INHERITANCE_HELP
674    COMMON_ORDERING_HELP
675    "\n"
676    "Example:\n"
677    "  lib_dirs = [ \"/usr/lib/foo\", \"lib/doom_melon\" ]\n";
678
679const char kLibs[] = "libs";
680const char kLibs_HelpShort[] =
681    "libs: [string list] Additional libraries to link.";
682const char kLibs_Help[] =
683    "libs: Additional libraries to link.\n"
684    "\n"
685    "  A list of strings.\n"
686    "\n"
687    "  These files will be passed to the linker, which will generally search\n"
688    "  the library include path. Unlike a normal list of files, they will be\n"
689    "  passed to the linker unmodified rather than being treated as file\n"
690    "  names relative to the current build file. Generally you would set\n"
691    "  the \"lib_dirs\" so your library is found. If you need to specify\n"
692    "  a path, you can use \"rebase_path\" to convert a path to be relative\n"
693    "  to the build directory.\n"
694    "\n"
695    "  When constructing the linker command, the \"lib_prefix\" attribute of\n"
696    "  the linker tool in the current toolchain will be prepended to each\n"
697    "  library. So your BUILD file should not specify the switch prefix\n"
698    "  (like \"-l\"). On Mac, libraries ending in \".framework\" will be\n"
699    "  special-cased: the switch \"-framework\" will be prepended instead of\n"
700    "  the lib_prefix, and the \".framework\" suffix will be trimmed.\n"
701    COMMON_LIB_INHERITANCE_HELP
702    COMMON_ORDERING_HELP
703    "\n"
704    "Examples:\n"
705    "  On Windows:\n"
706    "    libs = [ \"ctl3d.lib\" ]\n"
707    "  On Linux:\n"
708    "    libs = [ \"ld\" ]\n";
709
710const char kOutputExtension[] = "output_extension";
711const char kOutputExtension_HelpShort[] =
712    "output_extension: [string] Value to use for the output's file extension.";
713const char kOutputExtension_Help[] =
714    "output_extension: Value to use for the output's file extension.\n"
715    "\n"
716    "  Normally the file extension for a target is based on the target\n"
717    "  type and the operating system, but in rare cases you will need to\n"
718    "  override the name (for example to use \"libfreetype.so.6\" instead\n"
719    "  of libfreetype.so on Linux).";
720
721const char kOutputName[] = "output_name";
722const char kOutputName_HelpShort[] =
723    "output_name: [string] Name for the output file other than the default.";
724const char kOutputName_Help[] =
725    "output_name: Define a name for the output file other than the default.\n"
726    "\n"
727    "  Normally the output name of a target will be based on the target name,\n"
728    "  so the target \"//foo/bar:bar_unittests\" will generate an output\n"
729    "  file such as \"bar_unittests.exe\" (using Windows as an example).\n"
730    "\n"
731    "  Sometimes you will want an alternate name to avoid collisions or\n"
732    "  if the internal name isn't appropriate for public distribution.\n"
733    "\n"
734    "  The output name should have no extension or prefixes, these will be\n"
735    "  added using the default system rules. For example, on Linux an output\n"
736    "  name of \"foo\" will produce a shared library \"libfoo.so\".\n"
737    "\n"
738    "  This variable is valid for all binary output target types.\n"
739    "\n"
740    "Example:\n"
741    "  static_library(\"doom_melon\") {\n"
742    "    output_name = \"fluffy_bunny\"\n"
743    "  }\n";
744
745const char kOutputs[] = "outputs";
746const char kOutputs_HelpShort[] =
747    "outputs: [file list] Output files for actions and copy targets.";
748const char kOutputs_Help[] =
749    "outputs: Output files for actions and copy targets.\n"
750    "\n"
751    "  Outputs is valid for \"copy\", \"action\", and \"action_foreach\"\n"
752    "  target types and indicates the resulting files. The values may contain\n"
753    "  source expansions to generate the output names from the sources (see\n"
754    "  \"gn help source_expansion\").\n"
755    "\n"
756    "  For copy targets, the outputs is the destination for the copied\n"
757    "  file(s). For actions, the outputs should be the list of files\n"
758    "  generated by the script.\n";
759
760const char kPublic[] = "public";
761const char kPublic_HelpShort[] =
762    "public: [file list] Declare public header files for a target.";
763const char kPublic_Help[] =
764    "public: Declare public header files for a target.\n"
765    "\n"
766    "  A list of files that other targets can include. These permissions are\n"
767    "  checked via the \"check\" command (see \"gn help check\").\n"
768    "\n"
769    "  If no public files are declared, other targets (assuming they have\n"
770    "  visibility to depend on this target can include any file in the\n"
771    "  sources list. If this variable is defined on a target, dependent\n"
772    "  targets may only include files on this whitelist.\n"
773    "\n"
774    "  Header file permissions are also subject to visibility. A target\n"
775    "  must be visible to another target to include any files from it at all\n"
776    "  and the public headers indicate which subset of those files are\n"
777    "  permitted. See \"gn help visibility\" for more.\n"
778    "\n"
779    "  Public files are inherited through the dependency tree. So if there is\n"
780    "  a dependency A -> B -> C, then A can include C's public headers.\n"
781    "  However, the same is NOT true of visibility, so unless A is in C's\n"
782    "  visibility list, the include will be rejected.\n"
783    "\n"
784    "  GN only knows about files declared in the \"sources\" and \"public\"\n"
785    "  sections of targets. If a file is included that is not known to the\n"
786    "  build, it will be allowed.\n"
787    "\n"
788    "Examples:\n"
789    "  These exact files are public:\n"
790    "    public = [ \"foo.h\", \"bar.h\" ]\n"
791    "\n"
792    "  No files are public (no targets may include headers from this one):\n"
793    "    public = []\n";
794
795const char kPublicConfigs[] = "public_configs";
796const char kPublicConfigs_HelpShort[] =
797    "public_configs: [label list] Configs applied to dependents.";
798const char kPublicConfigs_Help[] =
799    "public_configs: Configs to be applied on dependents.\n"
800    "\n"
801    "  A list of config labels.\n"
802    "\n"
803    "  Targets directly depending on this one will have the configs listed in\n"
804    "  this variable added to them. These configs will also apply to the\n"
805    "  current target.\n"
806    "\n"
807    "  This addition happens in a second phase once a target and all of its\n"
808    "  dependencies have been resolved. Therefore, a target will not see\n"
809    "  these force-added configs in their \"configs\" variable while the\n"
810    "  script is running, and then can not be removed. As a result, this\n"
811    "  capability should generally only be used to add defines and include\n"
812    "  directories necessary to compile a target's headers.\n"
813    "\n"
814    "  See also \"all_dependent_configs\".\n"
815    COMMON_ORDERING_HELP;
816
817const char kPublicDeps[] = "public_deps";
818const char kPublicDeps_HelpShort[] =
819    "public_deps: [label list] Declare public dependencies.";
820const char kPublicDeps_Help[] =
821    "public_deps: Declare public dependencies.\n"
822    "\n"
823    "  Public dependencies are like private dependencies (\"deps\") but\n"
824    "  additionally express that the current target exposes the listed deps\n"
825    "  as part of its public API.\n"
826    "\n"
827    "  This has two ramifications:\n"
828    "\n"
829    "    - public_configs that are part of the dependency are forwarded\n"
830    "      to direct dependents (this is the same as using\n"
831    "      forward_dependent_configs_from).\n"
832    "\n"
833    "    - public headers in the dependency are usable by dependents\n"
834    "      (includes do not require a direct dependency or visibility).\n"
835    "\n"
836    "Discussion\n"
837    "\n"
838    "  Say you have three targets: A -> B -> C. C's visibility may allow\n"
839    "  B to depend on it but not A. Normally, this would prevent A from\n"
840    "  including any headers from C, and C's public_configs would apply\n"
841    "  only to B.\n"
842    "\n"
843    "  If B lists C in its public_deps instead of regular deps, A will now\n"
844    "  inherit C's public_configs and the ability to include C's public\n"
845    "  headers.\n"
846    "\n"
847    "  Generally if you are writing a target B and you include C's headers\n"
848    "  as part of B's public headers, or targets depending on B should\n"
849    "  consider B and C to be part of a unit, you should use public_deps\n"
850    "  instead of deps.\n"
851    "\n"
852    "Example\n"
853    "\n"
854    "  # This target can include files from \"c\" but not from\n"
855    "  # \"super_secret_implementation_details\".\n"
856    "  executable(\"a\") {\n"
857    "    deps = [ \":b\" ]\n"
858    "  }\n"
859    "\n"
860    "  shared_library(\"b\") {\n"
861    "    deps = [ \":super_secret_implementation_details\" ]\n"
862    "    public_deps = [ \":c\" ]\n"
863    "  }\n";
864
865const char kScript[] = "script";
866const char kScript_HelpShort[] =
867    "script: [file name] Script file for actions.";
868const char kScript_Help[] =
869    "script: Script file for actions.\n"
870    "\n"
871    "  An absolute or buildfile-relative file name of a Python script to run\n"
872    "  for a action and action_foreach targets (see \"gn help action\" and\n"
873    "  \"gn help action_foreach\").\n";
874
875const char kSources[] = "sources";
876const char kSources_HelpShort[] =
877    "sources: [file list] Source files for a target.";
878const char kSources_Help[] =
879    "sources: Source files for a target\n"
880    "\n"
881    "  A list of files relative to the current buildfile.\n";
882
883const char kTestonly[] = "testonly";
884const char kTestonly_HelpShort[] =
885    "testonly: [boolean] Declares a target must only be used for testing.";
886const char kTestonly_Help[] =
887    "testonly: Declares a target must only be used for testing.\n"
888    "\n"
889    "  Boolean. Defaults to false.\n"
890    "\n"
891    "  When a target is marked \"testonly = true\", it must only be depended\n"
892    "  on by other test-only targets. Otherwise, GN will issue an error\n"
893    "  that the depenedency is not allowed.\n"
894    "\n"
895    "  This feature is intended to prevent accidentally shipping test code\n"
896    "  in a final product.\n"
897    "\n"
898    "Example\n"
899    "\n"
900    "  source_set(\"test_support\") {\n"
901    "    testonly = true\n"
902    "    ...\n"
903    "  }\n";
904
905const char kVisibility[] = "visibility";
906const char kVisibility_HelpShort[] =
907    "visibility: [label list] A list of labels that can depend on a target.";
908const char kVisibility_Help[] =
909    "visibility: A list of labels that can depend on a target.\n"
910    "\n"
911    "  A list of labels and label patterns that define which targets can\n"
912    "  depend on the current one. These permissions are checked via the\n"
913    "  \"check\" command (see \"gn help check\").\n"
914    "\n"
915    "  If visibility is not defined, it defaults to public (\"*\").\n"
916    "\n"
917    "  If visibility is defined, only the targets with labels that match it\n"
918    "  can depend on the current target. The empty list means no targets\n"
919    "  can depend on the current target.\n"
920    "\n"
921    "  Tip: Often you will want the same visibility for all targets in a\n"
922    "  BUILD file. In this case you can just put the definition at the top,\n"
923    "  outside of any target, and the targets will inherit that scope and see\n"
924    "  the definition.\n"
925    "\n"
926    "Patterns\n"
927    "\n"
928    "  See \"gn help label_pattern\" for more details on what types of\n"
929    "  patterns are supported. If a toolchain is specified, only targets\n"
930    "  in that toolchain will be matched. If a toolchain is not specified on\n"
931    "  a pattern, targets in all toolchains will be matched.\n"
932    "\n"
933    "Examples\n"
934    "\n"
935    "  Only targets in the current buildfile (\"private\", the default):\n"
936    "    visibility = [ \":*\" ]\n"
937    "\n"
938    "  No targets (used for targets that should be leaf nodes):\n"
939    "    visibility = []\n"
940    "\n"
941    "  Any target (\"public\"):\n"
942    "    visibility = [ \"*\" ]\n"
943    "\n"
944    "  All targets in the current directory and any subdirectory:\n"
945    "    visibility = [ \"./*\" ]\n"
946    "\n"
947    "  Any target in \"//bar/BUILD.gn\":\n"
948    "    visibility = [ \"//bar:*\" ]\n"
949    "\n"
950    "  Any target in \"//bar/\" or any subdirectory thereof:\n"
951    "    visibility = [ \"//bar/*\"\n ]"
952    "\n"
953    "  Just these specific targets:\n"
954    "    visibility = [ \":mything\", \"//foo:something_else\" ]\n"
955    "\n"
956    "  Any target in the current directory and any subdirectory thereof, plus\n"
957    "  any targets in \"//bar/\" and any subdirectory thereof.\n"
958    "    visibility = [ \"./*\", \"//bar/*\" ]\n";
959
960// -----------------------------------------------------------------------------
961
962VariableInfo::VariableInfo()
963    : help_short(NULL),
964      help(NULL) {
965}
966
967VariableInfo::VariableInfo(const char* in_help_short, const char* in_help)
968    : help_short(in_help_short),
969      help(in_help) {
970}
971
972#define INSERT_VARIABLE(var) \
973    info_map[k##var] = VariableInfo(k##var##_HelpShort, k##var##_Help);
974
975const VariableInfoMap& GetBuiltinVariables() {
976  static VariableInfoMap info_map;
977  if (info_map.empty()) {
978    INSERT_VARIABLE(BuildCpuArch)
979    INSERT_VARIABLE(BuildOs)
980    INSERT_VARIABLE(CpuArch)
981    INSERT_VARIABLE(CurrentToolchain)
982    INSERT_VARIABLE(DefaultToolchain)
983    INSERT_VARIABLE(Os)
984    INSERT_VARIABLE(PythonPath)
985    INSERT_VARIABLE(RootBuildDir)
986    INSERT_VARIABLE(RootGenDir)
987    INSERT_VARIABLE(RootOutDir)
988    INSERT_VARIABLE(TargetGenDir)
989    INSERT_VARIABLE(TargetOutDir)
990  }
991  return info_map;
992}
993
994const VariableInfoMap& GetTargetVariables() {
995  static VariableInfoMap info_map;
996  if (info_map.empty()) {
997    INSERT_VARIABLE(AllDependentConfigs)
998    INSERT_VARIABLE(AllowCircularIncludesFrom)
999    INSERT_VARIABLE(Args)
1000    INSERT_VARIABLE(Cflags)
1001    INSERT_VARIABLE(CflagsC)
1002    INSERT_VARIABLE(CflagsCC)
1003    INSERT_VARIABLE(CflagsObjC)
1004    INSERT_VARIABLE(CflagsObjCC)
1005    INSERT_VARIABLE(CheckIncludes)
1006    INSERT_VARIABLE(CompleteStaticLib)
1007    INSERT_VARIABLE(Configs)
1008    INSERT_VARIABLE(Data)
1009    INSERT_VARIABLE(DataDeps)
1010    INSERT_VARIABLE(Defines)
1011    INSERT_VARIABLE(Depfile)
1012    INSERT_VARIABLE(Deps)
1013    INSERT_VARIABLE(ForwardDependentConfigsFrom)
1014    INSERT_VARIABLE(IncludeDirs)
1015    INSERT_VARIABLE(Inputs)
1016    INSERT_VARIABLE(Ldflags)
1017    INSERT_VARIABLE(Libs)
1018    INSERT_VARIABLE(LibDirs)
1019    INSERT_VARIABLE(OutputExtension)
1020    INSERT_VARIABLE(OutputName)
1021    INSERT_VARIABLE(Outputs)
1022    INSERT_VARIABLE(Public)
1023    INSERT_VARIABLE(PublicConfigs)
1024    INSERT_VARIABLE(PublicDeps)
1025    INSERT_VARIABLE(Script)
1026    INSERT_VARIABLE(Sources)
1027    INSERT_VARIABLE(Testonly)
1028    INSERT_VARIABLE(Visibility)
1029  }
1030  return info_map;
1031}
1032
1033#undef INSERT_VARIABLE
1034
1035}  // namespace variables
1036