| // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "tools/gn/build_settings.h" | |
| #include "tools/gn/functions.h" | |
| #include "tools/gn/loader.h" | |
| #include "tools/gn/parse_tree.h" | |
| #include "tools/gn/scope.h" | |
| #include "tools/gn/settings.h" | |
| namespace functions { | |
| const char kSetDefaultToolchain[] = "set_default_toolchain"; | |
| const char kSetDefaultToolchain_HelpShort[] = | |
| "set_default_toolchain: Sets the default toolchain name."; | |
| const char kSetDefaultToolchain_Help[] = | |
| R"(set_default_toolchain: Sets the default toolchain name. | |
| set_default_toolchain(toolchain_label) | |
| The given label should identify a toolchain definition (see "gn help | |
| toolchain"). This toolchain will be used for all targets unless otherwise | |
| specified. | |
| This function is only valid to call during the processing of the build | |
| configuration file. Since the build configuration file is processed | |
| separately for each toolchain, this function will be a no-op when called | |
| under any non-default toolchains. | |
| For example, the default toolchain should be appropriate for the current | |
| environment. If the current environment is 32-bit and somebody references a | |
| target with a 64-bit toolchain, we wouldn't want processing of the build | |
| config file for the 64-bit toolchain to reset the default toolchain to | |
| 64-bit, we want to keep it 32-bits. | |
| Argument | |
| toolchain_label | |
| Toolchain name. | |
| Example | |
| # Set default toolchain only has an effect when run in the context of the | |
| # default toolchain. Pick the right one according to the current CPU | |
| # architecture. | |
| if (target_cpu == "x64") { | |
| set_default_toolchain("//toolchains:64") | |
| } else if (target_cpu == "x86") { | |
| set_default_toolchain("//toolchains:32") | |
| } | |
| )"; | |
| Value RunSetDefaultToolchain(Scope* scope, | |
| const FunctionCallNode* function, | |
| const std::vector<Value>& args, | |
| Err* err) { | |
| if (!scope->IsProcessingBuildConfig()) { | |
| *err = Err( | |
| function->function(), "Must be called from build config.", | |
| "set_default_toolchain can only be called from the build configuration " | |
| "file."); | |
| return Value(); | |
| } | |
| // When the loader is expecting the default toolchain to be set, it will set | |
| // this key on the scope to point to the destination. | |
| Label* default_toolchain_dest = static_cast<Label*>( | |
| scope->GetProperty(Loader::kDefaultToolchainKey, nullptr)); | |
| if (!default_toolchain_dest) | |
| return Value(); | |
| const SourceDir& current_dir = scope->GetSourceDir(); | |
| const Label& default_toolchain = ToolchainLabelForScope(scope); | |
| if (!EnsureSingleStringArg(function, args, err)) | |
| return Value(); | |
| Label toolchain_label( | |
| Label::Resolve(current_dir, default_toolchain, args[0], err)); | |
| if (toolchain_label.is_null()) | |
| return Value(); | |
| *default_toolchain_dest = toolchain_label; | |
| return Value(); | |
| } | |
| } // namespace functions |