Index: tools/gn/function_toolchain.cc |
diff --git a/tools/gn/function_toolchain.cc b/tools/gn/function_toolchain.cc |
index faa190e66e46c30c8719b3acd56bcaf632f1f440..852d25a5f6f57f4efe56f28fe7312aab0fc5b205 100644 |
--- a/tools/gn/function_toolchain.cc |
+++ b/tools/gn/function_toolchain.cc |
@@ -314,10 +314,26 @@ const char kToolchain_Help[] = |
" The tool() function call specifies the commands commands to run for\n" |
" a given step. See \"gn help tool\".\n" |
"\n" |
- " toolchain_args()\n" |
- " List of arguments to pass to the toolchain when invoking this\n" |
- " toolchain. This applies only to non-default toolchains. See\n" |
- " \"gn help toolchain_args\" for more.\n" |
+ " toolchain_args\n" |
+ " Overrides for build arguments to pass to the toolchain when invoking\n" |
+ " it. This is a variable of type \"scope\" where the variable names\n" |
+ " correspond to varibles in declare_args() blocks.\n" |
+ "\n" |
+ " When you specify a target using an alternate toolchain, the master\n" |
+ " build configuration file is re-interpreted in the context of that\n" |
+ " toolchain (see \"gn help toolchain\"). The toolchain_args allows you\n" |
+ " to control the arguments passed into this alternate invocation of\n" |
+ " the build.\n" |
+ "\n" |
+ " Any default system arguments or arguments passed in via \"gn args\"\n" |
+ " will also be passed to the alternate invocation unless explicitly\n" |
+ " overridden by toolchain_args.\n" |
+ "\n" |
+ " The toolchain_args will be ignored when the toolchain being defined\n" |
+ " is the default. In this case, it's expected you want the default\n" |
+ " argument values.\n" |
+ "\n" |
+ " See also \"gn help buildargs\" for an overview of these arguments.\n" |
"\n" |
" deps\n" |
" Dependencies of this toolchain. These dependencies will be resolved\n" |
@@ -350,18 +366,19 @@ const char kToolchain_Help[] = |
" by the toolchain label).\n" |
" 2. Re-runs the master build configuration file, applying the\n" |
" arguments specified by the toolchain_args section of the toolchain\n" |
- " definition (see \"gn help toolchain_args\").\n" |
+ " definition.\n" |
" 3. Loads the destination build file in the context of the\n" |
" configuration file in the previous step.\n" |
"\n" |
- "Example:\n" |
+ "Example\n" |
+ "\n" |
" toolchain(\"plugin_toolchain\") {\n" |
" tool(\"cc\") {\n" |
" command = \"gcc {{source}}\"\n" |
" ...\n" |
" }\n" |
"\n" |
- " toolchain_args() {\n" |
+ " toolchain_args = {\n" |
" is_plugin = true\n" |
" is_32bit = true\n" |
" is_64bit = false\n" |
@@ -412,6 +429,17 @@ Value RunToolchain(Scope* scope, |
return Value(); |
} |
+ // Read toolchain args (if any). |
+ const Value* toolchain_args = block_scope.GetValue("toolchain_args", true); |
+ if (toolchain_args) { |
+ if (!toolchain_args->VerifyTypeIs(Value::SCOPE, err)) |
+ return Value(); |
+ |
+ Scope::KeyValueMap values; |
+ toolchain_args->scope_value()->GetCurrentScopeValues(&values); |
+ toolchain->args() = values; |
+ } |
+ |
if (!block_scope.CheckForUnusedVars(err)) |
return Value(); |
@@ -1015,79 +1043,45 @@ Value RunTool(Scope* scope, |
return Value(); |
} |
-// toolchain_args -------------------------------------------------------------- |
- |
extern const char kToolchainArgs[] = "toolchain_args"; |
extern const char kToolchainArgs_HelpShort[] = |
"toolchain_args: Set build arguments for toolchain build setup."; |
extern const char kToolchainArgs_Help[] = |
"toolchain_args: Set build arguments for toolchain build setup.\n" |
"\n" |
- " Used inside a toolchain definition to pass arguments to an alternate\n" |
- " toolchain's invocation of the build.\n" |
- "\n" |
- " When you specify a target using an alternate toolchain, the master\n" |
- " build configuration file is re-interpreted in the context of that\n" |
- " toolchain (see \"gn help toolchain\"). The toolchain_args function\n" |
- " allows you to control the arguments passed into this alternate\n" |
- " invocation of the build.\n" |
- "\n" |
- " Any default system arguments or arguments passed in on the command-\n" |
- " line will also be passed to the alternate invocation unless explicitly\n" |
- " overridden by toolchain_args.\n" |
- "\n" |
- " The toolchain_args will be ignored when the toolchain being defined\n" |
- " is the default. In this case, it's expected you want the default\n" |
- " argument values.\n" |
- "\n" |
- " See also \"gn help buildargs\" for an overview of these arguments.\n" |
+ " DEPRECATED. Instead use:\n" |
+ " toolchain_args = { ... }\n" |
"\n" |
- "Example:\n" |
- " toolchain(\"my_weird_toolchain\") {\n" |
- " ...\n" |
- " toolchain_args() {\n" |
- " # Override the system values for a generic Posix system.\n" |
- " is_win = false\n" |
- " is_posix = true\n" |
- "\n" |
- " # Pass this new value for specific setup for my toolchain.\n" |
- " is_my_weird_system = true\n" |
- " }\n" |
- " }\n"; |
+ " See \"gn help toolchain\" for documentation.\n"; |
Value RunToolchainArgs(Scope* scope, |
const FunctionCallNode* function, |
const std::vector<Value>& args, |
BlockNode* block, |
Err* err) { |
- // Find the toolchain definition we're executing inside of. The toolchain |
- // function will set a property pointing to it that we'll pick up. |
- Toolchain* toolchain = reinterpret_cast<Toolchain*>( |
- scope->GetProperty(&kToolchainPropertyKey, nullptr)); |
- if (!toolchain) { |
- *err = Err(function->function(), |
- "toolchain_args() called outside of toolchain().", |
- "The toolchain_args() function can only be used inside a " |
- "toolchain() definition."); |
- return Value(); |
- } |
- |
+ // This is a backwards-compatible shim that converts the old form of: |
+ // toolchain_args() { |
+ // foo = bar |
+ // } |
+ // to the new form: |
+ // toolchain_args = { |
+ // foo = bar |
+ // } |
+ // It will be deleted when all users of toolchain_args as a function are |
+ // deleted. |
if (!args.empty()) { |
*err = Err(function->function(), "This function takes no arguments."); |
return Value(); |
} |
- // This function makes a new scope with various variable sets on it, which |
- // we then save on the toolchain to use when re-invoking the build. |
- Scope block_scope(scope); |
- block->Execute(&block_scope, err); |
+ std::unique_ptr<Scope> block_scope(new Scope(scope)); |
+ block->Execute(block_scope.get(), err); |
if (err->has_error()) |
return Value(); |
- Scope::KeyValueMap values; |
- block_scope.GetCurrentScopeValues(&values); |
- toolchain->args() = values; |
- |
+ block_scope->DetachFromContaining(); |
+ scope->SetValue("toolchain_args", Value(function, std::move(block_scope)), |
+ function); |
return Value(); |
} |