From ca47896204482bf4a6979e3838bf7f09f61cebeb Mon Sep 17 00:00:00 2001 From: giy <giy@omp-system.ru> Date: Fri, 02 Sep 2022 14:16:56 +0300 Subject: [PATCH] Обновление до версии 2.9.0 --- QtVsTools.Core/MsBuildProject.cs | 104 +++++++++++++++++++++++++-------------------------- 1 files changed, 51 insertions(+), 53 deletions(-) diff --git a/QtVsTools.Core/MsBuildProject.cs b/QtVsTools.Core/MsBuildProject.cs index 3b11f34..3eff430 100644 --- a/QtVsTools.Core/MsBuildProject.cs +++ b/QtVsTools.Core/MsBuildProject.cs @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2017 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. @@ -30,22 +30,22 @@ using System.IO; using System.Collections.Generic; using System.Text; +using System.Text.RegularExpressions; using System.Linq; using System.Xml; using System.Xml.Linq; -using QtVsTools.Core.QtMsBuild; -using System.Text.RegularExpressions; using Microsoft.Build.Construction; using Microsoft.Build.Execution; using Microsoft.Build.Evaluation; -using QtVsTools.VisualStudio; -using QtVsTools.SyntaxAnalysis; -using EnvDTE; +using Microsoft.VisualStudio.Shell; namespace QtVsTools.Core { + using QtMsBuild; + using SyntaxAnalysis; + using static HelperFunctions; - using static RegExpr; + using static SyntaxAnalysis.RegExpr; public class MsBuildProject { @@ -65,7 +65,8 @@ User, Count } - MsBuildXmlFile[] files = new MsBuildXmlFile[(int)Files.Count]; + + readonly MsBuildXmlFile[] files = new MsBuildXmlFile[(int)Files.Count]; MsBuildProject() { @@ -94,7 +95,7 @@ } } - private static XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003"; + private static readonly XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003"; public static MsBuildProject Load(string pathToProject) { @@ -293,12 +294,8 @@ if (ConfigCondition == null) return false; - // Get default Qt dir - string defaultQtDir = null; var defaultVersionName = QtVersionManager.The().GetDefaultVersion(); var defaultVersion = QtVersionManager.The().GetVersionInfo(defaultVersionName); - if (defaultVersion != null) - defaultQtDir = defaultVersion.qtDir; // Get project configurations var configs = this[Files.Project].xml @@ -314,15 +311,6 @@ .FirstOrDefault(); if (globals == null) return false; - - // Get project configuration properties - var configProps = this[Files.Project].xml - .Elements(ns + "Project") - .Elements(ns + "PropertyGroup") - .Where(pg => - (string)pg.Attribute("Label") == "Configuration" - && pg.Attribute("Condition") != null) - .ToDictionary(pg => (string)pg.Attribute("Condition")); // Set Qt project format version var projKeyword = globals @@ -386,10 +374,8 @@ foreach (var pg in uncategorizedPropertyGroups) { foreach (var p in pg.Elements().ToList()) { var condition = p.Attribute("Condition") ?? pg.Attribute("Condition"); - XElement configPropertyGroup = null; - if (condition != null) - propertyGroups.TryGetValue((string)condition, out configPropertyGroup); - if (configPropertyGroup != null) { + if (condition != null && propertyGroups + .TryGetValue((string)condition, out XElement configPropertyGroup)) { p.Remove(); p.SetAttributeValue("Condition", null); configPropertyGroup.Add(p); @@ -535,12 +521,10 @@ foreach (var configQtSettings in qtSettings) { var configCondition = (string)configQtSettings.Attribute("Condition"); - XElement oldConfigQtInstall; - if (oldQtInstall.TryGetValue(configCondition, out oldConfigQtInstall)) + if (oldQtInstall.TryGetValue(configCondition, out XElement oldConfigQtInstall)) configQtSettings.Add(oldConfigQtInstall); - XElement oldConfigQtSettings; - if (oldQtSettings.TryGetValue(configCondition, out oldConfigQtSettings)) { + if (oldQtSettings.TryGetValue(configCondition, out XElement oldConfigQtSettings)) { foreach (var qtSetting in oldConfigQtSettings.Elements()) configQtSettings.Add(qtSetting); } @@ -600,6 +584,11 @@ .Elements(ns + "ItemDefinitionGroup") .Elements(ns + "Link"); + var resourceCompiler = this[Files.Project].xml + .Elements(ns + "Project") + .Elements(ns + "ItemDefinitionGroup") + .Elements(ns + "ResourceCompile"); + // Qt module names, to copy to QtModules property var moduleNames = new HashSet<string>(); @@ -613,9 +602,9 @@ var moduleLibs = new HashSet<string>(); // Go through all known Qt modules and check which ones are currently being used - foreach (var module in QtModules.Instance.GetAvailableModules()) { + foreach (var module in QtModules.Instance.GetAvailableModules(defaultVersion.qtMajor)) { - if (IsModuleUsed(module, compiler, linker)) { + if (IsModuleUsed(module, compiler, linker, resourceCompiler)) { // Qt module names, to copy to QtModules property if (!string.IsNullOrEmpty(module.proVarQT)) @@ -670,6 +659,12 @@ .Select(x => Unquote(x)) // Exclude paths rooted on $(QTDIR) .Where(x => !x.StartsWith("$(QTDIR)", IGNORE_CASE)))); + } + + // Remove Qt module macros from resource compiler properties + foreach (var defines in resourceCompiler.Elements(ns + "PreprocessorDefinitions")) { + defines.SetValue(string.Join(";", defines.Value.Split(';') + .Where(x => !moduleDefines.Contains(x)))); } // Add Qt module names to QtModules project property @@ -778,7 +773,8 @@ bool IsModuleUsed( QtModule module, IEnumerable<XElement> compiler, - IEnumerable<XElement> linker) + IEnumerable<XElement> linker, + IEnumerable<XElement> resourceCompiler) { // Module .lib is present in linker additional dependencies if (linker.Elements(ns + "AdditionalDependencies") @@ -788,8 +784,15 @@ return true; } - // Module macro is present in pre-processor definitions + // Module macro is present in the compiler pre-processor definitions if (compiler.Elements(ns + "PreprocessorDefinitions") + .SelectMany(x => x.Value.Split(';')) + .Any(x => module.Defines.Contains(x))) { + return true; + } + + // Module macro is present in resource compiler pre-processor definitions + if (resourceCompiler.Elements(ns + "PreprocessorDefinitions") .SelectMany(x => x.Value.Split(';')) .Any(x => module.Defines.Contains(x))) { return true; @@ -958,9 +961,9 @@ commandLine = replace(row.itemName, commandLine); // // * Configuration/platform, e.g. x64\Debug --> $(Platform)\$(Configuration) - commandLine = commandLine - .Replace(configName, "$(Configuration)", - StringComparison.InvariantCultureIgnoreCase) + // * ignore any word other than the expected configuration, e.g. lrelease.exe + commandLine = Regex.Replace(commandLine, @"\b" + configName + @"\b", + "$(Configuration)", RegexOptions.IgnoreCase) .Replace(platformName, "$(Platform)", StringComparison.InvariantCultureIgnoreCase); @@ -969,8 +972,7 @@ evaluator.Properties.Add(configProp.Name.LocalName, (string)configProp); if (!qtMsBuild.SetCommandLine(itemType, item, commandLine, evaluator)) { int lineNumber = 1; - var errorLine = row.command as IXmlLineInfo; - if (errorLine != null && errorLine.HasLineInfo()) + if (row.command is IXmlLineInfo errorLine && errorLine.HasLineInfo()) lineNumber = errorLine.LineNumber; Messages.Print(string.Format( @@ -1059,8 +1061,7 @@ return (string)cbt.Attribute("Include"); } } - string ouputFile; - if (!properties.TryGetValue(QtMoc.Property.InputFile, out ouputFile)) + if (!properties.TryGetValue(QtMoc.Property.InputFile, out string ouputFile)) return (string)cbt.Attribute("Include"); return ouputFile; } @@ -1085,8 +1086,7 @@ Path.IsPathRooted(x) ? x : Path.Combine(projDir, x))); var outputItems = new List<XElement>(); foreach (var outputFile in outputFiles) { - List<XElement> mocOutput = null; - if (projItemsByPath.TryGetValue(outputFile, out mocOutput)) { + if (projItemsByPath.TryGetValue(outputFile, out List<XElement> mocOutput)) { outputItems.AddRange(mocOutput); hasGeneratedFiles |= hasGeneratedFiles ? true : mocOutput .Where(x => !x.Elements(ns + "ExcludedFromBuild") @@ -1469,17 +1469,16 @@ class MSBuildEvaluator : IVSMacroExpander, IDisposable { - MsBuildXmlFile projFile; - string tempProjFilePath; - XElement evaluateTarget; - XElement evaluateProperty; - ProjectRootElement projRoot; - public Dictionary<string, string> expansionCache; + private readonly MsBuildXmlFile projFile; + private string tempProjFilePath; + private XElement evaluateTarget; + private XElement evaluateProperty; + private ProjectRootElement projRoot; + private readonly Dictionary<string, string> expansionCache; public Dictionary<string, string> Properties { get; - private set; } public MSBuildEvaluator(MsBuildXmlFile projFile) @@ -1522,8 +1521,7 @@ public string ExpandString(string stringToExpand) { - string expandedString; - if (TryExpansionCache(stringToExpand, out expandedString)) + if (TryExpansionCache(stringToExpand, out string expandedString)) return expandedString; if (evaluateTarget == null) { @@ -1649,7 +1647,7 @@ return true; } - static Regex ConditionParser = + static readonly Regex ConditionParser = new Regex(@"\'\$\(Configuration[^\)]*\)\|\$\(Platform[^\)]*\)\'\=\=\'([^\']+)\'"); class MsBuildConverterProvider : IPropertyStorageProvider -- Gitblit v1.9.1