aboutsummaryrefslogtreecommitdiffstats
path: root/share/qbs/modules/cpp
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@petroules.com>2014-03-02 14:27:59 -0500
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-03-12 16:06:55 +0100
commitf9572bfc40c9af5a1aa23f475bde538e870475ec (patch)
tree9a1328ed09cbdd4135d59820af49d9d0c25b634f /share/qbs/modules/cpp
parent0575c5930c47af5cf7f533931dc2dc5205f552ee (diff)
Support the qmake/CMake-style @SYNTAX@ in Info.plist replacement vars.
Also, this makes it trivial to add arbitrary new syntaxes if desired. Change-Id: I5622b03b284b47236b425f94c140d2a01f1b8d55 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'share/qbs/modules/cpp')
-rw-r--r--share/qbs/modules/cpp/darwin-tools.js69
1 files changed, 45 insertions, 24 deletions
diff --git a/share/qbs/modules/cpp/darwin-tools.js b/share/qbs/modules/cpp/darwin-tools.js
index 080215637..ef99bc8ca 100644
--- a/share/qbs/modules/cpp/darwin-tools.js
+++ b/share/qbs/modules/cpp/darwin-tools.js
@@ -45,6 +45,28 @@ function _resourceFileProperties(path)
// => {"a":"X3$Y","b":{"t":"%Y $(k)"}}
function expandPlistEnvironmentVariables(obj, env, warn)
{
+ // Possible syntaxes for wrapping an environment variable name
+ var syntaxes = [
+ {"open": "${", "close": "}"},
+ {"open": "$(", "close": ")"},
+ {"open": "@", "close": "@"}
+ ];
+
+ // Finds the first index of a replacement starting with one of the supported syntaxes
+ // This is needed so we don't do recursive substitutions
+ function indexOfReplacementStart(syntaxes, str, offset) {
+ var syntax;
+ var idx = str.length;
+ for (var i in syntaxes) {
+ var j = str.indexOf(syntaxes[i].open, offset);
+ if (j !== -1 && j < idx) {
+ syntax = syntaxes[i];
+ idx = j;
+ }
+ }
+ return { "syntax": syntax, "index": idx === str.length ? -1 : idx };
+ }
+
function expandRecursive(obj, env, checked) {
checked.push(obj);
for (var key in obj) {
@@ -57,33 +79,32 @@ function expandPlistEnvironmentVariables(obj, env, warn)
}
if (type !== "string")
continue;
- var i = value.indexOf('$')
+ var repl = indexOfReplacementStart(syntaxes, value);
+ var i = repl.index;
var changes = false;
while (i !== -1) {
- var brace = value.charAt(i+1);
- if (brace === '(' || brace === '{') {
- var j = value.indexOf(brace === '(' ? ')' : '}', i + 2);
- if (j === -1)
- break;
- var varParts = value.slice(i + 2, j).split(':');
- var varName = varParts[0];
- var varFormatter = varParts[1];
- var varValue = env[varName];
- if (undefined === varValue) {
- // skip replacement
- if (warn)
- print("Warning undefined variable ",varName, " in variable expansion");
- } else {
- changes = true;
- varValue = String(varValue);
- if (varFormatter === "rfc1034identifier")
- varValue = rfc1034(varValue);
- value = value.slice(0, i) + varValue + value.slice(j + 1);
- // avoid recursive substitutions to avoid potentially infinite loops
- i += varValue.length;
- }
+ 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 (warn)
+ print("Warning undefined variable ",varName, " in variable expansion");
+ } else {
+ changes = true;
+ varValue = String(varValue);
+ if (varFormatter === "rfc1034identifier")
+ varValue = rfc1034(varValue);
+ value = value.slice(0, i) + varValue + value.slice(j + repl.syntax.close.length);
+ // avoid recursive substitutions to avoid potentially infinite loops
+ i += varValue.length;
}
- i = value.indexOf('$', i + 1);
+ repl = indexOfReplacementStart(syntaxes, value, i + repl.syntax.close.length);
+ i = repl.index;
}
if (changes)
obj[key] = value;