diff options
Diffstat (limited to 'qmake/generators/mac/pbuilder_pbx.cpp')
-rw-r--r-- | qmake/generators/mac/pbuilder_pbx.cpp | 98 |
1 files changed, 72 insertions, 26 deletions
diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp index e634f6976e..b8e6d05728 100644 --- a/qmake/generators/mac/pbuilder_pbx.cpp +++ b/qmake/generators/mac/pbuilder_pbx.cpp @@ -1381,24 +1381,24 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) !project->values("QMAKE_FRAMEWORKPATH").isEmpty() ? SettingsAsList : 0, 5) << ";\n"; { - ProStringList cflags = fixListForOutput("QMAKE_CFLAGS"); + ProStringList cflags = project->values("QMAKE_CFLAGS"); const ProStringList &prl_defines = project->values("PRL_EXPORT_DEFINES"); for (int i = 0; i < prl_defines.size(); ++i) cflags += "-D" + prl_defines.at(i); const ProStringList &defines = project->values("DEFINES"); for (int i = 0; i < defines.size(); ++i) cflags += "-D" + defines.at(i); - t << "\t\t\t\t" << writeSettings("OTHER_CFLAGS", cflags, SettingsAsList, 5) << ";\n"; + t << "\t\t\t\t" << writeSettings("OTHER_CFLAGS", fixListForOutput(cflags), SettingsAsList, 5) << ";\n"; } { - ProStringList cxxflags = fixListForOutput("QMAKE_CXXFLAGS"); + ProStringList cxxflags = project->values("QMAKE_CXXFLAGS"); const ProStringList &prl_defines = project->values("PRL_EXPORT_DEFINES"); for (int i = 0; i < prl_defines.size(); ++i) cxxflags += "-D" + prl_defines.at(i); const ProStringList &defines = project->values("DEFINES"); for (int i = 0; i < defines.size(); ++i) cxxflags += "-D" + defines.at(i); - t << "\t\t\t\t" << writeSettings("OTHER_CPLUSPLUSFLAGS", cxxflags, SettingsAsList, 5) << ";\n"; + t << "\t\t\t\t" << writeSettings("OTHER_CPLUSPLUSFLAGS", fixListForOutput(cxxflags), SettingsAsList, 5) << ";\n"; } if (!project->isActiveConfig("staticlib")) { t << "\t\t\t\t" << writeSettings("OTHER_LDFLAGS", @@ -1408,7 +1408,8 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) + fixListForOutput("QMAKE_LIBS_PRIVATE"), SettingsAsList, 6) << ";\n"; } - const ProStringList &archs = project->values("QT_ARCH"); + const ProStringList &archs = !project->values("QMAKE_XCODE_ARCHS").isEmpty() ? + project->values("QMAKE_XCODE_ARCHS") : project->values("QT_ARCH"); if (!archs.isEmpty()) t << "\t\t\t\t" << writeSettings("ARCHS", archs) << ";\n"; if (!project->isEmpty("OBJECTS_DIR")) @@ -1518,19 +1519,20 @@ ProjectBuilderMakefileGenerator::fixForOutput(const QString &values) project->values("QMAKE_PBX_VARS").append(reg_var.cap(1)); rep += reg_var.matchedLength(); } - QString ret = values; - ret = ret.replace(QRegExp("\\\\ "), " "); //unescape spaces - ret = ret.replace(QRegExp("('|\\\\|\")"), "\\\\1"); //fix quotes - ret = ret.replace("\t", " "); //fix tabs - ret = ret.replace(QRegExp(" "), "\\ "); //escape spaces - return ret; + + return values; } ProStringList ProjectBuilderMakefileGenerator::fixListForOutput(const char *where) { + return fixListForOutput(project->values(where)); +} + +ProStringList +ProjectBuilderMakefileGenerator::fixListForOutput(const ProStringList &l) +{ ProStringList ret; - const ProStringList &l = project->values(where); for(int i = 0; i < l.count(); i++) ret += fixForOutput(l[i].toQString()); return ret; @@ -1747,37 +1749,81 @@ ProjectBuilderMakefileGenerator::escapeFilePath(const QString &path) const #endif } +static QString quotedStringLiteral(const QString &value) +{ + QString result; + const int len = value.length(); + result.reserve(int(len * 1.1) + 2); + + result += QLatin1Char('"'); + + // Escape + for (int i = 0; i < len; ++i) { + QChar character = value.at(i);; + ushort code = character.unicode(); + switch (code) { + case '\\': + result += QLatin1String("\\\\"); + break; + case '"': + result += QLatin1String("\\\""); + break; + case '\b': + result += QLatin1String("\\b"); + break; + case '\n': + result += QLatin1String("\\n"); + break; + case '\r': + result += QLatin1String("\\r"); + break; + case '\t': + result += QLatin1String("\\t"); + break; + default: + if (code >= 32 && code <= 127) + result += character; + else + result += QLatin1String("\\u") + QString::number(code, 16).rightJustified(4, '0'); + } + } + + result += QLatin1Char('"'); + + result.squeeze(); + return result; +} + QString ProjectBuilderMakefileGenerator::writeSettings(const QString &var, const ProStringList &vals, int flags, int indent_level) { QString ret; - const QString quote = (flags & SettingsNoQuote) ? "" : "\""; - const QString escape_quote = quote.isEmpty() ? "" : QString("\\" + quote); + bool shouldQuote = !((flags & SettingsNoQuote)); + QString newline = "\n"; for(int i = 0; i < indent_level; ++i) newline += "\t"; + + ret += var + " = "; + if(flags & SettingsAsList) { - ret += var + " = (" + newline; + ret += "(" + newline; for(int i = 0, count = 0; i < vals.size(); ++i) { QString val = vals.at(i).toQString(); if(!val.isEmpty()) { if(count++ > 0) ret += "," + newline; - ret += quote + val.replace(quote, escape_quote) + quote; + if (shouldQuote) + val = quotedStringLiteral(val); + ret += val; } } ret += ")"; } else { - ret += var + " = " + quote; - for(int i = 0; i < vals.size(); ++i) { - QString val = vals.at(i).toQString(); -// if(val.isEmpty()) -// val = quote + quote; - if(i) - ret += " "; - ret += val; - } - ret += quote; + QString val = vals.join(QLatin1Char(' ')); + if (shouldQuote) + val = quotedStringLiteral(val); + ret += val; } return ret; } |