Qbs: refactor property provider.

Set toolchain list centrally.

Set target OS for additional operating systems: WinRT, Windows CE,
Android, FreeBSD, NetBSD, OpenBSD, BSD (generic), BlackBerry, QNX,
and Solaris.

No more "else assumptions" which would for example detect Clang on
Windows as MSVC, any non-Clang toolchains as GCC, or any unrecognized
operating systems as Unix.

bsd4 is gone as it is not necessary in any practical sense (and no other
operating systems have different identifiers by version -- there is a
dedicated hostOSVersion property anyways).

Detect iOS without relying on Qt.

Change-Id: I38e2adf188d4604182ec84003dc5d281fce025cc
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
This commit is contained in:
Jake Petroules
2014-09-28 14:43:54 -04:00
parent 544783cf2a
commit 631ee70cc7

View File

@@ -33,17 +33,25 @@
#include <projectexplorer/kit.h> #include <projectexplorer/kit.h>
#include <projectexplorer/kitinformation.h> #include <projectexplorer/kitinformation.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <qtsupport/baseqtversion.h> #include <qtsupport/baseqtversion.h>
#include <qtsupport/qtkitinformation.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <tools/hostosinfo.h> #include <tools/hostosinfo.h>
#include <ios/iosconstants.h>
#include <qnx/qnxconstants.h>
#include <winrt/winrtconstants.h>
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
namespace QbsProjectManager { namespace QbsProjectManager {
using namespace Constants; using namespace Constants;
using namespace ProjectExplorer::Constants;
using namespace Ios::Constants;
using namespace Qnx::Constants;
using namespace WinRt::Internal::Constants;
static QString extractToolchainPrefix(QString *compilerName) static QString extractToolchainPrefix(QString *compilerName)
{ {
@@ -57,6 +65,80 @@ static QString extractToolchainPrefix(QString *compilerName)
return prefix; return prefix;
} }
static QStringList targetOSList(const ProjectExplorer::Abi &abi, const ProjectExplorer::Kit *k)
{
const Core::Id device = ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(k);
QStringList os;
switch (abi.os()) {
case ProjectExplorer::Abi::WindowsOS:
if (device == WINRT_DEVICE_TYPE_LOCAL ||
device == WINRT_DEVICE_TYPE_PHONE ||
device == WINRT_DEVICE_TYPE_EMULATOR) {
os << QLatin1String("winrt");
} else if (abi.osFlavor() == ProjectExplorer::Abi::WindowsCEFlavor) {
os << QLatin1String("windowsce");
}
os << QLatin1String("windows");
break;
case ProjectExplorer::Abi::MacOS:
if (device == DESKTOP_DEVICE_TYPE)
os << QLatin1String("osx");
else if (device == IOS_DEVICE_TYPE)
os << QLatin1String("ios");
else if (device == IOS_SIMULATOR_TYPE)
os << QLatin1String("ios-simulator") << QLatin1String("ios");
os << QLatin1String("darwin") << QLatin1String("bsd") << QLatin1String("unix");
break;
case ProjectExplorer::Abi::LinuxOS:
if (abi.osFlavor() == ProjectExplorer::Abi::AndroidLinuxFlavor)
os << QLatin1String("android");
os << QLatin1String("linux") << QLatin1String("unix");
break;
case ProjectExplorer::Abi::BsdOS:
switch (abi.osFlavor()) {
case ProjectExplorer::Abi::FreeBsdFlavor:
os << QLatin1String("freebsd");
break;
case ProjectExplorer::Abi::NetBsdFlavor:
os << QLatin1String("netbsd");
break;
case ProjectExplorer::Abi::OpenBsdFlavor:
os << QLatin1String("openbsd");
break;
default:
break;
}
os << QLatin1String("bsd") << QLatin1String("unix");
break;
case ProjectExplorer::Abi::UnixOS:
if (device == QNX_BB_OS_TYPE)
os << QLatin1String("blackberry") << QLatin1String("qnx");
else if (device == QNX_QNX_OS_TYPE)
os << QLatin1String("qnx");
else if (abi.osFlavor() == ProjectExplorer::Abi::SolarisUnixFlavor)
os << QLatin1String("solaris");
os << QLatin1String("unix");
break;
default:
break;
}
return os;
}
static QStringList toolchainList(const ProjectExplorer::ToolChain *tc)
{
QStringList list;
if (tc->type() == QLatin1String("clang"))
list << QLatin1String("clang") << QLatin1String("llvm") << QLatin1String("gcc");
else if (tc->type() == QLatin1String("gcc"))
list << QLatin1String("gcc"); // TODO: Detect llvm-gcc
else if (tc->type() == QLatin1String("mingw"))
list << QLatin1String("mingw") << QLatin1String("gcc");
else if (tc->type() == QLatin1String("msvc"))
list << QLatin1String("msvc");
return list;
}
QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k, const QVariantMap &defaultData) const QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k, const QVariantMap &defaultData) const
{ {
QTC_ASSERT(k, return defaultData); QTC_ASSERT(k, return defaultData);
@@ -70,7 +152,6 @@ QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k, c
if (!tc) if (!tc)
return data; return data;
// FIXME/CLARIFY: How to pass the sysroot?
ProjectExplorer::Abi targetAbi = tc->targetAbi(); ProjectExplorer::Abi targetAbi = tc->targetAbi();
if (targetAbi.architecture() != ProjectExplorer::Abi::UnknownArchitecture) { if (targetAbi.architecture() != ProjectExplorer::Abi::UnknownArchitecture) {
QString architecture = ProjectExplorer::Abi::toString(targetAbi.architecture()); QString architecture = ProjectExplorer::Abi::toString(targetAbi.architecture());
@@ -96,40 +177,15 @@ QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k, c
qbs::Internal::HostOsInfo::canonicalArchitecture(architecture)); qbs::Internal::HostOsInfo::canonicalArchitecture(architecture));
} }
switch (targetAbi.os()) { QStringList targetOS = targetOSList(targetAbi, k);
case ProjectExplorer::Abi::WindowsOS: if (!targetOS.isEmpty())
data.insert(QLatin1String(QBS_TARGETOS), QLatin1String("windows"));
data.insert(QLatin1String(QBS_TOOLCHAIN),
targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor
? QStringList() << QLatin1String("mingw") << QLatin1String("gcc")
: QStringList() << QLatin1String("msvc"));
break;
case ProjectExplorer::Abi::MacOS: {
const char IOSQT[] = "Qt4ProjectManager.QtVersion.Ios"; // from Ios::Constants (include header?)
const char IOS_SIMULATOR_TYPE[] = "Ios.Simulator.Type";
const QtSupport::BaseQtVersion * const qt = QtSupport::QtKitInformation::qtVersion(k);
QStringList targetOS;
targetOS << QLatin1String("darwin") << QLatin1String("bsd4")
<< QLatin1String("bsd") << QLatin1String("unix");
if (qt && qt->type() == QLatin1String(IOSQT)) {
targetOS.insert(0, QLatin1String("ios"));
if (ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(k) == IOS_SIMULATOR_TYPE)
targetOS.insert(0, QLatin1String("ios-simulator"));
} else {
targetOS.insert(0, QLatin1String("osx"));
}
data.insert(QLatin1String(QBS_TARGETOS), targetOS); data.insert(QLatin1String(QBS_TARGETOS), targetOS);
if (tc->type() != QLatin1String("clang")) { QStringList toolchain = toolchainList(tc);
data.insert(QLatin1String(QBS_TOOLCHAIN), QLatin1String("gcc")); if (!toolchain.isEmpty())
} else { data.insert(QLatin1String(QBS_TOOLCHAIN), toolchain);
data.insert(QLatin1String(QBS_TOOLCHAIN),
QStringList() << QLatin1String("clang")
<< QLatin1String("llvm")
<< QLatin1String("gcc"));
}
if (targetAbi.os() == ProjectExplorer::Abi::MacOS) {
// Set Xcode SDK name and version - required by Qbs if a sysroot is present // Set Xcode SDK name and version - required by Qbs if a sysroot is present
// Ideally this would be done in a better way... // Ideally this would be done in a better way...
QRegExp re(QLatin1String("(MacOSX|iPhoneOS|iPhoneSimulator)([0-9]+\\.[0-9]+)\\.sdk")); QRegExp re(QLatin1String("(MacOSX|iPhoneOS|iPhoneSimulator)([0-9]+\\.[0-9]+)\\.sdk"));
@@ -137,31 +193,6 @@ QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k, c
data.insert(QLatin1String(CPP_XCODESDKNAME), QString(re.cap(1).toLower() + re.cap(2))); data.insert(QLatin1String(CPP_XCODESDKNAME), QString(re.cap(1).toLower() + re.cap(2)));
data.insert(QLatin1String(CPP_XCODESDKVERSION), re.cap(2)); data.insert(QLatin1String(CPP_XCODESDKVERSION), re.cap(2));
} }
break;
}
case ProjectExplorer::Abi::LinuxOS:
data.insert(QLatin1String(QBS_TARGETOS), QStringList() << QLatin1String("linux")
<< QLatin1String("unix"));
if (tc->type() != QLatin1String("clang")) {
data.insert(QLatin1String(QBS_TOOLCHAIN), QLatin1String("gcc"));
} else {
data.insert(QLatin1String(QBS_TOOLCHAIN),
QStringList() << QLatin1String("clang")
<< QLatin1String("llvm")
<< QLatin1String("gcc"));
}
break;
default:
// TODO: Factor out toolchain type setting.
data.insert(QLatin1String(QBS_TARGETOS), QStringList() << QLatin1String("unix"));
if (tc->type() != QLatin1String("clang")) {
data.insert(QLatin1String(QBS_TOOLCHAIN), QLatin1String("gcc"));
} else {
data.insert(QLatin1String(QBS_TOOLCHAIN),
QStringList() << QLatin1String("clang")
<< QLatin1String("llvm")
<< QLatin1String("gcc"));
}
} }
Utils::FileName cxx = tc->compilerCommand(); Utils::FileName cxx = tc->compilerCommand();