|  | // 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 |