Write toochains info to json project info Toolchains info is needed by IDEs to offer better code completion. Change-Id: Ifd17fedbebefd5141a2bb41555503af970f781de Reviewed-on: https://gn-review.googlesource.com/c/gn/+/10940 Reviewed-by: Brett Wilson <brettw@chromium.org> Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/json_project_writer.cc b/src/gn/json_project_writer.cc index a8f9ac4..a8aad90 100644 --- a/src/gn/json_project_writer.cc +++ b/src/gn/json_project_writer.cc
@@ -426,6 +426,7 @@ } json_writer.EndDict(); // build_settings + std::map<Label, const Toolchain*> toolchains; json_writer.BeginDict("targets"); { for (const auto* target : sorted_targets) { @@ -445,10 +446,61 @@ base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_dict); json_writer.AddJSONDict(target_labels[target], json_dict); + toolchains[target->toolchain()->label()] = target->toolchain(); } } json_writer.EndDict(); // targets + json_writer.BeginDict("toolchains"); + { + for (const auto& tool_chain_kv : toolchains) { + base::Value toolchain{base::Value::Type::DICTIONARY}; + const auto& tools = tool_chain_kv.second->tools(); + for (const auto& tool_kv : tools) { + base::Value tool_info{base::Value::Type::DICTIONARY}; + auto setIfNotEmptry = [&](const auto& key, const auto& value) { + if (value.size()) + tool_info.SetKey(key, base::Value{value}); + }; + auto setSubstitutionList = [&](const auto& key, + const SubstitutionList& list) { + if (list.list().empty()) + return; + base::Value values{base::Value::Type::LIST}; + for (const auto& v : list.list()) + values.GetList().emplace_back(base::Value{v.AsString()}); + tool_info.SetKey(key, std::move(values)); + }; + const auto& tool = tool_kv.second; + setIfNotEmptry("command", tool->command().AsString()); + setIfNotEmptry("command_launcher", tool->command_launcher()); + setIfNotEmptry("default_output_extension", + tool->default_output_extension()); + setIfNotEmptry("default_output_dir", + tool->default_output_dir().AsString()); + setIfNotEmptry("depfile", tool->depfile().AsString()); + setIfNotEmptry("description", tool->description().AsString()); + setIfNotEmptry("framework_switch", tool->framework_switch()); + setIfNotEmptry("weak_framework_switch", tool->weak_framework_switch()); + setIfNotEmptry("framework_dir_switch", tool->framework_dir_switch()); + setIfNotEmptry("lib_switch", tool->lib_switch()); + setIfNotEmptry("lib_dir_switch", tool->lib_dir_switch()); + setIfNotEmptry("linker_arg", tool->linker_arg()); + setSubstitutionList("outputs", tool->outputs()); + setSubstitutionList("partial_outputs", tool->partial_outputs()); + setSubstitutionList("runtime_outputs", tool->runtime_outputs()); + setIfNotEmptry("output_prefix", tool->output_prefix()); + + toolchain.SetKey(tool_kv.first, std::move(tool_info)); + } + std::string json_dict; + base::JSONWriter::WriteWithOptions( + toolchain, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_dict); + json_writer.AddJSONDict(tool_chain_kv.first.GetUserVisibleName(false), json_dict); + } + } + json_writer.EndDict(); // toolchains + json_writer.Close(); return out;
diff --git a/src/gn/json_project_writer_unittest.cc b/src/gn/json_project_writer_unittest.cc index f642ea6..a22511b 100644 --- a/src/gn/json_project_writer_unittest.cc +++ b/src/gn/json_project_writer_unittest.cc
@@ -58,38 +58,201 @@ base::ReplaceSubstringsAfterOffset(&out, 0, "\r\n", "\n"); #endif const char expected_json[] = - "{\n" - " \"build_settings\": {\n" - " \"build_dir\": \"//out/Debug/\",\n" - " \"default_toolchain\": \"//toolchain:default\",\n" - " \"gen_input_files\": [ \"//.gn\", \"//BUILD.gn\", " - "\"//build/BUILD.gn\" ],\n" + R"_({ + "build_settings": { + "build_dir": "//out/Debug/", + "default_toolchain": "//toolchain:default", + "gen_input_files": [ "//.gn", "//BUILD.gn", "//build/BUILD.gn" ], +)_" #if defined(OS_WIN) " \"root_path\": \"c:/path/to/src\"\n" #else " \"root_path\": \"/path/to/src\"\n" #endif - " },\n" - " \"targets\": {\n" - " \"//foo:bar()\": {\n" - " \"args\": [ \"{{response_file_name}}\" ],\n" - " \"deps\": [ ],\n" - " \"inputs\": [ \"//foo/input1.txt\" ],\n" - " \"metadata\": {\n" - "\n" - " },\n" - " \"outputs\": [ \"//out/Debug/output1.out\" ],\n" - " \"public\": \"*\",\n" - " \"response_file_contents\": [ \"-j\", \"3\" ],\n" - " \"script\": \"//foo/script.py\",\n" - " \"sources\": [ \"//foo/source1.txt\" ],\n" - " \"testonly\": false,\n" - " \"toolchain\": \"\",\n" - " \"type\": \"action\",\n" - " \"visibility\": [ ]\n" - " }\n" - " }\n" - "}\n"; + R"_( }, + "targets": { + "//foo:bar()": { + "args": [ "{{response_file_name}}" ], + "deps": [ ], + "inputs": [ "//foo/input1.txt" ], + "metadata": { + + }, + "outputs": [ "//out/Debug/output1.out" ], + "public": "*", + "response_file_contents": [ "-j", "3" ], + "script": "//foo/script.py", + "sources": [ "//foo/source1.txt" ], + "testonly": false, + "toolchain": "", + "type": "action", + "visibility": [ ] + } + }, + "toolchains": { + "//toolchain:default": { + "alink": { + "command": "ar {{output}} {{source}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}.a" ], + "weak_framework_switch": "-weak_framework " + }, + "cc": { + "command": "cc {{source}} {{cflags}} {{cflags_c}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "compile_xcassets": { + "command": "touch {{output}}" + }, + "copy": { + "command": "cp {{source}} {{output}}" + }, + "copy_bundle_data": { + "command": "cp {{source}} {{output}}" + }, + "cxx": { + "command": "c++ {{source}} {{cflags}} {{cflags_cc}} {{defines}} {{include_dirs}} -o {{output}}", + "command_launcher": "launcher", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "link": { + "command": "ld -o {{target_output_name}} {{source}} {{ldflags}} {{libs}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}" ], + "weak_framework_switch": "-weak_framework " + }, + "objc": { + "command": "objcc {{source}} {{cflags}} {{cflags_objc}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "objcxx": { + "command": "objcxx {{source}} {{cflags}} {{cflags_objcc}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "rust_bin": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "outputs": [ "{{root_out_dir}}/{{crate_name}}{{output_extension}}" ] + }, + "rust_cdylib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "" ] + }, + "rust_dylib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "" ] + }, + "rust_macro": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "rust_rlib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".rlib", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "rust_staticlib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".a", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "solink": { + "command": "ld -shared -o {{target_output_name}}.so {{inputs}} {{ldflags}} {{libs}}", + "default_output_extension": ".so", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ], + "weak_framework_switch": "-weak_framework " + }, + "solink_module": { + "command": "ld -bundle -o {{target_output_name}}.so {{inputs}} {{ldflags}} {{libs}}", + "default_output_extension": ".so", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ], + "weak_framework_switch": "-weak_framework " + }, + "stamp": { + "command": "touch {{output}}" + }, + "swift": { + "command": "swiftc --module-name {{module_name}} {{module_dirs}} {{inputs}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{target_out_dir}}/{{module_name}}.swiftmodule" ], + "partial_outputs": [ "{{target_out_dir}}/{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + } + } + } +} +)_"; EXPECT_EQ(expected_json, out) << out; } @@ -116,37 +279,200 @@ base::ReplaceSubstringsAfterOffset(&out, 0, "\r\n", "\n"); #endif const char expected_json[] = - "{\n" - " \"build_settings\": {\n" - " \"build_dir\": \"//out/Debug/\",\n" - " \"default_toolchain\": \"//toolchain:default\",\n" - " \"gen_input_files\": [ ],\n" - " \"root_path\": \"\"\n" - " },\n" - " \"targets\": {\n" - " \"//foo:bar()\": {\n" - " \"allow_circular_includes_from\": [ ],\n" - " \"check_includes\": true,\n" - " \"crate_name\": \"foo\",\n" - " \"crate_root\": \"//foo/lib.rs\",\n" - " \"deps\": [ ],\n" - " \"externs\": {\n" - "\n" - " },\n" - " \"metadata\": {\n" - "\n" - " },\n" - " \"outputs\": [ \"//out/Debug/obj/foo/libbar.rlib\" ],\n" - " \"public\": \"*\",\n" - " \"sources\": [ \"//foo/lib.rs\" ],\n" - " \"testonly\": false,\n" - " \"toolchain\": \"\",\n" - " \"type\": \"rust_library\",\n" - " \"visibility\": [ \"*\" ]\n" - " }\n" - " }\n" - "}\n"; - EXPECT_EQ(expected_json, out); + R"_({ + "build_settings": { + "build_dir": "//out/Debug/", + "default_toolchain": "//toolchain:default", + "gen_input_files": [ ], + "root_path": "" + }, + "targets": { + "//foo:bar()": { + "allow_circular_includes_from": [ ], + "check_includes": true, + "crate_name": "foo", + "crate_root": "//foo/lib.rs", + "deps": [ ], + "externs": { + + }, + "metadata": { + + }, + "outputs": [ "//out/Debug/obj/foo/libbar.rlib" ], + "public": "*", + "sources": [ "//foo/lib.rs" ], + "testonly": false, + "toolchain": "", + "type": "rust_library", + "visibility": [ "*" ] + } + }, + "toolchains": { + "//toolchain:default": { + "alink": { + "command": "ar {{output}} {{source}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}.a" ], + "weak_framework_switch": "-weak_framework " + }, + "cc": { + "command": "cc {{source}} {{cflags}} {{cflags_c}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "compile_xcassets": { + "command": "touch {{output}}" + }, + "copy": { + "command": "cp {{source}} {{output}}" + }, + "copy_bundle_data": { + "command": "cp {{source}} {{output}}" + }, + "cxx": { + "command": "c++ {{source}} {{cflags}} {{cflags_cc}} {{defines}} {{include_dirs}} -o {{output}}", + "command_launcher": "launcher", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "link": { + "command": "ld -o {{target_output_name}} {{source}} {{ldflags}} {{libs}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}" ], + "weak_framework_switch": "-weak_framework " + }, + "objc": { + "command": "objcc {{source}} {{cflags}} {{cflags_objc}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "objcxx": { + "command": "objcxx {{source}} {{cflags}} {{cflags_objcc}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "rust_bin": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "outputs": [ "{{root_out_dir}}/{{crate_name}}{{output_extension}}" ] + }, + "rust_cdylib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "" ] + }, + "rust_dylib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "" ] + }, + "rust_macro": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "rust_rlib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".rlib", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "rust_staticlib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".a", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "solink": { + "command": "ld -shared -o {{target_output_name}}.so {{inputs}} {{ldflags}} {{libs}}", + "default_output_extension": ".so", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ], + "weak_framework_switch": "-weak_framework " + }, + "solink_module": { + "command": "ld -bundle -o {{target_output_name}}.so {{inputs}} {{ldflags}} {{libs}}", + "default_output_extension": ".so", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ], + "weak_framework_switch": "-weak_framework " + }, + "stamp": { + "command": "touch {{output}}" + }, + "swift": { + "command": "swiftc --module-name {{module_name}} {{module_dirs}} {{inputs}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{target_out_dir}}/{{module_name}}.swiftmodule" ], + "partial_outputs": [ "{{target_out_dir}}/{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + } + } + } +} +)_"; + EXPECT_EQ(expected_json, out) << out; } TEST_F(JSONWriter, ForEachWithResponseFile) { @@ -191,42 +517,203 @@ base::ReplaceSubstringsAfterOffset(&out, 0, "\r\n", "\n"); #endif const char expected_json[] = - "{\n" - " \"build_settings\": {\n" - " \"build_dir\": \"//out/Debug/\",\n" - " \"default_toolchain\": \"//toolchain:default\",\n" - " \"gen_input_files\": [ \"//.gn\", \"//BUILD.gn\" ],\n" + R"_({ + "build_settings": { + "build_dir": "//out/Debug/", + "default_toolchain": "//toolchain:default", + "gen_input_files": [ "//.gn", "//BUILD.gn" ], +)_" #if defined(OS_WIN) " \"root_path\": \"c:/path/to/src\"\n" #else " \"root_path\": \"/path/to/src\"\n" #endif - " },\n" - " \"targets\": {\n" - " \"//foo:bar()\": {\n" - " \"args\": [ \"{{source}}\", \"{{source_file_part}}\", " - "\"{{response_file_name}}\" ],\n" - " \"deps\": [ ],\n" - " \"metadata\": {\n" - "\n" - " },\n" - " \"output_patterns\": [ " - "\"//out/Debug/{{source_name_part}}.out\" ],\n" - " \"outputs\": [ \"//out/Debug/input1.out\" ],\n" - " \"public\": \"*\",\n" - " \"response_file_contents\": [ \"-j\", \"{{source_name_part}}\" " - "],\n" - " \"script\": \"//foo/script.py\",\n" - " \"source_outputs\": {\n" - " \"//foo/input1.txt\": [ \"input1.out\" ]\n" - " },\n" - " \"sources\": [ \"//foo/input1.txt\" ],\n" - " \"testonly\": false,\n" - " \"toolchain\": \"\",\n" - " \"type\": \"action_foreach\",\n" - " \"visibility\": [ ]\n" - " }\n" - " }\n" - "}\n"; - EXPECT_EQ(expected_json, out); + R"_( }, + "targets": { + "//foo:bar()": { + "args": [ "{{source}}", "{{source_file_part}}", "{{response_file_name}}" ], + "deps": [ ], + "metadata": { + + }, + "output_patterns": [ "//out/Debug/{{source_name_part}}.out" ], + "outputs": [ "//out/Debug/input1.out" ], + "public": "*", + "response_file_contents": [ "-j", "{{source_name_part}}" ], + "script": "//foo/script.py", + "source_outputs": { + "//foo/input1.txt": [ "input1.out" ] + }, + "sources": [ "//foo/input1.txt" ], + "testonly": false, + "toolchain": "", + "type": "action_foreach", + "visibility": [ ] + } + }, + "toolchains": { + "//toolchain:default": { + "alink": { + "command": "ar {{output}} {{source}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}.a" ], + "weak_framework_switch": "-weak_framework " + }, + "cc": { + "command": "cc {{source}} {{cflags}} {{cflags_c}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "compile_xcassets": { + "command": "touch {{output}}" + }, + "copy": { + "command": "cp {{source}} {{output}}" + }, + "copy_bundle_data": { + "command": "cp {{source}} {{output}}" + }, + "cxx": { + "command": "c++ {{source}} {{cflags}} {{cflags_cc}} {{defines}} {{include_dirs}} -o {{output}}", + "command_launcher": "launcher", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "link": { + "command": "ld -o {{target_output_name}} {{source}} {{ldflags}} {{libs}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}" ], + "weak_framework_switch": "-weak_framework " + }, + "objc": { + "command": "objcc {{source}} {{cflags}} {{cflags_objc}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "objcxx": { + "command": "objcxx {{source}} {{cflags}} {{cflags_objcc}} {{defines}} {{include_dirs}} -o {{output}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + }, + "rust_bin": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "outputs": [ "{{root_out_dir}}/{{crate_name}}{{output_extension}}" ] + }, + "rust_cdylib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "" ] + }, + "rust_dylib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "" ] + }, + "rust_macro": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".so", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "rust_rlib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".rlib", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "rust_staticlib": { + "command": "{{rustenv}} rustc --crate-name {{crate_name}} {{source}} --crate-type {{crate_type}} {{rustflags}} -o {{output}} {{rustdeps}} {{externs}}", + "default_output_extension": ".a", + "framework_switch": "-lframework=", + "lib_dir_switch": "-Lnative=", + "lib_switch": "-l", + "linker_arg": "-Clink-arg=", + "output_prefix": "lib", + "outputs": [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ] + }, + "solink": { + "command": "ld -shared -o {{target_output_name}}.so {{inputs}} {{ldflags}} {{libs}}", + "default_output_extension": ".so", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ], + "weak_framework_switch": "-weak_framework " + }, + "solink_module": { + "command": "ld -bundle -o {{target_output_name}}.so {{inputs}} {{ldflags}} {{libs}}", + "default_output_extension": ".so", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "output_prefix": "lib", + "outputs": [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ], + "weak_framework_switch": "-weak_framework " + }, + "stamp": { + "command": "touch {{output}}" + }, + "swift": { + "command": "swiftc --module-name {{module_name}} {{module_dirs}} {{inputs}}", + "framework_dir_switch": "-F", + "framework_switch": "-framework ", + "lib_dir_switch": "-L", + "lib_switch": "-l", + "outputs": [ "{{target_out_dir}}/{{module_name}}.swiftmodule" ], + "partial_outputs": [ "{{target_out_dir}}/{{source_name_part}}.o" ], + "weak_framework_switch": "-weak_framework " + } + } + } +} +)_"; + EXPECT_EQ(expected_json, out) << out; }