/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt VS Tools. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ using Microsoft.VisualStudio.VCProjectEngine; using System; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; namespace QtProjectLib { /// /// Adds convenience functions to the VCLinkerTool. /// public class LinkerToolWrapper { private VCLinkerTool linker; public LinkerToolWrapper(VCLinkerTool linkerTool) { linker = linkerTool; } public List AdditionalLibraryDirectories { get { if (linker.AdditionalLibraryDirectories == null) return null; var dirArray = linker.AdditionalLibraryDirectories.Split(new[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries); var lst = new List(dirArray); for (var i = 0; i < lst.Count; ++i) { var item = lst[i]; if (item.StartsWith("\"", StringComparison.Ordinal) && item.EndsWith("\"", StringComparison.Ordinal)) { item = item.Remove(0, 1); item = item.Remove(item.Length - 1, 1); lst[i] = item; } } return lst; } internal set { if (value == null) { linker.AdditionalLibraryDirectories = null; return; } var newAdditionalLibraryDirectories = string.Empty; var firstLoop = true; foreach (var item in value) { if (firstLoop) firstLoop = false; else newAdditionalLibraryDirectories += ";"; if (!Path.IsPathRooted(item) || item.IndexOfAny(new[] { ' ', '\t' }) > 0) newAdditionalLibraryDirectories += "\"" + item + "\""; else newAdditionalLibraryDirectories += item; } if (newAdditionalLibraryDirectories != linker.AdditionalLibraryDirectories) linker.AdditionalLibraryDirectories = newAdditionalLibraryDirectories; } } public List AdditionalDependencies { get { if (linker.AdditionalDependencies == null) return null; return splitByWhitespace(linker.AdditionalDependencies); } internal set { if (value == null) { linker.AdditionalDependencies = null; return; } var newAdditionalDependencies = string.Empty; var separators = new[] { ' ', '\t' }; var firstLoop = true; foreach (var item in value) { if (firstLoop) firstLoop = false; else newAdditionalDependencies += " "; var idx = item.IndexOfAny(separators); if (idx >= 0) newAdditionalDependencies += "\"" + item + "\""; else newAdditionalDependencies += item; } if (newAdditionalDependencies != linker.AdditionalDependencies) linker.AdditionalDependencies = newAdditionalDependencies; } } /// /// Splits a given string by whitespace characters and takes care of double quotes. /// /// string to be split /// private static List splitByWhitespace(string str) { var separators = new[] { ' ', '\t' }; var i = str.IndexOf('"'); if (i == -1) return new List(str.Split(separators, StringSplitOptions.RemoveEmptyEntries)); var ret = new List(); var startIndex = 0; var r = new Regex(@"""[^""]*"""); var mc = r.Matches(str); foreach (Match match in mc) { var item = match.Value; item = item.Remove(0, 1); item = item.Remove(item.Length - 1, 1); // Add all items before this match, using standard splitting. var strBefore = str.Substring(startIndex, match.Index - startIndex); var lstBefore = strBefore.Split(separators, StringSplitOptions.RemoveEmptyEntries); ret.AddRange(lstBefore); startIndex = match.Index + match.Length; if (item.Length == 0) continue; ret.Add(item); } if (startIndex < str.Length - 1) { // Add all items after the quoted match, using standard splitting. var strBefore = str.Substring(startIndex); var lstBefore = strBefore.Split(separators, StringSplitOptions.RemoveEmptyEntries); ret.AddRange(lstBefore); } return ret; } } }