OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "tools/gn/visual_studio_writer.h" | 5 #include "tools/gn/visual_studio_writer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <iterator> | 8 #include <iterator> |
9 #include <map> | 9 #include <map> |
10 #include <memory> | 10 #include <memory> |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 } | 146 } |
147 | 147 |
148 void ParseCompilerOptions(const Target* target, CompilerOptions* options) { | 148 void ParseCompilerOptions(const Target* target, CompilerOptions* options) { |
149 for (ConfigValuesIterator iter(target); !iter.done(); iter.Next()) { | 149 for (ConfigValuesIterator iter(target); !iter.done(); iter.Next()) { |
150 ParseCompilerOptions(iter.cur().cflags(), options); | 150 ParseCompilerOptions(iter.cur().cflags(), options); |
151 ParseCompilerOptions(iter.cur().cflags_c(), options); | 151 ParseCompilerOptions(iter.cur().cflags_c(), options); |
152 ParseCompilerOptions(iter.cur().cflags_cc(), options); | 152 ParseCompilerOptions(iter.cur().cflags_cc(), options); |
153 } | 153 } |
154 } | 154 } |
155 | 155 |
| 156 void ParseLinkerOptions(const std::vector<std::string>& ldflags, |
| 157 LinkerOptions* options) { |
| 158 for (const std::string& flag : ldflags) |
| 159 ParseLinkerOption(flag, options); |
| 160 } |
| 161 |
| 162 void ParseLinkerOptions(const Target* target, LinkerOptions* options) { |
| 163 for (ConfigValuesIterator iter(target); !iter.done(); iter.Next()) { |
| 164 ParseLinkerOptions(iter.cur().ldflags(), options); |
| 165 } |
| 166 } |
| 167 |
156 // Returns a string piece pointing into the input string identifying the parent | 168 // Returns a string piece pointing into the input string identifying the parent |
157 // directory path, excluding the last slash. Note that the input pointer must | 169 // directory path, excluding the last slash. Note that the input pointer must |
158 // outlive the output. | 170 // outlive the output. |
159 base::StringPiece FindParentDir(const std::string* path) { | 171 base::StringPiece FindParentDir(const std::string* path) { |
160 DCHECK(path && !path->empty()); | 172 DCHECK(path && !path->empty()); |
161 for (int i = static_cast<int>(path->size()) - 2; i >= 0; --i) { | 173 for (int i = static_cast<int>(path->size()) - 2; i >= 0; --i) { |
162 if (IsSlash((*path)[i])) | 174 if (IsSlash((*path)[i])) |
163 return base::StringPiece(path->data(), i); | 175 return base::StringPiece(path->data(), i); |
164 } | 176 } |
165 return base::StringPiece(); | 177 return base::StringPiece(); |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 if (!options.runtime_library.empty()) | 544 if (!options.runtime_library.empty()) |
533 cl_compile->SubElement("RuntimeLibrary")->Text(options.runtime_library); | 545 cl_compile->SubElement("RuntimeLibrary")->Text(options.runtime_library); |
534 if (!options.treat_warning_as_error.empty()) { | 546 if (!options.treat_warning_as_error.empty()) { |
535 cl_compile->SubElement("TreatWarningAsError") | 547 cl_compile->SubElement("TreatWarningAsError") |
536 ->Text(options.treat_warning_as_error); | 548 ->Text(options.treat_warning_as_error); |
537 } | 549 } |
538 if (!options.warning_level.empty()) | 550 if (!options.warning_level.empty()) |
539 cl_compile->SubElement("WarningLevel")->Text(options.warning_level); | 551 cl_compile->SubElement("WarningLevel")->Text(options.warning_level); |
540 } | 552 } |
541 | 553 |
542 // We don't include resource compilation and link options as ninja files | 554 std::unique_ptr<XmlElementWriter> link = |
543 // are used to generate real build. | 555 item_definitions->SubElement("Link"); |
| 556 { |
| 557 LinkerOptions options; |
| 558 ParseLinkerOptions(target, &options); |
| 559 if (!options.subsystem.empty()) |
| 560 link->SubElement("SubSystem")->Text(options.subsystem); |
| 561 } |
| 562 |
| 563 // We don't include resource compilation and other link options as ninja |
| 564 // files are used to generate real build. |
544 } | 565 } |
545 | 566 |
546 { | 567 { |
547 std::unique_ptr<XmlElementWriter> group = project.SubElement("ItemGroup"); | 568 std::unique_ptr<XmlElementWriter> group = project.SubElement("ItemGroup"); |
548 std::vector<OutputFile> tool_outputs; // Prevent reallocation in loop. | 569 std::vector<OutputFile> tool_outputs; // Prevent reallocation in loop. |
549 | 570 |
550 for (const SourceFile& file : target->sources()) { | 571 for (const SourceFile& file : target->sources()) { |
551 const char* compile_type; | 572 const char* compile_type; |
552 Toolchain::ToolType tool_type = Toolchain::TYPE_NONE; | 573 Toolchain::ToolType tool_type = Toolchain::TYPE_NONE; |
553 if (target->GetOutputFilesForSource(file, &tool_type, &tool_outputs)) { | 574 if (target->GetOutputFilesForSource(file, &tool_type, &tool_outputs)) { |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
838 } | 859 } |
839 } | 860 } |
840 | 861 |
841 std::string VisualStudioWriter::GetNinjaTarget(const Target* target) { | 862 std::string VisualStudioWriter::GetNinjaTarget(const Target* target) { |
842 std::ostringstream ninja_target_out; | 863 std::ostringstream ninja_target_out; |
843 DCHECK(!target->dependency_output_file().value().empty()); | 864 DCHECK(!target->dependency_output_file().value().empty()); |
844 ninja_path_output_.WriteFile(ninja_target_out, | 865 ninja_path_output_.WriteFile(ninja_target_out, |
845 target->dependency_output_file()); | 866 target->dependency_output_file()); |
846 return ninja_target_out.str(); | 867 return ninja_target_out.str(); |
847 } | 868 } |
OLD | NEW |