diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2022-03-30 12:10:38 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2022-04-04 08:54:17 +0000 |
commit | d64c7802fef2872aa6a78c06648a0aed45250955 (patch) | |
tree | d90a9d8426452cf7bae591245481de1b9b96e940 /share | |
parent | 77ce522281f33a6d06e7cd9fde39e9f578134533 (diff) | |
download | qbs-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>
Diffstat (limited to 'share')
-rw-r--r-- | share/qbs/imports/qbs/DarwinTools/darwin-tools.js | 72 | ||||
-rw-r--r-- | share/qbs/imports/qbs/Probes/XcodeProbe.qbs | 2 | ||||
-rw-r--r-- | share/qbs/modules/bundle/bundle.js | 6 | ||||
-rw-r--r-- | share/qbs/modules/xcode/xcode.js | 14 |
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")) |