OLD | NEW |
---|---|
1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import("//build/config/clang/clang.gni") | 5 import("//build/config/clang/clang.gni") |
6 import("//build/config/nacl/config.gni") | 6 import("//build/config/nacl/config.gni") |
7 import("//build/config/sanitizers/sanitizers.gni") | 7 import("//build/config/sanitizers/sanitizers.gni") |
8 import("//build/config/v8_target_cpu.gni") | 8 import("//build/config/v8_target_cpu.gni") |
9 import("//build/toolchain/cc_wrapper.gni") | 9 import("//build/toolchain/cc_wrapper.gni") |
10 import("//build/toolchain/goma.gni") | 10 import("//build/toolchain/goma.gni") |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
65 # to the toolchain. It can be used to force recompiles whenever a | 65 # to the toolchain. It can be used to force recompiles whenever a |
66 # toolchain is updated. | 66 # toolchain is updated. |
67 # - shlib_extension | 67 # - shlib_extension |
68 # If this string is specified it will be used for the file extension | 68 # If this string is specified it will be used for the file extension |
69 # for a shared library, rather than default value specified in | 69 # for a shared library, rather than default value specified in |
70 # toolchain.gni | 70 # toolchain.gni |
71 # - strip | 71 # - strip |
72 # Location of the strip executable. When specified, strip will be run on | 72 # Location of the strip executable. When specified, strip will be run on |
73 # all shared libraries and executables as they are built. The pre-stripped | 73 # all shared libraries and executables as they are built. The pre-stripped |
74 # artifacts will be put in lib.unstripped/ and exe.unstripped/. | 74 # artifacts will be put in lib.unstripped/ and exe.unstripped/. |
75 # | |
76 # Optional build argument controls. | |
77 # | |
78 # - clear_sanitizers | |
79 # When set to true, is_asan, is_msan, etc.will all be set to false. Often | |
80 # secondary toolchains do not want to run with sanitizers. | |
81 # - is_clang | |
82 # Whether to use clang instead of gcc. | |
83 # - is_component_build | |
84 # Whether to forcibly enable or disable component builds for this | |
85 # toolchain; if not specified, the toolchain will inherit the | |
86 # default setting. | |
87 # - is_nacl_glibc | |
88 # Whether NaCl code is built using Glibc instead of Newlib. | |
89 # - cc_wrapper | |
90 # Override the global cc_wrapper setting. e.g. "ccache" or "icecc". | |
91 # useful to opt-out of cc_wrapper in a particular toolchain by setting | |
92 # cc_wrapper = "" in it. | |
93 # - use_debug_fission | |
94 # Override the global use_debug_fission setting, useful if the particular | |
95 # toolchain should not be generating split-dwarf code. | |
96 # - use_goma | |
97 # Override the global use_goma setting, useful to opt-out of goma in a | |
98 # particular toolchain by setting use_gome = false in it. | |
99 # - use_gold | |
100 # Override the global use_gold setting, useful if the particular | |
101 # toolchain has a custom link step that is not actually using Gold. | |
102 # - v8_toolchain_cpu | |
103 # If defined, set v8_current_cpu to this, else set v8_current_cpu | |
104 # to current_cpu. | |
105 template("gcc_toolchain") { | 75 template("gcc_toolchain") { |
106 toolchain(target_name) { | 76 toolchain(target_name) { |
107 assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value") | 77 assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value") |
108 assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value") | 78 assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value") |
109 assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value") | 79 assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value") |
110 assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value") | 80 assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value") |
111 assert(defined(invoker.toolchain_cpu), | |
112 "gcc_toolchain() must specify a \"toolchain_cpu\"") | |
113 assert(defined(invoker.toolchain_os), | |
114 "gcc_toolchain() must specify a \"toolchain_os\"") | |
115 | |
116 if (defined(invoker.cc_wrapper)) { | |
117 cc_wrapper = invoker.cc_wrapper | |
118 } | |
119 if (defined(invoker.use_goma)) { | |
120 use_goma = invoker.use_goma | |
121 } | |
122 if (use_goma) { | |
123 assert(cc_wrapper == "", "Goma and cc_wrapper can't be used together.") | |
124 compiler_prefix = "$goma_dir/gomacc " | |
125 } else if (cc_wrapper != "") { | |
126 compiler_prefix = cc_wrapper + " " | |
127 } else { | |
128 compiler_prefix = "" | |
129 } | |
130 | 81 |
131 # This define changes when the toolchain changes, forcing a rebuild. | 82 # This define changes when the toolchain changes, forcing a rebuild. |
132 # Nothing should ever use this define. | 83 # Nothing should ever use this define. |
133 if (defined(invoker.rebuild_define)) { | 84 if (defined(invoker.rebuild_define)) { |
134 rebuild_string = "-D" + invoker.rebuild_define + " " | 85 rebuild_string = "-D" + invoker.rebuild_define + " " |
135 } else { | 86 } else { |
136 rebuild_string = "" | 87 rebuild_string = "" |
137 } | 88 } |
138 | 89 |
90 # GN's syntax can't handle more than one scope dereference at once, like | |
91 # "invoker.toolchain_args.foo", so make a temporary to hold the toolchain | |
92 # args so we can do "invoker_toolchain_args.foo". | |
93 if (defined(invoker.toolchain_args)) { | |
94 invoker_toolchain_args = invoker.toolchain_args | |
95 } else { | |
96 invoker_toolchain_args = { | |
97 } | |
98 } | |
99 | |
100 # When invoking this toolchain not as the default one, these args will be | |
101 # passed to the build. They are ignored when this is the default toolchain. | |
102 toolchain_args = { | |
103 # Populate toolchain args from the invoker. | |
104 forward_variables_from(invoker_toolchain_args, "*") | |
105 | |
106 # These values need to be passed through unchanged to all secondary | |
107 # toolchains. BUILDCONFIG.gn sets some defaults based on the values of | |
108 # the operating system and compiler, and we want to force the values to | |
109 # be consistent if re-running the computation in another context leads | |
110 # to different defaults. | |
111 host_toolchain = host_toolchain | |
112 target_os = target_os | |
113 target_cpu = target_cpu | |
Dirk Pranke
2016/08/08 23:28:39
host_toolchain is derived from host_os, host_cpu,
brettw
2016/08/09 17:26:29
This logic isn't changing from the old build, this
brettw
2016/08/09 17:28:31
If you're curious why this forwarding was added in
brettw
2016/08/09 18:14:01
Dependent patch to remove these:
https://coderevie
Dirk Pranke
2016/08/09 19:18:18
Right, forwarding host_toolchain still makes sense
| |
114 | |
115 if (!defined(invoker_toolchain_args.v8_current_cpu)) { | |
116 v8_current_cpu = invoker_toolchain_args.current_cpu | |
117 } | |
118 } | |
119 | |
120 # When the invoker has explicitly overridden use_goma or cc_wrapper in the | |
121 # toolchain args, use those values, otherwise default to the global one. | |
122 # This works because the only reasonable override that toolchains might | |
123 # supply for these values are to force-disable them. | |
124 if (defined(toolchain_args.use_goma)) { | |
125 toolchain_uses_goma = toolchain_args.use_goma | |
126 } else { | |
127 toolchain_uses_goma = use_goma | |
128 } | |
129 if (defined(toolchain_args.cc_wrapper)) { | |
130 toolchain_cc_wrapper = toolchain_args.cc_wrapper | |
131 } else { | |
132 toolchain_cc_wrapper = cc_wrapper | |
133 } | |
134 | |
135 # Compute the compiler prefix. | |
136 if (toolchain_uses_goma) { | |
137 assert(toolchain_cc_wrapper == "", | |
138 "Goma and cc_wrapper can't be used together.") | |
139 compiler_prefix = "$goma_dir/gomacc " | |
140 } else if (toolchain_cc_wrapper != "") { | |
141 compiler_prefix = toolchain_cc_wrapper + " " | |
142 } else { | |
143 compiler_prefix = "" | |
144 } | |
145 | |
139 cc = compiler_prefix + invoker.cc | 146 cc = compiler_prefix + invoker.cc |
140 cxx = compiler_prefix + invoker.cxx | 147 cxx = compiler_prefix + invoker.cxx |
141 ar = invoker.ar | 148 ar = invoker.ar |
142 ld = invoker.ld | 149 ld = invoker.ld |
143 if (defined(invoker.readelf)) { | 150 if (defined(invoker.readelf)) { |
144 readelf = invoker.readelf | 151 readelf = invoker.readelf |
145 } else { | 152 } else { |
146 readelf = "readelf" | 153 readelf = "readelf" |
147 } | 154 } |
148 if (defined(invoker.nm)) { | 155 if (defined(invoker.nm)) { |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 # See //build/toolchain/toolchain.gni for details. | 434 # See //build/toolchain/toolchain.gni for details. |
428 tool("stamp") { | 435 tool("stamp") { |
429 command = stamp_command | 436 command = stamp_command |
430 description = stamp_description | 437 description = stamp_description |
431 } | 438 } |
432 tool("copy") { | 439 tool("copy") { |
433 command = copy_command | 440 command = copy_command |
434 description = copy_description | 441 description = copy_description |
435 } | 442 } |
436 | 443 |
437 # When invoking this toolchain not as the default one, these args will be | |
438 # passed to the build. They are ignored when this is the default toolchain. | |
439 toolchain_args() { | |
440 current_cpu = invoker.toolchain_cpu | |
441 current_os = invoker.toolchain_os | |
442 | |
443 # These values need to be passed through unchanged. | |
444 host_toolchain = host_toolchain | |
445 target_os = target_os | |
446 target_cpu = target_cpu | |
447 | |
448 if (defined(invoker.is_clang)) { | |
449 is_clang = invoker.is_clang | |
450 } | |
451 if (defined(invoker.is_component_build)) { | |
452 is_component_build = invoker.is_component_build | |
453 } | |
454 if (defined(invoker.is_nacl_glibc)) { | |
455 is_nacl_glibc = invoker.is_nacl_glibc | |
456 } | |
457 if (defined(invoker.symbol_level)) { | |
458 symbol_level = invoker.symbol_level | |
459 } | |
460 if (defined(invoker.use_allocator)) { | |
461 use_allocator = invoker.use_allocator | |
462 } | |
463 if (defined(invoker.use_debug_fission)) { | |
464 use_debug_fission = invoker.use_debug_fission | |
465 } | |
466 if (defined(invoker.use_gold)) { | |
467 use_gold = invoker.use_gold | |
468 } | |
469 if (defined(invoker.use_sysroot)) { | |
470 use_sysroot = invoker.use_sysroot | |
471 } | |
472 if (defined(invoker.v8_toolchain_cpu)) { | |
473 v8_current_cpu = invoker.v8_toolchain_cpu | |
474 } else { | |
475 v8_current_cpu = current_cpu | |
476 } | |
477 } | |
478 | |
479 forward_variables_from(invoker, [ "deps" ]) | 444 forward_variables_from(invoker, [ "deps" ]) |
480 } | 445 } |
481 } | 446 } |
482 | 447 |
483 # This is a shorthand for gcc_toolchain instances based on the | 448 # This is a shorthand for gcc_toolchain instances based on the Chromium-built |
484 # Chromium-built version of Clang. Only the toolchain_cpu and | 449 # version of Clang. Only the toolchain_cpu and toolchain_os variables need to |
485 # toolchain_os variables need to be specified by the invoker, and | 450 # be specified by the invoker, and optionally toolprefix if it's a |
486 # optionally toolprefix if it's a cross-compile case. Note that for | 451 # cross-compile case. Note that for a cross-compile case this toolchain |
487 # a cross-compile case this toolchain requires a config to pass the | 452 # requires a config to pass the appropriate -target option, or else it will |
488 # appropriate -target option, or else it will actually just be doing | 453 # actually just be doing a native compile. The invoker can optionally override |
489 # a native compile. The invoker can optionally override use_gold too. | 454 # use_gold too. |
490 template("clang_toolchain") { | 455 template("clang_toolchain") { |
491 assert(defined(invoker.toolchain_cpu), | |
492 "clang_toolchain() must specify a \"toolchain_cpu\"") | |
493 assert(defined(invoker.toolchain_os), | |
494 "clang_toolchain() must specify a \"toolchain_os\"") | |
495 if (defined(invoker.toolprefix)) { | 456 if (defined(invoker.toolprefix)) { |
496 toolprefix = invoker.toolprefix | 457 toolprefix = invoker.toolprefix |
497 } else { | 458 } else { |
498 toolprefix = "" | 459 toolprefix = "" |
499 } | 460 } |
500 | 461 |
501 gcc_toolchain(target_name) { | 462 gcc_toolchain(target_name) { |
502 prefix = rebase_path("$clang_base_path/bin", root_build_dir) | 463 prefix = rebase_path("$clang_base_path/bin", root_build_dir) |
503 cc = "$prefix/clang" | 464 cc = "$prefix/clang" |
504 cxx = "$prefix/clang++" | 465 cxx = "$prefix/clang++" |
505 ld = cxx | 466 ld = cxx |
506 is_clang = true | |
507 | 467 |
508 readelf = "${toolprefix}readelf" | 468 readelf = "${toolprefix}readelf" |
509 ar = "${toolprefix}ar" | 469 ar = "${toolprefix}ar" |
510 nm = "${toolprefix}nm" | 470 nm = "${toolprefix}nm" |
511 | 471 |
512 forward_variables_from(invoker, | 472 forward_variables_from(invoker, [ "strip" ]) |
513 [ | |
514 "strip", | |
515 "toolchain_cpu", | |
516 "toolchain_os", | |
517 "use_gold", | |
518 "v8_toolchain_cpu", | |
519 ]) | |
520 | 473 |
474 toolchain_args = { | |
475 if (defined(invoker.toolchain_args)) { | |
476 forward_variables_from(invoker.toolchain_args, "*") | |
477 } | |
478 is_clang = true | |
479 } | |
480 | |
481 # Backwards-compatible handling for toolchain definitions in the Native | |
482 # Client repo. | |
483 # | |
484 # TODO(brettw) bug 634446 remove this when | |
485 # //native_client/src/trusted/service_runtime/linux/BUILD.gn is updated to | |
486 # use the new-style toolchain_args. | |
487 if (defined(invoker.toolchain_cpu)) { | |
488 assert(!defined(toolchain_args.current_cpu)) | |
489 toolchain_args.current_cpu = invoker.toolchain_cpu | |
490 } | |
491 if (defined(invoker.toolchain_os)) { | |
492 assert(!defined(toolchain_args.current_os)) | |
493 toolchain_args.current_os = invoker.toolchain_os | |
494 } | |
521 if (defined(invoker.use_debug_fission)) { | 495 if (defined(invoker.use_debug_fission)) { |
522 use_debug_fission = invoker.use_debug_fission | 496 assert(!defined(toolchain_args.use_debug_fission)) |
497 toolchain_args.use_debug_fission = invoker.use_debug_fission | |
498 } | |
499 if (defined(invoker.use_gold)) { | |
500 assert(!defined(toolchain_args.use_gold)) | |
501 toolchain_args.use_gold = invoker.use_gold | |
523 } | 502 } |
524 } | 503 } |
525 } | 504 } |
OLD | NEW |