Наша сборка Qt VS Tools
giy
2022-09-02 ca47896204482bf4a6979e3838bf7f09f61cebeb
QtVsTools.Core/ProjectExporter.cs
@@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt VS Tools.
@@ -26,15 +26,16 @@
**
****************************************************************************/
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.VCProjectEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.VCProjectEngine;
using EnvDTE;
using EnvDTE80;
namespace QtVsTools.Core
{
@@ -43,7 +44,7 @@
    /// </summary>
    public class ProjectExporter
    {
        private DTE dteObject;
        private readonly DTE dteObject;
        public ProjectExporter(DTE dte)
        {
@@ -91,13 +92,15 @@
        private ProSolution CreateProFileSolution(Solution sln)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            ProFileContent content;
            var prosln = new ProSolution(sln);
            foreach (var proj in HelperFunctions.ProjectsInSolution(sln.DTE)) {
                try {
                    // only add qt projects
                    if (HelperFunctions.IsQtProject(proj)) {
                    if (HelperFunctions.IsVsToolsProject(proj)) {
                        content = CreateProFileContent(proj);
                        prosln.ProFiles.Add(content);
                    } else if (proj.Kind == ProjectKinds.vsProjectKindSolutionFolder) {
@@ -113,9 +116,11 @@
        private void addProjectsInFolder(Project solutionFolder, ProSolution sln)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            foreach (ProjectItem pi in solutionFolder.ProjectItems) {
                var containedProject = pi.Object as Project;
                if (HelperFunctions.IsQtProject(containedProject)) {
                if (HelperFunctions.IsVsToolsProject(containedProject)) {
                    var content = CreateProFileContent(containedProject);
                    sln.ProFiles.Add(content);
                } else if (containedProject.Kind == ProjectKinds.vsProjectKindSolutionFolder) {
@@ -126,6 +131,8 @@
        private static ProFileContent CreateProFileContent(Project project)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            ProFileOption option;
            var qtPro = QtProject.Create(project);
            var content = new ProFileContent(qtPro.VCProject);
@@ -192,8 +199,7 @@
            if (config.ConfigurationType == ConfigurationTypes.typeStaticLibrary)
                option.List.Add("staticlib");
            if (linker != null) {
                var linkerRule = linker as IVCRulePropertyStorage;
                var generateDebugInformation = (linkerRule != null) ?
                var generateDebugInformation = (linker is IVCRulePropertyStorage linkerRule) ?
                    linkerRule.GetUnevaluatedPropertyValue("GenerateDebugInformation") : null;
                if (generateDebugInformation != "false")
                    option.List.Add("debug");
@@ -213,10 +219,12 @@
                }
            }
            if (qtPro.IsDesignerPluginProject()) {
                option.List.Add("designer");
            var legacyDesigner = Legacy.QtProject.IsDesignerPluginProject(qtPro);
            var plugin = legacyDesigner | Core.QtProject.IsQtPlugin(qtPro);
            if (plugin)
                option.List.Add("plugin");
            }
            if (legacyDesigner)
                option.List.Add("designer");
            // add defines
            option = new ProFileOption("DEFINES");
@@ -323,12 +331,18 @@
                option.List.Add(project.Name + ".rc");
            }
            if (qtPro.IsDesignerPluginProject()) {
            if (plugin) {
                option = new ProFileOption("target.path");
                option.ShortComment = "Install the plugin in the designer plugins directory.";
                if (legacyDesigner)
                    option.ShortComment = "Installs the plugin in the designer plugins directory.";
                else
                    option.ShortComment = "Installs the plugin in the plugins directory.";
                option.IncludeComment = true;
                option.AssignSymbol = ProFileOption.AssignType.AT_Equals;
                option.List.Add("$$[QT_INSTALL_PLUGINS]/designer");
                if (legacyDesigner)
                    option.List.Add("$$[QT_INSTALL_PLUGINS]/designer");
                else
                    option.List.Add("$$[QT_INSTALL_PLUGINS]");
                content.Options.Add(option);
                option = new ProFileOption("INSTALLS");
@@ -343,6 +357,8 @@
        private static ProFileContent CreatePriFileContent(Project project, string priFileDirectory)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            ProFileOption option;
            var qtPro = QtProject.Create(project);
            var content = new ProFileContent(qtPro.VCProject);
@@ -417,6 +433,8 @@
        private static void AddIncludePaths(Project project, ProFileOption option, string includePaths)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_ClProperties)
                return;
@@ -437,10 +455,7 @@
                if (!d.StartsWith("$(qtdir)\\include", StringComparison.OrdinalIgnoreCase) &&
                    !d.StartsWith(qtDir + "\\include", StringComparison.OrdinalIgnoreCase) &&
                    !d.EndsWith("win32-msvc2005", StringComparison.OrdinalIgnoreCase)) {
                    var vcConfig = project.ConfigurationManager.ActiveConfiguration.Object
                        as VCConfiguration;
                    if (vcConfig != null)
                    if (project.ConfigurationManager.ActiveConfiguration.Object is VCConfiguration vcConfig)
                        HelperFunctions.ExpandString(ref d, vcConfig);
                    if (HelperFunctions.IsAbsoluteFilePath(d))
                        d = HelperFunctions.GetRelativePath(project.FullName, d);
@@ -461,8 +476,9 @@
                qtDir = Environment.GetEnvironmentVariable("QTDIR");
            if (qtDir == null)
                qtDir = "";
            qtDir = HelperFunctions.NormalizeRelativeFilePath(qtDir);
            ThreadHelper.ThrowIfNotOnUIThread();
            if (paths != null) {
                foreach (var s in paths.Split(';', ',')) {
@@ -491,7 +507,14 @@
        private static void AddModules(QtProject qtPrj, ProFileOption optionQT, ProFileOption optionCONFIG)
        {
            foreach (var module in QtModules.Instance.GetAvailableModules()) {
            ThreadHelper.ThrowIfNotOnUIThread();
            var vm = QtVersionManager.The();
            var versionInfo = vm.GetVersionInfo(qtPrj.Project);
            if (versionInfo == null)
                versionInfo = vm.GetVersionInfo(vm.GetDefaultVersion());
            foreach (var module in QtModules.Instance.GetAvailableModules(versionInfo.qtMajor)) {
                if (!qtPrj.HasModule(module.Id))
                    continue;
@@ -504,6 +527,8 @@
        private void WriteProSolution(ProSolution prosln, bool openFile)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            var sln = prosln.ProjectSolution;
            if (string.IsNullOrEmpty(sln.FileName))
                return;
@@ -573,6 +598,8 @@
        private void WriteProFile(ProFileContent content, string proFile, string priFileToInclude, bool openFile)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            StreamWriter sw;
            if (File.Exists(proFile)) {
                if (MessageBox.Show(SR.GetString("ExportProject_ExistsOverwriteQuestion", proFile),
@@ -605,8 +632,7 @@
                WriteProFileOptions(sw, content.Options);
            }
            // open the file in vs
            if (openFile)
            if (openFile) // open the file in vs
                dteObject.OpenFile(Constants.vsViewKindTextView, proFile).Activate();
        }
@@ -705,6 +731,8 @@
        public static void SyncIncludeFiles(VCProject vcproj, List<string> priFiles,
            List<string> projFiles, DTE dte, bool flat, FakeFilter fakeFilter)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            var cmpPriFiles = new List<string>(priFiles.Count);
            foreach (var s in priFiles)
                cmpPriFiles.Add(HelperFunctions.NormalizeFilePath(s).ToLower());
@@ -779,7 +807,7 @@
        public void ExportToProFile()
        {
            var expDlg = new ExportProjectDialog();
            ThreadHelper.ThrowIfNotOnUIThread();
            var sln = dteObject.Solution;
            var prosln = CreateProFileSolution(sln);
@@ -789,6 +817,7 @@
                return;
            }
            var expDlg = new ExportProjectDialog();
            expDlg.ProFileSolution = prosln;
            expDlg.StartPosition = FormStartPosition.CenterParent;
            var ww = new MainWinWrapper(dteObject);
@@ -814,9 +843,10 @@
        public string ExportToPriFile(Project proj)
        {
            VCProject vcproj;
            ThreadHelper.ThrowIfNotOnUIThread();
            if (HelperFunctions.IsQtProject(proj)) {
            VCProject vcproj;
            if (HelperFunctions.IsVsToolsProject(proj)) {
                try {
                    vcproj = (VCProject)proj.Object;
                } catch (Exception e) {
@@ -844,8 +874,9 @@
        public void ExportToPriFile(Project proj, string fileName)
        {
            var priFile = new FileInfo(fileName);
            ThreadHelper.ThrowIfNotOnUIThread();
            var priFile = new FileInfo(fileName);
            var content = CreatePriFileContent(proj, priFile.DirectoryName);
            WritePriFile(content, priFile.FullName);
        }