aboutsummaryrefslogtreecommitdiffstats
path: root/src/qtvstools.core/LinkerToolWrapper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/qtvstools.core/LinkerToolWrapper.cs')
-rw-r--r--src/qtvstools.core/LinkerToolWrapper.cs173
1 files changed, 173 insertions, 0 deletions
diff --git a/src/qtvstools.core/LinkerToolWrapper.cs b/src/qtvstools.core/LinkerToolWrapper.cs
new file mode 100644
index 00000000..e1e0a607
--- /dev/null
+++ b/src/qtvstools.core/LinkerToolWrapper.cs
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** 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 QtVsTools.Core
+{
+ /// <summary>
+ /// Adds convenience functions to the VCLinkerTool.
+ /// </summary>
+ public class LinkerToolWrapper
+ {
+ private VCLinkerTool linker;
+
+ public LinkerToolWrapper(VCLinkerTool linkerTool)
+ {
+ linker = linkerTool;
+ }
+
+ public List<string> AdditionalLibraryDirectories
+ {
+ get
+ {
+ if (linker.AdditionalLibraryDirectories == null)
+ return null;
+ var dirArray = linker.AdditionalLibraryDirectories.Split(new[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries);
+ var lst = new List<string>(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<string> 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;
+ }
+ }
+
+ /// <summary>
+ /// Splits a given string by whitespace characters and takes care of double quotes.
+ /// </summary>
+ /// <param name="str">string to be split</param>
+ /// <returns></returns>
+ private static List<string> splitByWhitespace(string str)
+ {
+ var separators = new[] { ' ', '\t' };
+ var i = str.IndexOf('"');
+ if (i == -1)
+ return new List<string>(str.Split(separators, StringSplitOptions.RemoveEmptyEntries));
+
+ var ret = new List<string>();
+ 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;
+ }
+
+ }
+}