diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2020-10-05 15:59:47 +0200 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2020-10-08 08:58:28 +0000 |
commit | 759ec8419abab4433bf0d85c2414708fd664db82 (patch) | |
tree | dbe388dc2b20d81589bb26ce8daa9f0ce6d77cd5 | |
parent | 37c66211620ad37b61804adcc7ae0d8ed0d614be (diff) |
Fix usage of @VAR@ in info plist files
Fixes: QBS-1601
Change-Id: Iead18bf5fd25f965cf9f9748469f2469488eabc8
Reviewed-by: Thorbjørn Lindeijer <bjorn@lindeijer.nl>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
7 files changed, 81 insertions, 2 deletions
diff --git a/share/qbs/imports/qbs/DarwinTools/darwin-tools.js b/share/qbs/imports/qbs/DarwinTools/darwin-tools.js index 5f9076004..9b81310f0 100644 --- a/share/qbs/imports/qbs/DarwinTools/darwin-tools.js +++ b/share/qbs/imports/qbs/DarwinTools/darwin-tools.js @@ -166,7 +166,14 @@ var PropertyListVariableExpander = (function () { var syntax; var idx = -1; for (var i in syntaxes) { - var j = str.lastIndexOf(syntaxes[i].open); + var j; + // normal case - we search for the last occurrence to do a correct replacement + // for nested variables, e.g. ${VAR1_${VAR2}}. This doesn't work in case + // when start == end, e.g. @VAR@ - in that case we search from the start + if (syntaxes[i].open !== syntaxes[i].close) + j = str.lastIndexOf(syntaxes[i].open); + else + j = str.indexOf(syntaxes[i].open); if (j > idx) { syntax = syntaxes[i]; idx = j; diff --git a/share/qbs/modules/bundle/BundleModule.qbs b/share/qbs/modules/bundle/BundleModule.qbs index bf2555fa3..05e77c81b 100644 --- a/share/qbs/modules/bundle/BundleModule.qbs +++ b/share/qbs/modules/bundle/BundleModule.qbs @@ -187,7 +187,7 @@ Module { property bool _useXcodeBuildSpecs: true // false to use ONLY the qbs build specs - readonly property var extraEnv: ({ + property var extraEnv: ({ "PRODUCT_BUNDLE_IDENTIFIER": identifier }) diff --git a/tests/auto/blackbox/testdata-apple/infoPlistVariables/Info.plist b/tests/auto/blackbox/testdata-apple/infoPlistVariables/Info.plist new file mode 100644 index 000000000..b357378ac --- /dev/null +++ b/tests/auto/blackbox/testdata-apple/infoPlistVariables/Info.plist @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Curly</key> + <string>${EXECUTABLE_NAME}</string> + <key>Braces</key> + <string>$(EXECUTABLE_NAME)</string> + <key>At</key> + <string>@EXECUTABLE_NAME@</string> + <key>CurlyMult</key> + <string>${EXECUTABLE_NAME}_${PRODUCT_NAME}</string> + <key>BracesMult</key> + <string>$(EXECUTABLE_NAME)_$(PRODUCT_NAME)</string> + <key>AtMult</key> + <string>@EXECUTABLE_NAME@_@PRODUCT_NAME@</string> + <key>CurlyNested</key> + <string>${${EXE}_NAME}</string> + <key>BracesNested</key> + <string>${${EXE}_NAME}</string> +</dict> +</plist> diff --git a/tests/auto/blackbox/testdata-apple/infoPlistVariables/infoPlistVariables.qbs b/tests/auto/blackbox/testdata-apple/infoPlistVariables/infoPlistVariables.qbs new file mode 100644 index 000000000..3f083278f --- /dev/null +++ b/tests/auto/blackbox/testdata-apple/infoPlistVariables/infoPlistVariables.qbs @@ -0,0 +1,16 @@ +CppApplication { + Depends { name: "bundle" } + cpp.minimumMacosVersion: "10.7" + files: ["main.c", "Info.plist"] + + Properties { + condition: qbs.targetOS.contains("darwin") + bundle.isBundle: true + bundle.identifierPrefix: "com.test" + bundle.extraEnv: { + var result = original; + result["EXE"] = "EXECUTABLE"; + return result; + } + } +} diff --git a/tests/auto/blackbox/testdata-apple/infoPlistVariables/main.c b/tests/auto/blackbox/testdata-apple/infoPlistVariables/main.c new file mode 100644 index 000000000..76e819701 --- /dev/null +++ b/tests/auto/blackbox/testdata-apple/infoPlistVariables/main.c @@ -0,0 +1 @@ +int main() { return 0; } diff --git a/tests/auto/blackbox/tst_blackboxapple.cpp b/tests/auto/blackbox/tst_blackboxapple.cpp index ea0d2ac58..a8f86aeba 100644 --- a/tests/auto/blackbox/tst_blackboxapple.cpp +++ b/tests/auto/blackbox/tst_blackboxapple.cpp @@ -897,6 +897,38 @@ void TestBlackboxApple::infoPlist() } } +void TestBlackboxApple::infoPlistVariables() +{ + QDir::setCurrent(testDataDir + "/infoPlistVariables"); + + QbsRunParameters params; + params.arguments = QStringList() << "-f" << "infoPlistVariables.qbs"; + QCOMPARE(runQbs(params), 0); + + const auto infoPlistPath = getInfoPlistPath( + relativeProductBuildDir("infoPlistVariables") + "/infoPlistVariables.app"); + QVERIFY(QFile::exists(infoPlistPath)); + const auto content = readInfoPlistFile(infoPlistPath); + QVERIFY(!content.isEmpty()); + + QCOMPARE(content.value(QStringLiteral("Curly")), + QStringLiteral("infoPlistVariables")); + QCOMPARE(content.value(QStringLiteral("Braces")), + QStringLiteral("infoPlistVariables")); + QCOMPARE(content.value(QStringLiteral("At")), + QStringLiteral("infoPlistVariables")); + QCOMPARE(content.value(QStringLiteral("CurlyMult")), + QStringLiteral("infoPlistVariables_infoPlistVariables")); + QCOMPARE(content.value(QStringLiteral("BracesMult")), + QStringLiteral("infoPlistVariables_infoPlistVariables")); + QCOMPARE(content.value(QStringLiteral("AtMult")), + QStringLiteral("infoPlistVariables_infoPlistVariables")); + QCOMPARE(content.value(QStringLiteral("CurlyNested")), + QStringLiteral("infoPlistVariables")); + QCOMPARE(content.value(QStringLiteral("BracesNested")), + QStringLiteral("infoPlistVariables")); +} + void TestBlackboxApple::objcArc() { QDir::setCurrent(testDataDir + QLatin1String("/objc-arc")); diff --git a/tests/auto/blackbox/tst_blackboxapple.h b/tests/auto/blackbox/tst_blackboxapple.h index be2e5c5b5..2a399ad7a 100644 --- a/tests/auto/blackbox/tst_blackboxapple.h +++ b/tests/auto/blackbox/tst_blackboxapple.h @@ -62,6 +62,7 @@ private slots: void iconset(); void iconsetApp(); void infoPlist(); + void infoPlistVariables(); void objcArc(); void overrideInfoPlist(); void xcode(); |