forked from qt-creator/qt-creator
Adapt to new architectures handling in qbs
This lets qbs handle architectures entirely for GCC/MinGW, ICC, and MSVC toolchains, as well as projects targeting Android or any Apple platform with any toolchain. Now Qt Creator only passes down architecture information to qbs for QNX/QCC and Clang on Windows, Linux, BSD, etc. Change-Id: I44925671d7f280890f9e25a5726d019d3f98dea9 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -145,6 +145,63 @@ static QStringList toolchainList(const ProjectExplorer::ToolChain *tc)
|
||||
return list;
|
||||
}
|
||||
|
||||
static QString architecture(const ProjectExplorer::Abi &targetAbi)
|
||||
{
|
||||
if (targetAbi.architecture() != ProjectExplorer::Abi::UnknownArchitecture) {
|
||||
QString architecture = ProjectExplorer::Abi::toString(targetAbi.architecture());
|
||||
|
||||
// We have to be conservative tacking on suffixes to arch names because an arch that is
|
||||
// already 64-bit may get an incorrect name as a result (i.e. Itanium)
|
||||
if (targetAbi.wordWidth() == 64) {
|
||||
switch (targetAbi.architecture()) {
|
||||
case ProjectExplorer::Abi::X86Architecture:
|
||||
architecture.append(QLatin1Char('_'));
|
||||
// fall through
|
||||
case ProjectExplorer::Abi::ArmArchitecture:
|
||||
// ARM sub-architectures are currently not handled, which is kind of problematic
|
||||
case ProjectExplorer::Abi::MipsArchitecture:
|
||||
case ProjectExplorer::Abi::PowerPCArchitecture:
|
||||
architecture.append(QString::number(targetAbi.wordWidth()));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return architecture;
|
||||
}
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
static bool isMultiTargetingToolchain(const ProjectExplorer::ToolChain *tc)
|
||||
{
|
||||
// Clang and QCC are multi-targeting compilers; others (GCC/MinGW, MSVC, ICC) are not
|
||||
return tc->targetAbi().os() == ProjectExplorer::Abi::QnxOS
|
||||
|| tc->typeId() == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID;
|
||||
}
|
||||
|
||||
static QStringList architectures(const ProjectExplorer::ToolChain *tc)
|
||||
{
|
||||
// For platforms which can have builds for multiple architectures in a single configuration
|
||||
// (Darwin, Android), regardless of whether the toolchain is multi-targeting or not (Clang
|
||||
// always is, but Android GCC is not), let qbs automatically determine the list of architectures
|
||||
// to build for by default. Similarly, if the underlying toolchain only targets a single
|
||||
// architecture there's no reason to duplicate the detection logic here.
|
||||
// Handles: GCC/MinGW, ICC, MSVC, Clang (Darwin, Android)
|
||||
if (tc->targetAbi().os() == ProjectExplorer::Abi::DarwinOS
|
||||
|| tc->targetAbi().osFlavor() == ProjectExplorer::Abi::AndroidLinuxFlavor
|
||||
|| !isMultiTargetingToolchain(tc))
|
||||
return { };
|
||||
|
||||
// This attempts to use the preferred architecture for toolchains which are multi-targeting.
|
||||
// Handles: Clang (Linux/UNIX), QCC
|
||||
const auto arch = architecture(tc->targetAbi());
|
||||
if (!arch.isEmpty())
|
||||
return { arch };
|
||||
return { };
|
||||
}
|
||||
|
||||
QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k,
|
||||
const QVariantMap &defaultData) const
|
||||
{
|
||||
@@ -191,32 +248,10 @@ QVariantMap DefaultPropertyProvider::autoGeneratedProperties(const ProjectExplor
|
||||
ProjectExplorer::ToolChain *mainTc = tcCxx ? tcCxx : tcC;
|
||||
|
||||
ProjectExplorer::Abi targetAbi = mainTc->targetAbi();
|
||||
if (targetAbi.architecture() != ProjectExplorer::Abi::UnknownArchitecture) {
|
||||
QString architecture = ProjectExplorer::Abi::toString(targetAbi.architecture());
|
||||
|
||||
// We have to be conservative tacking on suffixes to arch names because an arch that is
|
||||
// already 64-bit may get an incorrect name as a result (i.e. Itanium)
|
||||
if (targetAbi.wordWidth() == 64) {
|
||||
switch (targetAbi.architecture()) {
|
||||
case ProjectExplorer::Abi::X86Architecture:
|
||||
architecture.append(QLatin1Char('_'));
|
||||
// fall through
|
||||
case ProjectExplorer::Abi::ArmArchitecture:
|
||||
case ProjectExplorer::Abi::MipsArchitecture:
|
||||
case ProjectExplorer::Abi::PowerPCArchitecture:
|
||||
architecture.append(QString::number(targetAbi.wordWidth()));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if (targetAbi.architecture() == ProjectExplorer::Abi::ArmArchitecture &&
|
||||
targetAbi.os() == ProjectExplorer::Abi::DarwinOS) {
|
||||
architecture.append(QLatin1String("v7"));
|
||||
}
|
||||
|
||||
data.insert(QLatin1String(QBS_ARCHITECTURE), qbs::canonicalArchitecture(architecture));
|
||||
}
|
||||
|
||||
auto archs = architectures(mainTc);
|
||||
if (!archs.isEmpty())
|
||||
data.insert(QLatin1String(QBS_ARCHITECTURES), archs);
|
||||
data.insert(QLatin1String(QBS_TARGETOS), targetOSList(targetAbi, k));
|
||||
|
||||
QStringList toolchain = toolchainList(mainTc);
|
||||
|
||||
@@ -77,7 +77,7 @@ static const char QBS_PRODUCT_OVERLAY_ICON[] = ":/qbsprojectmanager/images/produ
|
||||
// Toolchain related settings:
|
||||
const char QBS_TARGETOS[] = "qbs.targetOS";
|
||||
const char QBS_SYSROOT[] = "qbs.sysroot";
|
||||
const char QBS_ARCHITECTURE[] = "qbs.architecture";
|
||||
const char QBS_ARCHITECTURES[] = "qbs.architectures";
|
||||
const char QBS_TOOLCHAIN[] = "qbs.toolchain";
|
||||
const char CPP_TOOLCHAINPATH[] = "cpp.toolchainInstallPath";
|
||||
const char CPP_TOOLCHAINPREFIX[] = "cpp.toolchainPrefix";
|
||||
|
||||
Reference in New Issue
Block a user