| Index: tools/gn/function_toolchain.cc
|
| diff --git a/tools/gn/function_toolchain.cc b/tools/gn/function_toolchain.cc
|
| index 58532551d4f2d65250db6002fbaf675eec20cff7..3e272c958642a4ade77f90a78a5fc05e3fa6dbbb 100644
|
| --- a/tools/gn/function_toolchain.cc
|
| +++ b/tools/gn/function_toolchain.cc
|
| @@ -481,9 +481,10 @@ const char kTool_Help[] =
|
| " that actually produces these files.\n"
|
| "\n"
|
| " If you specify more than one output for shared library links,\n"
|
| - " you should consider setting link_output and depend_output.\n"
|
| - " Otherwise, the first entry in the outputs list should always be\n"
|
| - " the main output which will be linked to.\n"
|
| + " you should consider setting link_output, depend_output, and\n"
|
| + " runtime_link_output. Otherwise, the first entry in the\n"
|
| + " outputs list should always be the main output which will be\n"
|
| + " linked to.\n"
|
| "\n"
|
| " Example for a compiler tool that produces .obj files:\n"
|
| " outputs = [\n"
|
| @@ -503,20 +504,22 @@ const char kTool_Help[] =
|
| "\n"
|
| " link_output [string with substitutions]\n"
|
| " depend_output [string with substitutions]\n"
|
| + " runtime_link_output [string with substitutions]\n"
|
| " Valid for: \"solink\" only (optional)\n"
|
| "\n"
|
| - " These two files specify which of the outputs from the solink\n"
|
| + " These three files specify which of the outputs from the solink\n"
|
| " tool should be used for linking and dependency tracking. These\n"
|
| " should match entries in the \"outputs\". If unspecified, the\n"
|
| - " first item in the \"outputs\" array will be used for both. See\n"
|
| + " first item in the \"outputs\" array will be used for all. See\n"
|
| " \"Separate linking and dependencies for shared libraries\"\n"
|
| - " below for more.\n"
|
| + " below for more. If link_output is set but runtime_link_output\n"
|
| + " is not set, runtime_link_output defaults to link_output.\n"
|
| "\n"
|
| " On Windows, where the tools produce a .dll shared library and\n"
|
| - " a .lib import library, you will want both of these to be the\n"
|
| - " import library. On Linux, if you're not doing the separate\n"
|
| - " linking/dependency optimization, both of these should be the\n"
|
| - " .so output.\n"
|
| + " a .lib import library, you will want the first two to be the\n"
|
| + " import library and the third one to be the .dll file.\n"
|
| + " On Linux, if you're not doing the separate linking/dependency\n"
|
| + " optimization, all of these should be the .so output.\n"
|
| "\n"
|
| " output_prefix [string]\n"
|
| " Valid for: Linker tools (optional)\n"
|
| @@ -827,14 +830,16 @@ Value RunTool(Scope* scope,
|
| !ReadDepsFormat(&block_scope, tool.get(), err) ||
|
| !ReadPattern(&block_scope, "description", subst_validator, tool.get(),
|
| &Tool::set_description, err) ||
|
| - !ReadString(&block_scope, "lib_switch", tool.get(),
|
| - &Tool::set_lib_switch, err) ||
|
| + !ReadString(&block_scope, "lib_switch", tool.get(), &Tool::set_lib_switch,
|
| + err) ||
|
| !ReadString(&block_scope, "lib_dir_switch", tool.get(),
|
| &Tool::set_lib_dir_switch, err) ||
|
| !ReadPattern(&block_scope, "link_output", subst_validator, tool.get(),
|
| &Tool::set_link_output, err) ||
|
| !ReadPattern(&block_scope, "depend_output", subst_validator, tool.get(),
|
| &Tool::set_depend_output, err) ||
|
| + !ReadPattern(&block_scope, "runtime_link_output", subst_validator,
|
| + tool.get(), &Tool::set_runtime_link_output, err) ||
|
| !ReadString(&block_scope, "output_prefix", tool.get(),
|
| &Tool::set_output_prefix, err) ||
|
| !ReadPrecompiledHeaderType(&block_scope, tool.get(), err) ||
|
| @@ -854,8 +859,9 @@ Value RunTool(Scope* scope,
|
| return Value();
|
| }
|
|
|
| - // Validate that the link_output and depend_output refer to items in the
|
| - // outputs and aren't defined for irrelevant tool types.
|
| + // Validate that the link_output, depend_output, and runtime_link_output
|
| + // refer to items in the outputs and aren't defined for irrelevant tool
|
| + // types.
|
| if (!tool->link_output().empty()) {
|
| if (tool_type != Toolchain::TYPE_SOLINK &&
|
| tool_type != Toolchain::TYPE_SOLINK_MODULE) {
|
| @@ -888,6 +894,19 @@ Value RunTool(Scope* scope,
|
| "be specified or they should both be empty.");
|
| return Value();
|
| }
|
| + if (!tool->runtime_link_output().empty()) {
|
| + if (tool_type != Toolchain::TYPE_SOLINK &&
|
| + tool_type != Toolchain::TYPE_SOLINK_MODULE) {
|
| + *err = Err(function, "This tool specifies a runtime_link_output.",
|
| + "This is only valid for solink and solink_module tools.");
|
| + return Value();
|
| + }
|
| + if (!IsPatternInOutputList(tool->outputs(), tool->runtime_link_output())) {
|
| + *err = Err(function, "This tool's runtime_link_output is bad.",
|
| + "It must match one of the outputs.");
|
| + return Value();
|
| + }
|
| + }
|
|
|
| // Make sure there weren't any vars set in this tool that were unused.
|
| if (!block_scope.CheckForUnusedVars(err))
|
|
|