aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/ios
diff options
context:
space:
mode:
authorVladimir Serdyuk <vser35@gmail.com>2021-09-08 02:40:38 +0300
committerVladimir Serdyuk <vser35@gmail.com>2021-09-10 15:23:27 +0000
commit5d1d6c83a4b158dceeb20ab46c817ed60f763183 (patch)
treefa28cf457c9d3ac8ee0c59dd978dd2c357db0408 /src/plugins/ios
parent33f1a96005704ea72a4929243d0f04eba4d2f775 (diff)
iOS/CMake: Fix running non-Xcode targets and targets in subdirectories
Improve support for running iOS bundle built with CMake introduced in 3a294f670dae21d3ee284c054e335d2776182998. Currently it supports only Xcode generator and does not work if target is created in a subdirectory. This patch adds support for non-Xcode generators (tested with Ninja) and targets created in a subdirectories with any generators. The solution is not pretty due to the need to keep qmake compatibility. Would be glad to refactor if there's more correct approach. Change-Id: Ieaf7e3186ab55cadc643d9bd3d94442f9ac72228 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/plugins/ios')
-rw-r--r--src/plugins/ios/iosconstants.h1
-rw-r--r--src/plugins/ios/iosrunconfiguration.cpp97
2 files changed, 77 insertions, 21 deletions
diff --git a/src/plugins/ios/iosconstants.h b/src/plugins/ios/iosconstants.h
index 4e26e294606..7f4264ae3cc 100644
--- a/src/plugins/ios/iosconstants.h
+++ b/src/plugins/ios/iosconstants.h
@@ -47,6 +47,7 @@ const char IOS_DEPLOY_STEP_ID[] = "Qt4ProjectManager.IosDeployStep";
const char IosTarget[] = "IosTarget"; // QString
const char IosBuildDir[] = "IosBuildDir"; // QString
+const char IosCmakeGenerator[] = "IosCmakeGenerator";
const quint16 IOS_DEVICE_PORT_START = 30000;
const quint16 IOS_DEVICE_PORT_END = 31000;
diff --git a/src/plugins/ios/iosrunconfiguration.cpp b/src/plugins/ios/iosrunconfiguration.cpp
index aa3abc7b765..1198644a3ac 100644
--- a/src/plugins/ios/iosrunconfiguration.cpp
+++ b/src/plugins/ios/iosrunconfiguration.cpp
@@ -169,30 +169,85 @@ FilePath IosRunConfiguration::bundleDirectory() const
return {};
}
FilePath res;
+ bool shouldAppendBuildTypeAndPlatform = true;
if (BuildConfiguration *bc = target()->activeBuildConfiguration()) {
Project *project = target()->project();
- if (ProjectNode *node = project->findNodeForBuildKey(buildKey()))
- res = FilePath::fromString(node->data(Constants::IosBuildDir).toString());
- if (res.isEmpty())
+ if (ProjectNode *node = project->findNodeForBuildKey(buildKey())) {
+ QString pathStr = node->data(Constants::IosBuildDir).toString();
+ const QString cmakeGenerator = node->data(Constants::IosCmakeGenerator).toString();
+
+ if (cmakeGenerator.isEmpty()) {
+ // qmake node gives absolute IosBuildDir
+ res = FilePath::fromString(pathStr);
+ } else {
+ // CMake node gives IosBuildDir relative to root build directory
+
+ bool useCmakePath = true;
+
+ if (pathStr.isEmpty())
+ useCmakePath = false;
+
+ if (useCmakePath && cmakeGenerator == "Xcode") {
+ // When generating Xcode project, CMake may put a "${EFFECTIVE_PLATFORM_NAME}" macro,
+ // which is expanded by Xcode at build time.
+ // To get an actual executable path at configure time, replace this macro here
+ // depending on the device type.
+
+ const QString before = "${EFFECTIVE_PLATFORM_NAME}";
+
+ int idx = pathStr.indexOf(before);
+
+ if (idx == -1) {
+ useCmakePath = false;
+ } else {
+ QString after;
+ if (isDevice)
+ after = "-iphoneos";
+ else
+ after = "-iphonesimulator";
+
+ pathStr.replace(idx, before.length(), after);
+ }
+ }
+
+ if (useCmakePath) {
+ // With Ninja generator IosBuildDir may be just "." when executable is in the root directory,
+ // so use canonical path to ensure that redundand dot is removed.
+ res = bc->buildDirectory().pathAppended(pathStr).canonicalPath();
+ // All done with path provided by CMake
+ shouldAppendBuildTypeAndPlatform = false;
+ } else {
+ res = bc->buildDirectory();
+ }
+ }
+ }
+
+ if (res.isEmpty()) {
+ // Fallback
res = bc->buildDirectory();
- switch (bc->buildType()) {
- case BuildConfiguration::Debug :
- case BuildConfiguration::Unknown :
- if (isDevice)
- res = res / "Debug-iphoneos";
- else
- res = res.pathAppended("Debug-iphonesimulator");
- break;
- case BuildConfiguration::Profile :
- case BuildConfiguration::Release :
- if (isDevice)
- res = res.pathAppended("Release-iphoneos");
- else
- res = res.pathAppended("Release-iphonesimulator");
- break;
- default:
- qCWarning(iosLog) << "IosBuildStep had an unknown buildType "
- << target()->activeBuildConfiguration()->buildType();
+ shouldAppendBuildTypeAndPlatform = true;
+ }
+
+ if (shouldAppendBuildTypeAndPlatform) {
+ switch (bc->buildType()) {
+ case BuildConfiguration::Debug :
+ case BuildConfiguration::Unknown :
+ if (isDevice)
+ res = res / "Debug-iphoneos";
+ else
+ res = res.pathAppended("Debug-iphonesimulator");
+ break;
+ case BuildConfiguration::Profile :
+ case BuildConfiguration::Release :
+ if (isDevice)
+ res = res.pathAppended("Release-iphoneos");
+ else
+ res = res.pathAppended("Release-iphonesimulator");
+ break;
+ default:
+ qCWarning(iosLog) << "IosBuildStep had an unknown buildType "
+ << target()->activeBuildConfiguration()->buildType();
+ }
}
}
return res.pathAppended(applicationName() + ".app");