summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2022-03-30 12:10:38 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2022-04-04 08:54:17 +0000
commitd64c7802fef2872aa6a78c06648a0aed45250955 (patch)
treed90a9d8426452cf7bae591245481de1b9b96e940
parent77ce522281f33a6d06e7cd9fde39e9f578134533 (diff)
downloadqbs-d64c7802fef2872aa6a78c06648a0aed45250955.tar.gz
Fix Xcode support for 13.3
Some .xcspec files got new names and/or locations. Also, we now fully expand the values of property list variables before applying formatters. Presumably this used to work by accident because a simple look-up never produced a value in need of expansion. Fixes: QBS-1693 Change-Id: Ie66ec69042cdceede9d5ddec7c17de1c3c25a167 Reviewed-by: Ivan Komissarov <ABBAPOH@gmail.com>
-rw-r--r--share/qbs/imports/qbs/DarwinTools/darwin-tools.js72
-rw-r--r--share/qbs/imports/qbs/Probes/XcodeProbe.qbs2
-rw-r--r--share/qbs/modules/bundle/bundle.js6
-rw-r--r--share/qbs/modules/xcode/xcode.js14
4 files changed, 55 insertions, 39 deletions
diff --git a/share/qbs/imports/qbs/DarwinTools/darwin-tools.js b/share/qbs/imports/qbs/DarwinTools/darwin-tools.js
index f88f6ff52..15f2c54ec 100644
--- a/share/qbs/imports/qbs/DarwinTools/darwin-tools.js
+++ b/share/qbs/imports/qbs/DarwinTools/darwin-tools.js
@@ -182,6 +182,41 @@ var PropertyListVariableExpander = (function () {
return { "syntax": syntax, "index": idx };
}
+ function expandString(key, str, env) {
+ if (!str)
+ return str;
+ var repl = indexOfReplacementStart(syntaxes, str);
+ var i = repl.index;
+ while (i !== -1) {
+ var j = str.indexOf(repl.syntax.close, i + repl.syntax.open.length);
+ if (j === -1)
+ return str;
+ var varParts = str.slice(i + repl.syntax.open.length, j).split(':');
+ var varName = varParts[0];
+ var varFormatter = varParts[1];
+ var varValue = expandString(key, env[varName], env);
+ if (undefined === varValue) {
+ // skip replacement
+ if ($this.undefinedVariableFunction)
+ $this.undefinedVariableFunction(key, varName);
+ varValue = "";
+ }
+ varValue = String(varValue);
+ if (varFormatter !== undefined) {
+ // TODO: XCode supports multiple formatters separated by a comma
+ var varFormatterLower = varFormatter.toLowerCase();
+ if (varFormatterLower === "rfc1034identifier" || varFormatterLower === "identifier")
+ varValue = Utilities.rfc1034Identifier(varValue);
+ if (varValue === "" && varFormatterLower.startsWith("default="))
+ varValue = varFormatter.split("=")[1];
+ }
+ str = str.slice(0, i) + varValue + str.slice(j + repl.syntax.close.length);
+ repl = indexOfReplacementStart(syntaxes, str);
+ i = repl.index;
+ }
+ return str;
+ }
+
function expandRecursive(obj, env, checked) {
checked.push(obj);
for (var key in obj) {
@@ -194,40 +229,9 @@ var PropertyListVariableExpander = (function () {
}
if (type !== "string")
continue;
- var repl = indexOfReplacementStart(syntaxes, value);
- var i = repl.index;
- var changes = false;
- while (i !== -1) {
- var j = value.indexOf(repl.syntax.close, i + repl.syntax.open.length);
- if (j === -1)
- break;
- var varParts = value.slice(i + repl.syntax.open.length, j).split(':');
- var varName = varParts[0];
- var varFormatter = varParts[1];
- var varValue = env[varName];
- if (undefined === varValue) {
- // skip replacement
- if ($this.undefinedVariableFunction)
- $this.undefinedVariableFunction(key, varName);
- varValue = "";
- }
- varValue = String(varValue);
- if (varFormatter !== undefined) {
- // TODO: XCode supports multiple formatters separated by a comma
- var varFormatterLower = varFormatter.toLowerCase();
- if (varFormatterLower === "rfc1034identifier")
- varValue = Utilities.rfc1034Identifier(varValue);
- if (varValue === "" && varFormatterLower.startsWith("default="))
- varValue = varFormatter.split("=")[1];
- }
-
- value = value.slice(0, i) + varValue + value.slice(j + repl.syntax.close.length);
- changes = true;
- repl = indexOfReplacementStart(syntaxes, value);
- i = repl.index;
- }
- if (changes)
- obj[key] = value;
+ var expandedValue = expandString(key, value, env);
+ if (expandedValue !== value)
+ obj[key] = expandedValue;
}
}
expandRecursive(obj, env, []);
diff --git a/share/qbs/imports/qbs/Probes/XcodeProbe.qbs b/share/qbs/imports/qbs/Probes/XcodeProbe.qbs
index edd67433b..9a0d01072 100644
--- a/share/qbs/imports/qbs/Probes/XcodeProbe.qbs
+++ b/share/qbs/imports/qbs/Probes/XcodeProbe.qbs
@@ -89,7 +89,7 @@ Probe {
architectureSettings = {};
var archSpecsPath = Xcode.archsSpecsPath(xcodeVersion, targetOS, platformType,
- platformPath, devicePlatformPath);
+ platformPath, devicePlatformPath, developerPath);
var archSpecsReader = new Xcode.XcodeArchSpecsReader(archSpecsPath);
archSpecsReader.getArchitectureSettings().map(function (setting) {
var val = archSpecsReader.getArchitectureSettingValue(setting);
diff --git a/share/qbs/modules/bundle/bundle.js b/share/qbs/modules/bundle/bundle.js
index 293f53225..7fb89974a 100644
--- a/share/qbs/modules/bundle/bundle.js
+++ b/share/qbs/modules/bundle/bundle.js
@@ -181,15 +181,15 @@ var XcodeBuildSpecsReader = (function () {
var i, j;
for (i = 0; i < specsPaths.length; ++i) {
var specsPath = specsPaths[i];
- var names = ["Darwin", "MacOSX"];
+ var names = ["", "Darwin", "MacOSX"];
for (j = 0; j < names.length; ++j) {
var name = names[j];
var plist = new PropertyList2();
var plist2 = new PropertyList2();
try
{
- var plistName = [name, "Package", "Types.xcspec"].join(separator);
- var plistName2 = [name, "Product", "Types.xcspec"].join(separator);
+ var plistName = [name, "Package", "Types.xcspec"].join(name ? separator : "");
+ var plistName2 = [name, "Product", "Types.xcspec"].join(name ? separator : "");
var plistPath = FileInfo.joinPaths(specsPath, plistName);
var plistPath2 = FileInfo.joinPaths(specsPath, plistName2);
if (File.exists(plistPath)) {
diff --git a/share/qbs/modules/xcode/xcode.js b/share/qbs/modules/xcode/xcode.js
index 1060894d4..c6c77ca73 100644
--- a/share/qbs/modules/xcode/xcode.js
+++ b/share/qbs/modules/xcode/xcode.js
@@ -202,7 +202,19 @@ function boolFromSdkOrPlatform(varName, sdkProps, platformProps, defaultValue) {
return defaultValue;
}
-function archsSpecsPath(version, targetOS, platformType, platformPath, devicePlatformPath) {
+function archsSpecsPath(version, targetOS, platformType, platformPath, devicePlatformPath,
+ developerPath) {
+ if (Utilities.versionCompare(version, "13.3") >= 0) {
+ var baseDir = FileInfo.joinPaths(developerPath, "..",
+ "PlugIns/XCBSpecifications.ideplugin/Contents/Resources");
+ var baseName = targetOS.contains("macos") ? "MacOSX Architectures"
+ : targetOS.contains("ios-simulator") ? "iOS Simulator"
+ : targetOS.contains("ios") ? "iOS Device"
+ : targetOS.contains("tvos-simulator") ? "tvOS Simulator"
+ : targetOS.contains("tvos") ? "tvOS Device"
+ : targetOS.contains("watchos-simulator") ? "watchOS Simulator" : "watchOS Device";
+ return FileInfo.joinPaths(baseDir, baseName + ".xcspec");
+ }
var _specsPluginBaseName;
if (Utilities.versionCompare(version, "12") >= 0) {
if (targetOS.contains("macos"))