| OLD | NEW |
| 1 # GN Language and Operation | 1 # GN Language and Operation |
| 2 | 2 |
| 3 [TOC] | 3 [TOC] |
| 4 | 4 |
| 5 ## Introduction | 5 ## Introduction |
| 6 | 6 |
| 7 This page describes many of the language details and behaviors. | 7 This page describes many of the language details and behaviors. |
| 8 | 8 |
| 9 ### Use the built-in help! | 9 ### Use the built-in help! |
| 10 | 10 |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 "//base/test/foo.cc" | 256 "//base/test/foo.cc" |
| 257 ``` | 257 ``` |
| 258 | 258 |
| 259 System absolute names (rare, normally used for include directories): | 259 System absolute names (rare, normally used for include directories): |
| 260 | 260 |
| 261 ``` | 261 ``` |
| 262 "/usr/local/include/" | 262 "/usr/local/include/" |
| 263 "/C:/Program Files/Windows Kits/Include" | 263 "/C:/Program Files/Windows Kits/Include" |
| 264 ``` | 264 ``` |
| 265 | 265 |
| 266 ### Labels | |
| 267 | |
| 268 Everything that can participate in the dependency graph (targets, | |
| 269 configs, and toolchains) are identified by labels which are strings of a | |
| 270 defined format. A common label looks like this: | |
| 271 | |
| 272 ``` | |
| 273 "//base/test:test_support" | |
| 274 ``` | |
| 275 | |
| 276 which consists of a source-root-absolute path, a colon, and a name. This | |
| 277 means to look for the thing named "test\_support" in | |
| 278 `src/base/test/BUILD.gn`. | |
| 279 | |
| 280 When loading a build file, if it doesn't exist in the given location | |
| 281 relative to the source root, GN will look in the secondary tree in | |
| 282 `build/secondary`. The structure of this tree mirrors the main | |
| 283 repository and is a way to add build files for directories that may be | |
| 284 pulled from other repositories where we can't easily check in BUILD | |
| 285 files. The secondary tree is a fallback rather than an override, so a file in | |
| 286 the normal location always takes precedence. | |
| 287 | |
| 288 A canonical label also includes the label of the toolchain being used. | |
| 289 Normally, the toolchain label is implicitly inherited, but you can | |
| 290 include it to specify cross-toolchain dependencies (see "Toolchains" | |
| 291 below). | |
| 292 | |
| 293 ``` | |
| 294 "//base/test:test_support(//build/toolchain/win:msvc)" | |
| 295 ``` | |
| 296 | |
| 297 In this case it will look for the toolchain definition called "msvc" | |
| 298 in the file `//build/toolchain/win` to know how to compile this target. | |
| 299 | |
| 300 If you want to refer to something in the same buildfile, you can omit | |
| 301 the path name and just start with a colon. | |
| 302 | |
| 303 ``` | |
| 304 ":base" | |
| 305 ``` | |
| 306 | |
| 307 Labels can be specified as being relative to the current directory. | |
| 308 Stylistically, we prefer to use absolute paths for all non-file-local | |
| 309 references unless a build file needs to be run in different contexts (like | |
| 310 a project needs to be both standalone and pulled into other projects in | |
| 311 difference places in the directory hierarchy). | |
| 312 | |
| 313 ``` | |
| 314 "source/plugin:myplugin" # Prefer not to do these. | |
| 315 "../net:url_request" | |
| 316 ``` | |
| 317 | |
| 318 If a name is unspecified, it will inherit the directory name. Stylistically, we | |
| 319 prefer to omit the colon and name in these cases. | |
| 320 | |
| 321 ``` | |
| 322 "//net" = "//net:net" | |
| 323 "//tools/gn" = "//tools/gn:gn" | |
| 324 ``` | |
| 325 | |
| 326 ## Build configuration | 266 ## Build configuration |
| 327 | 267 |
| 328 ### Overall build flow | |
| 329 | |
| 330 1. Look for `.gn` file in the current directory and walk up the | |
| 331 directory tree until one is found. Set this directory to be the | |
| 332 "source root" and interpret this file to find the name of the build | |
| 333 config file. | |
| 334 2. Execute the build config file (this is the default toolchain). In Chrome | |
| 335 this is `//build/config/BUILDCONFIG.gn`. | |
| 336 3. Load the `BUILD.gn` file in the root directory. | |
| 337 4. Recursively load `BUILD.gn` in other directories to resolve all | |
| 338 current dependencies. If a BUILD file isn't found in the specified | |
| 339 location, GN will look in the corresponding location inside | |
| 340 `build/secondary`. | |
| 341 5. When a target's dependencies are resolved, write out the `.ninja` | |
| 342 file to disk. | |
| 343 6. When all targets are resolved, write out the root `build.ninja` | |
| 344 file. If the top-level build file defines a group called "default" | |
| 345 (i.e., `//:default`), GN will tell Ninja to use that for the | |
| 346 default build target, rather than building everything. (You can | |
| 347 still use `ninja all` to build everything). | |
| 348 | |
| 349 ### The build config file | |
| 350 | |
| 351 The first file executed is the build config file. The name of this file | |
| 352 is specified in the `.gn` file that marks the root of the repository. In | |
| 353 Chrome it is `//build/config/BUILDCONFIG.gn`. There is only one build | |
| 354 config file. | |
| 355 | |
| 356 This file sets up the scope in which all other build files will execute. | |
| 357 Any arguments, variables, defaults, etc. set up in this file will be | |
| 358 visible to all files in the build. | |
| 359 | |
| 360 It is executed once for each toolchain (see "Toolchains"). | |
| 361 | |
| 362 ### Build arguments | |
| 363 | |
| 364 Arguments can be passed in from the command line (and from other | |
| 365 toolchains, see "Toolchains" below). You declare which arguments you | |
| 366 accept and specify default values via `declare_args`. | |
| 367 | |
| 368 See `gn help buildargs` for an overview of how this works. See `gn help | |
| 369 declare_args` for specifics on declaring them. | |
| 370 | |
| 371 It is an error to declare a given argument more than once in a given | |
| 372 scope. Typically arguments would be declared in an imported file (to | |
| 373 share them among some subset of the build) or in the main build config | |
| 374 file (to make them global). | |
| 375 | |
| 376 ### Target defaults | |
| 377 | |
| 378 You can set up some default values for a given target type. This is | |
| 379 normally done in the build config file to set a list of default configs | |
| 380 that defines the build flags and other setup information for each target | |
| 381 type. | |
| 382 | |
| 383 See `gn help set_defaults`. | |
| 384 | |
| 385 For example, when you declare a `static_library`, the target defaults | |
| 386 for a static library are applied. These values can be overwritten, | |
| 387 modified, or preserved by a target. | |
| 388 | |
| 389 ``` | |
| 390 # This call is typically in the build config file (see above). | |
| 391 set_defaults("static_library") { | |
| 392 configs = [ "//build:rtti_setup", "//build:extra_warnings" ] | |
| 393 } | |
| 394 | |
| 395 # This would be in your directory's BUILD.gn file. | |
| 396 static_library("mylib") { | |
| 397 # At this point configs is set to [ "//build:rtti_setup", "//build:extra_warni
ngs" ] | |
| 398 # by default but may be modified. | |
| 399 configs -= "//build:extra_warnings" # Don't want these warnings. | |
| 400 configs += ":mylib_config" # Add some more configs. | |
| 401 } | |
| 402 ``` | |
| 403 | |
| 404 The other use-case for setting target defaults is when you define your | |
| 405 own target type via `template` and want to specify certain default | |
| 406 values. | |
| 407 | |
| 408 ## Targets | 268 ## Targets |
| 409 | 269 |
| 410 A target is a node in the build graph. It usually represents some kind | 270 A target is a node in the build graph. It usually represents some kind |
| 411 of executable or library file that will be generated. Targets depend on | 271 of executable or library file that will be generated. Targets depend on |
| 412 other targets. The built-in target types (see `gn help <targettype>` for | 272 other targets. The built-in target types (see `gn help <targettype>` for |
| 413 more help) are: | 273 more help) are: |
| 414 | 274 |
| 415 * `action`: Run a script to generate a file. | 275 * `action`: Run a script to generate a file. |
| 416 * `action_foreach`: Run a script once for each source file. | 276 * `action_foreach`: Run a script once for each source file. |
| 417 * `bundle_data`: Declare data to go into a Mac/iOS bundle. | 277 * `bundle_data`: Declare data to go into a Mac/iOS bundle. |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 ``` | 368 ``` |
| 509 | 369 |
| 510 A target can forward a config to all dependents until a link boundary is | 370 A target can forward a config to all dependents until a link boundary is |
| 511 reached by setting it as an `all_dependent_config`. This is strongly | 371 reached by setting it as an `all_dependent_config`. This is strongly |
| 512 discouraged as it can spray flags and defines over more of the build than | 372 discouraged as it can spray flags and defines over more of the build than |
| 513 necessary. Instead, use public_deps to control which flags apply where. | 373 necessary. Instead, use public_deps to control which flags apply where. |
| 514 | 374 |
| 515 In Chrome, prefer the build flag header system (`build/buildflag_header.gni`) | 375 In Chrome, prefer the build flag header system (`build/buildflag_header.gni`) |
| 516 for defines which prevents most screw-ups with compiler defines. | 376 for defines which prevents most screw-ups with compiler defines. |
| 517 | 377 |
| 518 ## Toolchains | |
| 519 | |
| 520 A toolchain is a set of build commands to run for different types of | |
| 521 input files and link tasks. | |
| 522 | |
| 523 You can have multiple toolchains in the build. It's easiest to think | |
| 524 about each one as completely separate builds that can additionally have | |
| 525 dependencies between them. This means, for example, that the 32-bit | |
| 526 Windows build might depend on a 64-bit helper target. Each of them can | |
| 527 depend on `"//base:base"` which will be the 32-bit base in the context | |
| 528 of the 32-bit toolchain, and the 64-bit base in the context of the | |
| 529 64-bit toolchain | |
| 530 | |
| 531 When a target specifies a dependency on another target, the current | |
| 532 toolchain is inherited unless it is explicitly overridden (see "Labels" | |
| 533 above). | |
| 534 | |
| 535 ### Toolchains and the build configuration | |
| 536 | |
| 537 When you have a simple build with only one toolchain, the build config | |
| 538 file is loaded only once at the beginning of the build. It must call | |
| 539 `set_default_toolchain` to tell GN the label of the toolchain definition | |
| 540 to use. This toolchain definition has the commands to use for the | |
| 541 compiler and linker. The `toolchain_args` section of the toolchain | |
| 542 definition is ignored. | |
| 543 | |
| 544 When a target has a dependency on a target using different toolchain, GN | |
| 545 will start a build using that secondary toolchain to resolve the target. | |
| 546 GN will load the build config file with the arguments specified in the | |
| 547 toolchain definition. Since the toolchain is already known, calls to | |
| 548 `set_default_toolchain` are ignored. | |
| 549 | |
| 550 So the toolchain configuration is two-way. In the default toolchain | |
| 551 (i.e. the main build target) the configuration flows from the build | |
| 552 config file to the toolchain: the build config file looks at the state | |
| 553 of the build (OS type, CPU architecture, etc.) and decides which | |
| 554 toolchain to use (via `set_default_toolchain`). In secondary toolchains, | |
| 555 the configuration flows from the toolchain to the build config file: the | |
| 556 `toolchain_args` in the toolchain definition specifies the arguments to | |
| 557 re-invoke the build. | |
| 558 | |
| 559 ### Toolchain example | |
| 560 | |
| 561 Say the default build is a 64-bit build. Either this is the default CPU | |
| 562 architecture based on the current system, or the user has passed | |
| 563 `target_cpu="x64"` on the command line. The build config file might look | |
| 564 like this to set up the default toolchain: | |
| 565 | |
| 566 ``` | |
| 567 # Set default toolchain only has an effect when run in the context of | |
| 568 # the default toolchain. Pick the right one according to the current CPU | |
| 569 # architecture. | |
| 570 if (target_cpu == "x64") { | |
| 571 set_default_toolchain("//toolchains:64") | |
| 572 } else if (target_cpu == "x86") { | |
| 573 set_default_toolchain("//toolchains:32") | |
| 574 } | |
| 575 ``` | |
| 576 | |
| 577 If a 64-bit target wants to depend on a 32-bit binary, it would specify | |
| 578 a dependency using `data_deps` (data deps are like deps that are only | |
| 579 needed at runtime and aren't linked, since you can't link a 32-bit and a | |
| 580 64-bit library). | |
| 581 | |
| 582 ``` | |
| 583 executable("my_program") { | |
| 584 ... | |
| 585 if (target_cpu == "x64") { | |
| 586 # The 64-bit build needs this 32-bit helper. | |
| 587 data_deps = [ ":helper(//toolchains:32)" ] | |
| 588 } | |
| 589 } | |
| 590 | |
| 591 if (target_cpu == "x86") { | |
| 592 # Our helper library is only compiled in 32-bits. | |
| 593 shared_library("helper") { | |
| 594 ... | |
| 595 } | |
| 596 } | |
| 597 ``` | |
| 598 | |
| 599 The toolchain file referenced above (`toolchains/BUILD.gn`) would define | |
| 600 two toolchains: | |
| 601 | |
| 602 ``` | |
| 603 toolchain("32") { | |
| 604 tool("cc") { | |
| 605 ... | |
| 606 } | |
| 607 ... more tools ... | |
| 608 | |
| 609 # Arguments to the build when re-invoking as a secondary toolchain. | |
| 610 toolchain_args = { | |
| 611 current_cpu = "x86" | |
| 612 } | |
| 613 } | |
| 614 | |
| 615 toolchain("64") { | |
| 616 tool("cc") { | |
| 617 ... | |
| 618 } | |
| 619 ... more tools ... | |
| 620 | |
| 621 # Arguments to the build when re-invoking as a secondary toolchain. | |
| 622 toolchain_args = { | |
| 623 current_cpu = "x64" | |
| 624 } | |
| 625 } | |
| 626 ``` | |
| 627 | |
| 628 The toolchain args specifies the CPU architecture explicitly, so if a | |
| 629 target depends on something using that toolchain, that cpu architecture | |
| 630 will be set when re-invoking the build. These args are ignored for the | |
| 631 default toolchain since by the time they're known the build config has | |
| 632 already been run. In general, the toolchain args and the conditions used | |
| 633 to set the default toolchain should agree. | |
| 634 | |
| 635 The nice thing about the multiple-build setup is that you can write | |
| 636 conditionals in your targets referencing the current toolchain state. | |
| 637 The build files will be re-run with different state for each toolchain. | |
| 638 For the `my_program` example above, you can see it queries the CPU | |
| 639 architecture, adding a dependency only for the 64-bit build of the | |
| 640 program. The 32-bit build would not get this dependency. | |
| 641 | |
| 642 ### Declaring a toolchain | |
| 643 | |
| 644 Toolchains are declared with the `toolchain` command, which sets the | |
| 645 commands to use for each compile and link operation. The toolchain also | |
| 646 specifies a set of arguments to pass to the build config file when | |
| 647 executing. This allows you to pass configuration information to the | |
| 648 alternate toolchain. | |
| 649 | |
| 650 ## Templates | 378 ## Templates |
| 651 | 379 |
| 652 Templates are GN's primary way to re-use code. Typically, a template | 380 Templates are GN's primary way to re-use code. Typically, a template |
| 653 would expand to one or more other target types. | 381 would expand to one or more other target types. |
| 654 | 382 |
| 655 ``` | 383 ``` |
| 656 # Declares a script that compiles IDL files to source, and then compiles those | 384 # Declares a script that compiles IDL files to source, and then compiles those |
| 657 # source files. | 385 # source files. |
| 658 template("idl") { | 386 template("idl") { |
| 659 # Always base helper targets on target_name so they're unique. Target name | 387 # Always base helper targets on target_name so they're unique. Target name |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 GN keeps some GYP concept like "all dependent" settings which work a bit | 532 GN keeps some GYP concept like "all dependent" settings which work a bit |
| 805 differently in Blaze. This is partially to make conversion from the existing | 533 differently in Blaze. This is partially to make conversion from the existing |
| 806 GYP code easier, and the GYP constructs generally offer more fine-grained | 534 GYP code easier, and the GYP constructs generally offer more fine-grained |
| 807 control (which is either good or bad, depending on the situation). | 535 control (which is either good or bad, depending on the situation). |
| 808 | 536 |
| 809 GN also uses GYP names like "sources" instead of "srcs" since | 537 GN also uses GYP names like "sources" instead of "srcs" since |
| 810 abbreviating this seems needlessly obscure, although it uses Blaze's | 538 abbreviating this seems needlessly obscure, although it uses Blaze's |
| 811 "deps" since "dependencies" is so hard to type. Chromium also compiles | 539 "deps" since "dependencies" is so hard to type. Chromium also compiles |
| 812 multiple languages in one target so specifying the language type on the | 540 multiple languages in one target so specifying the language type on the |
| 813 target name prefix was dropped (e.g. from `cc_library`). | 541 target name prefix was dropped (e.g. from `cc_library`). |
| OLD | NEW |