bool SetCommandLines( QtMsBuildContainer qtMsBuild, IEnumerable <XElement> configurations, IEnumerable <XElement> customBuilds, string itemType, string workingDir) { var query = from customBuild in customBuilds let itemName = customBuild.Attribute("Include").Value from config in configurations from command in customBuild.Elements(ns + "Command") let commandLine = command.Value where command.Attribute("Condition").Value == string.Format( "'$(Configuration)|$(Platform)'=='{0}'", (string)config.Attribute("Include")) select new { customBuild, itemName, config, commandLine }; using (var evaluator = new MSBuildEvaluator(this[Files.Project])) { foreach (var row in query) { XElement item; row.customBuild.Add(item = new XElement(ns + itemType, new XAttribute("Include", row.itemName), new XAttribute("ConfigName", (string)row.config.Attribute("Include")))); var configName = (string)row.config.Element(ns + "Configuration"); var platformName = (string)row.config.Element(ns + "Platform"); var commandLine = row.commandLine .Replace(Path.GetFileName(row.itemName), "%(Filename)%(Extension)", StringComparison.InvariantCultureIgnoreCase) .Replace(configName, "$(Configuration)", StringComparison.InvariantCultureIgnoreCase) .Replace(platformName, "$(Platform)", StringComparison.InvariantCultureIgnoreCase); evaluator.Properties.Clear(); foreach (var configProp in row.config.Elements()) { evaluator.Properties.Add(configProp.Name.LocalName, (string)configProp); } if (!qtMsBuild.SetCommandLine(itemType, item, commandLine, evaluator)) { return(false); } } } return(true); }
List <CustomBuildEval> EvaluateCustomBuild() { var eval = new List <CustomBuildEval>(); var pattern = new Regex(@"{([^}]+)}{([^}]+)}{([^}]+)}{([^}]+)}{([^}]+)}"); var projConfigs = this[Files.Project].xml .Elements(ns + "Project") .Elements(ns + "ItemGroup") .Elements(ns + "ProjectConfiguration"); using (var evaluator = new MSBuildEvaluator(this[Files.Project])) { foreach (var projConfig in projConfigs) { evaluator.Properties.Clear(); foreach (var configProp in projConfig.Elements()) { evaluator.Properties.Add(configProp.Name.LocalName, (string)configProp); } var expandedValue = evaluator.ExpandString( "@(CustomBuild->'" + "{%(Identity)}" + "{%(AdditionalInputs)}" + "{%(Outputs)}" + "{%(Message)}" + "{%(Command)}')"); foreach (Match cbEval in pattern.Matches(expandedValue)) { eval.Add(new CustomBuildEval { ProjectConfig = (string)projConfig.Attribute("Include"), Identity = cbEval.Groups[1].Value, AdditionalInputs = cbEval.Groups[2].Value, Outputs = cbEval.Groups[3].Value, Message = cbEval.Groups[4].Value, Command = cbEval.Groups[5].Value, }); } } } return(eval); }
string CustomBuildMocInput(XElement cbt) { var commandLine = (string)cbt.Element(ns + "Command"); Dictionary <QtMoc.Property, string> properties; using (var evaluator = new MSBuildEvaluator(this[Files.Project])) { if (!QtMsBuildContainer.QtMocInstance.ParseCommandLine( commandLine, evaluator, out properties)) { return((string)cbt.Attribute("Include")); } } string ouputFile; if (!properties.TryGetValue(QtMoc.Property.InputFile, out ouputFile)) { return((string)cbt.Attribute("Include")); } return(ouputFile); }