summaryrefslogtreecommitdiffstats
path: root/qmake
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-08-31 08:24:21 +0200
committerLiang Qi <liang.qi@qt.io>2016-08-31 08:24:21 +0200
commitf510a51dace0cb39a93b057b8fcbcbdda33a956e (patch)
treecd1dac8a78ecbb7579c59bf9f0b0d2d6fba56b4a /qmake
parentccedc853a67da078ace234af7b23fbf861736f3f (diff)
parent84830fc07d65d58fce9b24b5ec8f1224b0969ac0 (diff)
Merge remote-tracking branch 'origin/5.8' into dev
Diffstat (limited to 'qmake')
-rw-r--r--qmake/Makefile.unix4
-rw-r--r--qmake/doc/src/qmake-manual.qdoc7
-rw-r--r--qmake/generators/makefile.cpp12
-rw-r--r--qmake/generators/unix/unixmake2.cpp2
-rw-r--r--qmake/library/proitems.h8
-rw-r--r--qmake/library/qmakebuiltins.cpp48
-rw-r--r--qmake/library/qmakeparser.cpp10
-rw-r--r--qmake/library/qmakeparser.h3
8 files changed, 74 insertions, 20 deletions
diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix
index 42ad826fd5..ffbd0d4545 100644
--- a/qmake/Makefile.unix
+++ b/qmake/Makefile.unix
@@ -75,6 +75,7 @@ DEPEND_SRC = \
$(SOURCE_PATH)/src/corelib/tools/qlinkedlist.cpp \
$(SOURCE_PATH)/src/corelib/tools/qhash.cpp $(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp \
$(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm \
+ $(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm \
$(SOURCE_PATH)/src/corelib/io/qtemporaryfile.cpp $(SOURCE_PATH)/src/corelib/kernel/qmetatype.cpp \
$(SOURCE_PATH)/src/corelib/io/qsettings.cpp $(SOURCE_PATH)/src/corelib/kernel/qvariant.cpp \
$(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp $(SOURCE_PATH)/src/corelib/tools/qcryptographichash.cpp \
@@ -274,6 +275,9 @@ qcore_mac.o: $(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp
qcore_mac_objc.o: $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm
+qcore_foundation.o: $(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm
+
qutfcodec.o: $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp
diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc
index 509dc3efa1..c1979c4bec 100644
--- a/qmake/doc/src/qmake-manual.qdoc
+++ b/qmake/doc/src/qmake-manual.qdoc
@@ -2693,6 +2693,13 @@
\row
\li version
\li The version number of the package. Defaults to \c{1.0.0.0}.
+ \row
+ \li minVersion
+ \li The minimum required Windows version to run the package. Defaults to the environment variable \c UCRTVersion.
+ \row
+ \li maxVersionTested
+ \li The maximum Windows version the package has been tested against. Defaults to \c WINRT_MANIFEST.minVersion
+
\endtable
You can use any combination of those values.
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 11b1c8329d..5d7700ec82 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -2269,9 +2269,6 @@ QString MakefileGenerator::build_args()
{
QString ret = "$(QMAKE)";
- // general options and arguments
- ret += buildArgs();
-
//output
QString ofile = fileFixify(Option::output.fileName());
if(!ofile.isEmpty() && ofile != project->first("QMAKE_MAKEFILE"))
@@ -2280,6 +2277,9 @@ QString MakefileGenerator::build_args()
//inputs
ret += " " + escapeFilePath(fileFixify(project->projectFile()));
+ // general options and arguments
+ ret += buildArgs();
+
return ret;
}
@@ -2442,7 +2442,7 @@ MakefileGenerator::writeSubTargetCall(QTextStream &t,
if (!in_directory.isEmpty())
t << "\n\t" << mkdir_p_asstring(out_directory);
pfx = "( " + chkexists.arg(out) +
- + " $(QMAKE) " + in + buildArgs() + " -o " + out
+ + " $(QMAKE) -o " + out + ' ' + in + buildArgs()
+ " ) && ";
}
writeSubMakeCall(t, out_directory_cdin + pfx, makefilein);
@@ -2513,7 +2513,7 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
t << mkdir_p_asstring(out_directory)
<< out_directory_cdin;
}
- t << "$(QMAKE) " << in << buildArgs() << " -o " << out;
+ t << "$(QMAKE) -o " << out << ' ' << in << buildArgs();
if (!dont_recurse)
writeSubMakeCall(t, out_directory_cdin, makefilein + " qmake_all");
else
@@ -2710,7 +2710,7 @@ MakefileGenerator::writeMakeQmake(QTextStream &t, bool noDummyQmakeAll)
if(project->isEmpty("QMAKE_FAILED_REQUIREMENTS") && !project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) {
QStringList files = escapeFilePaths(fileFixify(Option::mkfile::project_files));
t << escapeDependencyPath(project->first("QMAKE_INTERNAL_PRL_FILE").toQString()) << ": \n\t"
- << "@$(QMAKE) -prl " << buildArgs() << " " << files.join(' ') << endl;
+ << "@$(QMAKE) -prl " << files.join(' ') << ' ' << buildArgs() << endl;
}
QString qmake = build_args();
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 2d6885076d..433731cc4b 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -732,7 +732,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
}
if(!meta_files.isEmpty())
t << escapeDependencyPaths(meta_files).join(" ") << ": \n\t"
- << "@$(QMAKE) -prl " << buildArgs() << ' ' << escapeFilePath(project->projectFile()) << endl;
+ << "@$(QMAKE) -prl " << escapeFilePath(project->projectFile()) << ' ' << buildArgs() << endl;
}
if (!project->isEmpty("QMAKE_BUNDLE")) {
diff --git a/qmake/library/proitems.h b/qmake/library/proitems.h
index 16dd9386c8..a3d2c01760 100644
--- a/qmake/library/proitems.h
+++ b/qmake/library/proitems.h
@@ -208,9 +208,13 @@ inline QString operator+(const QString &one, const ProString &two)
{ return ProString(one) + two; }
inline QString operator+(const ProString &one, const char *two)
- { return one + ProString(two); } // XXX optimize
+ { QString ret = one.toQStringRef() + two; ret.detach(); return ret; }
inline QString operator+(const char *one, const ProString &two)
- { return ProString(one) + two; } // XXX optimize
+ { QString ret = one + two.toQStringRef(); ret.detach(); return ret; }
+inline QString operator+(const ProString &one, QChar two)
+ { return one.toQStringRef() + two; }
+inline QString operator+(QChar one, const ProString &two)
+ { return one + two.toQStringRef(); }
inline QString &operator+=(QString &that, const ProString &other)
{ return that += other.toQStringRef(); }
diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp
index ba621c1c72..4418c95f4b 100644
--- a/qmake/library/qmakebuiltins.cpp
+++ b/qmake/library/qmakebuiltins.cpp
@@ -52,6 +52,8 @@
# include <qthreadpool.h>
#endif
+#include <algorithm>
+
#ifdef Q_OS_UNIX
#include <time.h>
#include <utime.h>
@@ -97,7 +99,7 @@ enum ExpandFunc {
enum TestFunc {
T_INVALID = 0, T_REQUIRES, T_GREATERTHAN, T_LESSTHAN, T_EQUALS,
T_EXISTS, T_EXPORT, T_CLEAR, T_UNSET, T_EVAL, T_CONFIG, T_SYSTEM,
- T_DEFINED, T_CONTAINS, T_INFILE,
+ T_DEFINED, T_DISCARD_FROM, T_CONTAINS, T_INFILE,
T_COUNT, T_ISEMPTY, T_PARSE_JSON, T_INCLUDE, T_LOAD, T_DEBUG, T_LOG, T_MESSAGE, T_WARNING, T_ERROR, T_IF,
T_MKPATH, T_WRITE_FILE, T_TOUCH, T_CACHE
};
@@ -178,6 +180,7 @@ void QMakeEvaluator::initFunctionStatics()
{ "if", T_IF },
{ "isActiveConfig", T_CONFIG },
{ "system", T_SYSTEM },
+ { "discard_from", T_DISCARD_FROM },
{ "defined", T_DEFINED },
{ "contains", T_CONTAINS },
{ "infile", T_INFILE },
@@ -1292,6 +1295,38 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
}
return ReturnTrue;
}
+ case T_DISCARD_FROM: {
+ if (args.count() != 1 || args.at(0).isEmpty()) {
+ evalError(fL1S("discard_from(file) requires one argument."));
+ return ReturnFalse;
+ }
+ if (m_valuemapStack.count() != 1) {
+ evalError(fL1S("discard_from() cannot be called from functions."));
+ return ReturnFalse;
+ }
+ QString fn = resolvePath(args.at(0).toQString(m_tmp1));
+ ProFile *pro = m_parser->parsedProFile(fn, QMakeParser::ParseOnlyCached);
+ if (!pro)
+ return ReturnFalse;
+ ProValueMap &vmap = m_valuemapStack.first();
+ for (auto vit = vmap.begin(); vit != vmap.end(); ) {
+ if (!vit->isEmpty()) {
+ auto isFrom = [pro](const ProString &s) {
+ return s.sourceFile() == pro;
+ };
+ vit->erase(std::remove_if(vit->begin(), vit->end(), isFrom), vit->end());
+ if (vit->isEmpty()) {
+ // When an initially non-empty variable becomes entirely empty,
+ // undefine it altogether.
+ vit = vmap.erase(vit);
+ continue;
+ }
+ }
+ ++vit;
+ }
+ pro->deref();
+ return ReturnTrue;
+ }
case T_INFILE:
if (args.count() < 2 || args.count() > 3) {
evalError(fL1S("infile(file, var, [values]) requires two or three arguments."));
@@ -1519,7 +1554,8 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
if (m_cumulative)
flags = LoadSilent;
if (args.count() >= 2) {
- parseInto = args.at(1).toQString(m_tmp2);
+ if (!args.at(1).isEmpty())
+ parseInto = args.at(1) + QLatin1Char('.');
if (args.count() >= 3 && isTrue(args.at(2)))
flags = LoadSilent;
}
@@ -1536,17 +1572,15 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
it = m_valuemapStack.top().constBegin(),
end = m_valuemapStack.top().constEnd();
it != end; ++it) {
- const QString &ky = it.key().toQString(m_tmp1);
- if (!(ky.startsWith(parseInto) &&
- (ky.length() == parseInto.length()
- || ky.at(parseInto.length()) == QLatin1Char('.'))))
+ const ProString &ky = it.key();
+ if (!ky.startsWith(parseInto))
newMap[it.key()] = it.value();
}
for (ProValueMap::ConstIterator it = symbols.constBegin();
it != symbols.constEnd(); ++it) {
const QString &ky = it.key().toQString(m_tmp1);
if (!ky.startsWith(QLatin1Char('.')))
- newMap.insert(ProKey(parseInto + QLatin1Char('.') + ky), it.value());
+ newMap.insert(ProKey(parseInto + ky), it.value());
}
m_valuemapStack.top() = newMap;
}
diff --git a/qmake/library/qmakeparser.cpp b/qmake/library/qmakeparser.cpp
index 7d645625a1..56b217dfbb 100644
--- a/qmake/library/qmakeparser.cpp
+++ b/qmake/library/qmakeparser.cpp
@@ -165,7 +165,7 @@ QMakeParser::QMakeParser(ProFileCache *cache, QMakeVfs *vfs, QMakeParserHandler
ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags)
{
ProFile *pro;
- if ((flags & ParseUseCache) && m_cache) {
+ if ((flags & (ParseUseCache|ParseOnlyCached)) && m_cache) {
ProFileCache::Entry *ent;
#ifdef PROPARSER_THREAD_SAFE
QMutexLocker locker(&m_cache->mutex);
@@ -187,7 +187,7 @@ ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags)
#endif
if ((pro = ent->pro))
pro->ref();
- } else {
+ } else if (!(flags & ParseOnlyCached)) {
ent = &m_cache->parsed_files[fileName];
#ifdef PROPARSER_THREAD_SAFE
ent->locker = new ProFileCache::Entry::Locker;
@@ -212,13 +212,17 @@ ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags)
ent->locker = 0;
}
#endif
+ } else {
+ pro = 0;
}
- } else {
+ } else if (!(flags & ParseOnlyCached)) {
pro = new ProFile(fileName);
if (!read(pro, flags)) {
delete pro;
pro = 0;
}
+ } else {
+ pro = 0;
}
return pro;
}
diff --git a/qmake/library/qmakeparser.h b/qmake/library/qmakeparser.h
index f8ff2fc3cc..6557ad65b5 100644
--- a/qmake/library/qmakeparser.h
+++ b/qmake/library/qmakeparser.h
@@ -78,7 +78,8 @@ public:
enum ParseFlag {
ParseDefault = 0,
ParseUseCache = 1,
- ParseReportMissing = 2
+ ParseOnlyCached = 2,
+ ParseReportMissing = 4
};
Q_DECLARE_FLAGS(ParseFlags, ParseFlag)