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 "gn/variables.h"
6
7 #include "gn/rust_variables.h"
8 #include "gn/swift_variables.h"
9
10 namespace variables {
11
12 // Built-in variables ----------------------------------------------------------
13
14 const char kGnVersion[] = "gn_version";
15 const char kGnVersion_HelpShort[] = "gn_version: [number] The version of gn.";
16 const char kGnVersion_Help[] =
17 R"(gn_version: [number] The version of gn.
18
19 Corresponds to the number printed by `gn --version`.
20
21 Example
22
23 assert(gn_version >= 1700, "need GN version 1700 for the frobulate feature")
24 )";
25
26 const char kHostCpu[] = "host_cpu";
27 const char kHostCpu_HelpShort[] =
28 "host_cpu: [string] The processor architecture that GN is running on.";
29 const char kHostCpu_Help[] =
30 R"(host_cpu: The processor architecture that GN is running on.
31
32 This is value is exposed so that cross-compile toolchains can access the host
33 architecture when needed.
34
35 The value should generally be considered read-only, but it can be overridden
36 in order to handle unusual cases where there might be multiple plausible
37 values for the host architecture (e.g., if you can do either 32-bit or 64-bit
38 builds). The value is not used internally by GN for any purpose.
39
40 Some possible values
41
42 - "x64"
43 - "x86"
44 )";
45
46 const char kHostOs[] = "host_os";
47 const char kHostOs_HelpShort[] =
48 "host_os: [string] The operating system that GN is running on.";
49 const char kHostOs_Help[] =
50 R"(host_os: [string] The operating system that GN is running on.
51
52 This value is exposed so that cross-compiles can access the host build
53 system's settings.
54
55 This value should generally be treated as read-only. It, however, is not used
56 internally by GN for any purpose.
57
58 Some possible values
59
60 - "linux"
61 - "mac"
62 - "win"
63 )";
64
65 const char kInvoker[] = "invoker";
66 const char kInvoker_HelpShort[] =
67 "invoker: [string] The invoking scope inside a template.";
68 const char kInvoker_Help[] =
69 R"(invoker: [string] The invoking scope inside a template.
70
71 Inside a template invocation, this variable refers to the scope of the
72 invoker of the template. Outside of template invocations, this variable is
73 undefined.
74
75 All of the variables defined inside the template invocation are accessible as
76 members of the "invoker" scope. This is the way that templates read values
77 set by the callers.
78
79 This is often used with "defined" to see if a value is set on the invoking
80 scope.
81
82 See "gn help template" for more examples.
83
84 Example
85
86 template("my_template") {
87 print(invoker.sources) # Prints [ "a.cc", "b.cc" ]
88 print(defined(invoker.foo)) # Prints false.
89 print(defined(invoker.bar)) # Prints true.
90 }
91
92 my_template("doom_melon") {
93 sources = [ "a.cc", "b.cc" ]
94 bar = 123
95 }
96 )";
97
98 const char kTargetCpu[] = "target_cpu";
99 const char kTargetCpu_HelpShort[] =
100 "target_cpu: [string] The desired cpu architecture for the build.";
101 const char kTargetCpu_Help[] =
102 R"(target_cpu: The desired cpu architecture for the build.
103
104 This value should be used to indicate the desired architecture for the
105 primary objects of the build. It will match the cpu architecture of the
106 default toolchain, but not necessarily the current toolchain.
107
108 In many cases, this is the same as "host_cpu", but in the case of
109 cross-compiles, this can be set to something different. This value is
110 different from "current_cpu" in that it does not change based on the current
111 toolchain. When writing rules, "current_cpu" should be used rather than
112 "target_cpu" most of the time.
113
114 This value is not used internally by GN for any purpose, so it may be set to
115 whatever value is needed for the build. GN defaults this value to the empty
116 string ("") and the configuration files should set it to an appropriate value
117 (e.g., setting it to the value of "host_cpu") if it is not overridden on the
118 command line or in the args.gn file.
119
120 Possible values
121
122 - "x86"
123 - "x64"
124 - "arm"
125 - "arm64"
126 - "mipsel"
127 - "mips64el"
128 - "s390x"
129 - "ppc64"
130 - "riscv32"
131 - "riscv64"
132 - "e2k"
133 - "loong64"
134 )";
135
136 const char kTargetName[] = "target_name";
137 const char kTargetName_HelpShort[] =
138 "target_name: [string] The name of the current target.";
139 const char kTargetName_Help[] =
140 R"(target_name: [string] The name of the current target.
141
142 Inside a target or template invocation, this variable refers to the name
143 given to the target or template invocation. Outside of these, this variable
144 is undefined.
145
146 This is most often used in template definitions to name targets defined in
147 the template based on the name of the invocation. This is necessary both to
148 ensure generated targets have unique names and to generate a target with the
149 exact name of the invocation that other targets can depend on.
150
151 Be aware that this value will always reflect the innermost scope. So when
152 defining a target inside a template, target_name will refer to the target
153 rather than the template invocation. To get the name of the template
154 invocation in this case, you should save target_name to a temporary variable
155 outside of any target definitions.
156
157 See "gn help template" for more examples.
158
159 Example
160
161 executable("doom_melon") {
162 print(target_name) # Prints "doom_melon".
163 }
164
165 template("my_template") {
166 print(target_name) # Prints "space_ray" when invoked below.
167
168 executable(target_name + "_impl") {
169 print(target_name) # Prints "space_ray_impl".
170 }
171 }
172
173 my_template("space_ray") {
174 }
175 )";
176
177 const char kTargetOs[] = "target_os";
178 const char kTargetOs_HelpShort[] =
179 "target_os: [string] The desired operating system for the build.";
180 const char kTargetOs_Help[] =
181 R"(target_os: The desired operating system for the build.
182
183 This value should be used to indicate the desired operating system for the
184 primary object(s) of the build. It will match the OS of the default
185 toolchain.
186
187 In many cases, this is the same as "host_os", but in the case of
188 cross-compiles, it may be different. This variable differs from "current_os"
189 in that it can be referenced from inside any toolchain and will always return
190 the initial value.
191
192 This should be set to the most specific value possible. So, "android" or
193 "chromeos" should be used instead of "linux" where applicable, even though
194 Android and ChromeOS are both Linux variants. This can mean that one needs to
195 write
196
197 if (target_os == "android" || target_os == "linux") {
198 # ...
199 }
200
201 and so forth.
202
203 This value is not used internally by GN for any purpose, so it may be set to
204 whatever value is needed for the build. GN defaults this value to the empty
205 string ("") and the configuration files should set it to an appropriate value
206 (e.g., setting it to the value of "host_os") if it is not set via the command
207 line or in the args.gn file.
208
209 Possible values
210
211 - "android"
212 - "chromeos"
213 - "ios"
214 - "linux"
215 - "nacl"
216 - "mac"
217 - "win"
218 )";
219
220 const char kCurrentCpu[] = "current_cpu";
221 const char kCurrentCpu_HelpShort[] =
222 "current_cpu: [string] The processor architecture of the current "
223 "toolchain.";
224 const char kCurrentCpu_Help[] =
225 R"(current_cpu: The processor architecture of the current toolchain.
226
227 The build configuration usually sets this value based on the value of
228 "host_cpu" (see "gn help host_cpu") and then threads this through the
229 toolchain definitions to ensure that it always reflects the appropriate
230 value.
231
232 This value is not used internally by GN for any purpose. It is set to the
233 empty string ("") by default but is declared so that it can be overridden on
234 the command line if so desired.
235
236 See "gn help target_cpu" for a list of common values returned.)";
237
238 const char kCurrentOs[] = "current_os";
239 const char kCurrentOs_HelpShort[] =
240 "current_os: [string] The operating system of the current toolchain.";
241 const char kCurrentOs_Help[] =
242 R"(current_os: The operating system of the current toolchain.
243
244 The build configuration usually sets this value based on the value of
245 "target_os" (see "gn help target_os"), and then threads this through the
246 toolchain definitions to ensure that it always reflects the appropriate
247 value.
248
249 This value is not used internally by GN for any purpose. It is set to the
250 empty string ("") by default but is declared so that it can be overridden on
251 the command line if so desired.
252
253 See "gn help target_os" for a list of common values returned.
254 )";
255
256 const char kCurrentToolchain[] = "current_toolchain";
257 const char kCurrentToolchain_HelpShort[] =
258 "current_toolchain: [string] Label of the current toolchain.";
259 const char kCurrentToolchain_Help[] =
260 R"(current_toolchain: Label of the current toolchain.
261
262 A fully-qualified label representing the current toolchain. You can use this
263 to make toolchain-related decisions in the build. See also
264 "default_toolchain".
265
266 Example
267
268 if (current_toolchain == "//build:64_bit_toolchain") {
269 executable("output_thats_64_bit_only") {
270 ...
271 )";
272
273 const char kDefaultToolchain[] = "default_toolchain";
274 const char kDefaultToolchain_HelpShort[] =
275 "default_toolchain: [string] Label of the default toolchain.";
276 const char kDefaultToolchain_Help[] =
277 R"(default_toolchain: [string] Label of the default toolchain.
278
279 A fully-qualified label representing the default toolchain, which may not
280 necessarily be the current one (see "current_toolchain").
281 )";
282
283 const char kPythonPath[] = "python_path";
284 const char kPythonPath_HelpShort[] =
285 "python_path: [string] Absolute path of Python.";
286 const char kPythonPath_Help[] =
287 R"(python_path: Absolute path of Python.
288
289 Normally used in toolchain definitions if running some command requires
290 Python. You will normally not need this when invoking scripts since GN
291 automatically finds it for you.
292 )";
293
294 const char kRootBuildDir[] = "root_build_dir";
295 const char kRootBuildDir_HelpShort[] =
296 "root_build_dir: [string] Directory where build commands are run.";
297 const char kRootBuildDir_Help[] =
298 R"(root_build_dir: [string] Directory where build commands are run.
299
300 This is the root build output directory which will be the current directory
301 when executing all compilers and scripts.
302
303 Most often this is used with rebase_path (see "gn help rebase_path") to
304 convert arguments to be relative to a script's current directory.
305 )";
306
307 const char kRootGenDir[] = "root_gen_dir";
308 const char kRootGenDir_HelpShort[] =
309 "root_gen_dir: [string] Directory for the toolchain's generated files.";
310 const char kRootGenDir_Help[] =
311 R"(root_gen_dir: Directory for the toolchain's generated files.
312
313 Absolute path to the root of the generated output directory tree for the
314 current toolchain. An example would be "//out/Debug/gen" for the default
315 toolchain, or "//out/Debug/arm/gen" for the "arm" toolchain.
316
317 This is primarily useful for setting up include paths for generated files. If
318 you are passing this to a script, you will want to pass it through
319 rebase_path() (see "gn help rebase_path") to convert it to be relative to the
320 build directory.
321
322 See also "target_gen_dir" which is usually a better location for generated
323 files. It will be inside the root generated dir.
324 )";
325
326 const char kRootOutDir[] = "root_out_dir";
327 const char kRootOutDir_HelpShort[] =
328 "root_out_dir: [string] Root directory for toolchain output files.";
329 const char kRootOutDir_Help[] =
330 R"(root_out_dir: [string] Root directory for toolchain output files.
331
332 Absolute path to the root of the output directory tree for the current
333 toolchain. It will not have a trailing slash.
334
335 For the default toolchain this will be the same as the root_build_dir. An
336 example would be "//out/Debug" for the default toolchain, or
337 "//out/Debug/arm" for the "arm" toolchain.
338
339 This is primarily useful for setting up script calls. If you are passing this
340 to a script, you will want to pass it through rebase_path() (see "gn help
341 rebase_path") to convert it to be relative to the build directory.
342
343 See also "target_out_dir" which is usually a better location for output
344 files. It will be inside the root output dir.
345
346 Example
347
348 action("myscript") {
349 # Pass the output dir to the script.
350 args = [ "-o", rebase_path(root_out_dir, root_build_dir) ]
351 }
352 )";
353
354 const char kTargetGenDir[] = "target_gen_dir";
355 const char kTargetGenDir_HelpShort[] =
356 "target_gen_dir: [string] Directory for a target's generated files.";
357 const char kTargetGenDir_Help[] =
358 R"(target_gen_dir: Directory for a target's generated files.
359
360 Absolute path to the target's generated file directory. This will be the
361 "root_gen_dir" followed by the relative path to the current build file. If
362 your file is in "//tools/doom_melon" then target_gen_dir would be
363 "//out/Debug/gen/tools/doom_melon". It will not have a trailing slash.
364
365 This is primarily useful for setting up include paths for generated files. If
366 you are passing this to a script, you will want to pass it through
367 rebase_path() (see "gn help rebase_path") to convert it to be relative to the
368 build directory.
369
370 See also "gn help root_gen_dir".
371
372 Example
373
374 action("myscript") {
375 # Pass the generated output dir to the script.
376 args = [ "-o", rebase_path(target_gen_dir, root_build_dir) ]
377 }
378 )";
379
380 const char kTargetOutDir[] = "target_out_dir";
381 const char kTargetOutDir_HelpShort[] =
382 "target_out_dir: [string] Directory for target output files.";
383 const char kTargetOutDir_Help[] =
384 R"(target_out_dir: [string] Directory for target output files.
385
386 Absolute path to the target's generated file directory. If your current
387 target is in "//tools/doom_melon" then this value might be
388 "//out/Debug/obj/tools/doom_melon". It will not have a trailing slash.
389
390 This is primarily useful for setting up arguments for calling scripts. If you
391 are passing this to a script, you will want to pass it through rebase_path()
392 (see "gn help rebase_path") to convert it to be relative to the build
393 directory.
394
395 See also "gn help root_out_dir".
396
397 Example
398
399 action("myscript") {
400 # Pass the output dir to the script.
401 args = [ "-o", rebase_path(target_out_dir, root_build_dir) ]
402 }
403 )";
404
405 // Target variables ------------------------------------------------------------
406
407 #define COMMON_ORDERING_HELP \
408 "\n" \
409 "Ordering of flags and values\n" \
410 "\n" \
411 " 1. Those set on the current target (not in a config).\n" \
412 " 2. Those set on the \"configs\" on the target in order that the\n" \
413 " configs appear in the list.\n" \
414 " 3. Those set on the \"all_dependent_configs\" on the target in order\n" \
415 " that the configs appear in the list.\n" \
416 " 4. Those set on the \"public_configs\" on the target in order that\n" \
417 " those configs appear in the list.\n" \
418 " 5. all_dependent_configs pulled from dependencies, in the order of\n" \
419 " the \"deps\" list. This is done recursively. If a config appears\n" \
420 " more than once, only the first occurrence will be used.\n" \
421 " 6. public_configs pulled from dependencies, in the order of the\n" \
422 " \"deps\" list. If a dependency is public, they will be applied\n" \
423 " recursively.\n"
424
425 const char kAllDependentConfigs[] = "all_dependent_configs";
426 const char kAllDependentConfigs_HelpShort[] =
427 "all_dependent_configs: [label list] Configs to be forced on dependents.";
428 const char kAllDependentConfigs_Help[] =
429 R"(all_dependent_configs: Configs to be forced on dependents.
430
431 A list of config labels.
432
433 All targets depending on this one, and recursively, all targets depending on
434 those, will have the configs listed in this variable added to them. These
435 configs will also apply to the current target.
436
437 This addition happens in a second phase once a target and all of its
438 dependencies have been resolved. Therefore, a target will not see these
439 force-added configs in their "configs" variable while the script is running,
440 and they can not be removed. As a result, this capability should generally
441 only be used to add defines and include directories necessary to compile a
442 target's headers.
443
444 See also "public_configs".
445 )" COMMON_ORDERING_HELP;
446
447 const char kAllowCircularIncludesFrom[] = "allow_circular_includes_from";
448 const char kAllowCircularIncludesFrom_HelpShort[] =
449 "allow_circular_includes_from: [label list] Permit includes from deps.";
450 const char kAllowCircularIncludesFrom_Help[] =
451 R"(allow_circular_includes_from: Permit includes from deps.
452
453 A list of target labels. Must be a subset of the target's "deps". These
454 targets will be permitted to include headers from the current target despite
455 the dependency going in the opposite direction.
456
457 When you use this, both targets must be included in a final binary for it to
458 link. To keep linker errors from happening, it is good practice to have all
459 external dependencies depend only on one of the two targets, and to set the
460 visibility on the other to enforce this. Thus the targets will always be
461 linked together in any output.
462
463 Details
464
465 Normally, for a file in target A to include a file from target B, A must list
466 B as a dependency. This invariant is enforced by the "gn check" command (and
467 the --check flag to "gn gen" -- see "gn help check").
468
469 Sometimes, two targets might be the same unit for linking purposes (two
470 source sets or static libraries that would always be linked together in a
471 final executable or shared library) and they each include headers from the
472 other: you want A to be able to include B's headers, and B to include A's
473 headers. This is not an ideal situation but is sometimes unavoidable.
474
475 This list, if specified, lists which of the dependencies of the current
476 target can include header files from the current target. That is, if A
477 depends on B, B can only include headers from A if it is in A's
478 allow_circular_includes_from list. Normally includes must follow the
479 direction of dependencies, this flag allows them to go in the opposite
480 direction.
481
482 Danger
483
484 In the above example, A's headers are likely to include headers from A's
485 dependencies. Those dependencies may have public_configs that apply flags,
486 defines, and include paths that make those headers work properly.
487
488 With allow_circular_includes_from, B can include A's headers, and
489 transitively from A's dependencies, without having the dependencies that
490 would bring in the public_configs those headers need. The result may be
491 errors or inconsistent builds.
492
493 So when you use allow_circular_includes_from, make sure that any compiler
494 settings, flags, and include directories are the same between both targets
495 (consider putting such things in a shared config they can both reference).
496 Make sure the dependencies are also the same (you might consider a group to
497 collect such dependencies they both depend on).
498
499 Example
500
501 source_set("a") {
502 deps = [ ":b", ":a_b_shared_deps" ]
503 allow_circular_includes_from = [ ":b" ]
504 ...
505 }
506
507 source_set("b") {
508 deps = [ ":a_b_shared_deps" ]
509 # Sources here can include headers from a despite lack of deps.
510 ...
511 }
512
513 group("a_b_shared_deps") {
514 public_deps = [ ":c" ]
515 }
516 )";
517
518 const char kGenDeps[] = "gen_deps";
519 const char kGenDeps_HelpShort[] =
520 "gen_deps: [label list] "
521 "Declares targets that should generate when this one does.";
522 const char kGenDeps_Help[] =
523 R"(gen_deps: Declares targets that should generate when this one does.
524
525 A list of target labels.
526
527 Not all GN targets that get evaluated are actually turned into ninja targets
528 (see "gn help execution"). If this target is generated, then any targets in
529 the "gen_deps" list will also be generated, regardless of the usual criteria.
530
531 Since "gen_deps" are not build time dependencies, there can be cycles between
532 "deps" and "gen_deps" or within "gen_deps" itself.
533 )";
534
535 const char kArflags[] = "arflags";
536 const char kArflags_HelpShort[] =
537 "arflags: [string list] Arguments passed to static_library archiver.";
538 const char kArflags_Help[] =
539 R"(arflags: Arguments passed to static_library archiver.
540
541 A list of flags passed to the archive/lib command that creates static
542 libraries.
543
544 arflags are NOT pushed to dependents, so applying arflags to source sets or
545 any other target type will be a no-op. As with ldflags, you could put the
546 arflags in a config and set that as a public or "all dependent" config, but
547 that will likely not be what you want. If you have a chain of static
548 libraries dependent on each other, this can cause the flags to propagate up
549 to other static libraries. Due to the nature of how arflags are typically
550 used, you will normally want to apply them directly on static_library targets
551 themselves.
552 )" COMMON_ORDERING_HELP;
553
554 const char kArgs[] = "args";
555 const char kArgs_HelpShort[] =
556 "args: [string list] Arguments passed to an action.";
557 const char kArgs_Help[] =
558 R"(args: (target variable) Arguments passed to an action.
559
560 For action and action_foreach targets, args is the list of arguments to pass
561 to the script. Typically you would use source expansion (see "gn help
562 source_expansion") to insert the source file names.
563
564 Args can also expand the substitution patterns corresponding to config
565 variables in the same way that compiler tools (see "gn help tool") do. These
566 allow actions that run compiler or compiler-like tools to access the results
567 of propagating configs through the build graph. For example:
568
569 args = [ "{{defines}}", "{{include_dirs}}", "{{rustenv}}", "--input-file",
570 "{{source}}" ]
571
572 See also "gn help action" and "gn help action_foreach".
573 )";
574
575 const char kMnemonic[] = "mnemonic";
576 const char kMnemonic_HelpShort[] =
577 "mnemonic: [string] Prefix displayed when ninja runs this action.";
578 const char kMnemonic_Help[] =
579 R"(mnemonic: [string] Prefix displayed when ninja runs this action.
580
581 Tools in GN can set their ninja "description" which is displayed when
582 building a target. These are commonly set with the format "CXX $output"
583 or "LINK $label". By default, all GN actions will have the description
584 "ACTION $label". Setting a mnemonic will override the "ACTION" prefix
585 with another string, but the label will still be unconditionally displayed.
586
587 Whitespace is not allowed within a mnemonic.
588 )";
589
590 const char kAssertNoDeps[] = "assert_no_deps";
591 const char kAssertNoDeps_HelpShort[] =
592 "assert_no_deps: [label pattern list] Ensure no deps on these targets.";
593 const char kAssertNoDeps_Help[] =
594 R"(assert_no_deps: Ensure no deps on these targets.
595
596 A list of label patterns.
597
598 This list is a list of patterns that must not match any of the transitive
599 dependencies of the target. These include all public, private, and data
600 dependencies, and cross shared library boundaries. This allows you to express
601 that undesirable code isn't accidentally added to downstream dependencies in
602 a way that might otherwise be difficult to notice.
603
604 Checking does not cross executable boundaries. If a target depends on an
605 executable, it's assumed that the executable is a tool that is producing part
606 of the build rather than something that is linked and distributed. This
607 allows assert_no_deps to express what is distributed in the final target
608 rather than depend on the internal build steps (which may include
609 non-distributable code).
610
611 See "gn help label_pattern" for the format of the entries in the list. These
612 patterns allow blacklisting individual targets or whole directory
613 hierarchies.
614
615 Sometimes it is desirable to enforce that many targets have no dependencies
616 on a target or set of targets. One efficient way to express this is to create
617 a group with the assert_no_deps rule on it, and make that group depend on all
618 targets you want to apply that assertion to.
619
620 Example
621
622 executable("doom_melon") {
623 deps = [ "//foo:bar" ]
624 ...
625 assert_no_deps = [
626 "//evil/*", # Don't link any code from the evil directory.
627 "//foo:test_support", # This target is also disallowed.
628 ]
629 }
630 )";
631
632 const char kBundleRootDir[] = "bundle_root_dir";
633 const char kBundleRootDir_HelpShort[] =
634 "bundle_root_dir: Expansion of {{bundle_root_dir}} in create_bundle.";
635 const char kBundleRootDir_Help[] =
636 R"(bundle_root_dir: Expansion of {{bundle_root_dir}} in create_bundle.
637
638 A string corresponding to a path in root_build_dir.
639
640 This string is used by the "create_bundle" target to expand the
641 {{bundle_root_dir}} of the "bundle_data" target it depends on. This must
642 correspond to a path under root_build_dir.
643
644 Example
645
646 bundle_data("info_plist") {
647 sources = [ "Info.plist" ]
648 outputs = [ "{{bundle_contents_dir}}/Info.plist" ]
649 }
650
651 create_bundle("doom_melon.app") {
652 deps = [ ":info_plist" ]
653 bundle_root_dir = "${root_build_dir}/doom_melon.app"
654 bundle_contents_dir = "${bundle_root_dir}/Contents"
655 bundle_resources_dir = "${bundle_contents_dir}/Resources"
656 bundle_executable_dir = "${bundle_contents_dir}/MacOS"
657 }
658 )";
659
660 const char kBundleContentsDir[] = "bundle_contents_dir";
661 const char kBundleContentsDir_HelpShort[] =
662 "bundle_contents_dir: "
663 "Expansion of {{bundle_contents_dir}} in create_bundle.";
664 const char kBundleContentsDir_Help[] =
665 R"(bundle_contents_dir: Expansion of {{bundle_contents_dir}} in
666 create_bundle.
667
668 A string corresponding to a path in $root_build_dir.
669
670 This string is used by the "create_bundle" target to expand the
671 {{bundle_contents_dir}} of the "bundle_data" target it depends on. This must
672 correspond to a path under "bundle_root_dir".
673
674 See "gn help bundle_root_dir" for examples.
675 )";
676
677 const char kBundleResourcesDir[] = "bundle_resources_dir";
678 const char kBundleResourcesDir_HelpShort[] =
679 "bundle_resources_dir: "
680 "Expansion of {{bundle_resources_dir}} in create_bundle.";
681 const char kBundleResourcesDir_Help[] =
682 R"(bundle_resources_dir
683
684 bundle_resources_dir: Expansion of {{bundle_resources_dir}} in
685 create_bundle.
686
687 A string corresponding to a path in $root_build_dir.
688
689 This string is used by the "create_bundle" target to expand the
690 {{bundle_resources_dir}} of the "bundle_data" target it depends on. This must
691 correspond to a path under "bundle_root_dir".
692
693 See "gn help bundle_root_dir" for examples.
694 )";
695
696 const char kBundleDepsFilter[] = "bundle_deps_filter";
697 const char kBundleDepsFilter_HelpShort[] =
698 "bundle_deps_filter: [label list] A list of labels that are filtered out.";
699 const char kBundleDepsFilter_Help[] =
700 R"(bundle_deps_filter: [label list] A list of labels that are filtered out.
701
702 A list of target labels.
703
704 This list contains target label patterns that should be filtered out when
705 creating the bundle. Any target matching one of those label will be removed
706 from the dependencies of the create_bundle target.
707
708 This is mostly useful when creating application extension bundle as the
709 application extension has access to runtime resources from the application
710 bundle and thus do not require a second copy.
711
712 See "gn help create_bundle" for more information.
713
714 Example
715
716 create_bundle("today_extension") {
717 deps = [
718 "//base"
719 ]
720 bundle_root_dir = "$root_out_dir/today_extension.appex"
721 bundle_deps_filter = [
722 # The extension uses //base but does not use any function calling into
723 # third_party/icu and thus does not need the icudtl.dat file.
724 "//third_party/icu:icudata",
725 ]
726 }
727 )";
728
729 const char kBundleExecutableDir[] = "bundle_executable_dir";
730 const char kBundleExecutableDir_HelpShort[] =
731 "bundle_executable_dir: "
732 "Expansion of {{bundle_executable_dir}} in create_bundle";
733 const char kBundleExecutableDir_Help[] =
734 R"(bundle_executable_dir
735
736 bundle_executable_dir: Expansion of {{bundle_executable_dir}} in
737 create_bundle.
738
739 A string corresponding to a path in $root_build_dir.
740
741 This string is used by the "create_bundle" target to expand the
742 {{bundle_executable_dir}} of the "bundle_data" target it depends on. This
743 must correspond to a path under "bundle_root_dir".
744
745 See "gn help bundle_root_dir" for examples.
746 )";
747
748 const char kXcassetCompilerFlags[] = "xcasset_compiler_flags";
749 const char kXcassetCompilerFlags_HelpShort[] =
750 "xcasset_compiler_flags: [string list] Flags passed to xcassets compiler";
751 const char kXcassetCompilerFlags_Help[] =
752 R"(xcasset_compiler_flags: Flags passed to xcassets compiler.
753
754 A list of strings.
755
756 Valid for create_bundle target. Those flags are directly passed to
757 xcassets compiler, corresponding to {{xcasset_compiler_flags}} substitution
758 in compile_xcassets tool.
759 )";
760
761 const char kTransparent[] = "transparent";
762 const char kTransparent_HelpShort[] =
763 "transparent: [bool] True if the bundle is transparent.";
764 const char kTransparent_Help[] =
765 R"(transparent: [bool] True if the bundle is transparent.
766
767 A boolean.
768
769 Valid for "create_bundle" target. If true, the "create_bundle" target will
770 not package the "bundle_data" deps but will forward them to all targets that
771 depends on it (unless the "bundle_data" target sets "product_type" to the
772 same value as the "create_bundle" target).
773 )";
774
775 const char kCflags[] = "cflags";
776 const char kCflags_HelpShort[] =
777 "cflags: [string list] Flags passed to all C compiler variants.";
778 const char kCommonCflagsHelp[] =
779 R"(cflags*: Flags passed to the C compiler.
780
781 A list of strings.
782
783 "cflags" are passed to all invocations of the C, C++, Objective C, and
784 Objective C++ compilers.
785
786 To target one of these variants individually, use "cflags_c", "cflags_cc",
787 "cflags_objc", and "cflags_objcc", respectively. These variant-specific
788 versions of cflags* will be appended on the compiler command line after
789 "cflags".
790
791 See also "asmflags" for flags for assembly-language files, "swiftflags" for
792 swift files, and "rustflags" for Rust files.
793 )" COMMON_ORDERING_HELP;
794 const char* kCflags_Help = kCommonCflagsHelp;
795
796 const char kAsmflags[] = "asmflags";
797 const char kAsmflags_HelpShort[] =
798 "asmflags: [string list] Flags passed to the assembler.";
799 const char* kAsmflags_Help =
800 R"(asmflags: Flags passed to the assembler.
801
802 A list of strings.
803
804 "asmflags" are passed to any invocation of a tool that takes an .asm or .S
805 file as input.
806 )" COMMON_ORDERING_HELP;
807
808 const char kCflagsC[] = "cflags_c";
809 const char kCflagsC_HelpShort[] =
810 "cflags_c: [string list] Flags passed to the C compiler.";
811 const char* kCflagsC_Help = kCommonCflagsHelp;
812
813 const char kCflagsCC[] = "cflags_cc";
814 const char kCflagsCC_HelpShort[] =
815 "cflags_cc: [string list] Flags passed to the C++ compiler.";
816 const char* kCflagsCC_Help = kCommonCflagsHelp;
817
818 const char kCflagsObjC[] = "cflags_objc";
819 const char kCflagsObjC_HelpShort[] =
820 "cflags_objc: [string list] Flags passed to the Objective C compiler.";
821 const char* kCflagsObjC_Help = kCommonCflagsHelp;
822
823 const char kCflagsObjCC[] = "cflags_objcc";
824 const char kCflagsObjCC_HelpShort[] =
825 "cflags_objcc: [string list] Flags passed to the Objective C++ compiler.";
826 const char* kCflagsObjCC_Help = kCommonCflagsHelp;
827
828 const char kCheckIncludes[] = "check_includes";
829 const char kCheckIncludes_HelpShort[] =
830 "check_includes: [boolean] Controls whether a target's files are checked.";
831 const char kCheckIncludes_Help[] =
832 R"(check_includes: [boolean] Controls whether a target's files are checked.
833
834 When true (the default), the "gn check" command (as well as "gn gen" with the
835 --check flag) will check this target's sources and headers for proper
836 dependencies.
837
838 When false, the files in this target will be skipped by default. This does
839 not affect other targets that depend on the current target, it just skips
840 checking the includes of the current target's files.
841
842 If there are a few conditionally included headers that trip up checking, you
843 can exclude headers individually by annotating them with "nogncheck" (see "gn
844 help nogncheck").
845
846 The topic "gn help check" has general information on how checking works and
847 advice on how to pass a check in problematic cases.
848
849 Example
850
851 source_set("busted_includes") {
852 # This target's includes are messed up, exclude it from checking.
853 check_includes = false
854 ...
855 }
856 )";
857
858 const char kCodeSigningArgs[] = "code_signing_args";
859 const char kCodeSigningArgs_HelpShort[] =
860 "code_signing_args: [string list] [deprecated] Args for the "
861 "post-processing script.";
862 const char kCodeSigningArgs_Help[] =
863 R"(code_signing_args: [string list] [deprecated] Args for the post-processing script.
864
865 For create_bundle targets, post_processing_args is the list of arguments to
866 pass to the post-processing script. Typically you would use source expansion
867 (see "gn help source_expansion") to insert the source file names.
868
869 Deprecated: this is an old name for the "post_processing_args" property of
870 the "create_bundle" target. It is still supported to avoid breaking existing
871 build rules, but a warning will be emitted when it is used.
872
873 See also "gn help create_bundle" and "gn help post_processing_args".
874 )";
875
876 const char kCodeSigningOutputs[] = "code_signing_outputs";
877 const char kCodeSigningOutputs_HelpShort[] =
878 "code_signing_outputs: [file list] [deprecated] Outputs of the "
879 "post-processing step.";
880 const char kCodeSigningOutputs_Help[] =
881 R"(code_signing_outputs: [file list] [deprecated] Outputs of the post-processing step.
882
883 Outputs from the post-processing step of a create_bundle target. Must refer to
884 files in the build directory.
885
886 Deprecated: this is an old name for the "post_processing_outputs" property of
887 the "create_bundle" target. It is still supported to avoid breaking existing
888 build rules, but a warning will be emitted when it is used.
889
890 See also "gn help create_bundle" and "gn help post_processing_args".
891 )";
892
893 const char kCodeSigningScript[] = "code_signing_script";
894 const char kCodeSigningScript_HelpShort[] =
895 "code_signing_script: [file name] [deprecated] Script for the "
896 "post-processing step.";
897 const char kCodeSigningScript_Help[] =
898 R"(code_signing_script: [file name] [deprecated] Script for the post-processing step."
899
900 An absolute or buildfile-relative file name of a Python script to run for a
901 create_bundle target to perform the post-processing step.
902
903 Deprecated: this is an old name for the "post_processing_script" property of
904 the "create_bundle" target. It is still supported to avoid breaking existing
905 build rules, but a warning will be emitted when it is used.
906
907 See also "gn help create_bundle" and "gn help post_processing_args".
908 )";
909
910 const char kCodeSigningSources[] = "code_signing_sources";
911 const char kCodeSigningSources_HelpShort[] =
912 "code_signing_sources: [file list] [deprecated] Sources for the "
913 "post-processing "
914 "step.";
915 const char kCodeSigningSources_Help[] =
916 R"(code_signing_sources: [file list] [deprecated] Sources for the post-processing step.
917
918 A list of files used as input for the post-processing step of a create_bundle
919 target. Non-absolute paths will be resolved relative to the current build
920 file.
921
922 Deprecated: this is an old name for the "post_processing_sources" property of
923 the "create_bundle" target. It is still supported to avoid breaking existing
924 build rules, but a warning will be emitted when it is used.
925
926 See also "gn help create_bundle" and "gn help post_processing_args".
927 )";
928
929 const char kCompleteStaticLib[] = "complete_static_lib";
930 const char kCompleteStaticLib_HelpShort[] =
931 "complete_static_lib: [boolean] Links all deps into a static library.";
932 const char kCompleteStaticLib_Help[] =
933 R"(complete_static_lib: [boolean] Links all deps into a static library.
934
935 A static library normally doesn't include code from dependencies, but instead
936 forwards the static libraries and source sets in its deps up the dependency
937 chain until a linkable target (an executable or shared library) is reached.
938 The final linkable target only links each static library once, even if it
939 appears more than once in its dependency graph.
940
941 In some cases the static library might be the final desired output. For
942 example, you may be producing a static library for distribution to third
943 parties. In this case, the static library should include code for all
944 dependencies in one complete package. However, complete static libraries
945 themselves are never linked into other complete static libraries. All
946 complete static libraries are for distribution and linking them in would
947 cause code duplication in this case. If the static library is not for
948 distribution, it should not be complete.
949
950 GN treats non-complete static libraries as source sets when they are linked
951 into complete static libraries. This is done because some tools like AR do
952 not handle dependent static libraries properly. This makes it easier to write
953 "alink" rules.
954
955 In rare cases it makes sense to list a header in more than one target if it
956 could be considered conceptually a member of both. libraries.
957
958 Example
959
960 static_library("foo") {
961 complete_static_lib = true
962 deps = [ "bar" ]
963 }
964 )";
965
966 const char kConfigs[] = "configs";
967 const char kConfigs_HelpShort[] =
968 "configs: [label list] Configs applying to this target or config.";
969 const char kConfigs_Help[] =
970 R"(configs: Configs applying to this target or config.
971
972 A list of config labels.
973
974 Configs on a target
975
976 When used on a target, the include_dirs, defines, etc. in each config are
977 appended in the order they appear to the compile command for each file in the
978 target. They will appear after the include_dirs, defines, etc. that the
979 target sets directly.
980
981 Since configs apply after the values set on a target, directly setting a
982 compiler flag will prepend it to the command line. If you want to append a
983 flag instead, you can put that flag in a one-off config and append that
984 config to the target's configs list.
985
986 The build configuration script will generally set up the default configs
987 applying to a given target type (see "set_defaults"). When a target is being
988 defined, it can add to or remove from this list.
989
990 Configs on a config
991
992 It is possible to create composite configs by specifying configs on a config.
993 One might do this to forward values, or to factor out blocks of settings from
994 very large configs into more manageable named chunks.
995
996 In this case, the composite config is expanded to be the concatenation of its
997 own values, and in order, the values from its sub-configs *before* anything
998 else happens. This has some ramifications:
999
1000 - A target has no visibility into a config's sub-configs. Target code only
1001 sees the name of the composite config. It can't remove sub-configs or opt
1002 in to only parts of it. The composite config may not even be defined
1003 before the target is.
1004
1005 - You can get duplication of values if a config is listed twice, say, on a
1006 target and in a sub-config that also applies. In other cases, the configs
1007 applying to a target are de-duped. It's expected that if a config is
1008 listed as a sub-config that it is only used in that context. (Note that
1009 it's possible to fix this and de-dupe, but it's not normally relevant and
1010 complicates the implementation.)
1011 )" COMMON_ORDERING_HELP
1012 R"(
1013 Example
1014
1015 # Configs on a target.
1016 source_set("foo") {
1017 # Don't use the default RTTI config that BUILDCONFIG applied to us.
1018 configs -= [ "//build:no_rtti" ]
1019
1020 # Add some of our own settings.
1021 configs += [ ":mysettings" ]
1022 }
1023
1024 # Create a default_optimization config that forwards to one of a set of more
1025 # specialized configs depending on build flags. This pattern is useful
1026 # because it allows a target to opt in to either a default set, or a more
1027 # specific set, while avoid duplicating the settings in two places.
1028 config("super_optimization") {
1029 cflags = [ ... ]
1030 }
1031 config("default_optimization") {
1032 if (optimize_everything) {
1033 configs = [ ":super_optimization" ]
1034 } else {
1035 configs = [ ":no_optimization" ]
1036 }
1037 }
1038 )";
1039
1040 const char kData[] = "data";
1041 const char kData_HelpShort[] =
1042 "data: [file list] Runtime data file dependencies.";
1043 const char kData_Help[] =
1044 R"(data: Runtime data file dependencies.
1045
1046 Lists files or directories required to run the given target. These are
1047 typically data files or directories of data files. The paths are interpreted
1048 as being relative to the current build file. Since these are runtime
1049 dependencies, they do not affect which targets are built or when. To declare
1050 input files to a script, use "inputs".
1051
1052 Appearing in the "data" section does not imply any special handling such as
1053 copying them to the output directory. This is just used for declaring runtime
1054 dependencies. Runtime dependencies can be queried using the "runtime_deps"
1055 category of "gn desc" or written during build generation via
1056 "--runtime-deps-list-file".
1057
1058 GN doesn't require data files to exist at build-time. So actions that produce
1059 files that are in turn runtime dependencies can list those generated files
1060 both in the "outputs" list as well as the "data" list.
1061
1062 By convention, directories are listed with a trailing slash:
1063 data = [ "test/data/" ]
1064 However, no verification is done on these so GN doesn't enforce this. The
1065 paths are just rebased and passed along when requested.
1066
1067 Note: On iOS and macOS, create_bundle targets will not be recursed into when
1068 gathering data. See "gn help create_bundle" for details.
1069
1070 See "gn help runtime_deps" for how these are used.
1071 )";
1072
1073 const char kDataDeps[] = "data_deps";
1074 const char kDataDeps_HelpShort[] =
1075 "data_deps: [label list] Non-linked dependencies.";
1076 const char kDataDeps_Help[] =
1077 R"(data_deps: Non-linked dependencies.
1078
1079 A list of target labels.
1080
1081 Specifies dependencies of a target that are not actually linked into the
1082 current target. Such dependencies will be built and will be available at
1083 runtime.
1084
1085 This is normally used for things like plugins or helper programs that a
1086 target needs at runtime.
1087
1088 Note: On iOS and macOS, create_bundle targets will not be recursed into when
1089 gathering data_deps. See "gn help create_bundle" for details.
1090
1091 See also "gn help deps" and "gn help data".
1092
1093 Example
1094
1095 executable("foo") {
1096 deps = [ "//base" ]
1097 data_deps = [ "//plugins:my_runtime_plugin" ]
1098 }
1099 )";
1100
1101 const char kDataKeys[] = "data_keys";
1102 const char kDataKeys_HelpShort[] =
1103 "data_keys: [string list] Keys from which to collect metadata.";
1104 const char kDataKeys_Help[] =
1105 R"(data_keys: Keys from which to collect metadata.
1106
1107 These keys are used to identify metadata to collect. If a walked target
1108 defines this key in its metadata, its value will be appended to the resulting
1109 collection.
1110
1111 See "gn help generated_file".
1112 )";
1113
1114 const char kDefines[] = "defines";
1115 const char kDefines_HelpShort[] =
1116 "defines: [string list] C preprocessor defines.";
1117 const char kDefines_Help[] =
1118 R"(defines: C preprocessor defines.
1119
1120 A list of strings
1121
1122 These strings will be passed to the C/C++ compiler as #defines. The strings
1123 may or may not include an "=" to assign a value.
1124 )" COMMON_ORDERING_HELP
1125 R"(
1126 Example
1127
1128 defines = [ "AWESOME_FEATURE", "LOG_LEVEL=3" ]
1129 )";
1130
1131 const char kDepfile[] = "depfile";
1132 const char kDepfile_HelpShort[] =
1133 "depfile: [string] File name for input dependencies for actions.";
1134 const char kDepfile_Help[] =
1135 R"(depfile: [string] File name for input dependencies for actions.
1136
1137 If nonempty, this string specifies that the current action or action_foreach
1138 target will generate the given ".d" file containing the dependencies of the
1139 input. Empty or unset means that the script doesn't generate the files.
1140
1141 A depfile should be used only when a target depends on files that are not
1142 already specified by a target's inputs and sources. Likewise, depfiles should
1143 specify only those dependencies not already included in sources or inputs.
1144
1145 The .d file should go in the target output directory. If you have more than
1146 one source file that the script is being run over, you can use the output
1147 file expansions described in "gn help action_foreach" to name the .d file
1148 according to the input.
1149
1150 The format is that of a Makefile and all paths must be relative to the root
1151 build directory. Only one output may be listed and it must match the first
1152 output of the action.
1153
1154 Although depfiles are created by an action, they should not be listed in the
1155 action's "outputs" unless another target will use the file as an input.
1156
1157 Example
1158
1159 action_foreach("myscript_target") {
1160 script = "myscript.py"
1161 sources = [ ... ]
1162
1163 # Locate the depfile in the output directory named like the
1164 # inputs but with a ".d" appended.
1165 depfile = "$target_gen_dir/{{source_name_part}}.d"
1166
1167 # Say our script uses "-o <d file>" to indicate the depfile.
1168 args = [ "{{source}}", "-o", rebase_path(depfile, root_build_dir)]
1169 }
1170 )";
1171
1172 const char kDeps[] = "deps";
1173 const char kDeps_HelpShort[] =
1174 "deps: [label list] Private linked dependencies.";
1175 const char kDeps_Help[] =
1176 R"(deps: Private linked dependencies.
1177
1178 A list of target labels.
1179
1180 Specifies private dependencies of a target. Private dependencies are
1181 propagated up the dependency tree and linked to dependent targets, but do not
1182 grant the ability to include headers from the dependency. Public configs are
1183 not forwarded.
1184
1185 Details of dependency propagation
1186
1187 Source sets, shared libraries, and non-complete static libraries will be
1188 propagated up the dependency tree across groups, non-complete static
1189 libraries and source sets.
1190
1191 Executables, shared libraries, and complete static libraries will link all
1192 propagated targets and stop propagation. Actions and copy steps also stop
1193 propagation, allowing them to take a library as an input but not force
1194 dependents to link to it.
1195
1196 Propagation of all_dependent_configs and public_configs happens independently
1197 of target type. all_dependent_configs are always propagated across all types
1198 of targets, and public_configs are always propagated across public deps of
1199 all types of targets.
1200
1201 For Rust targets, deps ensures that Rust code can refer to the dependency
1202 target. If the dependency is a C/C++ target, the path to that target will
1203 be made available to Rust for `#[link]` directives.
1204
1205 Data dependencies are propagated differently. See "gn help data_deps" and
1206 "gn help runtime_deps".
1207
1208 See also "public_deps".
1209 )";
1210
1211 const char kExterns[] = "externs";
1212 const char kExterns_HelpShort[] =
1213 "externs: [scope] Set of Rust crate-dependency pairs.";
1214 const char kExterns_Help[] =
1215 R"(externs: [scope] Set of Rust crate-dependency pairs.
1216
1217 A list, each value being a scope indicating a pair of crate name and the path
1218 to the Rust library.
1219
1220 These libraries will be passed as `--extern crate_name=path` to compiler
1221 invocation containing the current target.
1222
1223 Examples
1224
1225 executable("foo") {
1226 sources = [ "main.rs" ]
1227 externs = [{
1228 crate_name = "bar",
1229 path = "path/to/bar.rlib"
1230 }]
1231 }
1232
1233 This target would compile the `foo` crate with the following `extern` flag:
1234 `--extern bar=path/to/bar.rlib`.
1235 )";
1236
1237 const char kFriend[] = "friend";
1238 const char kFriend_HelpShort[] =
1239 "friend: [label pattern list] Allow targets to include private headers.";
1240 const char kFriend_Help[] =
1241 R"(friend: Allow targets to include private headers.
1242
1243 A list of label patterns (see "gn help label_pattern") that allow dependent
1244 targets to include private headers. Applies to all binary targets.
1245
1246 Normally if a target lists headers in the "public" list (see "gn help
1247 public"), other headers are implicitly marked as private. Private headers
1248 can not be included by other targets, even with a public dependency path.
1249 The "gn check" function performs this validation.
1250
1251 A friend declaration allows one or more targets to include private headers.
1252 This is useful for things like unit tests that are closely associated with a
1253 target and require internal knowledge without opening up all headers to be
1254 included by all dependents.
1255
1256 A friend target does not allow that target to include headers when no
1257 dependency exists. A public dependency path must still exist between two
1258 targets to include any headers from a destination target. The friend
1259 annotation merely allows the use of headers that would otherwise be
1260 prohibited because they are private.
1261
1262 The friend annotation is matched only against the target containing the file
1263 with the include directive. Friend annotations are not propagated across
1264 public or private dependencies. Friend annotations do not affect visibility.
1265
1266 Example
1267
1268 static_library("lib") {
1269 # This target can include our private headers.
1270 friend = [ ":unit_tests" ]
1271
1272 public = [
1273 "public_api.h", # Normal public API for dependent targets.
1274 ]
1275
1276 # Private API and sources.
1277 sources = [
1278 "a_source_file.cc",
1279
1280 # Normal targets that depend on this one won't be able to include this
1281 # because this target defines a list of "public" headers. Without the
1282 # "public" list, all headers are implicitly public.
1283 "private_api.h",
1284 ]
1285 }
1286
1287 executable("unit_tests") {
1288 sources = [
1289 # This can include "private_api.h" from the :lib target because it
1290 # depends on that target and because of the friend annotation.
1291 "my_test.cc",
1292 ]
1293
1294 deps = [
1295 ":lib", # Required for the include to be allowed.
1296 ]
1297 }
1298 )";
1299
1300 const char kFrameworkDirs[] = "framework_dirs";
1301 const char kFrameworkDirs_HelpShort[] =
1302 "framework_dirs: [directory list] Additional framework search directories.";
1303 const char kFrameworkDirs_Help[] =
1304 R"(framework_dirs: [directory list] Additional framework search directories.
1305
1306 A list of source directories.
1307
1308 The directories in this list will be added to the framework search path for
1309 the files in the affected target.
1310 )" COMMON_ORDERING_HELP
1311 R"(
1312 Example
1313
1314 framework_dirs = [ "src/include", "//third_party/foo" ]
1315 )";
1316
1317 const char kFrameworks[] = "frameworks";
1318 const char kFrameworks_HelpShort[] =
1319 "frameworks: [name list] Name of frameworks that must be linked.";
1320 const char kFrameworks_Help[] =
1321 R"(frameworks: [name list] Name of frameworks that must be linked.
1322
1323 A list of framework names.
1324
1325 The frameworks named in that list will be linked with any dynamic link
1326 type target.
1327 )" COMMON_ORDERING_HELP
1328 R"(
1329 Example
1330
1331 frameworks = [ "Foundation.framework", "Foo.framework" ]
1332 )";
1333
1334 const char kIncludeDirs[] = "include_dirs";
1335 const char kIncludeDirs_HelpShort[] =
1336 "include_dirs: [directory list] Additional include directories.";
1337 const char kIncludeDirs_Help[] =
1338 R"(include_dirs: Additional include directories.
1339
1340 A list of source directories.
1341
1342 The directories in this list will be added to the include path for the files
1343 in the affected target.
1344 )" COMMON_ORDERING_HELP
1345 R"(
1346 Example
1347
1348 include_dirs = [ "src/include", "//third_party/foo" ]
1349 )";
1350
1351 const char kInputs[] = "inputs";
1352 const char kInputs_HelpShort[] =
1353 "inputs: [file list] Additional compile-time dependencies.";
1354 const char kInputs_Help[] =
1355 R"(inputs: Additional compile-time dependencies.
1356
1357 Inputs are compile-time dependencies of the current target. This means that
1358 all inputs must be available before compiling any of the sources or executing
1359 any actions.
1360
1361 Inputs are typically only used for action and action_foreach targets.
1362
1363 Inputs for actions
1364
1365 For action and action_foreach targets, inputs should be the inputs to script
1366 that don't vary. These should be all .py files that the script uses via
1367 imports (the main script itself will be an implicit dependency of the action
1368 so need not be listed).
1369
1370 For action targets, inputs and sources are treated the same, but from a style
1371 perspective, it's recommended to follow the same rule as action_foreach and
1372 put helper files in the inputs, and the data used by the script (if any) in
1373 sources.
1374
1375 Note that another way to declare input dependencies from an action is to have
1376 the action write a depfile (see "gn help depfile"). This allows the script to
1377 dynamically write input dependencies, that might not be known until actually
1378 executing the script. This is more efficient than doing processing while
1379 running GN to determine the inputs, and is easier to keep in-sync than
1380 hardcoding the list.
1381
1382 Script input gotchas
1383
1384 It may be tempting to write a script that enumerates all files in a directory
1385 as inputs. Don't do this! Even if you specify all the files in the inputs or
1386 sources in the GN target (or worse, enumerate the files in an exec_script
1387 call when running GN, which will be slow), the dependencies will be broken.
1388
1389 The problem happens if a file is ever removed because the inputs are not
1390 listed on the command line to the script. Because the script hasn't changed
1391 and all inputs are up to date, the script will not re-run and you will get a
1392 stale build. Instead, either list all inputs on the command line to the
1393 script, or if there are many, create a separate list file that the script
1394 reads. As long as this file is listed in the inputs, the build will detect
1395 when it has changed in any way and the action will re-run.
1396
1397 Inputs for binary targets
1398
1399 Any input dependencies will be resolved before compiling any sources or
1400 linking the target. Normally, all actions that a target depends on will be run
1401 before any files in a target are compiled. So if you depend on generated
1402 headers, you do not typically need to list them in the inputs section.
1403
1404 Inputs for binary targets will be treated as implicit dependencies, meaning
1405 that changes in any of the inputs will force all sources in the target to be
1406 recompiled. If an input only applies to a subset of source files, you may
1407 want to split those into a separate target to avoid unnecessary recompiles.
1408
1409 Example
1410
1411 action("myscript") {
1412 script = "domything.py"
1413 inputs = [ "input.data" ]
1414 }
1415 )";
1416
1417 const char kLdflags[] = "ldflags";
1418 const char kLdflags_HelpShort[] =
1419 "ldflags: [string list] Flags passed to the linker.";
1420 const char kLdflags_Help[] =
1421 R"(ldflags: Flags passed to the linker.
1422
1423 A list of strings.
1424
1425 These flags are passed on the command-line to the linker and generally
1426 specify various linking options. Most targets will not need these and will
1427 use "libs" and "lib_dirs" instead.
1428
1429 ldflags are NOT pushed to dependents, so applying ldflags to source sets or
1430 static libraries will be a no-op. If you want to apply ldflags to dependent
1431 targets, put them in a config and set it in the all_dependent_configs or
1432 public_configs.
1433 )" COMMON_ORDERING_HELP;
1434
1435 #define COMMON_LIB_INHERITANCE_HELP \
1436 "\n" \
1437 " libs and lib_dirs work differently than other flags in two respects.\n" \
1438 " First, they are inherited across static library boundaries until a\n" \
1439 " shared library or executable target is reached. Second, they are\n" \
1440 " uniquified so each one is only passed once (the first instance of it\n" \
1441 " will be the one used).\n"
1442
1443 #define LIBS_AND_LIB_DIRS_ORDERING_HELP \
1444 "\n" \
1445 " For \"libs\" and \"lib_dirs\" only, the values propagated from\n" \
1446 " dependencies (as described above) are applied last assuming they\n" \
1447 " are not already in the list.\n"
1448
1449 const char kLibDirs[] = "lib_dirs";
1450 const char kLibDirs_HelpShort[] =
1451 "lib_dirs: [directory list] Additional library directories.";
1452 const char kLibDirs_Help[] =
1453 R"(lib_dirs: Additional library directories.
1454
1455 A list of directories.
1456
1457 Specifies additional directories passed to the linker for searching for the
1458 required libraries. If an item is not an absolute path, it will be treated as
1459 being relative to the current build file.
1460 )" COMMON_LIB_INHERITANCE_HELP COMMON_ORDERING_HELP LIBS_AND_LIB_DIRS_ORDERING_HELP
1461 R"(
1462 Example
1463
1464 lib_dirs = [ "/usr/lib/foo", "lib/doom_melon" ]
1465 )";
1466
1467 const char kLibs[] = "libs";
1468 const char kLibs_HelpShort[] =
1469 "libs: [string list] Additional libraries to link.";
1470 const char kLibs_Help[] =
1471 R"(libs: Additional libraries to link.
1472
1473 A list of library names or library paths.
1474
1475 These libraries will be linked into the final binary (executable or shared
1476 library) containing the current target.
1477 )" COMMON_LIB_INHERITANCE_HELP
1478 R"(
1479 Types of libs
1480
1481 There are several different things that can be expressed in libs:
1482
1483 File paths
1484 Values containing '/' will be treated as references to files in the
1485 checkout. They will be rebased to be relative to the build directory and
1486 specified in the "libs" for linker tools. This facility should be used
1487 for libraries that are checked in to the version control. For libraries
1488 that are generated by the build, use normal GN deps to link them.
1489
1490 System libraries
1491 Values not containing '/' will be treated as system library names. These
1492 will be passed unmodified to the linker and prefixed with the
1493 "lib_switch" attribute of the linker tool. Generally you would set the
1494 "lib_dirs" so the given library is found. Your BUILD.gn file should not
1495 specify the switch (like "-l"): this will be encoded in the "lib_switch"
1496 of the tool.
1497 )" COMMON_ORDERING_HELP LIBS_AND_LIB_DIRS_ORDERING_HELP
1498 R"(
1499 Examples
1500
1501 On Windows:
1502 libs = [ "ctl3d.lib" ]
1503
1504 On Linux:
1505 libs = [ "ld" ]
1506 )";
1507
1508 const char kMetadata[] = "metadata";
1509 const char kMetadata_HelpShort[] = "metadata: [scope] Metadata of this target.";
1510 const char kMetadata_Help[] =
1511 R"(metadata: Metadata of this target.
1512
1513 Metadata is a collection of keys and values relating to a particular target.
1514 Values must be lists, allowing for sane and predictable collection behavior.
1515 Generally, these keys will include three types of lists: lists of ordinary
1516 strings, lists of filenames intended to be rebased according to their
1517 particular source directory, and lists of target labels intended to be used
1518 as barriers to the walk. Verification of these categories occurs at walk time,
1519 not creation time (since it is not clear until the walk which values are
1520 intended for which purpose).
1521
1522 Example
1523
1524 group("doom_melon") {
1525 metadata = {
1526 # These keys are not built in to GN but are interpreted when consuming
1527 # metadata.
1528 my_barrier = []
1529 my_files = [ "a.txt", "b.txt" ]
1530 }
1531 }
1532 )";
1533
1534 const char kOutputExtension[] = "output_extension";
1535 const char kOutputExtension_HelpShort[] =
1536 "output_extension: [string] Value to use for the output's file extension.";
1537 const char kOutputExtension_Help[] =
1538 R"(output_extension: Value to use for the output's file extension.
1539
1540 Normally the file extension for a target is based on the target type and the
1541 operating system, but in rare cases you will need to override the name (for
1542 example to use "libfreetype.so.6" instead of libfreetype.so on Linux).
1543
1544 This value should not include a leading dot. If undefined, the default
1545 specified on the tool will be used. If set to the empty string, no output
1546 extension will be used.
1547
1548 The output_extension will be used to set the "{{output_extension}}" expansion
1549 which the linker tool will generally use to specify the output file name. See
1550 "gn help tool".
1551
1552 Example
1553
1554 shared_library("freetype") {
1555 if (is_linux) {
1556 # Call the output "libfreetype.so.6"
1557 output_extension = "so.6"
1558 }
1559 ...
1560 }
1561
1562 # On Windows, generate a "mysettings.cpl" control panel applet. Control panel
1563 # applets are actually special shared libraries.
1564 if (is_win) {
1565 shared_library("mysettings") {
1566 output_extension = "cpl"
1567 ...
1568 }
1569 }
1570 )";
1571
1572 const char kOutputDir[] = "output_dir";
1573 const char kOutputDir_HelpShort[] =
1574 "output_dir: [directory] Directory to put output file in.";
1575 const char kOutputDir_Help[] =
1576 R"(output_dir: [directory] Directory to put output file in.
1577
1578 For library and executable targets, overrides the directory for the final
1579 output. This must be in the root_build_dir or a child thereof.
1580
1581 This should generally be in the root_out_dir or a subdirectory thereof (the
1582 root_out_dir will be the same as the root_build_dir for the default
1583 toolchain, and will be a subdirectory for other toolchains). Not putting the
1584 output in a subdirectory of root_out_dir can result in collisions between
1585 different toolchains, so you will need to take steps to ensure that your
1586 target is only present in one toolchain.
1587
1588 Normally the toolchain specifies the output directory for libraries and
1589 executables (see "gn help tool"). You will have to consult that for the
1590 default location. The default location will be used if output_dir is
1591 undefined or empty.
1592
1593 Example
1594
1595 shared_library("doom_melon") {
1596 output_dir = "$root_out_dir/plugin_libs"
1597 ...
1598 }
1599 )";
1600
1601 const char kOutputName[] = "output_name";
1602 const char kOutputName_HelpShort[] =
1603 "output_name: [string] Name for the output file other than the default.";
1604 const char kOutputName_Help[] =
1605 R"(output_name: Define a name for the output file other than the default.
1606
1607 Normally the output name of a target will be based on the target name, so the
1608 target "//foo/bar:bar_unittests" will generate an output file such as
1609 "bar_unittests.exe" (using Windows as an example).
1610
1611 Sometimes you will want an alternate name to avoid collisions or if the
1612 internal name isn't appropriate for public distribution.
1613
1614 The output name should have no extension or prefixes, these will be added
1615 using the default system rules. For example, on Linux an output name of "foo"
1616 will produce a shared library "libfoo.so". There is no way to override the
1617 output prefix of a linker tool on a per- target basis. If you need more
1618 flexibility, create a copy target to produce the file you want.
1619
1620 This variable is valid for all binary output target types.
1621
1622 Example
1623
1624 static_library("doom_melon") {
1625 output_name = "fluffy_bunny"
1626 }
1627 )";
1628
1629 const char kOutputPrefixOverride[] = "output_prefix_override";
1630 const char kOutputPrefixOverride_HelpShort[] =
1631 "output_prefix_override: [boolean] Don't use prefix for output name.";
1632 const char kOutputPrefixOverride_Help[] =
1633 R"(output_prefix_override: Don't use prefix for output name.
1634
1635 A boolean that overrides the output prefix for a target. Defaults to false.
1636
1637 Some systems use prefixes for the names of the final target output file. The
1638 normal example is "libfoo.so" on Linux for a target named "foo".
1639
1640 The output prefix for a given target type is specified on the linker tool
1641 (see "gn help tool"). Sometimes this prefix is undesired.
1642
1643 See also "gn help output_extension".
1644
1645 Example
1646
1647 shared_library("doom_melon") {
1648 # Normally this will produce "libdoom_melon.so" on Linux. Setting this flag
1649 # will produce "doom_melon.so".
1650 output_prefix_override = true
1651 ...
1652 }
1653 )";
1654
1655 const char kPartialInfoPlist[] = "partial_info_plist";
1656 const char kPartialInfoPlist_HelpShort[] =
1657 "partial_info_plist: [filename] Path plist from asset catalog compiler.";
1658 const char kPartialInfoPlist_Help[] =
1659 R"(partial_info_plist: [filename] Path plist from asset catalog compiler.
1660
1661 Valid for create_bundle target, corresponds to the path for the partial
1662 Info.plist created by the asset catalog compiler that needs to be merged
1663 with the application Info.plist (usually done by the post-processing script).
1664
1665 The file will be generated regardless of whether the asset compiler has
1666 been invoked or not. See "gn help create_bundle".
1667 )";
1668
1669 const char kOutputs[] = "outputs";
1670 const char kOutputs_HelpShort[] =
1671 "outputs: [file list] Output files for actions and copy targets.";
1672 const char kOutputs_Help[] =
1673 R"(outputs: Output files for actions and copy targets.
1674
1675 Outputs is valid for "copy", "action", and "action_foreach" target types and
1676 indicates the resulting files. Outputs must always refer to files in the
1677 build directory.
1678
1679 copy
1680 Copy targets should have exactly one entry in the outputs list. If there is
1681 exactly one source, this can be a literal file name or a source expansion.
1682 If there is more than one source, this must contain a source expansion to
1683 map a single input name to a single output name. See "gn help copy".
1684
1685 action_foreach
1686 Action_foreach targets must always use source expansions to map input files
1687 to output files. There can be more than one output, which means that each
1688 invocation of the script will produce a set of files (presumably based on
1689 the name of the input file). See "gn help action_foreach".
1690
1691 action
1692 Action targets (excluding action_foreach) must list literal output file(s)
1693 with no source expansions. See "gn help action".
1694 )";
1695
1696 const char kPool[] = "pool";
1697 const char kPool_HelpShort[] =
1698 "pool: [string] Label of the pool used by binary targets and actions.";
1699 const char kPool_Help[] =
1700 R"(pool: Label of the pool used by binary targets actions.
1701
1702 A fully-qualified label representing the pool that will be used for binary
1703 targets and actions. Pools are defined using the pool() {...} declaration.
1704
1705 Example
1706
1707 executable("binary") {
1708 pool = "//build:custom_pool"
1709 ...
1710 }
1711
1712 action("action") {
1713 pool = "//build:custom_pool"
1714 ...
1715 }
1716 )";
1717
1718 const char kPostProcessingArgs[] = "post_processing_args";
1719 const char kPostProcessingArgs_HelpShort[] =
1720 "post_processing_args: [string list] Args for the post-processing script.";
1721 const char kPostProcessingArgs_Help[] =
1722 R"(post_processing_args: [string list] Args for the post-processing script.
1723
1724 For create_bundle targets, post_processing_args is the list of arguments to
1725 pass to the post-processing script. Typically you would use source expansion
1726 (see "gn help source_expansion") to insert the source file names.
1727
1728 See also "gn help create_bundle".
1729 )";
1730
1731 const char kPostProcessingOutputs[] = "post_processing_outputs";
1732 const char kPostProcessingOutputs_HelpShort[] =
1733 "post_processing_outputs: [file list] Outputs of the post-processing step.";
1734 const char kPostProcessingOutputs_Help[] =
1735 R"(post_processing_outputs: [file list] Outputs of the post-processing step.
1736
1737 Outputs from the post-processing step of a create_bundle target. Must refer to
1738 files in the build directory.
1739
1740 See also "gn help create_bundle".
1741 )";
1742
1743 const char kPostProcessingScript[] = "post_processing_script";
1744 const char kPostProcessingScript_HelpShort[] =
1745 "post_processing_script: [file name] Script for the post-processing step.";
1746 const char kPostProcessingScript_Help[] =
1747 R"(post_processing_script: [file name] Script for the post-processing step."
1748
1749 An absolute or buildfile-relative file name of a Python script to run for a
1750 create_bundle target to perform the post-processing step.
1751
1752 See also "gn help create_bundle".
1753 )";
1754
1755 const char kPostProcessingSources[] = "post_processing_sources";
1756 const char kPostProcessingSources_HelpShort[] =
1757 "post_processing_sources: [file list] Sources for the post-processing "
1758 "step.";
1759 const char kPostProcessingSources_Help[] =
1760 R"(post_processing_sources: [file list] Sources for the post-processing step.
1761
1762 A list of files used as input for the post-processing step of a create_bundle
1763 target. Non-absolute paths will be resolved relative to the current build
1764 file.
1765
1766 See also "gn help create_bundle".
1767 )";
1768
1769 const char kPrecompiledHeader[] = "precompiled_header";
1770 const char kPrecompiledHeader_HelpShort[] =
1771 "precompiled_header: [string] Header file to precompile.";
1772 const char kPrecompiledHeader_Help[] =
1773 R"(precompiled_header: [string] Header file to precompile.
1774
1775 Precompiled headers will be used when a target specifies this value, or a
1776 config applying to this target specifies this value. In addition, the tool
1777 corresponding to the source files must also specify precompiled headers (see
1778 "gn help tool"). The tool will also specify what type of precompiled headers
1779 to use, by setting precompiled_header_type to either "gcc" or "msvc".
1780
1781 The precompiled header/source variables can be specified on a target or a
1782 config, but must be the same for all configs applying to a given target since
1783 a target can only have one precompiled header.
1784
1785 If you use both C and C++ sources, the precompiled header and source file
1786 will be compiled once per language. You will want to make sure to wrap C++
1787 includes in __cplusplus #ifdefs so the file will compile in C mode.
1788
1789 GCC precompiled headers
1790
1791 When using GCC-style precompiled headers, "precompiled_source" contains the
1792 path of a .h file that is precompiled and then included by all source files
1793 in targets that set "precompiled_source".
1794
1795 The value of "precompiled_header" is not used with GCC-style precompiled
1796 headers.
1797
1798 MSVC precompiled headers
1799
1800 When using MSVC-style precompiled headers, the "precompiled_header" value is
1801 a string corresponding to the header. This is NOT a path to a file that GN
1802 recognises, but rather the exact string that appears in quotes after
1803 an #include line in source code. The compiler will match this string against
1804 includes or forced includes (/FI).
1805
1806 MSVC also requires a source file to compile the header with. This must be
1807 specified by the "precompiled_source" value. In contrast to the header value,
1808 this IS a GN-style file name, and tells GN which source file to compile to
1809 make the .pch file used for subsequent compiles.
1810
1811 For example, if the toolchain specifies MSVC headers:
1812
1813 toolchain("vc_x64") {
1814 ...
1815 tool("cxx") {
1816 precompiled_header_type = "msvc"
1817 ...
1818
1819 You might make a config like this:
1820
1821 config("use_precompiled_headers") {
1822 precompiled_header = "build/precompile.h"
1823 precompiled_source = "//build/precompile.cc"
1824
1825 # Either your source files should #include "build/precompile.h"
1826 # first, or you can do this to force-include the header.
1827 cflags = [ "/FI$precompiled_header" ]
1828 }
1829
1830 And then define a target that uses the config:
1831
1832 executable("doom_melon") {
1833 configs += [ ":use_precompiled_headers" ]
1834 ...
1835 )";
1836
1837 const char kPrecompiledHeaderType[] = "precompiled_header_type";
1838 const char kPrecompiledHeaderType_HelpShort[] =
1839 "precompiled_header_type: [string] \"gcc\" or \"msvc\".";
1840 const char kPrecompiledHeaderType_Help[] =
1841 R"(precompiled_header_type: [string] "gcc" or "msvc".
1842
1843 See "gn help precompiled_header".
1844 )";
1845
1846 const char kPrecompiledSource[] = "precompiled_source";
1847 const char kPrecompiledSource_HelpShort[] =
1848 "precompiled_source: [file name] Source file to precompile.";
1849 const char kPrecompiledSource_Help[] =
1850 R"(precompiled_source: [file name] Source file to precompile.
1851
1852 The source file that goes along with the precompiled_header when using
1853 "msvc"-style precompiled headers. It will be implicitly added to the sources
1854 of the target. See "gn help precompiled_header".
1855 )";
1856
1857 const char kProductType[] = "product_type";
1858 const char kProductType_HelpShort[] =
1859 "product_type: [string] Product type for the bundle.";
1860 const char kProductType_Help[] =
1861 R"(product_type: [string] Product type for the bundle.
1862
1863 Valid for "create_bundle" and "bundle_data" targets.
1864
1865 Correspond to the type of the bundle. Used by transparent "create_bundle"
1866 target to control whether a "bundle_data" needs to be propagated or not.
1867
1868 When generating Xcode project, the product_type is propagated and only
1869 "create_bundle" with a non-empty product_type will have a corresponding
1870 target in the project.
1871 )";
1872
1873 const char kPublic[] = "public";
1874 const char kPublic_HelpShort[] =
1875 "public: [file list] Declare public header files for a target.";
1876 const char kPublic_Help[] =
1877 R"(public: Declare public header files for a target.
1878
1879 A list of files that other targets can include. These permissions are checked
1880 via the "check" command (see "gn help check").
1881
1882 If no public files are declared, other targets (assuming they have visibility
1883 to depend on this target) can include any file in the sources list. If this
1884 variable is defined on a target, dependent targets may only include files on
1885 this whitelist unless that target is marked as a friend (see "gn help
1886 friend").
1887
1888 Header file permissions are also subject to visibility. A target must be
1889 visible to another target to include any files from it at all and the public
1890 headers indicate which subset of those files are permitted. See "gn help
1891 visibility" for more.
1892
1893 Public files are inherited through the dependency tree. So if there is a
1894 dependency A -> B -> C, then A can include C's public headers. However, the
1895 same is NOT true of visibility, so unless A is in C's visibility list, the
1896 include will be rejected.
1897
1898 GN only knows about files declared in the "sources" and "public" sections of
1899 targets. If a file is included that is not known to the build, it will be
1900 allowed.
1901
1902 It is common for test targets to need to include private headers for their
1903 associated code. In this case, list the test target in the "friend" list of
1904 the target that owns the private header to allow the inclusion. See
1905 "gn help friend" for more.
1906
1907 When a binary target has no explicit or implicit public headers (a "public"
1908 list is defined but is empty), GN assumes that the target can not propagate
1909 any compile-time dependencies up the dependency tree. In this case, the build
1910 can be parallelized more efficiently.
1911 Say there are dependencies:
1912 A (shared library) -> B (shared library) -> C (action).
1913 Normally C must complete before any source files in A can compile (because
1914 there might be generated includes). But when B explicitly declares no public
1915 headers, C can execute in parallel with A's compile steps. C must still be
1916 complete before any dependents link.
1917
1918 Examples
1919
1920 These exact files are public:
1921 public = [ "foo.h", "bar.h" ]
1922
1923 No files are public (no targets may include headers from this one):
1924 # This allows starting compilation in dependent targets earlier.
1925 public = []
1926 )";
1927
1928 const char kPublicConfigs[] = "public_configs";
1929 const char kPublicConfigs_HelpShort[] =
1930 "public_configs: [label list] Configs applied to dependents.";
1931 const char kPublicConfigs_Help[] =
1932 R"(public_configs: Configs to be applied on dependents.
1933
1934 A list of config labels.
1935
1936 Targets directly depending on this one will have the configs listed in this
1937 variable added to them. These configs will also apply to the current target.
1938 Generally, public configs are used to apply defines and include directories
1939 necessary to compile this target's header files.
1940
1941 See also "gn help all_dependent_configs".
1942
1943 Propagation of public configs
1944
1945 Public configs are applied to all targets that depend directly on this one.
1946 These dependent targets can further push this target's public configs
1947 higher in the dependency tree by depending on it via public_deps (see "gn
1948 help public_deps").
1949
1950 static_library("toplevel") {
1951 # This target will get "my_config" applied to it. However, since this
1952 # target uses "deps" and not "public_deps", targets that depend on this
1953 # one won't get it.
1954 deps = [ ":intermediate" ]
1955 }
1956
1957 static_library("intermediate") {
1958 # Depending on "lower" in any way will apply "my_config" to this target.
1959 # Additionall, since this target depends on "lower" via public_deps,
1960 # targets that depend on this one will also get "my_config".
1961 public_deps = [ ":lower" ]
1962 }
1963
1964 static_library("lower") {
1965 # This will get applied to all targets that depend on this one.
1966 public_configs = [ ":my_config" ]
1967 }
1968
1969 Public config propagation happens in a second phase once a target and all of
1970 its dependencies have been resolved. Therefore, a target will not see these
1971 force-added configs in their "configs" variable while the script is running,
1972 and they can not be removed. As a result, this capability should generally
1973 only be used to add defines and include directories rather than setting
1974 complicated flags that some targets may not want.
1975
1976 Public configs may or may not be propagated across toolchain boundaries
1977 depending on the value of the propagates_configs flag (see "gn help
1978 toolchain") on the toolchain of the target declaring the public_config.
1979
1980 Avoiding applying public configs to this target
1981
1982 If you want the config to apply to targets that depend on this one, but NOT
1983 this one, define an extra layer of indirection using a group:
1984
1985 # External targets depend on this group.
1986 group("my_target") {
1987 # Config to apply to all targets that depend on this one.
1988 public_configs = [ ":external_settings" ]
1989 deps = [ ":internal_target" ]
1990 }
1991
1992 # Internal target to actually compile the sources.
1993 static_library("internal_target") {
1994 # Force all external targets to depend on the group instead of directly
1995 # on this so the "external_settings" config will get applied.
1996 visibility = [ ":my_target" ]
1997 ...
1998 }
1999
2000 )" COMMON_ORDERING_HELP;
2001
2002 const char kPublicDeps[] = "public_deps";
2003 const char kPublicDeps_HelpShort[] =
2004 "public_deps: [label list] Declare public dependencies.";
2005 const char kPublicDeps_Help[] =
2006 R"(public_deps: Declare public dependencies.
2007
2008 Public dependencies are like private dependencies (see "gn help deps") but
2009 additionally express that the current target exposes the listed deps as part
2010 of its public API.
2011
2012 This has several ramifications:
2013
2014 - public_configs that are part of the dependency are forwarded to direct
2015 dependents.
2016
2017 - Public headers in the dependency are usable by dependents (includes do
2018 not require a direct dependency or visibility).
2019
2020 - If the current target is a shared library, other shared libraries that it
2021 publicly depends on (directly or indirectly) are propagated up the
2022 dependency tree to dependents for linking.
2023
2024 See also "gn help public_configs".
2025
2026 Discussion
2027
2028 Say you have three targets: A -> B -> C. C's visibility may allow B to depend
2029 on it but not A. Normally, this would prevent A from including any headers
2030 from C, and C's public_configs would apply only to B.
2031
2032 If B lists C in its public_deps instead of regular deps, A will now inherit
2033 C's public_configs and the ability to include C's public headers.
2034
2035 Generally if you are writing a target B and you include C's headers as part
2036 of B's public headers, or targets depending on B should consider B and C to
2037 be part of a unit, you should use public_deps instead of deps.
2038
2039 Example
2040
2041 # This target can include files from "c" but not from
2042 # "super_secret_implementation_details".
2043 executable("a") {
2044 deps = [ ":b" ]
2045 }
2046
2047 shared_library("b") {
2048 deps = [ ":super_secret_implementation_details" ]
2049 public_deps = [ ":c" ]
2050 }
2051 )";
2052
2053 const char kRebase[] = "rebase";
2054 const char kRebase_HelpShort[] =
2055 "rebase: [boolean] Rebase collected metadata as files.";
2056 const char kRebase_Help[] =
2057 R"(rebase: Rebase collected metadata as files.
2058
2059 A boolean that triggers a rebase of collected metadata strings based on their
2060 declared file. Defaults to false.
2061
2062 Metadata generally declares files as strings relative to the local build file.
2063 However, this data is often used in other contexts, and so setting this flag
2064 will force the metadata collection to be rebased according to the local build
2065 file's location and thus allow the filename to be used anywhere.
2066
2067 Setting this flag will raise an error if any target's specified metadata is
2068 not a string value.
2069
2070 See also "gn help generated_file".
2071 )";
2072
2073 const char kResponseFileContents[] = "response_file_contents";
2074 const char kResponseFileContents_HelpShort[] =
2075 "response_file_contents: [string list] Contents of .rsp file for actions.";
2076 const char kResponseFileContents_Help[] =
2077 R"*(response_file_contents: Contents of a response file for actions.
2078
2079 Sometimes the arguments passed to a script can be too long for the system's
2080 command-line capabilities. This is especially the case on Windows where the
2081 maximum command-line length is less than 8K. A response file allows you to
2082 pass an unlimited amount of data to a script in a temporary file for an
2083 action or action_foreach target.
2084
2085 If the response_file_contents variable is defined and non-empty, the list
2086 will be treated as script args (including possibly substitution patterns)
2087 that will be written to a temporary file at build time. The name of the
2088 temporary file will be substituted for "{{response_file_name}}" in the script
2089 args.
2090
2091 The response file contents will always be quoted and escaped according to
2092 Unix shell rules. To parse the response file, the Python script should use
2093 "shlex.split(file_contents)".
2094
2095 Example
2096
2097 action("process_lots_of_files") {
2098 script = "process.py",
2099 inputs = [ ... huge list of files ... ]
2100
2101 # Write all the inputs to a response file for the script. Also,
2102 # make the paths relative to the script working directory.
2103 response_file_contents = rebase_path(inputs, root_build_dir)
2104
2105 # The script expects the name of the response file in --file-list.
2106 args = [
2107 "--enable-foo",
2108 "--file-list={{response_file_name}}",
2109 ]
2110 }
2111 )*";
2112
2113 const char kScript[] = "script";
2114 const char kScript_HelpShort[] = "script: [file name] Script file for actions.";
2115 const char kScript_Help[] =
2116 R"(script: Script file for actions.
2117
2118 An absolute or buildfile-relative file name of a Python script to run for a
2119 action and action_foreach targets (see "gn help action" and "gn help
2120 action_foreach").
2121 )";
2122
2123 const char kSources[] = "sources";
2124 const char kSources_HelpShort[] =
2125 "sources: [file list] Source files for a target.";
2126 const char kSources_Help[] =
2127 R"(sources: Source files for a target
2128
2129 A list of files. Non-absolute paths will be resolved relative to the current
2130 build file.
2131
2132 Sources for binary targets
2133
2134 For binary targets (source sets, executables, and libraries), the known file
2135 types will be compiled with the associated tools. Unknown file types and
2136 headers will be skipped. However, you should still list all C/C+ header files
2137 so GN knows about the existence of those files for the purposes of include
2138 checking.
2139
2140 As a special case, a file ending in ".def" will be treated as a Windows
2141 module definition file. It will be appended to the link line with a
2142 preceding "/DEF:" string. There must be at most one .def file in a target
2143 and they do not cross dependency boundaries (so specifying a .def file in a
2144 static library or source set will have no effect on the executable or shared
2145 library they're linked into).
2146
2147 For Rust targets that do not specify a crate_root, then the crate_root will
2148 look for a lib.rs file (or main.rs for executable) or a single file in
2149 sources, if sources contains only one file.
2150
2151 Sources for non-binary targets
2152
2153 action_foreach
2154 The sources are the set of files that the script will be executed over. The
2155 script will run once per file.
2156
2157 action
2158 The sources will be treated the same as inputs. See "gn help inputs" for
2159 more information and usage advice.
2160
2161 copy
2162 The source are the source files to copy.
2163 )";
2164
2165 const char kSwiftflags[] = "swiftflags";
2166 const char kSwiftflags_HelpShort[] =
2167 "swiftflags: [string list] Flags passed to the swift compiler.";
2168 const char* kSwiftflags_Help =
2169 R"(swiftflags: Flags passed to the swift compiler.
2170
2171 A list of strings.
2172
2173 "swiftflags" are passed to any invocation of a tool that takes an .swift
2174 file as input.
2175 )" COMMON_ORDERING_HELP;
2176
2177 const char kXcodeTestApplicationName[] = "xcode_test_application_name";
2178 const char kXcodeTestApplicationName_HelpShort[] =
2179 "xcode_test_application_name: [string] Name for Xcode test target.";
2180 const char kXcodeTestApplicationName_Help[] =
2181 R"(xcode_test_application_name: Name for Xcode test target.
2182
2183 Each unit and ui test target must have a test application target, and this
2184 value is used to specify the relationship. Only meaningful to Xcode (used as
2185 part of the Xcode project generation).
2186
2187 See "gn help create_bundle" for more information.
2188
2189 Example
2190
2191 create_bundle("chrome_xctest") {
2192 test_application_name = "chrome"
2193 ...
2194 }
2195 )";
2196
2197 const char kTestonly[] = "testonly";
2198 const char kTestonly_HelpShort[] =
2199 "testonly: [boolean] Declares a target must only be used for testing.";
2200 const char kTestonly_Help[] =
2201 R"(testonly: Declares a target must only be used for testing.
2202
2203 Boolean. Defaults to false.
2204
2205 When a target is marked "testonly = true", it must only be depended on by
2206 other test-only targets. Otherwise, GN will issue an error that the
2207 depenedency is not allowed.
2208
2209 This feature is intended to prevent accidentally shipping test code in a
2210 final product.
2211
2212 Example
2213
2214 source_set("test_support") {
2215 testonly = true
2216 ...
2217 }
2218 )";
2219
2220 const char kVisibility[] = "visibility";
2221 const char kVisibility_HelpShort[] =
2222 "visibility: [label list] A list of labels that can depend on a target.";
2223 const char kVisibility_Help[] =
2224 R"(visibility: A list of labels that can depend on a target.
2225
2226 A list of labels and label patterns that define which targets can depend on
2227 the current one. These permissions are checked via the "check" command (see
2228 "gn help check").
2229
2230 If visibility is not defined, it defaults to public ("*").
2231
2232 If visibility is defined, only the targets with labels that match it can
2233 depend on the current target. The empty list means no targets can depend on
2234 the current target.
2235
2236 Tip: Often you will want the same visibility for all targets in a BUILD file.
2237 In this case you can just put the definition at the top, outside of any
2238 target, and the targets will inherit that scope and see the definition.
2239
2240 Patterns
2241
2242 See "gn help label_pattern" for more details on what types of patterns are
2243 supported. If a toolchain is specified, only targets in that toolchain will
2244 be matched. If a toolchain is not specified on a pattern, targets in all
2245 toolchains will be matched.
2246
2247 Examples
2248
2249 Only targets in the current buildfile ("private"):
2250 visibility = [ ":*" ]
2251
2252 No targets (used for targets that should be leaf nodes):
2253 visibility = []
2254
2255 Any target ("public", the default):
2256 visibility = [ "*" ]
2257
2258 All targets in the current directory and any subdirectory:
2259 visibility = [ "./*" ]
2260
2261 Any target in "//bar/BUILD.gn":
2262 visibility = [ "//bar:*" ]
2263
2264 Any target in "//bar/" or any subdirectory thereof:
2265 visibility = [ "//bar/*" ]
2266
2267 Just these specific targets:
2268 visibility = [ ":mything", "//foo:something_else" ]
2269
2270 Any target in the current directory and any subdirectory thereof, plus
2271 any targets in "//bar/" and any subdirectory thereof.
2272 visibility = [ "./*", "//bar/*" ]
2273 )";
2274
2275 const char kWalkKeys[] = "walk_keys";
2276 const char kWalkKeys_HelpShort[] =
2277 "walk_keys: [string list] Key(s) for managing the metadata collection "
2278 "walk.";
2279 const char kWalkKeys_Help[] =
2280 R"(walk_keys: Key(s) for managing the metadata collection walk.
2281
2282 Defaults to [""].
2283
2284 These keys are used to control the next step in a collection walk, acting as
2285 barriers. If a specified key is defined in a target's metadata, the walk will
2286 use the targets listed in that value to determine which targets are walked.
2287
2288 If no walk_keys are specified for a generated_file target (i.e. "[""]"), the
2289 walk will touch all deps and data_deps of the specified target recursively.
2290
2291 See "gn help generated_file".
2292 )";
2293
2294 const char kWeakFrameworks[] = "weak_frameworks";
2295 const char kWeakFrameworks_HelpShort[] =
2296 "weak_frameworks: [name list] Name of frameworks that must be weak linked.";
2297 const char kWeakFrameworks_Help[] =
2298 R"(weak_frameworks: [name list] Name of frameworks that must be weak linked.
2299
2300 A list of framework names.
2301
2302 The frameworks named in that list will be weak linked with any dynamic link
2303 type target. Weak linking instructs the dynamic loader to attempt to load
2304 the framework, but if it is not able to do so, it leaves any imported symbols
2305 unresolved. This is typically used when a framework is present in a new
2306 version of an SDK but not on older versions of the OS that the software runs
2307 on.
2308 )" COMMON_ORDERING_HELP
2309 R"(
2310 Example
2311
2312 weak_frameworks = [ "OnlyOnNewerOSes.framework" ]
2313 )";
2314
2315 const char kWriteValueContents[] = "contents";
2316 const char kWriteValueContents_HelpShort[] =
2317 "contents: Contents to write to file.";
2318 const char kWriteValueContents_Help[] =
2319 R"(contents: Contents to write to file.
2320
2321 The contents of the file for a generated_file target.
2322 See "gn help generated_file".
2323 )";
2324
2325 const char kWriteOutputConversion[] = "output_conversion";
2326 const char kWriteOutputConversion_HelpShort[] =
2327 "output_conversion: Data format for generated_file targets.";
2328 const char kWriteOutputConversion_Help[] =
2329 R"(output_conversion: Data format for generated_file targets.
2330
2331 Controls how the "contents" of a generated_file target is formatted.
2332 See `gn help io_conversion`.
2333 )";
2334
2335 const char kWriteRuntimeDeps[] = "write_runtime_deps";
2336 const char kWriteRuntimeDeps_HelpShort[] =
2337 "write_runtime_deps: Writes the target's runtime_deps to the given path.";
2338 const char kWriteRuntimeDeps_Help[] =
2339 R"(write_runtime_deps: Writes the target's runtime_deps to the given path.
2340
2341 Does not synchronously write the file, but rather schedules it to be written
2342 at the end of generation.
2343
2344 If the file exists and the contents are identical to that being written, the
2345 file will not be updated. This will prevent unnecessary rebuilds of targets
2346 that depend on this file.
2347
2348 Path must be within the output directory.
2349
2350 See "gn help runtime_deps" for how the runtime dependencies are computed.
2351
2352 The format of this file will list one file per line with no escaping. The
2353 files will be relative to the root_build_dir. The first line of the file will
2354 be the main output file of the target itself. The file contents will be the
2355 same as requesting the runtime deps be written on the command line (see "gn
2356 help --runtime-deps-list-file").
2357 )";
2358
2359 const char kXcodeExtraAttributes[] = "xcode_extra_attributes";
2360 const char kXcodeExtraAttributes_HelpShort[] =
2361 "xcode_extra_attributes: [scope] Extra attributes for Xcode projects.";
2362 const char kXcodeExtraAttributes_Help[] =
2363 R"(xcode_extra_attributes: [scope] Extra attributes for Xcode projects.
2364
2365 The value defined in this scope will be copied to the EXTRA_ATTRIBUTES
2366 property of the generated Xcode project. They are only meaningful when
2367 generating with --ide=xcode.
2368
2369 See "gn help create_bundle" for more information.
2370 )";
2371
2372 // -----------------------------------------------------------------------------
2373
VariableInfo()2374 VariableInfo::VariableInfo() : help_short(""), help("") {}
2375
2376 VariableInfo::VariableInfo(const char* in_help_short, const char* in_help)
2377 : help_short(in_help_short), help(in_help) {}
2378
2379 #define INSERT_VARIABLE(var) \
2380 info_map[k##var] = VariableInfo(k##var##_HelpShort, k##var##_Help);
2381
2382 const VariableInfoMap& GetBuiltinVariables() {
2383 static VariableInfoMap info_map;
2384 if (info_map.empty()) {
2385 INSERT_VARIABLE(CurrentCpu)
2386 INSERT_VARIABLE(CurrentOs)
2387 INSERT_VARIABLE(CurrentToolchain)
2388 INSERT_VARIABLE(DefaultToolchain)
2389 INSERT_VARIABLE(GnVersion)
2390 INSERT_VARIABLE(HostCpu)
2391 INSERT_VARIABLE(HostOs)
2392 INSERT_VARIABLE(Invoker)
2393 INSERT_VARIABLE(PythonPath)
2394 INSERT_VARIABLE(RootBuildDir)
2395 INSERT_VARIABLE(RootGenDir)
2396 INSERT_VARIABLE(RootOutDir)
2397 INSERT_VARIABLE(TargetCpu)
2398 INSERT_VARIABLE(TargetGenDir)
2399 INSERT_VARIABLE(TargetName)
2400 INSERT_VARIABLE(TargetOs)
2401 INSERT_VARIABLE(TargetOutDir)
2402 }
2403 return info_map;
2404 }
2405
2406 const VariableInfoMap& GetTargetVariables() {
2407 static VariableInfoMap info_map;
2408 if (info_map.empty()) {
2409 INSERT_VARIABLE(AllDependentConfigs)
2410 INSERT_VARIABLE(AllowCircularIncludesFrom)
2411 INSERT_VARIABLE(GenDeps)
2412 INSERT_VARIABLE(Arflags)
2413 INSERT_VARIABLE(Args)
2414 INSERT_VARIABLE(Asmflags)
2415 INSERT_VARIABLE(AssertNoDeps)
2416 INSERT_VARIABLE(BundleRootDir)
2417 INSERT_VARIABLE(BundleContentsDir)
2418 INSERT_VARIABLE(BundleResourcesDir)
2419 INSERT_VARIABLE(BundleDepsFilter)
2420 INSERT_VARIABLE(BundleExecutableDir)
2421 INSERT_VARIABLE(XcassetCompilerFlags)
2422 INSERT_VARIABLE(Transparent)
2423 INSERT_VARIABLE(Cflags)
2424 INSERT_VARIABLE(CflagsC)
2425 INSERT_VARIABLE(CflagsCC)
2426 INSERT_VARIABLE(CflagsObjC)
2427 INSERT_VARIABLE(CflagsObjCC)
2428 INSERT_VARIABLE(CheckIncludes)
2429 INSERT_VARIABLE(CodeSigningArgs)
2430 INSERT_VARIABLE(CodeSigningOutputs)
2431 INSERT_VARIABLE(CodeSigningScript)
2432 INSERT_VARIABLE(CodeSigningSources)
2433 INSERT_VARIABLE(CompleteStaticLib)
2434 INSERT_VARIABLE(Configs)
2435 INSERT_VARIABLE(Data)
2436 INSERT_VARIABLE(DataDeps)
2437 INSERT_VARIABLE(DataKeys)
2438 INSERT_VARIABLE(Defines)
2439 INSERT_VARIABLE(Depfile)
2440 INSERT_VARIABLE(Deps)
2441 INSERT_VARIABLE(Mnemonic)
2442 INSERT_VARIABLE(Externs)
2443 INSERT_VARIABLE(Friend)
2444 INSERT_VARIABLE(FrameworkDirs)
2445 INSERT_VARIABLE(Frameworks)
2446 INSERT_VARIABLE(IncludeDirs)
2447 INSERT_VARIABLE(Inputs)
2448 INSERT_VARIABLE(Ldflags)
2449 INSERT_VARIABLE(Libs)
2450 INSERT_VARIABLE(LibDirs)
2451 INSERT_VARIABLE(Metadata)
2452 INSERT_VARIABLE(OutputDir)
2453 INSERT_VARIABLE(OutputExtension)
2454 INSERT_VARIABLE(OutputName)
2455 INSERT_VARIABLE(OutputPrefixOverride)
2456 INSERT_VARIABLE(Outputs)
2457 INSERT_VARIABLE(PartialInfoPlist)
2458 INSERT_VARIABLE(Pool)
2459 INSERT_VARIABLE(PostProcessingArgs)
2460 INSERT_VARIABLE(PostProcessingOutputs)
2461 INSERT_VARIABLE(PostProcessingScript)
2462 INSERT_VARIABLE(PostProcessingSources)
2463 INSERT_VARIABLE(PrecompiledHeader)
2464 INSERT_VARIABLE(PrecompiledHeaderType)
2465 INSERT_VARIABLE(PrecompiledSource)
2466 INSERT_VARIABLE(ProductType)
2467 INSERT_VARIABLE(Public)
2468 INSERT_VARIABLE(PublicConfigs)
2469 INSERT_VARIABLE(PublicDeps)
2470 INSERT_VARIABLE(Rebase)
2471 INSERT_VARIABLE(ResponseFileContents)
2472 INSERT_VARIABLE(Script)
2473 INSERT_VARIABLE(Sources)
2474 INSERT_VARIABLE(Swiftflags)
2475 INSERT_VARIABLE(XcodeTestApplicationName)
2476 INSERT_VARIABLE(Testonly)
2477 INSERT_VARIABLE(Visibility)
2478 INSERT_VARIABLE(WalkKeys)
2479 INSERT_VARIABLE(WeakFrameworks)
2480 INSERT_VARIABLE(WriteOutputConversion)
2481 INSERT_VARIABLE(WriteValueContents)
2482 INSERT_VARIABLE(WriteRuntimeDeps)
2483 INSERT_VARIABLE(XcodeExtraAttributes)
2484 InsertRustVariables(&info_map);
2485 InsertSwiftVariables(&info_map);
2486 }
2487 return info_map;
2488 }
2489
2490 #undef INSERT_VARIABLE
2491
2492 } // namespace variables
2493