diff options
Diffstat (limited to 'qmake/generators')
-rw-r--r-- | qmake/generators/mac/pbuilder_pbx.cpp | 98 | ||||
-rw-r--r-- | qmake/generators/mac/pbuilder_pbx.h | 1 | ||||
-rw-r--r-- | qmake/generators/makefile.cpp | 3 | ||||
-rw-r--r-- | qmake/generators/makefiledeps.cpp | 11 |
4 files changed, 77 insertions, 36 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; } diff --git a/qmake/generators/mac/pbuilder_pbx.h b/qmake/generators/mac/pbuilder_pbx.h index 255dd43348..a08dc7c2bd 100644 --- a/qmake/generators/mac/pbuilder_pbx.h +++ b/qmake/generators/mac/pbuilder_pbx.h @@ -61,6 +61,7 @@ class ProjectBuilderMakefileGenerator : public UnixMakefileGenerator QString findProgram(const ProString &prog); QString fixForOutput(const QString &file); ProStringList fixListForOutput(const char *where); + ProStringList fixListForOutput(const ProStringList &list); int reftypeForFile(const QString &where); QString sourceTreeForFile(const QString &where); QString projectSuffix() const; diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 98b5a328e4..a8ae84a4e2 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -2272,8 +2272,7 @@ MakefileGenerator::writeHeader(QTextStream &t) { t << "#############################################################################\n"; t << "# Makefile for building: " << escapeFilePath(var("TARGET")) << endl; - t << "# Generated by qmake (" QMAKE_VERSION_STR ") (Qt " QT_VERSION_STR ") on: "; - t << QDateTime::currentDateTime().toString() << endl; + t << "# Generated by qmake (" QMAKE_VERSION_STR ") (Qt " QT_VERSION_STR ")\n"; t << "# Project: " << fileFixify(project->projectFile()) << endl; t << "# Template: " << var("TEMPLATE") << endl; if(!project->isActiveConfig("build_pass")) diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index 898903a423..df37957f9b 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -771,20 +771,15 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file) } if(Option::debug_level && qmake_endOfLine(*(buffer+x))) ++line_count; - if(((buffer_len > x+2 && *(buffer+x+1) == 'Q' && *(buffer+x+2) == '_') - || - (buffer_len > x+4 && *(buffer+x+1) == 'Q' && *(buffer+x+2) == 'O' - && *(buffer+x+3) == 'M' && *(buffer+x+4) == '_')) - && + if (buffer_len > x + 2 && buffer[x + 1] == 'Q' && buffer[x + 2] == '_' && *(buffer + x) != '_' && (*(buffer + x) < 'a' || *(buffer + x) > 'z') && (*(buffer + x) < 'A' || *(buffer + x) > 'Z') && (*(buffer + x) < '0' || *(buffer + x) > '9')) { ++x; int match = 0; - static const char *interesting[] = { "OBJECT", "GADGET", - "M_OBJECT" }; - for(int interest = 0, m1, m2; interest < 3; ++interest) { + static const char *interesting[] = { "OBJECT", "GADGET" }; + for (int interest = 0, m1, m2; interest < 2; ++interest) { if(interest == 0 && ignore_qobject) continue; else if(interest == 1 && ignore_qgadget) |