aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiguel Costa <miguel.costa@qt.io>2018-03-16 14:31:41 +0100
committerMiguel Costa <miguel.costa@qt.io>2018-03-23 09:54:09 +0000
commit15b8d95995bd064543c50300182e6517d026a90b (patch)
tree5280b25df8c10b3ecc544525b935b3876148d1f3
parent41966c712db87b252d83593c391951453cc45987 (diff)
Get target architecture from qconfig.pri (QT_ARCH)
Enhanced the parser of qconfig.pri to be able to access the value of QT_ARCH, including the case of cross-compilation (where this variable is defined inside a conditional block). The previous method of parsing the Qt5Core.dll PE record does not work with a static build of Qt. Task-number: QTVSADDINBUG-523 Change-Id: Ic12e35c520c8af90ae7a44f8b7dd191cbbd7c408 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r--src/qtprojectlib/QtConfig.cs67
-rw-r--r--src/qtprojectlib/VersionInformation.cs61
2 files changed, 45 insertions, 83 deletions
diff --git a/src/qtprojectlib/QtConfig.cs b/src/qtprojectlib/QtConfig.cs
index 5431bf99..94d5dc59 100644
--- a/src/qtprojectlib/QtConfig.cs
+++ b/src/qtprojectlib/QtConfig.cs
@@ -47,6 +47,8 @@ namespace QtProjectLib
public string LibInfix { get; private set; }
+ public bool Is64Bit { get; private set; }
+
public QtConfig(string qtdir)
{
LibInfix = string.Empty;
@@ -55,36 +57,51 @@ namespace QtProjectLib
if (!fi.Exists)
return;
- var variableDef = new Regex(@"^\s*(\w+)\s*([\+\-]?\=)(.*)");
- try {
- using (var reader = new StreamReader(fi.FullName)) {
- string line;
- while ((line = reader.ReadLine()) != null) {
- var match = variableDef.Match(line);
- if (!match.Success || match.Groups.Count < 4)
- continue;
+ var qConfig = File.ReadAllText(fi.FullName);
+
+ var variableDef = new Regex(@"(\w+)\s*\{|(\})|([\w\.]+)\s*([\+\-]?\=)(.*)\n");
+ var lastBlock = string.Empty;
+ bool inBlock = false;
+ foreach (Match match in variableDef.Matches(qConfig)) {
+ var block = match.Groups[1].Value;
+ var blockEnd = match.Groups[2].Value;
+ var name = match.Groups[3].Value;
+ var oper = match.Groups[4].Value;
+ var data = match.Groups[5].Value;
+
+ if (!string.IsNullOrEmpty(block)) {
+ inBlock = true;
+ if (block == "else" && !string.IsNullOrEmpty(lastBlock))
+ lastBlock = "!" + lastBlock;
+ else
+ lastBlock = block;
+ } else if (!string.IsNullOrEmpty(blockEnd)) {
+ inBlock = false;
+ if (lastBlock.StartsWith("!"))
+ lastBlock = "";
+ } else if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(data)
+ && (!inBlock || lastBlock == "!host_build")) {
- var name = match.Groups[1].Value;
- var oper = match.Groups[2].Value;
- var data = match.Groups[3].Value;
- if (name == "CONFIG") {
- var values = data.Split(new char[] { ' ', '\t' },
- StringSplitOptions.RemoveEmptyEntries);
- foreach (var value in values) {
- if (value == "static") {
- BuildType = BuildType.Static;
- break;
- } else if (value == "shared") {
- BuildType = BuildType.Shared;
- break;
- }
+ data = data.Replace("\r", "").Trim();
+ if (name == "CONFIG") {
+ var values = data.Split(new char[] { ' ', '\t' },
+ StringSplitOptions.RemoveEmptyEntries);
+ foreach (var value in values) {
+ if (value == "static") {
+ BuildType = BuildType.Static;
+ break;
+ } else if (value == "shared") {
+ BuildType = BuildType.Shared;
+ break;
}
- } else if (name == "QT_LIBINFIX") {
- LibInfix = data.Trim();
}
+ } else if (name == "QT_LIBINFIX") {
+ LibInfix = data;
+ } else if (name == "QT_ARCH") {
+ Is64Bit = (data == "x86_64");
}
}
- } catch { }
+ }
}
}
}
diff --git a/src/qtprojectlib/VersionInformation.cs b/src/qtprojectlib/VersionInformation.cs
index 4e06c547..c7d23ed2 100644
--- a/src/qtprojectlib/VersionInformation.cs
+++ b/src/qtprojectlib/VersionInformation.cs
@@ -208,64 +208,9 @@ namespace QtProjectLib
public bool is64Bit()
{
- var fileToCheck = Path.Combine(qtDir,
- "bin", string.Format("Qt5Core{0}.dll", LibInfix()));
- if (!File.Exists(fileToCheck))
- throw new QtVSException("Can't find " + fileToCheck);
-
- const ushort MAGIC_NUMBER_MZ = 0x5A4D;
- const uint FILE_HEADER_OFFSET = 0x3C;
- const uint PE_SIGNATURE = 0x4550;
- const ushort IMAGE_FILE_MACHINE_I386 = 0x014c;
- const ushort IMAGE_FILE_MACHINE_IA64 = 0x0200;
- const ushort IMAGE_FILE_MACHINE_AMD64 = 0x8664;
-
- using (var b = new BinaryReader(File.Open(fileToCheck,
- FileMode.Open, FileAccess.Read, FileShare.Read))) {
-
- ushort magicNumber;
- try {
- magicNumber = b.ReadUInt16();
- } catch {
- throw new QtVSException("Error reading PE header: magic number");
- }
- if (magicNumber != MAGIC_NUMBER_MZ)
- throw new QtVSException("Incorrect PE header format: magic number");
-
- uint fileHeaderOffset;
- try {
- b.BaseStream.Seek(FILE_HEADER_OFFSET, SeekOrigin.Begin);
- fileHeaderOffset = b.ReadUInt32();
- } catch {
- throw new QtVSException("Error reading PE header: file header offset");
- }
-
- uint signature;
- try {
- b.BaseStream.Seek(fileHeaderOffset, SeekOrigin.Begin);
- signature = b.ReadUInt32();
- } catch {
- throw new QtVSException("Error reading PE header: signature");
- }
- if (signature != PE_SIGNATURE)
- throw new QtVSException("Incorrect PE header format: signature");
-
- ushort machine;
- try {
- machine = b.ReadUInt16();
- } catch {
- throw new QtVSException("Error reading PE header: machine");
- }
- switch (machine) {
- case IMAGE_FILE_MACHINE_I386:
- return false;
- case IMAGE_FILE_MACHINE_IA64:
- case IMAGE_FILE_MACHINE_AMD64:
- return true;
- default:
- throw new QtVSException("Unknown executable format for " + fileToCheck);
- }
- }
+ if (qtConfig == null)
+ qtConfig = new QtConfig(qtDir);
+ return qtConfig.Is64Bit;
}
public bool isWinRT()