aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <[email protected]>2022-10-11 16:22:15 +0200
committerChristian Kandeler <[email protected]>2022-10-13 13:28:52 +0000
commita34125ae11ee391f301dc3f414e91e20f6b4da4e (patch)
tree1c7fba9d4d8c2fd81e2c4b0accecf3b3c3d37527
parentb6a766669751ec71cfdb026ad3dbd3b8d8be1c4e (diff)
CMake/qmake: Fix target triple for iOS targets
Neither cmake nor qmake know the full iOS compiler command line, so we have to construct the target triple for the code model ourselves. Fixes: QTCREATORBUG-28278 Change-Id: I6cac06f340e9388de5c86509a8df4ac00eef87cd Reviewed-by: Eike Ziller <[email protected]>
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp34
-rw-r--r--src/plugins/projectexplorer/rawprojectpart.cpp26
-rw-r--r--src/plugins/projectexplorer/rawprojectpart.h8
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp1
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeparsernodes.h1
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeproject.cpp9
6 files changed, 60 insertions, 19 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp
index 4b089dff6fc..d2239ccaa9e 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp
@@ -607,24 +607,24 @@ void CMakeBuildSystem::updateProjectData()
setError(errorMessage);
qCDebug(cmakeBuildSystemLog) << "Raw project parts created." << errorMessage;
- {
- for (RawProjectPart &rpp : rpps) {
- rpp.setQtVersion(
- kitInfo.projectPartQtVersion); // TODO: Check if project actually uses Qt.
- const QString includeFileBaseDir = buildConfiguration()->buildDirectory().toString();
- if (kitInfo.cxxToolChain) {
- rpp.setFlagsForCxx({kitInfo.cxxToolChain, rpp.flagsForCxx.commandLineFlags,
- includeFileBaseDir});
- }
- if (kitInfo.cToolChain) {
- rpp.setFlagsForC({kitInfo.cToolChain, rpp.flagsForC.commandLineFlags,
- includeFileBaseDir});
- }
- }
-
- m_cppCodeModelUpdater->update({p, kitInfo, buildConfiguration()->environment(), rpps},
- m_extraCompilers);
+ for (RawProjectPart &rpp : rpps) {
+ rpp.setQtVersion(
+ kitInfo.projectPartQtVersion); // TODO: Check if project actually uses Qt.
+ const QString includeFileBaseDir = buildConfiguration()->buildDirectory().toString();
+ QStringList cxxFlags = rpp.flagsForCxx.commandLineFlags;
+ QStringList cFlags = rpp.flagsForC.commandLineFlags;
+ addTargetFlagForIos(cxxFlags, cFlags, this, [this] {
+ return m_configurationFromCMake.stringValueOf("CMAKE_OSX_DEPLOYMENT_TARGET");
+ });
+ if (kitInfo.cxxToolChain)
+ rpp.setFlagsForCxx({kitInfo.cxxToolChain, cxxFlags, includeFileBaseDir});
+ if (kitInfo.cToolChain)
+ rpp.setFlagsForC({kitInfo.cToolChain, cFlags, includeFileBaseDir});
}
+
+ m_cppCodeModelUpdater->update({p, kitInfo, buildConfiguration()->environment(), rpps},
+ m_extraCompilers);
+
{
const bool mergedHeaderPathsAndQmlImportPaths = kit()->value(
QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(), false).toBool();
diff --git a/src/plugins/projectexplorer/rawprojectpart.cpp b/src/plugins/projectexplorer/rawprojectpart.cpp
index 35962516171..1f7cea32c96 100644
--- a/src/plugins/projectexplorer/rawprojectpart.cpp
+++ b/src/plugins/projectexplorer/rawprojectpart.cpp
@@ -5,10 +5,12 @@
#include "abi.h"
#include "buildconfiguration.h"
+#include "buildsystem.h"
#include "kitinformation.h"
#include "project.h"
#include "target.h"
+#include <ios/iosconstants.h>
#include <utils/algorithm.h>
namespace ProjectExplorer {
@@ -191,4 +193,28 @@ ProjectUpdateInfo::ProjectUpdateInfo(Project *project,
}
}
+// We do not get the -target flag from qmake or cmake on macOS; see QTCREATORBUG-28278.
+void addTargetFlagForIos(QStringList &cFlags, QStringList &cxxFlags, const BuildSystem *bs,
+ const std::function<QString ()> &getDeploymentTarget)
+{
+ const Utils::Id deviceType = DeviceTypeKitAspect::deviceTypeId(bs->target()->kit());
+ if (deviceType != Ios::Constants::IOS_DEVICE_TYPE
+ && deviceType != Ios::Constants::IOS_SIMULATOR_TYPE) {
+ return;
+ }
+ const bool isSim = deviceType == Ios::Constants::IOS_SIMULATOR_TYPE;
+ QString targetTriple(QLatin1String(isSim ? "x86_64" : "arm64"));
+ targetTriple.append("-apple-ios").append(getDeploymentTarget());
+ if (isSim)
+ targetTriple.append("-simulator");
+ const auto addTargetFlag = [&targetTriple](QStringList &flags) {
+ if (!flags.contains("-target") && !Utils::contains(flags,
+ [](const QString &flag) { return flag.startsWith("--target="); })) {
+ flags << "-target" << targetTriple;
+ }
+ };
+ addTargetFlag(cxxFlags);
+ addTargetFlag(cFlags);
+}
+
} // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/rawprojectpart.h b/src/plugins/projectexplorer/rawprojectpart.h
index fa36dc6c4a8..e1895869294 100644
--- a/src/plugins/projectexplorer/rawprojectpart.h
+++ b/src/plugins/projectexplorer/rawprojectpart.h
@@ -21,9 +21,17 @@
namespace ProjectExplorer {
+class BuildSystem;
class Kit;
class Project;
+void PROJECTEXPLORER_EXPORT addTargetFlagForIos(
+ QStringList &cFlags,
+ QStringList &cxxFlags,
+ const BuildSystem *bs,
+ const std::function<QString()> &getDeploymentTarget
+ );
+
class PROJECTEXPLORER_EXPORT RawProjectPartFlags
{
public:
diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
index 6df3ff16fe7..8467b62bd6b 100644
--- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
@@ -1557,6 +1557,7 @@ QmakeEvalResultPtr QmakeProFile::evaluate(const QmakeEvalInput &input)
result->newVarValues[Variable::AndroidAbis] = exactReader->values(QLatin1String(Android::Constants::ANDROID_ABIS));
result->newVarValues[Variable::AndroidApplicationArgs] = exactReader->values(QLatin1String(Android::Constants::ANDROID_APPLICATION_ARGUMENTS));
result->newVarValues[Variable::AndroidExtraLibs] = exactReader->values(QLatin1String(Android::Constants::ANDROID_EXTRA_LIBS));
+ result->newVarValues[Variable::IosDeploymentTarget] = exactReader->values("QMAKE_IOS_DEPLOYMENT_TARGET");
result->newVarValues[Variable::AppmanPackageDir] = exactReader->values(QLatin1String("AM_PACKAGE_DIR"));
result->newVarValues[Variable::AppmanManifest] = exactReader->values(QLatin1String("AM_MANIFEST"));
result->newVarValues[Variable::IsoIcons] = exactReader->values(QLatin1String("ISO_ICONS"));
diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h
index d481dda64ce..e0e6cdd1331 100644
--- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h
+++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h
@@ -80,6 +80,7 @@ enum class Variable {
AndroidPackageSourceDir,
AndroidExtraLibs,
AndroidApplicationArgs,
+ IosDeploymentTarget,
AppmanPackageDir,
AppmanManifest,
IsoIcons,
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index 605c4c19bb2..47adf657e9a 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -350,10 +350,15 @@ void QmakeBuildSystem::updateCppCodeModel()
};
const QStringList extraCxxArgs = getExtraFlagsFromCompilerVar(Variable::QmakeCxx);
+ cxxArgs << extraCxxArgs;
const QStringList extraCArgs = getExtraFlagsFromCompilerVar(Variable::QmakeCc);
+ cArgs << extraCArgs;
+ addTargetFlagForIos(cArgs, cxxArgs, this, [pro] {
+ return pro->variableValue(Variable::IosDeploymentTarget).join(QString());
+ });
- rpp.setFlagsForCxx({kitInfo.cxxToolChain, cxxArgs << extraCxxArgs, includeFileBaseDir});
- rpp.setFlagsForC({kitInfo.cToolChain, cArgs << extraCArgs, includeFileBaseDir});
+ rpp.setFlagsForCxx({kitInfo.cxxToolChain, cxxArgs, includeFileBaseDir});
+ rpp.setFlagsForC({kitInfo.cToolChain, cArgs, includeFileBaseDir});
rpp.setMacros(ProjectExplorer::Macro::toMacros(pro->cxxDefines()));
rpp.setPreCompiledHeaders(pro->variableValue(Variable::PrecompiledHeader));
rpp.setSelectedForBuilding(pro->includedInExactParse());