diff options
author | Jake Petroules <jake.petroules@qt.io> | 2017-06-26 17:04:30 -0700 |
---|---|---|
committer | Jake Petroules <jake.petroules@qt.io> | 2017-06-29 08:36:50 +0000 |
commit | 8112ca60323e8342627bffe92ca8f00bfc5812cc (patch) | |
tree | 56fe93817b6657cd866d782ac4ddb3c541b1665a | |
parent | db351f78a672cc9ecf50eae01385675348cd1920 (diff) |
Move the compiler version detection into a separate Probe
The compiler version is needed in the GccProbe itself (to determine
which compiler flags are available to use) so it cannot be done in a
single probe. This change will be taken advantage of in a subsequent
patch.
This patch also fixes a silent failure that caused the wrong compiler
flags to be used in the GccProbe due to the compiler version being
undefined at the point where feature checks based on the compiler
version were being made... specifically, that the -target flag was
assumed to be unavailable due to the missing compiler version.
Change-Id: I13626c37f3fd21b5b8b6632714ba9dd9373b7838
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | share/qbs/imports/qbs/Probes/GccProbe.qbs | 14 | ||||
-rw-r--r-- | share/qbs/imports/qbs/Probes/GccVersionProbe.qbs | 68 | ||||
-rw-r--r-- | share/qbs/modules/cpp/GenericGCC.qbs | 19 |
3 files changed, 83 insertions, 18 deletions
diff --git a/share/qbs/imports/qbs/Probes/GccProbe.qbs b/share/qbs/imports/qbs/Probes/GccProbe.qbs index 7214ffacb..b153f89c0 100644 --- a/share/qbs/imports/qbs/Probes/GccProbe.qbs +++ b/share/qbs/imports/qbs/Probes/GccProbe.qbs @@ -40,15 +40,11 @@ PathProbe { property var environment property string _nullDevice: qbs.nullDevice - property stringList _toolchain: qbs.toolchain property string _pathListSeparator: qbs.pathListSeparator property string _sysroot: qbs.sysroot // Outputs property string architecture - property int versionMajor - property int versionMinor - property int versionPatch property stringList includePaths property stringList libraryPaths property stringList frameworkPaths @@ -71,15 +67,5 @@ PathProbe { // We have to dump the compiler's macros; -dumpmachine is not suitable because it is not // always complete (for example, the subarch is not included for arm architectures). architecture = ModUtils.guessArchitecture(macros); - - if (_toolchain.contains("clang")) { - versionMajor = parseInt(macros["__clang_major__"], 10); - versionMinor = parseInt(macros["__clang_minor__"], 10); - versionPatch = parseInt(macros["__clang_patchlevel__"], 10); - } else { - versionMajor = parseInt(macros["__GNUC__"], 10); - versionMinor = parseInt(macros["__GNUC_MINOR__"], 10); - versionPatch = parseInt(macros["__GNUC_PATCHLEVEL__"], 10); - } } } diff --git a/share/qbs/imports/qbs/Probes/GccVersionProbe.qbs b/share/qbs/imports/qbs/Probes/GccVersionProbe.qbs new file mode 100644 index 000000000..c0044f307 --- /dev/null +++ b/share/qbs/imports/qbs/Probes/GccVersionProbe.qbs @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of the Qt Build Suite. +** +** 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 http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +import qbs +import qbs.File +import "../../../modules/cpp/gcc.js" as Gcc + +PathProbe { + // Inputs + property string compilerFilePath + property var environment + + property string _nullDevice: qbs.nullDevice + property stringList _toolchain: qbs.toolchain + + // Outputs + property int versionMajor + property int versionMinor + property int versionPatch + + configure: { + if (!File.exists(compilerFilePath)) { + found = false; + return; + } + + var macros = Gcc.dumpMacros(environment, compilerFilePath, undefined, _nullDevice); + + if (_toolchain.contains("clang")) { + versionMajor = parseInt(macros["__clang_major__"], 10); + versionMinor = parseInt(macros["__clang_minor__"], 10); + versionPatch = parseInt(macros["__clang_patchlevel__"], 10); + found = true; + } else { + versionMajor = parseInt(macros["__GNUC__"], 10); + versionMinor = parseInt(macros["__GNUC_MINOR__"], 10); + versionPatch = parseInt(macros["__GNUC_PATCHLEVEL__"], 10); + found = true; + } + } +} diff --git a/share/qbs/modules/cpp/GenericGCC.qbs b/share/qbs/modules/cpp/GenericGCC.qbs index c9e10d081..228efee26 100644 --- a/share/qbs/modules/cpp/GenericGCC.qbs +++ b/share/qbs/modules/cpp/GenericGCC.qbs @@ -49,6 +49,15 @@ CppModule { names: [compilerName] } + // Find the version as early as possible in case other things depend on it, + // for example the question of whether certain flags are supported and which need to be used + // in the GccProbe itself. + Probes.GccVersionProbe { + id: gccVersionProbe + compilerFilePath: compilerPath + environment: buildEnv + } + Probes.GccProbe { id: gccProbe compilerFilePath: compilerPath @@ -88,9 +97,9 @@ CppModule { qbs.architecture: gccProbe.found ? gccProbe.architecture : original - compilerVersionMajor: gccProbe.versionMajor - compilerVersionMinor: gccProbe.versionMinor - compilerVersionPatch: gccProbe.versionPatch + compilerVersionMajor: gccVersionProbe.versionMajor + compilerVersionMinor: gccVersionProbe.versionMinor + compilerVersionPatch: gccVersionProbe.versionPatch compilerIncludePaths: gccProbe.includePaths compilerFrameworkPaths: gccProbe.frameworkPaths @@ -100,7 +109,9 @@ CppModule { && Utilities.versionCompare(compilerVersion, "3.1") >= 0 property bool assemblerHasTargetOption: qbs.toolchain.contains("xcode") && Utilities.versionCompare(compilerVersion, "7") >= 0 - property string target: [targetArch, targetVendor, targetSystem, targetAbi].join("-") + property string target: targetArch + ? [targetArch, targetVendor, targetSystem, targetAbi].join("-") + : undefined property string targetArch: Utilities.canonicalTargetArchitecture( qbs.architecture, targetVendor, targetSystem, targetAbi) property string targetVendor: "unknown" |