Skip to content

Commit abb0481

Browse files
committed
Updated Qt# to work with the latest C++# which supports modules, and optimised the generation of documentation.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 69956ed commit abb0481

18 files changed

+570
-558
lines changed

QtSharp.CLI/IEnumerableExtensions.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.

QtSharp.CLI/Program.cs

Lines changed: 30 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
using System.Linq;
66
using System.Text.RegularExpressions;
77
using CppSharp;
8-
using CppSharp.Parser;
9-
using ClangParser = CppSharp.Parser.ClangParser;
108

119
namespace QtSharp.CLI
1210
{
@@ -43,32 +41,15 @@ static int ParseArgs(string[] args, out string qmake, out string make, out bool
4341
return 0;
4442
}
4543

46-
class QtVersion
47-
{
48-
public int MajorVersion;
49-
public int MinorVersion;
50-
public string Path;
51-
public string Target;
52-
public string Docs;
53-
public string QMake;
54-
public string Make;
55-
public string Bins;
56-
public string Libs;
57-
public string Headers;
58-
public IEnumerable<string> LibFiles;
59-
public IEnumerable<string> SystemIncludeDirs;
60-
public IEnumerable<string> FrameworkDirs;
61-
}
62-
63-
static List<QtVersion> FindQt()
44+
static List<QtInfo> FindQt()
6445
{
6546
var home = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
66-
var qts = new List<QtVersion>();
47+
var qts = new List<QtInfo>();
6748

6849
var qtPath = Path.Combine(home, "Qt");
6950
if (!Directory.Exists(qtPath))
7051
{
71-
return new List<QtVersion>();
52+
return new List<QtInfo>();
7253
}
7354

7455
foreach (var path in Directory.EnumerateDirectories(qtPath))
@@ -77,7 +58,7 @@ static List<QtVersion> FindQt()
7758
bool isNumber = dir.All(c => char.IsDigit(c) || c == '.');
7859
if (!isNumber)
7960
continue;
80-
var qt = new QtVersion { Path = path };
61+
var qt = new QtInfo { Path = path };
8162
var match = Regex.Match(dir, @"([0-9]+)\.([0-9]+)");
8263
if (!match.Success)
8364
continue;
@@ -89,7 +70,7 @@ static List<QtVersion> FindQt()
8970
return qts;
9071
}
9172

92-
static bool QueryQt(QtVersion qt, bool debug)
73+
static bool QueryQt(QtInfo qt, bool debug)
9374
{
9475
// check for OS X
9576
if (string.IsNullOrWhiteSpace(qt.QMake))
@@ -167,37 +148,6 @@ static bool QueryQt(QtVersion qt, bool debug)
167148
return true;
168149
}
169150

170-
static Dictionary<string, IList<string>> GetDependencies(QtVersion qt)
171-
{
172-
var dependencies = new Dictionary<string, IList<string>>();
173-
174-
var parserOptions = new ParserOptions();
175-
parserOptions.addLibraryDirs(Platform.IsWindows ? qt.Bins : qt.Libs);
176-
if (Platform.IsMacOS)
177-
{
178-
var libsInfo = new DirectoryInfo(qt.Libs);
179-
foreach (var frameworkDir in libsInfo.EnumerateDirectories("*.framework").Select(d => d.FullName))
180-
parserOptions.addLibraryDirs(Path.Combine(frameworkDir));
181-
}
182-
183-
foreach (var libFile in qt.LibFiles)
184-
{
185-
dependencies[libFile] = Enumerable.Empty<string>().ToList();
186-
187-
parserOptions.FileName = libFile;
188-
using (var parserResult = ClangParser.ParseLibrary(parserOptions))
189-
{
190-
if (parserResult.Kind == ParserResultKind.Success)
191-
{
192-
dependencies[libFile] = CppSharp.ClangParser.ConvertLibrary(parserResult.Library).Dependencies;
193-
parserResult.Library.Dispose();
194-
}
195-
}
196-
}
197-
198-
return dependencies;
199-
}
200-
201151
static void ProcessGeneratedInlines ()
202152
{
203153
if (!Platform.IsWindows)
@@ -221,11 +171,11 @@ public static int Main(string[] args)
221171
var qts = FindQt();
222172
bool found = qts.Count != 0;
223173
bool debug = false;
224-
QtVersion qt;
174+
QtInfo qt;
225175

226176
if (!found)
227177
{
228-
qt = new QtVersion();
178+
qt = new QtInfo();
229179

230180
var result = ParseArgs(args, out qt.QMake, out qt.Make, out debug);
231181
if (result != 0)
@@ -245,27 +195,25 @@ public static int Main(string[] args)
245195
if (!QueryQt(qt, debug))
246196
return 1;
247197

248-
var dependencies = GetDependencies(qt);
249-
250198
var modules = new List<string>
251199
{
252-
"Qt5Core",
253-
"Qt5Gui",
254-
"Qt5Widgets",
255-
"Qt5Xml",
256-
"Qt5Designer",
257-
"Qt5Network",
258-
"Qt5Qml",
259-
"Qt5Nfc",
260-
"Qt5OpenGL",
261-
"Qt5ScriptTools",
262-
"Qt5Sensors",
263-
"Qt5SerialPort",
264-
"Qt5Svg",
265-
"Qt5Multimedia",
266-
"Qt5MultimediaWidgets",
267-
"Qt5Quick",
268-
"Qt5QuickWidgets"
200+
"QtCore",
201+
"QtGui",
202+
"QtWidgets",
203+
"QtXml",
204+
"QtDesigner",
205+
"QtNetwork",
206+
"QtQml",
207+
"QtNfc",
208+
"QtOpenGL",
209+
"QtScriptTools",
210+
"QtSensors",
211+
"QtSerialPort",
212+
"QtSvg",
213+
"QtMultimedia",
214+
"QtMultimediaWidgets",
215+
"QtQuick",
216+
"QtQuickWidgets"
269217
};
270218
if (debug)
271219
{
@@ -274,33 +222,16 @@ public static int Main(string[] args)
274222
modules[i] += "d";
275223
}
276224
}
277-
qt.LibFiles = qt.LibFiles.ToList().TopologicalSort(l => dependencies.ContainsKey(l) ? dependencies[l] : Enumerable.Empty<string>());
278-
var wrappedModules = new List<KeyValuePair<string, string>>(modules.Count);
279-
foreach (var libFile in qt.LibFiles)
225+
for (int i = qt.LibFiles.Count - 1; i >= 0; i--)
280226
{
281-
string lib = Path.GetFileNameWithoutExtension(libFile);
282-
if (!Platform.IsWindows)
283-
lib = lib.Replace("Qt", "Qt5");
284-
285-
if (modules.All(m => m != Path.GetFileNameWithoutExtension(lib)))
286-
continue;
287-
288-
if (log)
227+
if (!modules.Contains(QtSharp.GetModuleNameFromLibFile(qt.LibFiles[i])))
289228
{
290-
logredirect.SetLogFile(lib + "Log.txt");
291-
logredirect.Start();
229+
qt.LibFiles.RemoveAt(i);
292230
}
293-
294-
var qtSharp = new QtSharp(new QtModuleInfo(qt.QMake, qt.Make, qt.Headers, Platform.IsWindows ? qt.Bins : qt.Libs,
295-
libFile, qt.Target, qt.SystemIncludeDirs, qt.FrameworkDirs, qt.Docs));
296-
ConsoleDriver.Run(qtSharp);
297-
298-
if (File.Exists(qtSharp.LibraryName) && File.Exists(qtSharp.InlinesLibraryPath))
299-
wrappedModules.Add(new KeyValuePair<string, string>(qtSharp.LibraryName, qtSharp.InlinesLibraryPath));
300-
301-
if (log)
302-
logredirect.Stop();
303231
}
232+
var qtSharp = new QtSharp(qt);
233+
ConsoleDriver.Run(qtSharp);
234+
var wrappedModules = qtSharp.GetVerifiedWrappedModules();
304235

305236
ProcessGeneratedInlines();
306237

QtSharp.CLI/QtSharp.CLI.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@
9090
</ItemGroup>
9191
<ItemGroup>
9292
<Compile Include="ConsoleLogger.cs" />
93-
<Compile Include="IEnumerableExtensions.cs" />
9493
<Compile Include="Program.cs" />
9594
<Compile Include="Properties\AssemblyInfo.cs" />
9695
</ItemGroup>

QtSharp/CompileInlinesPass.cs

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,59 +20,63 @@ public CompileInlinesPass(string qmake, string make)
2020
this.make = make;
2121
}
2222

23-
public override bool VisitLibrary(ASTContext library)
23+
public override bool VisitLibrary(ASTContext context)
2424
{
25-
string error;
26-
const string qtVersionVariable = "QT_VERSION";
27-
var qtVersion = ProcessHelper.Run(this.qmake, string.Format("-query {0}", qtVersionVariable), out error);
28-
var qtVersionFile = Path.Combine(this.Driver.Options.OutputDir, qtVersionVariable);
29-
var dir = Platform.IsMacOS ? this.Driver.Options.OutputDir : Path.Combine(this.Driver.Options.OutputDir, "release");
30-
var inlines = Path.GetFileName(string.Format("{0}{1}.{2}", Platform.IsWindows ? string.Empty : "lib",
31-
this.Driver.Options.InlinesLibraryName, Platform.IsMacOS ? "dylib" : "dll"));
32-
var libFile = Path.Combine(dir, inlines);
33-
var qtVersionFileInfo = new FileInfo(qtVersionFile);
34-
var inlinesFileInfo = new FileInfo(libFile);
35-
string text = string.Empty;
36-
if (!qtVersionFileInfo.Exists || (text = File.ReadAllText(qtVersionFile)) != qtVersion ||
37-
!inlinesFileInfo.Exists || qtVersionFileInfo.CreationTimeUtc > inlinesFileInfo.CreationTimeUtc ||
38-
qtVersionFileInfo.LastWriteTimeUtc > inlinesFileInfo.LastWriteTimeUtc)
25+
foreach (var module in Driver.Options.Modules)
3926
{
40-
if (text != qtVersion)
41-
{
42-
File.WriteAllText(qtVersionFile, qtVersion);
43-
}
44-
if (!this.CompileInlines())
27+
string error;
28+
const string qtVersionVariable = "QT_VERSION";
29+
var qtVersion = ProcessHelper.Run(this.qmake, string.Format("-query {0}", qtVersionVariable), out error);
30+
var qtVersionFile = Path.Combine(this.Driver.Options.OutputDir, qtVersionVariable);
31+
var dir = Platform.IsMacOS ? this.Driver.Options.OutputDir : Path.Combine(this.Driver.Options.OutputDir, "release");
32+
var inlines = Path.GetFileName(string.Format("{0}{1}.{2}", Platform.IsWindows ? string.Empty : "lib",
33+
module.InlinesLibraryName, Platform.IsMacOS ? "dylib" : "dll"));
34+
var libFile = Path.Combine(dir, inlines);
35+
var qtVersionFileInfo = new FileInfo(qtVersionFile);
36+
var inlinesFileInfo = new FileInfo(libFile);
37+
string text = string.Empty;
38+
if (!qtVersionFileInfo.Exists || (text = File.ReadAllText(qtVersionFile)) != qtVersion ||
39+
!inlinesFileInfo.Exists || qtVersionFileInfo.CreationTimeUtc > inlinesFileInfo.CreationTimeUtc ||
40+
qtVersionFileInfo.LastWriteTimeUtc > inlinesFileInfo.LastWriteTimeUtc)
4541
{
46-
return false;
42+
if (text != qtVersion)
43+
{
44+
File.WriteAllText(qtVersionFile, qtVersion);
45+
}
46+
if (!this.CompileInlines(module))
47+
{
48+
continue;
49+
}
4750
}
48-
}
49-
var parserOptions = new ParserOptions();
50-
parserOptions.addLibraryDirs(dir);
51-
parserOptions.FileName = inlines;
52-
using (var parserResult = CppSharp.Parser.ClangParser.ParseLibrary(parserOptions))
53-
{
54-
if (parserResult.Kind == ParserResultKind.Success)
51+
var parserOptions = new ParserOptions();
52+
parserOptions.addLibraryDirs(dir);
53+
parserOptions.LibraryFile = inlines;
54+
using (var parserResult = CppSharp.Parser.ClangParser.ParseLibrary(parserOptions))
5555
{
56-
var nativeLibrary = CppSharp.ClangParser.ConvertLibrary(parserResult.Library);
57-
this.Driver.Symbols.Libraries.Add(nativeLibrary);
58-
this.Driver.Symbols.IndexSymbols();
59-
parserResult.Library.Dispose();
56+
if (parserResult.Kind == ParserResultKind.Success)
57+
{
58+
var nativeLibrary = CppSharp.ClangParser.ConvertLibrary(parserResult.Library);
59+
this.Driver.Symbols.Libraries.Add(nativeLibrary);
60+
this.Driver.Symbols.IndexSymbols();
61+
parserResult.Library.Dispose();
62+
}
6063
}
6164
}
6265
return true;
6366
}
6467

65-
private bool CompileInlines()
68+
private bool CompileInlines(Module module)
6669
{
67-
var pro = string.Format("{0}.pro", this.Driver.Options.InlinesLibraryName);
70+
var pro = string.Format("{0}.pro", module.InlinesLibraryName);
6871
var path = Path.Combine(this.Driver.Options.OutputDir, pro);
6972
var proBuilder = new StringBuilder();
7073
proBuilder.AppendFormat("QT += {0}\n",
71-
string.Join(" ",
72-
this.Driver.Options.Headers.Select(h => h.Substring("Qt".Length).ToLowerInvariant())));
74+
string.Join(" ", from header in module.Headers
75+
where !header.EndsWith(".h", StringComparison.Ordinal)
76+
select header.Substring("Qt".Length).ToLowerInvariant()));
7377
proBuilder.Append("CONFIG += c++11\n");
7478
proBuilder.Append("QMAKE_CXXFLAGS += -fkeep-inline-functions\n");
75-
proBuilder.AppendFormat("TARGET = {0}\n", this.Driver.Options.InlinesLibraryName);
79+
proBuilder.AppendFormat("TARGET = {0}\n", module.InlinesLibraryName);
7680
proBuilder.Append("TEMPLATE = lib\n");
7781
proBuilder.AppendFormat("SOURCES += {0}\n", Path.ChangeExtension(pro, "cpp"));
7882
if (Environment.OSVersion.Platform == PlatformID.Win32NT)

QtSharp/DocGeneration/DocIndexNode.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace QtSharp.DocGeneration
2+
{
3+
public class DocIndexNode
4+
{
5+
public string Name { get; set; }
6+
public string Location { get; set; }
7+
public int LineNumber { get; set; }
8+
public string HRef { get; set; }
9+
public bool IsObsolete { get; set; }
10+
}
11+
}

0 commit comments

Comments
 (0)