diff options
Diffstat (limited to 'gn/tools/gn/visual_studio_writer.h')
-rw-r--r-- | gn/tools/gn/visual_studio_writer.h | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/gn/tools/gn/visual_studio_writer.h b/gn/tools/gn/visual_studio_writer.h new file mode 100644 index 00000000000..3193646b7fc --- /dev/null +++ b/gn/tools/gn/visual_studio_writer.h @@ -0,0 +1,167 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef TOOLS_GN_VISUAL_STUDIO_WRITER_H_ +#define TOOLS_GN_VISUAL_STUDIO_WRITER_H_ + +#include <iosfwd> +#include <memory> +#include <string> +#include <vector> + +#include "base/gtest_prod_util.h" +#include "base/macros.h" +#include "tools/gn/path_output.h" + +namespace base { +class FilePath; +} + +class Builder; +class BuildSettings; +class Err; +class SourceFile; +class Target; + +class VisualStudioWriter { + public: + enum Version { + Vs2013 = 1, // Visual Studio 2013 + Vs2015, // Visual Studio 2015 + Vs2017 // Visual Studio 2017 + }; + + // Writes Visual Studio project and solution files. |sln_name| is the optional + // solution file name ("all" is used if not specified). |filters| is optional + // semicolon-separated list of label patterns used to limit the set of + // generated projects. Only matching targets and their dependencies (unless + // |no_deps| is true) will be included to the solution. On failure will + // populate |err| and will return false. |win_sdk| is the Windows SDK version + // which will be used by Visual Studio IntelliSense. + static bool RunAndWriteFiles(const BuildSettings* build_settings, + const Builder& builder, + Version version, + const std::string& sln_name, + const std::string& filters, + const std::string& win_sdk, + const std::string& ninja_extra_args, + bool no_deps, + Err* err); + + private: + FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, ResolveSolutionFolders); + FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, + ResolveSolutionFolders_AbsPath); + FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, NoDotSlash); + + // Solution project or folder. + struct SolutionEntry { + SolutionEntry(const std::string& name, + const std::string& path, + const std::string& guid); + virtual ~SolutionEntry(); + + // Entry name. For projects must be unique in the solution. + std::string name; + // Absolute project file or folder directory path. + std::string path; + // GUID-like string. + std::string guid; + // Pointer to parent folder. nullptr if entry has no parent. + SolutionEntry* parent_folder; + }; + + struct SolutionProject : public SolutionEntry { + SolutionProject(const std::string& name, + const std::string& path, + const std::string& guid, + const std::string& label_dir_path, + const std::string& config_platform); + ~SolutionProject() override; + + // Absolute label dir path. + std::string label_dir_path; + // Configuration platform. May be different than solution config platform. + std::string config_platform; + }; + + struct SourceFileCompileTypePair { + SourceFileCompileTypePair(const SourceFile* file, const char* compile_type); + ~SourceFileCompileTypePair(); + + // Source file. + const SourceFile* file; + // Compile type string. + const char* compile_type; + }; + + using SolutionProjects = std::vector<std::unique_ptr<SolutionProject>>; + using SolutionFolders = std::vector<std::unique_ptr<SolutionEntry>>; + using SourceFileCompileTypePairs = std::vector<SourceFileCompileTypePair>; + + VisualStudioWriter(const BuildSettings* build_settings, + const char* config_platform, + Version version, + const std::string& win_kit); + ~VisualStudioWriter(); + + bool WriteProjectFiles(const Target* target, + const std::string& ninja_extra_args, + Err* err); + bool WriteProjectFileContents(std::ostream& out, + const SolutionProject& solution_project, + const Target* target, + const std::string& ninja_extra_args, + SourceFileCompileTypePairs* source_types, + Err* err); + void WriteFiltersFileContents(std::ostream& out, + const Target* target, + const SourceFileCompileTypePairs& source_types); + bool WriteSolutionFile(const std::string& sln_name, Err* err); + void WriteSolutionFileContents(std::ostream& out, + const base::FilePath& solution_dir_path); + + // Resolves all solution folders (parent folders for projects) into |folders_| + // and updates |root_folder_dir_|. Also sets |parent_folder| for |projects_|. + void ResolveSolutionFolders(); + + std::string GetNinjaTarget(const Target* target); + + const BuildSettings* build_settings_; + + // Toolset version. + const char* toolset_version_; + + // Project version. + const char* project_version_; + + // Visual Studio version string. + const char* version_string_; + + // Platform for solution configuration (Win32, x64). Some projects may be + // configured for different platform. + const char* config_platform_; + + // All projects contained by solution. + SolutionProjects projects_; + + // Absolute root solution folder path. + std::string root_folder_path_; + + // Folders for all solution projects. + SolutionFolders folders_; + + // Semicolon-separated Windows SDK include directories. + std::string windows_kits_include_dirs_; + + // Path formatter for ninja targets. + PathOutput ninja_path_output_; + + // Windows 10 SDK version string (e.g. 10.0.14393.0) + std::string windows_sdk_version_; + + DISALLOW_COPY_AND_ASSIGN(VisualStudioWriter); +}; + +#endif // TOOLS_GN_VISUAL_STUDIO_WRITER_H_ |