diff options
author | Miguel Costa <miguel.costa@qt.io> | 2018-03-16 14:31:41 +0100 |
---|---|---|
committer | Miguel Costa <miguel.costa@qt.io> | 2018-03-23 09:54:09 +0000 |
commit | 15b8d95995bd064543c50300182e6517d026a90b (patch) | |
tree | 5280b25df8c10b3ecc544525b935b3876148d1f3 | |
parent | 41966c712db87b252d83593c391951453cc45987 (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.cs | 67 | ||||
-rw-r--r-- | src/qtprojectlib/VersionInformation.cs | 61 |
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() |