Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Unified Diff: tools/gn/visual_studio_writer.cc

Issue 1835943002: GN: VS project calls ninja for single file compiles as well (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/visual_studio_writer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/visual_studio_writer.cc
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index 14a02cd8c15aee5d69d22113f677abde346c46eb..87dfa8164d75e19f92cef28121794a3ae36aff23 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -189,6 +189,14 @@ VisualStudioWriter::SolutionProject::SolutionProject(
VisualStudioWriter::SolutionProject::~SolutionProject() = default;
+VisualStudioWriter::SourceFileCompileTypePair::SourceFileCompileTypePair(
+ const SourceFile* _file,
+ const char* _compile_type)
+ : file(_file), compile_type(_compile_type) {}
+
+VisualStudioWriter::SourceFileCompileTypePair::~SourceFileCompileTypePair() =
+ default;
+
VisualStudioWriter::VisualStudioWriter(const BuildSettings* build_settings,
const char* config_platform,
Version version)
@@ -321,8 +329,9 @@ bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) {
project_config_platform));
std::stringstream vcxproj_string_out;
+ SourceFileCompileTypePairs source_types;
if (!WriteProjectFileContents(vcxproj_string_out, *projects_.back(), target,
- err)) {
+ &source_types, err)) {
projects_.pop_back();
return false;
}
@@ -335,7 +344,7 @@ bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) {
base::FilePath filters_path = UTF8ToFilePath(vcxproj_path_str + ".filters");
std::stringstream filters_string_out;
- WriteFiltersFileContents(filters_string_out, target);
+ WriteFiltersFileContents(filters_string_out, target, source_types);
return WriteFileIfChanged(filters_path, filters_string_out.str(), err);
}
@@ -343,6 +352,7 @@ bool VisualStudioWriter::WriteProjectFileContents(
std::ostream& out,
const SolutionProject& solution_project,
const Target* target,
+ SourceFileCompileTypePairs* source_types,
Err* err) {
PathOutput path_output(GetTargetOutputDir(target),
build_settings_->root_path_utf8(),
@@ -481,13 +491,7 @@ bool VisualStudioWriter::WriteProjectFileContents(
cl_compile->SubElement("MinimalRebuild")->Text("false");
if (!options.optimization.empty())
cl_compile->SubElement("Optimization")->Text(options.optimization);
- if (target->config_values().has_precompiled_headers()) {
- cl_compile->SubElement("PrecompiledHeader")->Text("Use");
- cl_compile->SubElement("PrecompiledHeaderFile")
- ->Text(target->config_values().precompiled_header());
- } else {
- cl_compile->SubElement("PrecompiledHeader")->Text("NotUsing");
- }
+ cl_compile->SubElement("PrecompiledHeader")->Text("NotUsing");
{
std::unique_ptr<XmlElementWriter> preprocessor_definitions =
cl_compile->SubElement("PreprocessorDefinitions");
@@ -512,22 +516,25 @@ bool VisualStudioWriter::WriteProjectFileContents(
{
std::unique_ptr<XmlElementWriter> group = project.SubElement("ItemGroup");
- if (!target->config_values().precompiled_source().is_null()) {
- group
- ->SubElement(
- "ClCompile", "Include",
- SourceFileWriter(path_output,
- target->config_values().precompiled_source()))
- ->SubElement("PrecompiledHeader")
- ->Text("Create");
- }
+ std::vector<OutputFile> tool_outputs; // Prevent reallocation in loop.
for (const SourceFile& file : target->sources()) {
- SourceFileType type = GetSourceFileType(file);
- if (type == SOURCE_H || type == SOURCE_CPP || type == SOURCE_C) {
- group->SubElement(type == SOURCE_H ? "ClInclude" : "ClCompile",
- "Include", SourceFileWriter(path_output, file));
+ const char* compile_type;
+ Toolchain::ToolType tool_type = Toolchain::TYPE_NONE;
+ if (target->GetOutputFilesForSource(file, &tool_type, &tool_outputs)) {
+ compile_type = "CustomBuild";
+ std::unique_ptr<XmlElementWriter> build = group->SubElement(
+ compile_type, "Include", SourceFileWriter(path_output, file));
+ build->SubElement("Command")->Text("call ninja.exe -C $(OutDir) " +
+ tool_outputs[0].value());
+ build->SubElement("Outputs")->Text("$(OutDir)" +
+ tool_outputs[0].value());
+ } else {
+ compile_type = "None";
+ group->SubElement(compile_type, "Include",
+ SourceFileWriter(path_output, file));
}
+ source_types->push_back(SourceFileCompileTypePair(&file, compile_type));
}
}
@@ -562,8 +569,10 @@ bool VisualStudioWriter::WriteProjectFileContents(
return true;
}
-void VisualStudioWriter::WriteFiltersFileContents(std::ostream& out,
- const Target* target) {
+void VisualStudioWriter::WriteFiltersFileContents(
+ std::ostream& out,
+ const Target* target,
+ const SourceFileCompileTypePairs& source_types) {
out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl;
XmlElementWriter project(
out, "Project",
@@ -589,35 +598,31 @@ void VisualStudioWriter::WriteFiltersFileContents(std::ostream& out,
std::set<std::string> processed_filters;
- for (const SourceFile& file : target->sources()) {
- SourceFileType type = GetSourceFileType(file);
- if (type == SOURCE_H || type == SOURCE_CPP || type == SOURCE_C) {
- std::unique_ptr<XmlElementWriter> cl_item = files_group.SubElement(
- type == SOURCE_H ? "ClInclude" : "ClCompile", "Include",
- SourceFileWriter(file_path_output, file));
+ for (const auto& file_and_type : source_types) {
+ std::unique_ptr<XmlElementWriter> cl_item = files_group.SubElement(
+ file_and_type.compile_type, "Include",
+ SourceFileWriter(file_path_output, *file_and_type.file));
- std::ostringstream target_relative_out;
- filter_path_output.WriteFile(target_relative_out, file);
- std::string target_relative_path = target_relative_out.str();
- ConvertPathToSystem(&target_relative_path);
- base::StringPiece filter_path = FindParentDir(&target_relative_path);
+ std::ostringstream target_relative_out;
+ filter_path_output.WriteFile(target_relative_out, *file_and_type.file);
+ std::string target_relative_path = target_relative_out.str();
+ ConvertPathToSystem(&target_relative_path);
+ base::StringPiece filter_path = FindParentDir(&target_relative_path);
- if (!filter_path.empty()) {
- std::string filter_path_str = filter_path.as_string();
- while (processed_filters.find(filter_path_str) ==
- processed_filters.end()) {
- auto it = processed_filters.insert(filter_path_str).first;
- filters_group
- ->SubElement("Filter",
- XmlAttributes("Include", filter_path_str))
- ->SubElement("UniqueIdentifier")
- ->Text(MakeGuid(filter_path_str, kGuidSeedFilter));
- filter_path_str = FindParentDir(&(*it)).as_string();
- if (filter_path_str.empty())
- break;
- }
- cl_item->SubElement("Filter")->Text(filter_path);
+ if (!filter_path.empty()) {
+ std::string filter_path_str = filter_path.as_string();
+ while (processed_filters.find(filter_path_str) ==
+ processed_filters.end()) {
+ auto it = processed_filters.insert(filter_path_str).first;
+ filters_group
+ ->SubElement("Filter", XmlAttributes("Include", filter_path_str))
+ ->SubElement("UniqueIdentifier")
+ ->Text(MakeGuid(filter_path_str, kGuidSeedFilter));
+ filter_path_str = FindParentDir(&(*it)).as_string();
+ if (filter_path_str.empty())
+ break;
}
+ cl_item->SubElement("Filter")->Text(filter_path);
}
}
}
« no previous file with comments | « tools/gn/visual_studio_writer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698