summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brand <mabrand@mabrand.nl>2012-06-29 21:26:11 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-29 21:26:11 +0200
commitf4f0c8b99b362822f85dd1859518e89d33e4bd3b (patch)
tree1de8f74ce9dc211668b8a10f4f873457fcb74363
parentddf7233125dbf7dfb218fd47f77a94446ce3c027 (diff)
parent1491065506eb97c9def93b908db1df9fcdf3fff0 (diff)
Merge "Merge branch 'buildsystem' (second round)" into refs/staging/master
-rw-r--r--mkspecs/features/qt.prf6
-rw-r--r--mkspecs/features/qt_config.prf5
-rw-r--r--mkspecs/features/spec_post.prf31
-rw-r--r--mkspecs/features/spec_pre.prf39
-rw-r--r--mkspecs/features/win32/default_post.prf11
-rw-r--r--qmake/generators/integrity/gbuild.cpp38
-rw-r--r--qmake/generators/mac/pbuilder_pbx.cpp20
-rw-r--r--qmake/generators/makefile.cpp127
-rw-r--r--qmake/generators/makefile.h4
-rw-r--r--qmake/generators/metamakefile.cpp63
-rw-r--r--qmake/generators/metamakefile.h5
-rw-r--r--qmake/generators/projectgenerator.cpp33
-rw-r--r--qmake/generators/unix/unixmake.cpp21
-rw-r--r--qmake/generators/unix/unixmake2.cpp28
-rw-r--r--qmake/generators/win32/borland_bmake.cpp2
-rw-r--r--qmake/generators/win32/mingw_make.cpp21
-rw-r--r--qmake/generators/win32/mingw_make.h1
-rw-r--r--qmake/generators/win32/msvc_nmake.cpp8
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp14
-rw-r--r--qmake/generators/win32/msvc_objectmodel.h2
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp44
-rw-r--r--qmake/generators/win32/winmakefile.cpp12
-rw-r--r--qmake/main.cpp6
-rw-r--r--qmake/meta.cpp4
-rw-r--r--qmake/option.cpp178
-rw-r--r--qmake/option.h14
-rw-r--r--qmake/project.cpp540
-rw-r--r--qmake/project.h43
-rw-r--r--qmake/property.cpp74
-rw-r--r--qmake/property.h4
-rw-r--r--tests/auto/tools/qmake/testdata/functions/functions.pro14
-rw-r--r--tests/auto/tools/qmake/testdata/operators/operators.pro22
-rw-r--r--tests/auto/tools/qmake/testdata/variables/variables.pro16
-rw-r--r--tools/configure/configureapp.cpp18
-rw-r--r--tools/configure/environment.cpp55
-rw-r--r--tools/configure/environment.h4
36 files changed, 584 insertions, 943 deletions
diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf
index 03e58b3afd..1d1e17c541 100644
--- a/mkspecs/features/qt.prf
+++ b/mkspecs/features/qt.prf
@@ -14,12 +14,6 @@ win32 {
} else {
DEFINES += QT_NODLL
}
-
- # Some files include qplatformdefs.h, which lives in the individual mkspec directory
- # However, if QMAKESPEC_ORIGINAL is set, the module/app is outside of the QtBase
- # directory, and using the default profile. So we add the original mkspecs directory
- # to the include path
- !isEmpty(QMAKESPEC_ORIGINAL):INCLUDEPATH += $$QMAKESPEC_ORIGINAL
}
CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG
contains(QT_CONFIG, force_asserts):DEFINES += QT_FORCE_ASSERTS
diff --git a/mkspecs/features/qt_config.prf b/mkspecs/features/qt_config.prf
index 07fd988fb5..305ff1cb81 100644
--- a/mkspecs/features/qt_config.prf
+++ b/mkspecs/features/qt_config.prf
@@ -24,6 +24,11 @@ QMAKE_QT_CONFIG = $$[QT_HOST_DATA/get]/mkspecs/qconfig.pri
include($$mod)
}
}
+ unset(QT_MODULE_INCLUDE_BASE)
+ unset(QT_MODULE_LIB_BASE)
+ unset(QT_MODULE_PLUGIN_BASE)
+ unset(QT_MODULE_BIN_BASE)
+ unset(QT_MODULE_IMPORT_BASE)
}
load(qt_functions)
diff --git a/mkspecs/features/spec_post.prf b/mkspecs/features/spec_post.prf
new file mode 100644
index 0000000000..fcc7314ce5
--- /dev/null
+++ b/mkspecs/features/spec_post.prf
@@ -0,0 +1,31 @@
+isEmpty(MAKEFILE_GENERATOR):error("Qmake spec does not set MAKEFILE_GENERATOR.")
+isEmpty(QMAKE_PLATFORM) {
+ isEmpty(TARGET_PLATFORM) {
+ equals(MAKEFILE_GENERATOR, UNIX) {
+ equals(QMAKE_HOST.os, Darwin): \
+ TARGET_PLATFORM = macx
+ else: \
+ TARGET_PLATFORM = unix
+ } else:if(equals(MAKEFILE_GENERATOR, MSVC.NET) \
+ |equals(MAKEFILE_GENERATOR, BMAKE) \
+ |equals(MAKEFILE_GENERATOR, MSBUILD) \
+ |equals(MAKEFILE_GENERATOR, MINGW)) {
+ TARGET_PLATFORM = win32
+ } else:if(equals(MAKEFILE_GENERATOR, PROJECTBUILDER) \
+ |equals(MAKEFILE_GENERATOR, XCODE)) {
+ } else:equals(MAKEFILE_GENERATOR, GBUILD) {
+ TARGET_PLATFORM = unix
+ } else {
+ error("Qmake spec sets an invalid MAKEFILE_GENERATOR.")
+ }
+ }
+ equals(TARGET_PLATFORM, unix): \
+ QMAKE_PLATFORM = unix
+ else:equals(TARGET_PLATFORM, macx): \
+ QMAKE_PLATFORM = mac macx unix
+ else:equals(TARGET_PLATFORM, win32): \
+ QMAKE_PLATFORM = win32
+ else: \
+ error("Qmake spec sets an invalid TARGET_PLATFORM.")
+}
+CONFIG += $$QMAKE_PLATFORM
diff --git a/mkspecs/features/spec_pre.prf b/mkspecs/features/spec_pre.prf
new file mode 100644
index 0000000000..bcd4a08449
--- /dev/null
+++ b/mkspecs/features/spec_pre.prf
@@ -0,0 +1,39 @@
+QMAKE_DIR_SEP = $$DIR_SEPARATOR
+QMAKE_DIRLIST_SEP = $$DIRLIST_SEPARATOR
+
+QMAKE_EXT_C = .c
+QMAKE_EXT_CPP = .cpp .cc .cxx
+QMAKE_EXT_CPP_MOC = .moc
+QMAKE_EXT_H = .h .hpp .hh .hxx
+QMAKE_EXT_H_MOC = .cpp
+QMAKE_EXT_JS = .js
+QMAKE_EXT_LEX = .l
+QMAKE_EXT_LIBTOOL = .la
+QMAKE_EXT_PKGCONFIG = .pc
+QMAKE_EXT_PRL = .prl
+QMAKE_EXT_UI = .ui
+QMAKE_EXT_YACC = .y
+
+QMAKE_CPP_MOD_MOC =
+QMAKE_H_MOD_MOC = moc_
+QMAKE_MOD_LEX = _lex
+QMAKE_MOD_YACC = _yacc
+
+equals(QMAKE_HOST.os, Windows) {
+ QMAKE_EXT_OBJ = .obj
+ QMAKE_EXT_RES = .res
+ QMAKE_SH =
+ PATH = $$split($$(PATH), ;)
+ for(dir, PATH) {
+ exists($$dir/sh.exe) {
+ QMAKE_SH = $$dir/sh.exe
+ break()
+ }
+ }
+ unset(PATH)
+} else {
+ QMAKE_EXT_CPP += .C
+ QMAKE_EXT_H += .H
+ QMAKE_EXT_OBJ = .o
+ QMAKE_SH = sh
+}
diff --git a/mkspecs/features/win32/default_post.prf b/mkspecs/features/win32/default_post.prf
deleted file mode 100644
index a1d8b52da9..0000000000
--- a/mkspecs/features/win32/default_post.prf
+++ /dev/null
@@ -1,11 +0,0 @@
-!isEmpty(CE_ARCH) {
- QMAKESPEC_DIR = $$QMAKESPEC
- exists($$QMAKESPEC_DIR/default_post.prf) {
- isEmpty(QMAKESPEC_DIR):QMAKESPEC_DIR = $$QMAKESPEC_ORIGINAL
- !isEmpty(QMAKESPEC_DIR):load($$QMAKESPEC_DIR/default_post.prf)
- }
-}
-
-# Now load the global default_post
-load(default_post)
-
diff --git a/qmake/generators/integrity/gbuild.cpp b/qmake/generators/integrity/gbuild.cpp
index 0d9d81c549..219b6a2d5d 100644
--- a/qmake/generators/integrity/gbuild.cpp
+++ b/qmake/generators/integrity/gbuild.cpp
@@ -213,7 +213,6 @@ GBuildMakefileGenerator::write()
dllbase += DLLOFFSET;
}
- warn_msg(WarnParser, Option::output.fileName().toLocal8Bit().constData());
QTextStream t(&Option::output);
QString primaryTarget(project->values("QMAKE_CXX").at(0));
@@ -259,8 +258,8 @@ GBuildMakefileGenerator::write()
t << "\t-Iwork\n";
t << "\t-Llib\n";
t << "\t";
- QStringList &l = project->values("QMAKE_CXXFLAGS");
- for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ const QStringList &l = project->values("QMAKE_CXXFLAGS");
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if ((*it).startsWith("-"))
t << "\n" << "\t" << (*it);
else
@@ -285,8 +284,8 @@ GBuildMakefileGenerator::write()
if (isnativebin && (i == 0))
continue;
t << "\t";
- QStringList &l = project->values(src[i]);
- for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ const QStringList &l = project->values(src[i]);
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if ((*it).startsWith("-"))
t << "\n" << "\t" << (*it);
else
@@ -298,8 +297,8 @@ GBuildMakefileGenerator::write()
/* first subdirectories/subprojects */
{
- QStringList &l = project->values("SUBDIRS");
- for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ const QStringList &l = project->values("SUBDIRS");
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
QString gpjname((*it));
/* avoid native tools */
if (nativebins.contains(gpjname.section("_", -1)))
@@ -319,9 +318,10 @@ GBuildMakefileGenerator::write()
}
{
- QStringList &l = project->values("RESOURCES");
- for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
- QString tmpstr((*it).replace(pathtoremove, ""));
+ const QStringList &l = project->values("RESOURCES");
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
+ QString tmpstr(*it);
+ tmpstr.remove(pathtoremove);
t << tmpstr << "\t[Qt Resource]\n";
tmpstr = tmpstr.section(".", -2, -1).section(QDir::separator(), -1);
tmpstr.remove(".qrc");
@@ -332,9 +332,10 @@ GBuildMakefileGenerator::write()
}
}
{
- QStringList &l = project->values("FORMS");
- for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
- QString tmpstr((*it).replace(pathtoremove, ""));
+ const QStringList &l = project->values("FORMS");
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
+ QString tmpstr(*it);
+ tmpstr.remove(pathtoremove);
t << tmpstr << "\t[Qt Dialog]\n";
tmpstr = tmpstr.section(".", 0, 0).section(QDir::separator(), -1);
tmpstr.insert(tmpstr.lastIndexOf(QDir::separator()) + 1, "ui_");
@@ -347,22 +348,22 @@ GBuildMakefileGenerator::write()
/* source files for this project */
QString src[] = { "HEADERS", "SOURCES", QString() };
for (int i = 0; !src[i].isNull(); i++) {
- QStringList &l = project->values(src[i]);
- for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ const QStringList &l = project->values(src[i]);
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if ((*it).isEmpty())
continue;
/* native tools aren't preprocessed */
if (!isnativebin)
t << writeOne((*it), pathtoremove);
else
- t << (*it).remove(pathtoremove) << "\n";
+ t << QString(*it).remove(pathtoremove) << "\n";
}
}
t << "\n";
{
- QStringList &l = project->values("GENERATED_SOURCES");
- for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ const QStringList &l = project->values("GENERATED_SOURCES");
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
t << "work/" << (*it).section(QDir::separator(), -1) << "\n";
}
}
@@ -425,7 +426,6 @@ GBuildMakefileGenerator::openOutput(QFile &file, const QString &build) const
outputName += QDir::separator();
outputName += fileInfo(project->projectFile()).baseName();
outputName += projectSuffix();
- warn_msg(WarnParser, outputName.toLocal8Bit().constData());
file.setFileName(outputName);
}
debug_msg(1, "file is %s", file.fileName().toLatin1().constData());
diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp
index 80c220ed2b..74046a0ac4 100644
--- a/qmake/generators/mac/pbuilder_pbx.cpp
+++ b/qmake/generators/mac/pbuilder_pbx.cpp
@@ -166,16 +166,6 @@ ProjectBuilderMakefileGenerator::writeSubDirs(QTextStream &t)
fprintf(stderr, "Cannot find directory: %s\n", dir.toLatin1().constData());
}
if(tmp_proj.read(fn)) {
- if(Option::debug_level) {
- debug_msg(1, "Dumping all variables:");
- QHash<QString, QStringList> &vars = tmp_proj.variables();
- for(QHash<QString, QStringList>::Iterator it = vars.begin();
- it != vars.end(); ++it) {
- if(it.key().left(1) != "." && !it.value().isEmpty())
- debug_msg(1, "%s: %s === %s", fn.toLatin1().constData(), it.key().toLatin1().constData(),
- it.value().join(" :: ").toLatin1().constData());
- }
- }
if(tmp_proj.first("TEMPLATE") == "subdirs") {
QMakeProject *pp = new QMakeProject(&tmp_proj);
pb_subdirs += new ProjectBuilderSubDirs(pp, dir);
@@ -393,7 +383,7 @@ ProjectBuilderMakefileGenerator::writeSubDirs(QTextStream &t)
t << "\t\t\t" << writeSettings("buildConfigurationList", keyFor("QMAKE_SUBDIR_PBX_BUILDCONFIG_LIST")) << ";" << "\n";
t << "\t\t\t" << "projectReferences = (" << "\n";
{
- QStringList &qmake_subdirs = project->values("QMAKE_PBX_SUBDIRS");
+ const QStringList &qmake_subdirs = project->values("QMAKE_PBX_SUBDIRS");
for(int i = 0; i < qmake_subdirs.count(); i++) {
QString subdir = qmake_subdirs[i];
t << "\t\t\t\t" << "{" << "\n"
@@ -714,16 +704,16 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
mkt << "IMAGES = " << varList("QMAKE_IMAGE_COLLECTION") << endl;
mkt << "PARSERS =";
if(!project->isEmpty("YACCSOURCES")) {
- QStringList &yaccs = project->values("YACCSOURCES");
- for(QStringList::Iterator yit = yaccs.begin(); yit != yaccs.end(); ++yit) {
+ const QStringList &yaccs = project->values("YACCSOURCES");
+ for (QStringList::ConstIterator yit = yaccs.begin(); yit != yaccs.end(); ++yit) {
QFileInfo fi(fileInfo((*yit)));
mkt << " " << fi.path() << Option::dir_sep << fi.baseName()
<< Option::yacc_mod << Option::cpp_ext.first();
}
}
if(!project->isEmpty("LEXSOURCES")) {
- QStringList &lexs = project->values("LEXSOURCES");
- for(QStringList::Iterator lit = lexs.begin(); lit != lexs.end(); ++lit) {
+ const QStringList &lexs = project->values("LEXSOURCES");
+ for (QStringList::ConstIterator lit = lexs.begin(); lit != lexs.end(); ++lit) {
QFileInfo fi(fileInfo((*lit)));
mkt << " " << fi.path() << Option::dir_sep << fi.baseName()
<< Option::lex_mod << Option::cpp_ext.first();
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index f126da3280..c4e0a4face 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -300,6 +300,12 @@ MakefileGenerator::setProjectFile(QMakeProject *p)
if(project)
return;
project = p;
+ if (project->isActiveConfig("win32"))
+ target_mode = TARG_WIN_MODE;
+ else if (project->isActiveConfig("macx"))
+ target_mode = TARG_MACX_MODE;
+ else
+ target_mode = TARG_UNIX_MODE;
init();
findLibraries();
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE &&
@@ -311,7 +317,7 @@ QStringList
MakefileGenerator::findFilesInVPATH(QStringList l, uchar flags, const QString &vpath_var)
{
QStringList vpath;
- QHash<QString, QStringList> &v = project->variables();
+ const QHash<QString, QStringList> &v = project->variables();
for(int val_it = 0; val_it < l.count(); ) {
bool remove_file = false;
QString &val = l[val_it];
@@ -442,14 +448,14 @@ MakefileGenerator::init()
continue_compiler_chain:
if(jump_count > quc.size()) //just to avoid an infinite loop here
break;
- if(project->variables().contains(quc.at(comp_out) + ".variable_out")) {
- const QStringList &outputs = project->variables().value(quc.at(comp_out) + ".variable_out");
+ if (v.contains(quc.at(comp_out) + ".variable_out")) {
+ const QStringList &outputs = v.value(quc.at(comp_out) + ".variable_out");
for(int out = 0; out < outputs.size(); ++out) {
for(int comp_in = 0; comp_in < quc.size(); ++comp_in) {
if(comp_in == comp_out)
continue;
- if(project->variables().contains(quc.at(comp_in) + ".input")) {
- const QStringList &inputs = project->variables().value(quc.at(comp_in) + ".input");
+ if (v.contains(quc.at(comp_in) + ".input")) {
+ const QStringList &inputs = v.value(quc.at(comp_in) + ".input");
for(int in = 0; in < inputs.size(); ++in) {
if(inputs.at(in) == outputs.at(out) && comp_out > comp_in) {
++jump_count;
@@ -665,7 +671,7 @@ MakefileGenerator::init()
if(tmp_out.isEmpty())
continue;
if(project->values((*it) + ".CONFIG").indexOf("combine") != -1) {
- QStringList &compilerInputs = project->values((*it) + ".input");
+ const QStringList &compilerInputs = project->values((*it) + ".input");
// Don't generate compiler output if it doesn't have input.
if (compilerInputs.isEmpty() || project->values(compilerInputs.first()).isEmpty())
continue;
@@ -674,8 +680,8 @@ MakefileGenerator::init()
continue;
QString out = fileFixify(tmp_out, Option::output_dir, Option::output_dir);
bool pre_dep = (project->values((*it) + ".CONFIG").indexOf("target_predeps") != -1);
- if(project->variables().contains((*it) + ".variable_out")) {
- const QStringList &var_out = project->variables().value((*it) + ".variable_out");
+ if (v.contains((*it) + ".variable_out")) {
+ const QStringList &var_out = v.value((*it) + ".variable_out");
for(int i = 0; i < var_out.size(); ++i) {
QString v = var_out.at(i);
if(v == QLatin1String("SOURCES"))
@@ -697,14 +703,14 @@ MakefileGenerator::init()
list.append(out);
}
if(pre_dep) {
- QStringList &list = project->variables()["PRE_TARGETDEPS"];
+ QStringList &list = project->values("PRE_TARGETDEPS");
if(!list.contains(out))
list.append(out);
}
}
} else {
- QStringList &tmp = project->values((*it) + ".input");
- for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
+ const QStringList &tmp = project->values((*it) + ".input");
+ for (QStringList::ConstIterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
const QStringList inputs = project->values((*it2));
for(QStringList::ConstIterator input = inputs.constBegin(); input != inputs.constEnd(); ++input) {
if((*input).isEmpty())
@@ -715,8 +721,8 @@ MakefileGenerator::init()
QString out = replaceExtraCompilerVariables(tmp_out, (*input), QString());
out = fileFixify(out, Option::output_dir, Option::output_dir);
bool pre_dep = (project->values((*it) + ".CONFIG").indexOf("target_predeps") != -1);
- if(project->variables().contains((*it) + ".variable_out")) {
- const QStringList &var_out = project->variables().value((*it) + ".variable_out");
+ if (v.contains((*it) + ".variable_out")) {
+ const QStringList &var_out = project->values(*it + ".variable_out");
for(int i = 0; i < var_out.size(); ++i) {
QString v = var_out.at(i);
if(v == QLatin1String("SOURCES"))
@@ -738,7 +744,7 @@ MakefileGenerator::init()
list.append(out);
}
if(pre_dep) {
- QStringList &list = project->variables()["PRE_TARGETDEPS"];
+ QStringList &list = project->values("PRE_TARGETDEPS");
if(!list.contains(out))
list.append(out);
}
@@ -1151,11 +1157,11 @@ MakefileGenerator::writePrlFile()
void
MakefileGenerator::writeObj(QTextStream &t, const QString &src)
{
- QStringList &srcl = project->values(src);
- QStringList objl = createObjectList(srcl);
+ const QStringList &srcl = project->values(src);
+ const QStringList objl = createObjectList(srcl);
- QStringList::Iterator oit = objl.begin();
- QStringList::Iterator sit = srcl.begin();
+ QStringList::ConstIterator oit = objl.begin();
+ QStringList::ConstIterator sit = srcl.begin();
QString stringSrc("$src");
QString stringObj("$obj");
for(;sit != srcl.end() && oit != objl.end(); ++oit, ++sit) {
@@ -1216,8 +1222,8 @@ MakefileGenerator::writeInstalls(QTextStream &t, const QString &installs, bool n
rm_dir_contents = "-$(DEL_FILE) -r";
QString all_installs, all_uninstalls;
- QStringList &l = project->values(installs);
- for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ const QStringList &l = project->values(installs);
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
QString pvar = (*it) + ".path";
if(project->values((*it) + ".CONFIG").indexOf("no_path") == -1 &&
project->values((*it) + ".CONFIG").indexOf("dummy_install") == -1 &&
@@ -1683,10 +1689,10 @@ MakefileGenerator::verifyExtraCompiler(const QString &comp, const QString &file_
if(!pass)
return false;
} else {
- QStringList &tmp = project->values(comp + ".input");
- for(QStringList::Iterator it = tmp.begin(); it != tmp.end(); ++it) {
- QStringList &inputs = project->values((*it));
- for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) {
+ const QStringList &tmp = project->values(comp + ".input");
+ for (QStringList::ConstIterator it = tmp.begin(); it != tmp.end(); ++it) {
+ const QStringList &inputs = project->values((*it));
+ for (QStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) {
if((*input).isEmpty())
continue;
QString in = fileFixify(Option::fixPathToTargetOS((*input), false));
@@ -1729,10 +1735,10 @@ MakefileGenerator::verifyExtraCompiler(const QString &comp, const QString &file_
if(system(cmd.toLatin1().constData()))
return false;
} else {
- QStringList &tmp = project->values(comp + ".input");
- for(QStringList::Iterator it = tmp.begin(); it != tmp.end(); ++it) {
- QStringList &inputs = project->values((*it));
- for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) {
+ const QStringList &tmp = project->values(comp + ".input");
+ for (QStringList::ConstIterator it = tmp.begin(); it != tmp.end(); ++it) {
+ const QStringList &inputs = project->values((*it));
+ for (QStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) {
if((*input).isEmpty())
continue;
QString in = fileFixify(Option::fixPathToTargetOS((*input), false));
@@ -1753,14 +1759,14 @@ MakefileGenerator::verifyExtraCompiler(const QString &comp, const QString &file_
void
MakefileGenerator::writeExtraTargets(QTextStream &t)
{
- QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
- for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) {
+ const QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
+ for (QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it) {
QString targ = var((*it) + ".target"),
cmd = var((*it) + ".commands"), deps;
if(targ.isEmpty())
targ = (*it);
- QStringList &deplist = project->values((*it) + ".depends");
- for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) {
+ const QStringList &deplist = project->values((*it) + ".depends");
+ for (QStringList::ConstIterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) {
QString dep = var((*dep_it) + ".target");
if(dep.isEmpty())
dep = (*dep_it);
@@ -1822,7 +1828,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
+ escapeFilePath(Option::fixPathToLocalOS(Option::output_dir, false))
+ QLatin1String(" && ");
}
- QStringList &vars = project->values((*it) + ".variables");
+ const QStringList &vars = project->values((*it) + ".variables");
if(tmp_out.isEmpty() || tmp_cmd.isEmpty())
continue;
QStringList tmp_inputs;
@@ -2114,10 +2120,10 @@ MakefileGenerator::writeExtraVariables(QTextStream &t)
t << endl;
QStringList outlist;
- QHash<QString, QStringList> &vars = project->variables();
- QStringList &exports = project->values("QMAKE_EXTRA_VARIABLES");
- for (QHash<QString, QStringList>::Iterator it = vars.begin(); it != vars.end(); ++it) {
- for (QStringList::Iterator exp_it = exports.begin(); exp_it != exports.end(); ++exp_it) {
+ const QHash<QString, QStringList> &vars = project->variables();
+ const QStringList &exports = project->values("QMAKE_EXTRA_VARIABLES");
+ for (QHash<QString, QStringList>::ConstIterator it = vars.begin(); it != vars.end(); ++it) {
+ for (QStringList::ConstIterator exp_it = exports.begin(); exp_it != exports.end(); ++exp_it) {
QRegExp rx((*exp_it), Qt::CaseInsensitive, QRegExp::Wildcard);
if (rx.exactMatch(it.key()))
outlist << ("EXPORT_" + it.key() + " = " + it.value().join(" "));
@@ -2133,7 +2139,7 @@ bool
MakefileGenerator::writeStubMakefile(QTextStream &t)
{
t << "QMAKE = " << var("QMAKE_QMAKE") << endl;
- QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
+ const QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
for(QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it)
t << *it << " ";
//const QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.fileName()));
@@ -2196,14 +2202,6 @@ QString MakefileGenerator::buildArgs(const QString &outdir)
ret += " -spec " + fixifySpecdir(Option::mkfile::qmakespec, outdir);
if (!Option::mkfile::xqmakespec_commandline.isEmpty())
ret += " -xspec " + fixifySpecdir(Option::mkfile::xqmakespec, outdir);
- if (Option::target_mode_overridden) {
- if (Option::target_mode == Option::TARG_MACX_MODE)
- ret += " -macx";
- else if (Option::target_mode == Option::TARG_UNIX_MODE)
- ret += " -unix";
- else if (Option::target_mode == Option::TARG_WIN_MODE)
- ret += " -win32";
- }
//arguments
for(QStringList::Iterator it = Option::before_user_vars.begin();
@@ -2398,8 +2396,8 @@ void
MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubTarget*> targets, int flags)
{
// blasted includes
- QStringList &qeui = project->values("QMAKE_EXTRA_INCLUDES");
- for(QStringList::Iterator qeui_it = qeui.begin(); qeui_it != qeui.end(); ++qeui_it)
+ const QStringList &qeui = project->values("QMAKE_EXTRA_INCLUDES");
+ for (QStringList::ConstIterator qeui_it = qeui.begin(); qeui_it != qeui.end(); ++qeui_it)
t << "include " << (*qeui_it) << endl;
if (!(flags & SubTargetSkipDefaultVariables)) {
@@ -2609,16 +2607,16 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
}
// user defined targets
- QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
- for(QStringList::Iterator qut_it = qut.begin(); qut_it != qut.end(); ++qut_it) {
+ const QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
+ for (QStringList::ConstIterator qut_it = qut.begin(); qut_it != qut.end(); ++qut_it) {
QString targ = var((*qut_it) + ".target"),
cmd = var((*qut_it) + ".commands"), deps;
if(targ.isEmpty())
targ = (*qut_it);
t << endl;
- QStringList &deplist = project->values((*qut_it) + ".depends");
- for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) {
+ const QStringList &deplist = project->values((*qut_it) + ".depends");
+ for (QStringList::ConstIterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) {
QString dep = var((*dep_it) + ".target");
if(dep.isEmpty())
dep = Option::fixPathToTargetOS(*dep_it, false);
@@ -2933,8 +2931,8 @@ MakefileGenerator::checkMultipleDefinition(const QString &f, const QString &w)
int slsh = f.lastIndexOf(Option::dir_sep);
if(slsh != -1)
file.remove(0, slsh + 1);
- QStringList &l = project->values(w);
- for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {
+ const QStringList &l = project->values(w);
+ for (QStringList::ConstIterator val_it = l.begin(); val_it != l.end(); ++val_it) {
QString file2((*val_it));
slsh = file2.lastIndexOf(Option::dir_sep);
if(slsh != -1)
@@ -2967,8 +2965,8 @@ MakefileGenerator::findFileForDep(const QMakeLocalFileName &dep, const QMakeLoca
QMakeLocalFileName ret;
if(!project->isEmpty("SKIP_DEPENDS")) {
bool found = false;
- QStringList &nodeplist = project->values("SKIP_DEPENDS");
- for(QStringList::Iterator it = nodeplist.begin();
+ const QStringList &nodeplist = project->values("SKIP_DEPENDS");
+ for (QStringList::ConstIterator it = nodeplist.begin();
it != nodeplist.end(); ++it) {
QRegExp regx((*it));
if(regx.indexIn(dep.local()) != -1) {
@@ -3016,8 +3014,8 @@ MakefileGenerator::findFileForDep(const QMakeLocalFileName &dep, const QMakeLoca
}
{ //is it from an EXTRA_TARGET
const QString dep_basename = dep.local().section(Option::dir_sep, -1);
- QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
- for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) {
+ const QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
+ for (QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it) {
QString targ = var((*it) + ".target");
if(targ.isEmpty())
targ = (*it);
@@ -3035,10 +3033,10 @@ MakefileGenerator::findFileForDep(const QMakeLocalFileName &dep, const QMakeLoca
QString tmp_out = project->values((*it) + ".output").first();
if(tmp_out.isEmpty())
continue;
- QStringList &tmp = project->values((*it) + ".input");
- for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
- QStringList &inputs = project->values((*it2));
- for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) {
+ const QStringList &tmp = project->values((*it) + ".input");
+ for (QStringList::ConstIterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
+ const QStringList &inputs = project->values((*it2));
+ for (QStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) {
QString out = Option::fixPathToTargetOS(unescapeFilePath(replaceExtraCompilerVariables(tmp_out, (*input), QString())));
if(out == dep.real() || out.section(Option::dir_sep, -1) == dep_basename) {
ret = QMakeLocalFileName(fileFixify(out, qmake_getpwd(), Option::output_dir));
@@ -3075,8 +3073,7 @@ QString
MakefileGenerator::specdir()
{
if (spec.isEmpty())
- spec = fileFixify(project->isHostBuild()
- ? Option::mkfile::qmakespec : Option::mkfile::xqmakespec);
+ spec = fileFixify(project->specDir());
return spec;
}
@@ -3261,7 +3258,7 @@ MakefileGenerator::writePkgConfigFile()
t << "Libs: ";
QString pkgConfiglibDir;
QString pkgConfiglibName;
- if (Option::target_mode == Option::TARG_MACX_MODE && project->isActiveConfig("lib_bundle")) {
+ if (target_mode == TARG_MACX_MODE && project->isActiveConfig("lib_bundle")) {
pkgConfiglibDir = "-F${libdir}";
QString bundle;
if (!project->isEmpty("QMAKE_FRAMEWORK_BUNDLE_NAME"))
diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h
index 2cf774e2bc..dc6714dd64 100644
--- a/qmake/generators/makefile.h
+++ b/qmake/generators/makefile.h
@@ -91,6 +91,8 @@ class MakefileGenerator : protected QMakeSourceFileInfo
mutable QHash<ReplaceExtraCompilerCacheKey, QString> extraCompilerVariablesCache;
protected:
+ enum TARG_MODE { TARG_UNIX_MODE, TARG_MACX_MODE, TARG_WIN_MODE } target_mode;
+
QStringList createObjectList(const QStringList &sources);
//makefile style generator functions
@@ -258,7 +260,7 @@ public:
virtual bool supportsMergedBuilds() { return false; }
virtual bool mergeBuildProject(MakefileGenerator * /*other*/) { return false; }
virtual bool openOutput(QFile &, const QString &build) const;
- virtual bool isWindowsShell() const { return Option::host_mode == Option::HOST_WIN_MODE; }
+ bool isWindowsShell() const { return Option::dir_sep == QLatin1String("\\"); }
};
inline void MakefileGenerator::setNoIO(bool o)
diff --git a/qmake/generators/metamakefile.cpp b/qmake/generators/metamakefile.cpp
index a1ab4ada75..d023d5e73e 100644
--- a/qmake/generators/metamakefile.cpp
+++ b/qmake/generators/metamakefile.cpp
@@ -104,7 +104,7 @@ BuildsMetaMakefileGenerator::init()
return false;
init_flag = true;
- const QStringList &builds = project->variables()["BUILDS"];
+ const QStringList &builds = project->values("BUILDS");
bool use_single_build = builds.isEmpty();
if(builds.count() > 1 && Option::output.fileName() == "-") {
use_single_build = true;
@@ -214,17 +214,6 @@ BuildsMetaMakefileGenerator::write(const QString &oldpwd)
if(!ret)
Option::output.remove();
}
-
- // debugging
- if(Option::debug_level) {
- debug_msg(1, "Dumping all variables:");
- QHash<QString, QStringList> &vars = project->variables();
- for(QHash<QString, QStringList>::Iterator it = vars.begin(); it != vars.end(); ++it) {
- if(!it.key().startsWith(".") && !it.value().isEmpty())
- debug_msg(1, "%s === %s", it.key().toLatin1().constData(),
- it.value().join(" :: ").toLatin1().constData());
- }
- }
}
return ret;
}
@@ -292,14 +281,7 @@ SubdirsMetaMakefileGenerator::init()
init_flag = true;
bool hasError = false;
- // It might make sense to bequeath the CONFIG option to the recursed
- // projects. OTOH, one would most likely have it in all projects anyway -
- // either through a qmakespec, a .qmake.cache or explicitly - as otherwise
- // running qmake in a subdirectory would have a different auto-recurse
- // setting than in parent directories.
- bool recurse = Option::recursive == Option::QMAKE_RECURSIVE_YES
- || (Option::recursive == Option::QMAKE_RECURSIVE_DEFAULT
- && project->isRecursive());
+ bool recurse = Option::recursive;
if (recurse && project->isActiveConfig("dont_recurse"))
recurse = false;
if(recurse) {
@@ -347,7 +329,7 @@ SubdirsMetaMakefileGenerator::init()
qmake_setpwd(sub->input_dir);
Option::output_dir = sub->output_dir;
bool tmpError = !sub_proj->read(subdir.fileName());
- if(!sub_proj->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
+ if (!sub_proj->isEmpty("QMAKE_FAILED_REQUIREMENTS")) {
fprintf(stderr, "Project file(%s) not recursed because all requirements not met:\n\t%s\n",
subdir.fileName().toLatin1().constData(),
sub_proj->values("QMAKE_FAILED_REQUIREMENTS").join(" ").toLatin1().constData());
@@ -514,44 +496,5 @@ MetaMakefileGenerator::createMetaGenerator(QMakeProject *proj, const QString &na
#endif // QT_QMAKE_PARSER_ONLY
-bool
-MetaMakefileGenerator::modesForGenerator(const QString &gen,
- Option::HOST_MODE *host_mode, Option::TARG_MODE *target_mode)
-{
- if (gen == "UNIX") {
-#ifdef Q_OS_MAC
- *host_mode = Option::HOST_MACX_MODE;
- *target_mode = Option::TARG_MACX_MODE;
-#elif defined(Q_OS_WIN)
- *host_mode = Option::HOST_WIN_MODE;
- *target_mode = Option::TARG_UNIX_MODE;
-#else
- *host_mode = Option::HOST_UNIX_MODE;
- *target_mode = Option::TARG_UNIX_MODE;
-#endif
- } else if (gen == "MSVC.NET" || gen == "BMAKE" || gen == "MSBUILD") {
- *host_mode = Option::HOST_WIN_MODE;
- *target_mode = Option::TARG_WIN_MODE;
- } else if (gen == "MINGW") {
-#if defined(Q_OS_MAC)
- *host_mode = Option::HOST_MACX_MODE;
-#elif defined(Q_OS_UNIX)
- *host_mode = Option::HOST_UNIX_MODE;
-#else
- *host_mode = Option::HOST_WIN_MODE;
-#endif
- *target_mode = Option::TARG_WIN_MODE;
- } else if (gen == "PROJECTBUILDER" || gen == "XCODE") {
- *host_mode = Option::HOST_MACX_MODE;
- *target_mode = Option::TARG_MACX_MODE;
- } else if (gen == "GBUILD") {
- *host_mode = Option::HOST_UNIX_MODE;
- *target_mode = Option::TARG_INTEGRITY_MODE;
- } else {
- fprintf(stderr, "Unknown generator specified: %s\n", gen.toLatin1().constData());
- return false;
- }
- return true;
-}
QT_END_NAMESPACE
diff --git a/qmake/generators/metamakefile.h b/qmake/generators/metamakefile.h
index 4e2e7c502e..846a7989f1 100644
--- a/qmake/generators/metamakefile.h
+++ b/qmake/generators/metamakefile.h
@@ -42,8 +42,6 @@
#ifndef METAMAKEFILE_H
#define METAMAKEFILE_H
-#include <option.h>
-
#include <qlist.h>
#include <qstring.h>
@@ -67,9 +65,6 @@ public:
static MetaMakefileGenerator *createMetaGenerator(QMakeProject *proj, const QString &name, bool op=true, bool *success = 0);
static MakefileGenerator *createMakefileGenerator(QMakeProject *proj, bool noIO = false);
- static bool modesForGenerator(const QString &generator,
- Option::HOST_MODE *host_mode, Option::TARG_MODE *target_mode);
-
inline QMakeProject *projectFile() const { return project; }
virtual bool init() = 0;
diff --git a/qmake/generators/projectgenerator.cpp b/qmake/generators/projectgenerator.cpp
index 9a181a43f5..1e5bab669c 100644
--- a/qmake/generators/projectgenerator.cpp
+++ b/qmake/generators/projectgenerator.cpp
@@ -77,7 +77,7 @@ ProjectGenerator::init()
verifyCompilers();
project->read(QMakeProject::ReadFeatures);
- project->variables()["CONFIG"].clear();
+ project->values("CONFIG").clear();
QHash<QString, QStringList> &v = project->variables();
QString templ = Option::user_template.isEmpty() ? QString("app") : Option::user_template;
@@ -105,7 +105,7 @@ ProjectGenerator::init()
add_depend = true;
if(dir.right(1) != Option::dir_sep)
dir += Option::dir_sep;
- if(Option::recursive == Option::QMAKE_RECURSIVE_YES) {
+ if (Option::recursive) {
QStringList files = QDir(dir).entryList(QDir::Files);
for(int i = 0; i < (int)files.count(); i++) {
if(files[i] != "." && files[i] != "..")
@@ -132,7 +132,7 @@ ProjectGenerator::init()
dir = regex.left(s+1);
regex = regex.right(regex.length() - (s+1));
}
- if(Option::recursive == Option::QMAKE_RECURSIVE_YES) {
+ if (Option::recursive) {
QStringList entries = QDir(dir).entryList(QDir::Dirs);
for(int i = 0; i < (int)entries.count(); i++) {
if(entries[i] != "." && entries[i] != "..") {
@@ -187,7 +187,7 @@ ProjectGenerator::init()
subdirs.append(nd);
}
}
- if(Option::recursive == Option::QMAKE_RECURSIVE_YES) {
+ if (Option::recursive) {
QStringList dirs = QDir(newdir).entryList(QDir::Dirs);
for(int i = 0; i < (int)dirs.count(); i++) {
QString nd = fileFixify(newdir + QDir::separator() + dirs[i]);
@@ -224,8 +224,7 @@ ProjectGenerator::init()
}
}
}
- if(Option::recursive == Option::QMAKE_RECURSIVE_YES
- && !knownDirs.contains(newdir, Qt::CaseInsensitive))
+ if (Option::recursive && !knownDirs.contains(newdir, Qt::CaseInsensitive))
knownDirs.append(newdir);
}
}
@@ -297,13 +296,13 @@ ProjectGenerator::init()
}
//strip out files that are actually output from internal compilers (ie temporary files)
- const QStringList &quc = project->variables()["QMAKE_EXTRA_COMPILERS"];
+ const QStringList &quc = project->values("QMAKE_EXTRA_COMPILERS");
for(QStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) {
- QString tmp_out = project->variables()[(*it) + ".output"].first();
+ QString tmp_out = project->first((*it) + ".output");
if(tmp_out.isEmpty())
continue;
- QStringList var_out = project->variables()[(*it) + ".variable_out"];
+ QStringList var_out = project->values((*it) + ".variable_out");
bool defaults = var_out.isEmpty();
for(int i = 0; i < var_out.size(); ++i) {
QString v = var_out.at(i);
@@ -317,15 +316,15 @@ ProjectGenerator::init()
var_out << "HEADERS";
var_out << "FORMS";
}
- const QStringList &tmp = project->variables()[(*it) + ".input"];
+ const QStringList &tmp = project->values((*it) + ".input");
for(QStringList::ConstIterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
- QStringList &inputs = project->variables()[(*it2)];
+ QStringList &inputs = project->values(*it2);
for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) {
QString path = replaceExtraCompilerVariables(tmp_out, (*input), QString());
path = fixPathToQmake(path).section('/', -1);
for(int i = 0; i < var_out.size(); ++i) {
QString v = var_out.at(i);
- QStringList &list = project->variables()[v];
+ QStringList &list = project->values(v);
for(int src = 0; src < list.size(); ) {
if(list[src] == path || list[src].endsWith("/" + path))
list.removeAt(src);
@@ -356,7 +355,7 @@ ProjectGenerator::writeMakefile(QTextStream &t)
QString ofn = QFileInfo(static_cast<QFile *>(t.device())->fileName()).completeBaseName();
if (ofn.isEmpty() || ofn == "-")
ofn = "unknown";
- project->variables()["TARGET_ASSIGN"] = QStringList(ofn);
+ project->values("TARGET_ASSIGN") = QStringList(ofn);
t << getWritableVar("TARGET_ASSIGN")
<< getWritableVar("CONFIG", false)
@@ -384,8 +383,8 @@ ProjectGenerator::addConfig(const QString &cfg, bool add)
QString where = "CONFIG";
if(!add)
where = "CONFIG_REMOVE";
- if(!project->variables()[where].contains(cfg)) {
- project->variables()[where] += cfg;
+ if (!project->values(where).contains(cfg)) {
+ project->values(where) += cfg;
return true;
}
return false;
@@ -439,7 +438,7 @@ ProjectGenerator::addFile(QString file)
QString newfile = fixPathToQmake(fileFixify(file));
- QStringList &endList = project->variables()[where];
+ QStringList &endList = project->values(where);
if(!endList.contains(newfile, Qt::CaseInsensitive)) {
endList += newfile;
return true;
@@ -450,7 +449,7 @@ ProjectGenerator::addFile(QString file)
QString
ProjectGenerator::getWritableVar(const QString &v, bool)
{
- QStringList &vals = project->variables()[v];
+ QStringList &vals = project->values(v);
if(vals.isEmpty())
return "";
diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp
index b8b4f1bbc5..31b059decc 100644
--- a/qmake/generators/unix/unixmake.cpp
+++ b/qmake/generators/unix/unixmake.cpp
@@ -491,9 +491,9 @@ UnixMakefileGenerator::findLibraries()
} else {
stub = opt.mid(2);
}
- } else if(Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-F")) {
+ } else if (target_mode == TARG_MACX_MODE && opt.startsWith("-F")) {
frameworkdirs.append(QMakeLocalFileName(opt.right(opt.length()-2)));
- } else if(Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-framework")) {
+ } else if (target_mode == TARG_MACX_MODE && opt.startsWith("-framework")) {
if(opt.length() > 11) {
opt = opt.mid(11);
} else {
@@ -612,11 +612,11 @@ UnixMakefileGenerator::processPrlFiles()
break;
}
}
- } else if(Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-F")) {
+ } else if (target_mode == TARG_MACX_MODE && opt.startsWith("-F")) {
QMakeLocalFileName f(opt.right(opt.length()-2));
if(!frameworkdirs.contains(f))
frameworkdirs.append(f);
- } else if(Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-framework")) {
+ } else if (target_mode == TARG_MACX_MODE && opt.startsWith("-framework")) {
if(opt.length() > 11)
opt = opt.mid(11);
else
@@ -655,7 +655,7 @@ UnixMakefileGenerator::processPrlFiles()
QString arch("default");
QString opt = l.at(lit).trimmed();
if(opt.startsWith("-")) {
- if (Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-Xarch")) {
+ if (target_mode == TARG_MACX_MODE && opt.startsWith("-Xarch")) {
if (opt.length() > 7) {
arch = opt.mid(7);
opt = l.at(++lit);
@@ -663,7 +663,7 @@ UnixMakefileGenerator::processPrlFiles()
}
if(opt.startsWith("-L") ||
- (Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-F"))) {
+ (target_mode == TARG_MACX_MODE && opt.startsWith("-F"))) {
if(!lflags[arch].contains(opt))
lflags[arch].append(opt);
} else if(opt.startsWith("-l") || opt == "-pthread") {
@@ -671,12 +671,12 @@ UnixMakefileGenerator::processPrlFiles()
if (lflags[arch].contains(opt))
lflags[arch].removeAll(opt);
lflags[arch].append(opt);
- } else if(Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-framework")) {
+ } else if (target_mode == TARG_MACX_MODE && opt.startsWith("-framework")) {
if(opt.length() > 11)
opt = opt.mid(11);
else {
opt = l.at(++lit);
- if (Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-Xarch"))
+ if (target_mode == TARG_MACX_MODE && opt.startsWith("-Xarch"))
opt = l.at(++lit); // The user has done the right thing and prefixed each part
}
bool found = false;
@@ -742,7 +742,7 @@ UnixMakefileGenerator::defaultInstall(const QString &t)
QStringList links;
QString target="$(TARGET)";
- QStringList &targets = project->values(t + ".targets");
+ const QStringList &targets = project->values(t + ".targets");
if(!project->isEmpty("QMAKE_BUNDLE")) {
target = project->first("QMAKE_BUNDLE");
bundle = true;
@@ -838,8 +838,7 @@ UnixMakefileGenerator::defaultInstall(const QString &t)
uninst.append("-$(DEL_FILE) \"" + dst_targ + "\"");
if(!links.isEmpty()) {
for(int i = 0; i < links.size(); ++i) {
- if(Option::target_mode == Option::TARG_UNIX_MODE ||
- Option::target_mode == Option::TARG_MACX_MODE) {
+ if (target_mode == TARG_UNIX_MODE || target_mode == TARG_MACX_MODE) {
QString link = Option::fixPathToTargetOS(destdir + links[i], false);
int lslash = link.lastIndexOf(Option::dir_sep);
if(lslash != -1)
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 490b76e494..f13699f0f7 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -82,7 +82,7 @@ UnixMakefileGenerator::writeMakefile(QTextStream &t)
writeHeader(t);
if(!project->values("QMAKE_FAILED_REQUIREMENTS").isEmpty()) {
t << "QMAKE = " << var("QMAKE_QMAKE") << endl;
- QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
+ const QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
for(QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it)
t << *it << " ";
t << "first all clean install distclean uninstall qmake_all:" << "\n\t"
@@ -190,11 +190,13 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
t << "SOURCES = " << valList(escapeFilePaths(project->values("SOURCES"))) << " "
<< valList(escapeFilePaths(project->values("GENERATED_SOURCES"))) << endl;
if(do_incremental) {
- QStringList &objs = project->values("OBJECTS"), &incrs = project->values("QMAKE_INCREMENTAL"), incrs_out;
+ const QStringList &objs = project->values("OBJECTS");
+ const QStringList &incrs = project->values("QMAKE_INCREMENTAL");
+ QStringList incrs_out;
t << "OBJECTS = ";
- for(QStringList::Iterator objit = objs.begin(); objit != objs.end(); ++objit) {
+ for (QStringList::ConstIterator objit = objs.begin(); objit != objs.end(); ++objit) {
bool increment = false;
- for(QStringList::Iterator incrit = incrs.begin(); incrit != incrs.end(); ++incrit) {
+ for (QStringList::ConstIterator incrit = incrs.begin(); incrit != incrs.end(); ++incrit) {
if((*objit).indexOf(QRegExp((*incrit), Qt::CaseSensitive,
QRegExp::Wildcard)) != -1) {
increment = true;
@@ -247,8 +249,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
t << endl;
// blasted includes
- QStringList &qeui = project->values("QMAKE_EXTRA_INCLUDES");
- QStringList::Iterator it;
+ const QStringList &qeui = project->values("QMAKE_EXTRA_INCLUDES");
+ QStringList::ConstIterator it;
for(it = qeui.begin(); it != qeui.end(); ++it)
t << "include " << (*it) << endl;
@@ -301,8 +303,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
QString src[] = { "SOURCES", "GENERATED_SOURCES", QString() };
for(int x = 0; !src[x].isNull(); x++) {
- QStringList &l = project->values(src[x]);
- for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ const QStringList &l = project->values(src[x]);
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if(!(*it).isEmpty()) {
QString d_file;
for(QStringList::Iterator cit = Option::c_ext.begin();
@@ -343,15 +345,15 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if(!project->isEmpty("SUBLIBS_DIR"))
libdir = project->first("SUBLIBS_DIR");
t << "SUBLIBS = ";
- QStringList &l = project->values("SUBLIBS");
- for(QStringList::Iterator it = l.begin(); it != l.end(); ++it)
+ const QStringList &l = project->values("SUBLIBS");
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it)
t << libdir << project->first("QMAKE_PREFIX_STATICLIB") << (*it) << "."
<< project->first("QMAKE_EXTENSION_STATICLIB") << " ";
t << endl << endl;
}
if(project->isActiveConfig("depend_prl") && !project->isEmpty("QMAKE_PRL_INTERNAL_FILES")) {
- QStringList &l = project->values("QMAKE_PRL_INTERNAL_FILES");
- QStringList::Iterator it;
+ const QStringList &l = project->values("QMAKE_PRL_INTERNAL_FILES");
+ QStringList::ConstIterator it;
for(it = l.begin(); it != l.end(); ++it) {
QMakeMetaInfo libinfo;
if(libinfo.readLib((*it)) && !libinfo.isEmpty("QMAKE_PRL_BUILD_DIR")) {
@@ -886,7 +888,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
QString libdir = "tmp/";
if(!project->isEmpty("SUBLIBS_DIR"))
libdir = project->first("SUBLIBS_DIR");
- QStringList &l = project->values("SUBLIBS");
+ const QStringList &l = project->values("SUBLIBS");
for(it = l.begin(); it != l.end(); ++it)
t << libdir << project->first("QMAKE_PREFIX_STATICLIB") << (*it) << "."
<< project->first("QMAKE_EXTENSION_STATICLIB") << ":\n\t"
diff --git a/qmake/generators/win32/borland_bmake.cpp b/qmake/generators/win32/borland_bmake.cpp
index 4c4ddf642e..110e2eafa6 100644
--- a/qmake/generators/win32/borland_bmake.cpp
+++ b/qmake/generators/win32/borland_bmake.cpp
@@ -57,7 +57,7 @@ BorlandMakefileGenerator::writeMakefile(QTextStream &t)
{
writeHeader(t);
if(!project->values("QMAKE_FAILED_REQUIREMENTS").isEmpty()) {
- QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
+ const QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
for(QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it)
t << *it << " ";
t << "all first clean:" << "\n\t"
diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp
index e62221e636..e7dbc6a274 100644
--- a/qmake/generators/win32/mingw_make.cpp
+++ b/qmake/generators/win32/mingw_make.cpp
@@ -51,21 +51,12 @@ QT_BEGIN_NAMESPACE
MingwMakefileGenerator::MingwMakefileGenerator() : Win32MakefileGenerator(), init_flag(false)
{
- if (Option::shellPath.isEmpty())
+ if (isWindowsShell())
quote = "\"";
else
quote = "'";
}
-bool MingwMakefileGenerator::isWindowsShell() const
-{
-#ifdef Q_OS_WIN
- return Option::shellPath.isEmpty();
-#else
- return Win32MakefileGenerator::isWindowsShell();
-#endif
-}
-
QString MingwMakefileGenerator::escapeDependencyPath(const QString &path) const
{
QString ret = path;
@@ -91,8 +82,8 @@ bool MingwMakefileGenerator::findLibraries(const QString &where)
QList<QMakeLocalFileName> dirs;
{
- QStringList &libpaths = project->values("QMAKE_LIBDIR");
- for(QStringList::Iterator libpathit = libpaths.begin();
+ const QStringList &libpaths = project->values("QMAKE_LIBDIR");
+ for (QStringList::ConstIterator libpathit = libpaths.begin();
libpathit != libpaths.end(); ++libpathit)
dirs.append(QMakeLocalFileName((*libpathit)));
}
@@ -148,7 +139,7 @@ bool MingwMakefileGenerator::writeMakefile(QTextStream &t)
if(Option::mkfile::do_stub_makefile) {
t << "QMAKE = " << var("QMAKE_QMAKE") << endl;
- QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
+ const QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
for(QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it)
t << *it << " ";
t << "first all clean install distclean uninstall: qmake" << endl
@@ -344,8 +335,8 @@ void MingwMakefileGenerator::writeIncPart(QTextStream &t)
{
t << "INCPATH = ";
- QStringList &incs = project->values("INCLUDEPATH");
- for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) {
+ const QStringList &incs = project->values("INCLUDEPATH");
+ for (QStringList::ConstIterator incit = incs.begin(); incit != incs.end(); ++incit) {
QString inc = (*incit);
inc.replace(QRegExp("\\\\$"), "");
inc.replace(QRegExp("\""), "");
diff --git a/qmake/generators/win32/mingw_make.h b/qmake/generators/win32/mingw_make.h
index 08d87cb916..88832dde76 100644
--- a/qmake/generators/win32/mingw_make.h
+++ b/qmake/generators/win32/mingw_make.h
@@ -57,7 +57,6 @@ protected:
bool writeMakefile(QTextStream &);
void init();
private:
- bool isWindowsShell() const;
void writeMingwParts(QTextStream &);
void writeIncPart(QTextStream &t);
void writeLibsPart(QTextStream &t);
diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp
index adf8883b01..0107f025eb 100644
--- a/qmake/generators/win32/msvc_nmake.cpp
+++ b/qmake/generators/win32/msvc_nmake.cpp
@@ -59,8 +59,8 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
{
writeHeader(t);
if(!project->values("QMAKE_FAILED_REQUIREMENTS").isEmpty()) {
- QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
- for(QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it)
+ const QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
+ for (QStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it)
t << *it << " ";
t << "all first clean:" << "\n\t"
<< "@echo \"Some of the required modules ("
@@ -332,8 +332,8 @@ void NmakeMakefileGenerator::writeImplicitRulesPart(QTextStream &t)
}
QString srcs[] = { QString("SOURCES"), QString("GENERATED_SOURCES"), QString() };
for(int x = 0; !srcs[x].isNull(); x++) {
- QStringList &l = project->values(srcs[x]);
- for(QStringList::Iterator sit = l.begin(); sit != l.end(); ++sit) {
+ const QStringList &l = project->values(srcs[x]);
+ for (QStringList::ConstIterator sit = l.begin(); sit != l.end(); ++sit) {
QString sep = "\\";
if((*sit).indexOf(sep) == -1)
sep = "/";
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp
index b474dac7a5..daaef0fbc4 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -2181,11 +2181,11 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info)
// All information about the extra compiler
QString tmp_out = Project->project->first(extraCompilerName + ".output");
- QString tmp_cmd = Project->project->variables()[extraCompilerName + ".commands"].join(" ");
- QString tmp_cmd_name = Project->project->variables()[extraCompilerName + ".name"].join(" ");
- QStringList tmp_dep = Project->project->variables()[extraCompilerName + ".depends"];
- QString tmp_dep_cmd = Project->project->variables()[extraCompilerName + ".depend_command"].join(" ");
- QStringList configs = Project->project->variables()[extraCompilerName + ".CONFIG"];
+ QString tmp_cmd = Project->project->values(extraCompilerName + ".commands").join(" ");
+ QString tmp_cmd_name = Project->project->values(extraCompilerName + ".name").join(" ");
+ QStringList tmp_dep = Project->project->values(extraCompilerName + ".depends");
+ QString tmp_dep_cmd = Project->project->values(extraCompilerName + ".depend_command").join(" ");
+ QStringList configs = Project->project->values(extraCompilerName + ".CONFIG");
bool combined = configs.indexOf("combine") != -1;
QString cmd, cmd_name, out;
@@ -2248,9 +2248,9 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info)
// Command for file
if (combined) {
// Add dependencies for each file
- QStringList tmp_in = Project->project->variables()[extraCompilerName + ".input"];
+ QStringList tmp_in = Project->project->values(extraCompilerName + ".input");
for (int a = 0; a < tmp_in.count(); ++a) {
- const QStringList &files = Project->project->variables()[tmp_in.at(a)];
+ const QStringList &files = Project->project->values(tmp_in.at(a));
for (int b = 0; b < files.count(); ++b) {
deps += Project->findDependencies(files.at(b));
inputs += Option::fixPathToTargetOS(files.at(b), false);
diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h
index 37d923f9c1..0d1e11b277 100644
--- a/qmake/generators/win32/msvc_objectmodel.h
+++ b/qmake/generators/win32/msvc_objectmodel.h
@@ -475,7 +475,7 @@ protected:
virtual ~VCToolBase(){}
virtual bool parseOption(const char* option) = 0;
public:
- void parseOptions(QStringList& options) {
+ void parseOptions(const QStringList& options) {
for (QStringList::ConstIterator it=options.begin(); (it!=options.end()); it++)
parseOption((*it).toLatin1().constData());
}
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index b228917692..606fee6dd0 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -379,12 +379,12 @@ QUuid VcprojGenerator::increaseUUID(const QUuid &id)
QStringList VcprojGenerator::collectSubDirs(QMakeProject *proj)
{
QStringList subdirs;
- QStringList tmp_proj_subdirs = proj->variables()["SUBDIRS"];
+ QStringList tmp_proj_subdirs = proj->values("SUBDIRS");
for(int x = 0; x < tmp_proj_subdirs.size(); ++x) {
QString tmpdir = tmp_proj_subdirs.at(x);
const QString tmpdirConfig = tmpdir + QStringLiteral(".CONFIG");
if (!proj->isEmpty(tmpdirConfig)) {
- const QStringList config = proj->variables().value(tmpdirConfig);
+ const QStringList config = proj->values(tmpdirConfig);
if (config.contains(QStringLiteral("no_default_target")))
continue; // Ignore this sub-dir
}
@@ -463,7 +463,7 @@ void VcprojGenerator::writeSubDirs(QTextStream &t)
}
if(tmp_proj.read(fn)) {
// Check if all requirements are fulfilled
- if(!tmp_proj.variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
+ if (!tmp_proj.isEmpty("QMAKE_FAILED_REQUIREMENTS")) {
fprintf(stderr, "Project file(%s) not added to Solution because all requirements not met:\n\t%s\n",
fn.toLatin1().constData(), tmp_proj.values("QMAKE_FAILED_REQUIREMENTS").join(" ").toLatin1().constData());
continue;
@@ -483,16 +483,6 @@ void VcprojGenerator::writeSubDirs(QTextStream &t)
tmp_vcproj.setProjectFile(&tmp_proj);
Option::qmake_mode = old_mode;
Option::output_dir = old_output_dir;
- if(Option::debug_level) {
- debug_msg(1, "Dumping all variables:");
- QHash<QString, QStringList> &vars = tmp_proj.variables();
- for(QHash<QString, QStringList>::Iterator it = vars.begin();
- it != vars.end(); ++it) {
- if(it.key().left(1) != "." && !it.value().isEmpty())
- debug_msg(1, "%s: %s === %s", fn.toLatin1().constData(), it.key().toLatin1().constData(),
- it.value().join(" :: ").toLatin1().constData());
- }
- }
// We assume project filename is [QMAKE_PROJECT_NAME].vcproj
QString vcproj = unescapeFilePath(tmp_vcproj.project->first("QMAKE_PROJECT_NAME") + project->first("VCPROJ_EXTENSION"));
@@ -536,17 +526,17 @@ void VcprojGenerator::writeSubDirs(QTextStream &t)
newDep->target = newDep->target.left(newDep->target.length()-3) + "lib";
// All ActiveQt Server projects are dependent on idc.exe
- if(tmp_proj.variables()["CONFIG"].contains("qaxserver"))
+ if (tmp_proj.values("CONFIG").contains("qaxserver"))
newDep->dependencies << "idc.exe";
// All extra compilers which has valid input are considered dependencies
- const QStringList &quc = tmp_proj.variables()["QMAKE_EXTRA_COMPILERS"];
+ const QStringList &quc = tmp_proj.values("QMAKE_EXTRA_COMPILERS");
for(QStringList::ConstIterator it = quc.constBegin(); it != quc.constEnd(); ++it) {
- const QStringList &invar = tmp_proj.variables().value((*it) + ".input");
+ const QStringList &invar = tmp_proj.values(*it + ".input");
for(QStringList::ConstIterator iit = invar.constBegin(); iit != invar.constEnd(); ++iit) {
- const QStringList fileList = tmp_proj.variables().value(*iit);
+ const QStringList fileList = tmp_proj.values(*iit);
if (!fileList.isEmpty()) {
- const QStringList &cmdsParts = tmp_proj.variables().value((*it) + ".commands");
+ const QStringList &cmdsParts = tmp_proj.values(*it + ".commands");
bool startOfLine = true;
foreach(QString cmd, cmdsParts) {
if (!startOfLine) {
@@ -575,11 +565,11 @@ void VcprojGenerator::writeSubDirs(QTextStream &t)
// Add all unknown libs to the deps
QStringList where = QStringList() << "QMAKE_LIBS" << "QMAKE_LIBS_PRIVATE";
if(!tmp_proj.isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
- where = tmp_proj.variables()["QMAKE_INTERNAL_PRL_LIBS"];
- for(QStringList::iterator wit = where.begin();
+ where = tmp_proj.values("QMAKE_INTERNAL_PRL_LIBS");
+ for (QStringList::ConstIterator wit = where.begin();
wit != where.end(); ++wit) {
- QStringList &l = tmp_proj.variables()[(*wit)];
- for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ const QStringList &l = tmp_proj.values(*wit);
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
QString opt = (*it);
if(!opt.startsWith("/") && // Not a switch
opt != newDep->target && // Not self
@@ -767,10 +757,10 @@ void VcprojGenerator::init()
// unless the compiler is configure as a combined stage, then use the first one
const QStringList &quc = project->values("QMAKE_EXTRA_COMPILERS");
for(QStringList::ConstIterator it = quc.constBegin(); it != quc.constEnd(); ++it) {
- const QStringList &invar = project->variables().value((*it) + ".input");
+ const QStringList &invar = project->values(*it + ".input");
const QString compiler_out = project->first((*it) + ".output");
for(QStringList::ConstIterator iit = invar.constBegin(); iit != invar.constEnd(); ++iit) {
- QStringList fileList = project->variables().value(*iit);
+ QStringList fileList = project->values(*iit);
if (!fileList.isEmpty()) {
if (project->values((*it) + ".CONFIG").indexOf("combine") != -1)
fileList = QStringList(fileList.first());
@@ -1112,7 +1102,7 @@ void VcprojGenerator::initDeploymentTool()
// Only deploy Qt libs for shared build
if (!project->values("QMAKE_QT_DLL").isEmpty()) {
- QStringList& arg = project->values("MSVCPROJ_LIBS");
+ const QStringList &arg = project->values("MSVCPROJ_LIBS");
for (QStringList::ConstIterator it = arg.constBegin(); it != arg.constEnd(); ++it) {
if (it->contains(project->first("QMAKE_LIBDIR"))) {
QString dllName = *it;
@@ -1471,8 +1461,8 @@ void VcprojGenerator::initOld()
// $$QMAKE.. -> $$MSVCPROJ.. -------------------------------------
project->values("MSVCPROJ_LIBS") += project->values("QMAKE_LIBS");
project->values("MSVCPROJ_LIBS") += project->values("QMAKE_LIBS_PRIVATE");
- QStringList &incs = project->values("INCLUDEPATH");
- for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) {
+ const QStringList &incs = project->values("INCLUDEPATH");
+ for (QStringList::ConstIterator incit = incs.begin(); incit != incs.end(); ++incit) {
QString inc = (*incit);
if (!inc.startsWith('"') && !inc.endsWith('"'))
inc = QString("\"%1\"").arg(inc); // Quote all paths if not quoted already
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
index 895c331b21..319cd68338 100644
--- a/qmake/generators/win32/winmakefile.cpp
+++ b/qmake/generators/win32/winmakefile.cpp
@@ -110,8 +110,8 @@ Win32MakefileGenerator::findLibraries(const QString &where)
QStringList &l = project->values(where);
QList<QMakeLocalFileName> dirs;
{
- QStringList &libpaths = project->values("QMAKE_LIBDIR");
- for(QStringList::Iterator libpathit = libpaths.begin();
+ const QStringList &libpaths = project->values("QMAKE_LIBDIR");
+ for (QStringList::ConstIterator libpathit = libpaths.begin();
libpathit != libpaths.end(); ++libpathit)
dirs.append(QMakeLocalFileName((*libpathit)));
}
@@ -223,8 +223,8 @@ Win32MakefileGenerator::processPrlFiles()
QHash<QString, bool> processed;
QList<QMakeLocalFileName> libdirs;
{
- QStringList &libpaths = project->values("QMAKE_LIBDIR");
- for(QStringList::Iterator libpathit = libpaths.begin(); libpathit != libpaths.end(); ++libpathit)
+ const QStringList &libpaths = project->values("QMAKE_LIBDIR");
+ for (QStringList::ConstIterator libpathit = libpaths.begin(); libpathit != libpaths.end(); ++libpathit)
libdirs.append(QMakeLocalFileName((*libpathit)));
}
for(bool ret = false; true; ret = false) {
@@ -730,8 +730,8 @@ void Win32MakefileGenerator::writeStandardParts(QTextStream &t)
if(!project->isEmpty("TRANSLATIONS"))
dist_files << var("TRANSLATIONS");
if(!project->isEmpty("FORMS")) {
- QStringList &forms = project->values("FORMS");
- for(QStringList::Iterator formit = forms.begin(); formit != forms.end(); ++formit) {
+ const QStringList &forms = project->values("FORMS");
+ for (QStringList::ConstIterator formit = forms.begin(); formit != forms.end(); ++formit) {
QString ui_h = fileFixify((*formit) + Option::h_ext.first());
if(exists(ui_h))
dist_files << ui_h;
diff --git a/qmake/main.cpp b/qmake/main.cpp
index 45672c67ee..835849c652 100644
--- a/qmake/main.cpp
+++ b/qmake/main.cpp
@@ -173,8 +173,10 @@ int runQMake(int argc, char **argv)
exit_val = 3;
continue;
}
- if(Option::mkfile::do_preprocess) //no need to create makefile
- continue;
+ if (Option::mkfile::do_preprocess) {
+ project.dump();
+ continue; //no need to create makefile
+ }
}
bool success = true;
diff --git a/qmake/meta.cpp b/qmake/meta.cpp
index ecd78e3455..5577dedabe 100644
--- a/qmake/meta.cpp
+++ b/qmake/meta.cpp
@@ -142,8 +142,8 @@ QMakeMetaInfo::readLibtoolFile(const QString &f)
dirf = "";
else if(!dirf.isEmpty() && !dirf.endsWith(Option::output_dir))
dirf += QLatin1Char('/');
- QHash<QString, QStringList> &v = proj.variables();
- for(QHash<QString, QStringList>::Iterator it = v.begin(); it != v.end(); ++it) {
+ const QHash<QString, QStringList> &v = proj.variables();
+ for (QHash<QString, QStringList>::ConstIterator it = v.begin(); it != v.end(); ++it) {
QStringList lst = it.value();
if(lst.count() == 1 && (lst.first().startsWith("'") || lst.first().startsWith("\"")) &&
lst.first().endsWith(QString(lst.first()[0])))
diff --git a/qmake/option.cpp b/qmake/option.cpp
index 714aebe6ef..b01b4eded5 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -60,7 +60,6 @@ QString Option::pkgcfg_ext;
QString Option::ui_ext;
QStringList Option::h_ext;
QString Option::cpp_moc_ext;
-QString Option::h_moc_ext;
QStringList Option::cpp_ext;
QStringList Option::c_ext;
QString Option::obj_ext;
@@ -70,10 +69,8 @@ QString Option::pro_ext;
QString Option::dir_sep;
QString Option::dirlist_sep;
QString Option::h_moc_mod;
-QString Option::cpp_moc_mod;
QString Option::yacc_mod;
QString Option::lex_mod;
-QString Option::sysenv_mod;
QString Option::res_ext;
char Option::field_sep;
@@ -86,15 +83,11 @@ int Option::warn_level = WarnLogic | WarnDeprecated;
int Option::debug_level = 0;
QFile Option::output;
QString Option::output_dir;
-Option::QMAKE_RECURSIVE Option::recursive = Option::QMAKE_RECURSIVE_DEFAULT;
+bool Option::recursive = false;
QStringList Option::before_user_vars;
QStringList Option::after_user_vars;
QString Option::user_template;
QString Option::user_template_prefix;
-QStringList Option::shellPath;
-Option::HOST_MODE Option::host_mode = Option::HOST_UNKNOWN_MODE;
-Option::TARG_MODE Option::target_mode = Option::TARG_UNKNOWN_MODE;
-bool Option::target_mode_overridden = false;
//QMAKE_*_PROPERTY stuff
QStringList Option::prop::properties;
@@ -232,7 +225,7 @@ Option::parseCommandLine(int argc, char **argv, int skip)
if(x == 1) {
bool specified = true;
if(opt == "project") {
- Option::recursive = Option::QMAKE_RECURSIVE_YES;
+ Option::recursive = true;
Option::qmake_mode = Option::QMAKE_GENERATE_PROJECT;
} else if(opt == "prl") {
Option::mkfile::do_deps = false;
@@ -261,23 +254,10 @@ Option::parseCommandLine(int argc, char **argv, int skip)
Option::user_template = argv[++x];
} else if(opt == "tp" || opt == "template_prefix") {
Option::user_template_prefix = argv[++x];
- } else if(opt == "macx") {
- fprintf(stderr, "-macx is deprecated.\n");
- Option::host_mode = HOST_MACX_MODE;
- Option::target_mode = TARG_MACX_MODE;
- Option::target_mode_overridden = true;
} else if(opt == "unix") {
- fprintf(stderr, "-unix is deprecated.\n");
- Option::host_mode = HOST_UNIX_MODE;
- Option::target_mode = TARG_UNIX_MODE;
- Option::target_mode_overridden = true;
+ Option::dir_sep = "/";
} else if(opt == "win32") {
- fprintf(stderr, "-win32 is deprecated.\n");
- Option::host_mode = HOST_WIN_MODE;
- Option::target_mode = TARG_WIN_MODE;
- Option::target_mode_overridden = true;
- } else if(opt == "integrity") {
- Option::target_mode = TARG_INTEGRITY_MODE;
+ Option::dir_sep = "\\";
} else if(opt == "d") {
Option::debug_level++;
} else if(opt == "version" || opt == "v" || opt == "-version") {
@@ -303,9 +283,9 @@ Option::parseCommandLine(int argc, char **argv, int skip)
} else if(opt == "Wnone") {
Option::warn_level = WarnNone;
} else if(opt == "r" || opt == "recursive") {
- Option::recursive = Option::QMAKE_RECURSIVE_YES;
+ Option::recursive = true;
} else if(opt == "nr" || opt == "norecursive") {
- Option::recursive = Option::QMAKE_RECURSIVE_NO;
+ Option::recursive = false;
} else if(opt == "config") {
user_configs += argv[++x];
} else {
@@ -322,7 +302,6 @@ Option::parseCommandLine(int argc, char **argv, int skip)
} else if(opt == "nodependheuristics") {
Option::mkfile::do_dep_heuristics = false;
} else if(opt == "E") {
- fprintf(stderr, "-E is deprecated. Use -d instead.\n");
Option::mkfile::do_preprocess = true;
} else if(opt == "cache") {
Option::mkfile::cachefile = argv[++x];
@@ -392,58 +371,19 @@ Option::parseCommandLine(int argc, char **argv, int skip)
return Option::QMAKE_CMDLINE_SUCCESS;
}
-#ifdef Q_OS_WIN
-static QStringList detectShellPath()
-{
- QStringList paths;
- QString path = qgetenv("PATH");
- QStringList pathlist = path.toLower().split(";");
- for (int i = 0; i < pathlist.count(); i++) {
- QString maybeSh = pathlist.at(i) + "/sh.exe";
- if (QFile::exists(maybeSh)) {
- paths.append(maybeSh);
- }
- }
- return paths;
-}
-#endif
-
int
Option::init(int argc, char **argv)
{
Option::application_argv0 = 0;
- Option::cpp_moc_mod = "";
- Option::h_moc_mod = "moc_";
- Option::lex_mod = "_lex";
- Option::yacc_mod = "_yacc";
- Option::prl_ext = ".prl";
- Option::libtool_ext = ".la";
- Option::pkgcfg_ext = ".pc";
Option::prf_ext = ".prf";
- Option::ui_ext = ".ui";
- Option::h_ext << ".h" << ".hpp" << ".hh" << ".hxx";
- Option::c_ext << ".c";
-#ifndef Q_OS_WIN
- Option::h_ext << ".H";
-#endif
- Option::cpp_moc_ext = ".moc";
- Option::h_moc_ext = ".cpp";
- Option::cpp_ext << ".cpp" << ".cc" << ".cxx";
-#ifndef Q_OS_WIN
- Option::cpp_ext << ".C";
-#endif
- Option::lex_ext = ".l";
- Option::yacc_ext = ".y";
Option::pro_ext = ".pro";
#ifdef Q_OS_WIN
+ Option::dir_sep = "\\";
Option::dirlist_sep = ";";
- Option::shellPath = detectShellPath();
- Option::res_ext = ".res";
#else
+ Option::dir_sep = "/";
Option::dirlist_sep = ":";
- Option::shellPath = QStringList("sh");
#endif
- Option::sysenv_mod = "QMAKE_ENV_";
Option::field_sep = ' ';
if(argc && argv) {
@@ -482,6 +422,14 @@ Option::init(int argc, char **argv)
}
if(!Option::qmake_abslocation.isNull())
Option::qmake_abslocation = QDir::cleanPath(Option::qmake_abslocation);
+ else // This is rather unlikely to ever happen on a modern system ...
+ Option::qmake_abslocation = QLibraryInfo::rawLocation(QLibraryInfo::HostBinariesPath,
+ QLibraryInfo::EffectivePaths) +
+#ifdef Q_OS_WIN
+ "/qmake.exe";
+#else
+ "/qmake";
+#endif
} else {
Option::qmake_mode = Option::QMAKE_GENERATE_MAKEFILE;
}
@@ -562,36 +510,11 @@ Option::init(int argc, char **argv)
}
#endif
}
- } else if (Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) {
-#if defined(Q_OS_MAC)
- Option::host_mode = Option::HOST_MACX_MODE;
- Option::target_mode = Option::TARG_MACX_MODE;
-#elif defined(Q_OS_UNIX)
- Option::host_mode = Option::HOST_UNIX_MODE;
- Option::target_mode = Option::TARG_UNIX_MODE;
-#else
- Option::host_mode = Option::HOST_WIN_MODE;
- Option::target_mode = Option::TARG_WIN_MODE;
-#endif
}
- //defaults for globals
- if (Option::host_mode != Option::HOST_UNKNOWN_MODE)
- applyHostMode();
return QMAKE_CMDLINE_SUCCESS;
}
-void Option::applyHostMode()
-{
- if (Option::host_mode == Option::HOST_WIN_MODE) {
- Option::dir_sep = "\\";
- Option::obj_ext = ".obj";
- } else {
- Option::dir_sep = "/";
- Option::obj_ext = ".o";
- }
-}
-
void Option::prepareProject(const QString &pfile)
{
QString srcpath = (pfile != "-")
@@ -617,54 +540,27 @@ void Option::prepareProject(const QString &pfile)
bool Option::postProcessProject(QMakeProject *project)
{
- Option::cpp_ext = project->variables()["QMAKE_EXT_CPP"];
- if(cpp_ext.isEmpty())
- cpp_ext << ".cpp"; //something must be there
- Option::h_ext = project->variables()["QMAKE_EXT_H"];
- if(h_ext.isEmpty())
- h_ext << ".h";
- Option::c_ext = project->variables()["QMAKE_EXT_C"];
- if(c_ext.isEmpty())
- c_ext << ".c"; //something must be there
-
- if(!project->isEmpty("QMAKE_EXT_RES"))
- Option::res_ext = project->first("QMAKE_EXT_RES");
- if(!project->isEmpty("QMAKE_EXT_PKGCONFIG"))
- Option::pkgcfg_ext = project->first("QMAKE_EXT_PKGCONFIG");
- if(!project->isEmpty("QMAKE_EXT_LIBTOOL"))
- Option::libtool_ext = project->first("QMAKE_EXT_LIBTOOL");
- if(!project->isEmpty("QMAKE_EXT_PRL"))
- Option::prl_ext = project->first("QMAKE_EXT_PRL");
- if(!project->isEmpty("QMAKE_EXT_PRF"))
- Option::prf_ext = project->first("QMAKE_EXT_PRF");
- if(!project->isEmpty("QMAKE_EXT_JS"))
- Option::prf_ext = project->first("QMAKE_EXT_JS");
- if(!project->isEmpty("QMAKE_EXT_UI"))
- Option::ui_ext = project->first("QMAKE_EXT_UI");
- if(!project->isEmpty("QMAKE_EXT_CPP_MOC"))
- Option::cpp_moc_ext = project->first("QMAKE_EXT_CPP_MOC");
- if(!project->isEmpty("QMAKE_EXT_H_MOC"))
- Option::h_moc_ext = project->first("QMAKE_EXT_H_MOC");
- if(!project->isEmpty("QMAKE_EXT_LEX"))
- Option::lex_ext = project->first("QMAKE_EXT_LEX");
- if(!project->isEmpty("QMAKE_EXT_YACC"))
- Option::yacc_ext = project->first("QMAKE_EXT_YACC");
- if(!project->isEmpty("QMAKE_EXT_OBJ"))
- Option::obj_ext = project->first("QMAKE_EXT_OBJ");
- if(!project->isEmpty("QMAKE_H_MOD_MOC"))
- Option::h_moc_mod = project->first("QMAKE_H_MOD_MOC");
- if(!project->isEmpty("QMAKE_CPP_MOD_MOC"))
- Option::cpp_moc_mod = project->first("QMAKE_CPP_MOD_MOC");
- if(!project->isEmpty("QMAKE_MOD_LEX"))
- Option::lex_mod = project->first("QMAKE_MOD_LEX");
- if(!project->isEmpty("QMAKE_MOD_YACC"))
- Option::yacc_mod = project->first("QMAKE_MOD_YACC");
- if(!project->isEmpty("QMAKE_DIR_SEP"))
- Option::dir_sep = project->first("QMAKE_DIR_SEP");
- if(!project->isEmpty("QMAKE_DIRLIST_SEP"))
- Option::dirlist_sep = project->first("QMAKE_DIRLIST_SEP");
- if(!project->isEmpty("QMAKE_MOD_SYSTEM_ENV"))
- Option::sysenv_mod = project->first("QMAKE_MOD_SYSTEM_ENV");
+ Option::cpp_ext = project->values("QMAKE_EXT_CPP");
+ Option::h_ext = project->values("QMAKE_EXT_H");
+ Option::c_ext = project->values("QMAKE_EXT_C");
+ Option::res_ext = project->first("QMAKE_EXT_RES");
+ Option::pkgcfg_ext = project->first("QMAKE_EXT_PKGCONFIG");
+ Option::libtool_ext = project->first("QMAKE_EXT_LIBTOOL");
+ Option::prl_ext = project->first("QMAKE_EXT_PRL");
+ Option::ui_ext = project->first("QMAKE_EXT_UI");
+ Option::cpp_moc_ext = project->first("QMAKE_EXT_CPP_MOC");
+ Option::lex_ext = project->first("QMAKE_EXT_LEX");
+ Option::yacc_ext = project->first("QMAKE_EXT_YACC");
+ Option::obj_ext = project->first("QMAKE_EXT_OBJ");
+ Option::h_moc_mod = project->first("QMAKE_H_MOD_MOC");
+ Option::lex_mod = project->first("QMAKE_MOD_LEX");
+ Option::yacc_mod = project->first("QMAKE_MOD_YACC");
+ Option::dir_sep = project->first("QMAKE_DIR_SEP");
+
+ if (Option::output_dir.startsWith(project->buildRoot()))
+ Option::mkfile::cachefile_depth =
+ Option::output_dir.mid(project->buildRoot().length()).count('/');
+
return true;
}
diff --git a/qmake/option.h b/qmake/option.h
index 7b86d56e89..4e6098130a 100644
--- a/qmake/option.h
+++ b/qmake/option.h
@@ -80,18 +80,15 @@ struct Option
static QStringList h_ext;
static QStringList cpp_ext;
static QStringList c_ext;
- static QString h_moc_ext;
static QString cpp_moc_ext;
static QString obj_ext;
static QString lex_ext;
static QString yacc_ext;
static QString h_moc_mod;
- static QString cpp_moc_mod;
static QString lex_mod;
static QString yacc_mod;
static QString dir_sep;
static QString dirlist_sep;
- static QString sysenv_mod;
static QString pro_ext;
static QString res_ext;
static char field_sep;
@@ -106,7 +103,6 @@ struct Option
//both of these must be called..
static int init(int argc=0, char **argv=0); //parse cmdline
- static void applyHostMode();
static void prepareProject(const QString &pfile);
static bool postProcessProject(QMakeProject *);
@@ -169,17 +165,9 @@ struct Option
static QString output_dir;
static int debug_level;
static int warn_level;
- enum QMAKE_RECURSIVE { QMAKE_RECURSIVE_DEFAULT, QMAKE_RECURSIVE_YES, QMAKE_RECURSIVE_NO };
- static QMAKE_RECURSIVE recursive;
+ static bool recursive;
static QStringList before_user_vars, after_user_vars;
- enum HOST_MODE { HOST_UNKNOWN_MODE, HOST_UNIX_MODE, HOST_WIN_MODE, HOST_MACX_MODE };
- static HOST_MODE host_mode;
- enum TARG_MODE { TARG_UNKNOWN_MODE, TARG_UNIX_MODE, TARG_WIN_MODE, TARG_MACX_MODE,
- TARG_INTEGRITY_MODE };
- static TARG_MODE target_mode;
- static bool target_mode_overridden;
static QString user_template, user_template_prefix;
- static QStringList shellPath;
//QMAKE_*_PROPERTY options
struct prop {
diff --git a/qmake/project.cpp b/qmake/project.cpp
index 360c0958f1..36bf6add96 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -254,6 +254,8 @@ static QString varMap(const QString &x)
ret = "QMAKE_FRAMEWORKPATH";
else if(ret == "QMAKE_FRAMEWORKDIR_FLAGS")
ret = "QMAKE_FRAMEWORKPATH_FLAGS";
+ else if(ret == "IN_PWD")
+ ret = "PWD";
else
return ret;
warn_msg(WarnDeprecated, "%s:%d: Variable %s is deprecated; use %s instead.",
@@ -565,69 +567,57 @@ static void qmake_error_msg(const QString &msg)
1) features/(unix|win32|macx)/
2) features/
*/
-QStringList qmake_feature_paths(QMakeProperty *prop, bool host_build)
+QStringList QMakeProject::qmakeFeaturePaths()
{
const QString mkspecs_concat = QLatin1String("/mkspecs");
const QString base_concat = QLatin1String("/features");
QStringList concat;
- {
- switch(Option::target_mode) {
- case Option::TARG_MACX_MODE: //also a unix
- concat << base_concat + QLatin1String("/mac");
- concat << base_concat + QLatin1String("/macx");
- concat << base_concat + QLatin1String("/unix");
- break;
- default: // Can't happen, just make the compiler shut up
- case Option::TARG_UNIX_MODE:
- concat << base_concat + QLatin1String("/unix");
- break;
- case Option::TARG_WIN_MODE:
- concat << base_concat + QLatin1String("/win32");
- break;
- }
- concat << base_concat;
- }
+ foreach (const QString &sfx, values("QMAKE_PLATFORM"))
+ concat << base_concat + QLatin1Char('/') + sfx;
+ concat << base_concat;
QStringList feature_roots = splitPathList(QString::fromLocal8Bit(qgetenv("QMAKEFEATURES")));
feature_roots += cached_qmakefeatures;
if(prop)
feature_roots += splitPathList(prop->value("QMAKEFEATURES"));
+ QStringList feature_bases;
if (!cached_build_root.isEmpty())
- for(QStringList::Iterator concat_it = concat.begin();
- concat_it != concat.end(); ++concat_it)
- feature_roots << (cached_build_root + (*concat_it));
+ feature_bases << cached_build_root;
+ if (!cached_source_root.isEmpty())
+ feature_bases << cached_source_root;
QStringList qmakepath = splitPathList(QString::fromLocal8Bit(qgetenv("QMAKEPATH")));
qmakepath += cached_qmakepath;
foreach (const QString &path, qmakepath)
- foreach (const QString &cat, concat)
- feature_roots << (path + mkspecs_concat + cat);
- QString *specp = host_build ? &Option::mkfile::qmakespec : &Option::mkfile::xqmakespec;
- if (!specp->isEmpty()) {
+ feature_bases << (path + mkspecs_concat);
+ if (!real_spec.isEmpty()) {
// The spec is already platform-dependent, so no subdirs here.
- feature_roots << *specp + base_concat;
+ feature_roots << real_spec + base_concat;
// Also check directly under the root directory of the mkspecs collection
- QFileInfo specfi(*specp);
+ QFileInfo specfi(real_spec);
QDir specrootdir(specfi.absolutePath());
while (!specrootdir.isRoot()) {
const QString specrootpath = specrootdir.path();
if (specrootpath.endsWith(mkspecs_concat)) {
if (QFile::exists(specrootpath + base_concat))
- for (QStringList::Iterator concat_it = concat.begin();
- concat_it != concat.end(); ++concat_it)
- feature_roots << (specrootpath + (*concat_it));
+ feature_bases << specrootpath;
break;
}
specrootdir.cdUp();
}
}
- for(QStringList::Iterator concat_it = concat.begin();
- concat_it != concat.end(); ++concat_it)
- feature_roots << (QLibraryInfo::rawLocation(QLibraryInfo::HostDataPath,
- QLibraryInfo::EffectivePaths) +
- mkspecs_concat + (*concat_it));
+ feature_bases << (QLibraryInfo::rawLocation(QLibraryInfo::HostDataPath,
+ QLibraryInfo::EffectivePaths) + mkspecs_concat);
+ foreach (const QString &fb, feature_bases)
+ foreach (const QString &cc, concat)
+ feature_roots << (fb + cc);
feature_roots.removeDuplicates();
- return feature_roots;
+
+ QStringList ret;
+ foreach (const QString &root, feature_roots)
+ if (QFileInfo(root).exists())
+ ret << root;
+ return ret;
}
QStringList qmake_mkspec_paths()
@@ -649,6 +639,23 @@ QStringList qmake_mkspec_paths()
return ret;
}
+static void
+setTemplate(QStringList &varlist)
+{
+ if (!Option::user_template.isEmpty()) { // Don't permit override
+ varlist = QStringList(Option::user_template);
+ } else {
+ if (varlist.isEmpty())
+ varlist << "app";
+ else
+ varlist.erase(varlist.begin() + 1, varlist.end());
+ }
+ if (!Option::user_template_prefix.isEmpty()
+ && !varlist.first().startsWith(Option::user_template_prefix)) {
+ varlist.first().prepend(Option::user_template_prefix);
+ }
+}
+
QMakeProject::~QMakeProject()
{
if(own_prop)
@@ -667,7 +674,6 @@ QMakeProject::init(QMakeProperty *p)
prop = p;
own_prop = false;
}
- recursive = false;
host_build = false;
reset();
}
@@ -1119,14 +1125,6 @@ QMakeProject::parse(const QString &t, QHash<QString, QStringList> &place, int nu
doVariableReplace(var, place);
var = varMap(var); //backwards compatibility
- if(!var.isEmpty() && Option::mkfile::do_preprocess) {
- static QString last_file("*none*");
- if(parser.file != last_file) {
- fprintf(stdout, "#file %s:%d\n", parser.file.toLatin1().constData(), parser.line_no);
- last_file = parser.file;
- }
- fprintf(stdout, "%s %s %s\n", var.toLatin1().constData(), op.toLatin1().constData(), vals.toLatin1().constData());
- }
if(vals.contains('=') && numLines > 1)
warn_msg(WarnParser, "Possible accidental line continuation: {%s} at %s:%d",
@@ -1218,6 +1216,8 @@ QMakeProject::parse(const QString &t, QHash<QString, QStringList> &place, int nu
}
if(var == "REQUIRES") // special case to get communicated to backends!
doProjectCheckReqs(vallist, place);
+ else if (var == QLatin1String("TEMPLATE"))
+ setTemplate(varlist);
}
return true;
}
@@ -1289,6 +1289,7 @@ QMakeProject::read(const QString &file, QHash<QString, QStringList> &place)
qmake_setpwd(QFileInfo(filename).absolutePath());
}
if(ret) {
+ place["PWD"] = QStringList(qmake_getpwd());
parser_info pi = parser;
parser.from_file = true;
parser.file = filename;
@@ -1324,20 +1325,19 @@ bool
QMakeProject::read(uchar cmd)
{
again:
- if ((cmd & ReadSetup) && base_vars.isEmpty()) {
- // hack to get the Option stuff in there
- base_vars["QMAKE_EXT_CPP"] = Option::cpp_ext;
- base_vars["QMAKE_EXT_C"] = Option::c_ext;
- base_vars["QMAKE_EXT_H"] = Option::h_ext;
- base_vars["QMAKE_SH"] = Option::shellPath;
- if(!Option::user_template_prefix.isEmpty())
- base_vars["TEMPLATE_PREFIX"] = QStringList(Option::user_template_prefix);
-
+ if (init_vars.isEmpty()) {
+ loadDefaults();
+ init_vars = vars;
+ } else {
+ vars = init_vars;
+ }
+ if (cmd & ReadSetup) {
+ if (base_vars.isEmpty()) {
QString superdir;
QString project_root;
- QString project_build_root;
QStringList qmakepath;
QStringList qmakefeatures;
+ project_build_root.clear();
if (Option::mkfile::do_cache) { // parse the cache
QHash<QString, QStringList> cache;
QString rdir = Option::output_dir;
@@ -1405,9 +1405,10 @@ QMakeProject::read(uchar cmd)
qmakepath = cache.value(QLatin1String("QMAKEPATH"));
qmakefeatures = cache.value(QLatin1String("QMAKEFEATURES"));
- if (Option::output_dir.startsWith(project_build_root))
- Option::mkfile::cachefile_depth =
- Option::output_dir.mid(project_build_root.length()).count('/');
+ if (!superfile.isEmpty())
+ vars["_QMAKE_SUPER_CACHE_"] << superfile;
+ if (!cachefile.isEmpty())
+ vars["_QMAKE_CACHE_"] << cachefile;
}
no_cache:
@@ -1470,32 +1471,48 @@ QMakeProject::read(uchar cmd)
// here without resorting to tricks. This is the only planned use case anyway.
if (!superfile.isEmpty()) {
debug_msg(1, "Project super cache file: reading %s", superfile.toLatin1().constData());
- read(superfile, base_vars);
+ read(superfile, vars);
}
// parse qmake configuration
+ doProjectInclude("spec_pre", IncludeFlagFeature, vars);
while(qmakespec.endsWith(QLatin1Char('/')))
qmakespec.truncate(qmakespec.length()-1);
QString spec = qmakespec + QLatin1String("/qmake.conf");
debug_msg(1, "QMAKESPEC conf: reading %s", spec.toLatin1().constData());
- if(!read(spec, base_vars)) {
+ if (!read(spec, vars)) {
fprintf(stderr, "Failure to read QMAKESPEC conf file %s.\n", spec.toLatin1().constData());
return false;
}
- validateModes();
+#ifdef Q_OS_UNIX
+ real_spec = QFileInfo(qmakespec).canonicalFilePath();
+#else
+ // We can't resolve symlinks as they do on Unix, so configure.exe puts the source of the
+ // qmake.conf at the end of the default/qmake.conf in the QMAKESPEC_ORG variable.
+ QString orig_spec = first(QLatin1String("QMAKESPEC_ORIGINAL"));
+ real_spec = orig_spec.isEmpty() ? qmakespec : orig_spec;
+#endif
+ short_spec = QFileInfo(real_spec).fileName();
+ doProjectInclude("spec_post", IncludeFlagFeature, vars);
+ // The spec extends the feature search path, so invalidate the cache.
+ invalidateFeatureRoots();
if (!conffile.isEmpty()) {
debug_msg(1, "Project config file: reading %s", conffile.toLatin1().constData());
- read(conffile, base_vars);
+ read(conffile, vars);
}
if (!cachefile.isEmpty()) {
debug_msg(1, "QMAKECACHE file: reading %s", cachefile.toLatin1().constData());
- read(cachefile, base_vars);
+ read(cachefile, vars);
}
}
- }
- vars = base_vars; // start with the base
+ base_vars = vars;
+ } else {
+ vars = base_vars; // start with the base
+ }
+ setupProject();
+ }
for (QHash<QString, QStringList>::ConstIterator it = extra_vars.constBegin();
it != extra_vars.constEnd(); ++it)
@@ -1506,10 +1523,6 @@ QMakeProject::read(uchar cmd)
doProjectInclude("default_pre", IncludeFlagFeature, vars);
}
- //get a default
- if(pfile != "-" && vars["TARGET"].isEmpty())
- vars["TARGET"].append(QFileInfo(pfile).baseName());
-
//before commandline
if (cmd & ReadSetup) {
parser.file = "(internal)";
@@ -1598,72 +1611,100 @@ QMakeProject::read(uchar cmd)
return true;
}
-void QMakeProject::validateModes()
+void
+QMakeProject::setupProject()
{
- if (Option::host_mode == Option::HOST_UNKNOWN_MODE
- || Option::target_mode == Option::TARG_UNKNOWN_MODE) {
- Option::HOST_MODE host_mode;
- Option::TARG_MODE target_mode;
- const QStringList &gen = base_vars.value("MAKEFILE_GENERATOR");
- if (gen.isEmpty()) {
- fprintf(stderr, "%s:%d: Using OS scope before setting MAKEFILE_GENERATOR\n",
- parser.file.toLatin1().constData(), parser.line_no);
- } else if (MetaMakefileGenerator::modesForGenerator(gen.first(),
- &host_mode, &target_mode)) {
- if (Option::host_mode == Option::HOST_UNKNOWN_MODE) {
- Option::host_mode = host_mode;
- Option::applyHostMode();
- }
-
- if (Option::target_mode == Option::TARG_UNKNOWN_MODE) {
- const QStringList &tgt = base_vars.value("TARGET_PLATFORM");
- if (!tgt.isEmpty()) {
- const QString &os = tgt.first();
- if (os == "unix")
- Option::target_mode = Option::TARG_UNIX_MODE;
- else if (os == "macx")
- Option::target_mode = Option::TARG_MACX_MODE;
- else if (os == "win32")
- Option::target_mode = Option::TARG_WIN_MODE;
- else
- fprintf(stderr, "Unknown target platform specified: %s\n",
- os.toLatin1().constData());
- } else {
- Option::target_mode = target_mode;
- }
- }
- }
- }
+ setTemplate(vars["TEMPLATE"]);
+ if (pfile != "-")
+ vars["TARGET"] << QFileInfo(pfile).baseName();
+ vars["_PRO_FILE_"] << pfile;
+ vars["_PRO_FILE_PWD_"] << (pfile.isEmpty() ? qmake_getpwd() : QFileInfo(pfile).absolutePath());
+ vars["OUT_PWD"] << Option::output_dir;
}
void
-QMakeProject::resolveSpec(QString *spec, const QString &qmakespec)
+QMakeProject::loadDefaults()
{
- if (spec->isEmpty()) {
- *spec = QFileInfo(qmakespec).fileName();
- if (*spec == "default" || *spec == "default-host") {
-#ifdef Q_OS_UNIX
- char buffer[1024];
- int l = readlink(qmakespec.toLatin1().constData(), buffer, 1023);
- if (l != -1) {
- buffer[l] = '\0';
- *spec = QString::fromLatin1(buffer);
-#else
- // We can't resolve symlinks as they do on Unix, so configure.exe puts the source of the
- // qmake.conf at the end of the default/qmake.conf in the QMAKESPEC_ORG variable.
- const QStringList &spec_org = base_vars["QMAKESPEC_ORIGINAL"];
- if (spec_org.isEmpty()) {
- // try again the next time around
- *spec = QString();
- } else {
- *spec = spec_org.at(0);
-#endif
- int lastSlash = spec->lastIndexOf(QLatin1Char('/'));
- if (lastSlash != -1)
- spec->remove(0, lastSlash + 1);
- }
- }
+ vars["LITERAL_WHITESPACE"] << QLatin1String("\t");
+ vars["LITERAL_DOLLAR"] << QLatin1String("$");
+ vars["LITERAL_HASH"] << QLatin1String("#");
+ vars["DIR_SEPARATOR"] << Option::dir_sep;
+ vars["DIRLIST_SEPARATOR"] << Option::dirlist_sep;
+ vars["QMAKE_QMAKE"] << Option::qmake_abslocation;
+ vars["_DATE_"] << QDateTime::currentDateTime().toString();
+#if defined(Q_OS_WIN32)
+ vars["QMAKE_HOST.os"] << QString::fromLatin1("Windows");
+
+ DWORD name_length = 1024;
+ wchar_t name[1024];
+ if (GetComputerName(name, &name_length))
+ vars["QMAKE_HOST.name"] << QString::fromWCharArray(name);
+
+ QSysInfo::WinVersion ver = QSysInfo::WindowsVersion;
+ vars["QMAKE_HOST.version"] << QString::number(ver);
+ QString verStr;
+ switch (ver) {
+ case QSysInfo::WV_Me: verStr = QLatin1String("WinMe"); break;
+ case QSysInfo::WV_95: verStr = QLatin1String("Win95"); break;
+ case QSysInfo::WV_98: verStr = QLatin1String("Win98"); break;
+ case QSysInfo::WV_NT: verStr = QLatin1String("WinNT"); break;
+ case QSysInfo::WV_2000: verStr = QLatin1String("Win2000"); break;
+ case QSysInfo::WV_2003: verStr = QLatin1String("Win2003"); break;
+ case QSysInfo::WV_XP: verStr = QLatin1String("WinXP"); break;
+ case QSysInfo::WV_VISTA: verStr = QLatin1String("WinVista"); break;
+ default: verStr = QLatin1String("Unknown"); break;
+ }
+ vars["QMAKE_HOST.version_string"] << verStr;
+
+ SYSTEM_INFO info;
+ GetSystemInfo(&info);
+ QString archStr;
+ switch (info.wProcessorArchitecture) {
+# ifdef PROCESSOR_ARCHITECTURE_AMD64
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ archStr = QLatin1String("x86_64");
+ break;
+# endif
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ archStr = QLatin1String("x86");
+ break;
+ case PROCESSOR_ARCHITECTURE_IA64:
+# ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
+ case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
+# endif
+ archStr = QLatin1String("IA64");
+ break;
+ default:
+ archStr = QLatin1String("Unknown");
+ break;
+ }
+ vars["QMAKE_HOST.arch"] << archStr;
+
+# if defined(Q_CC_MSVC)
+ QString paths = QString::fromLocal8Bit(qgetenv("PATH"));
+ QString vcBin64 = QString::fromLocal8Bit(qgetenv("VCINSTALLDIR"));
+ if (!vcBin64.endsWith('\\'))
+ vcBin64.append('\\');
+ vcBin64.append("bin\\amd64");
+ QString vcBinX86_64 = QString::fromLocal8Bit(qgetenv("VCINSTALLDIR"));
+ if (!vcBinX86_64.endsWith('\\'))
+ vcBinX86_64.append('\\');
+ vcBinX86_64.append("bin\\x86_amd64");
+ if (paths.contains(vcBin64,Qt::CaseInsensitive) || paths.contains(vcBinX86_64,Qt::CaseInsensitive))
+ vars["QMAKE_TARGET.arch"] << QString::fromLatin1("x86_64");
+ else
+ vars["QMAKE_TARGET.arch"] << QString::fromLatin1("x86");
+# endif
+#elif defined(Q_OS_UNIX)
+ struct utsname name;
+ if (!uname(&name)) {
+ vars["QMAKE_HOST.os"] << QString::fromLocal8Bit(name.sysname);
+ vars["QMAKE_HOST.name"] << QString::fromLocal8Bit(name.nodename);
+ vars["QMAKE_HOST.version"] << QString::fromLocal8Bit(name.release);
+ vars["QMAKE_HOST.version_string"] << QString::fromLocal8Bit(name.version);
+ vars["QMAKE_HOST.arch"] << QString::fromLocal8Bit(name.machine);
}
+#endif
}
bool
@@ -1678,28 +1719,12 @@ QMakeProject::isActiveConfig(const QString &x, bool regex, QHash<QString, QStrin
else if(x == "false")
return false;
- if (x == "unix") {
- validateModes();
- return Option::target_mode == Option::TARG_UNIX_MODE
- || Option::target_mode == Option::TARG_MACX_MODE;
- } else if (x == "macx" || x == "mac") {
- validateModes();
- return Option::target_mode == Option::TARG_MACX_MODE;
- } else if (x == "win32") {
- validateModes();
- return Option::target_mode == Option::TARG_WIN_MODE;
- }
-
if (x == "host_build")
return host_build;
//mkspecs
- static QString hspec, xspec;
- resolveSpec(&hspec, Option::mkfile::qmakespec);
- resolveSpec(&xspec, Option::mkfile::xqmakespec);
- const QString &spec = host_build ? hspec : xspec;
QRegExp re(x, Qt::CaseSensitive, QRegExp::Wildcard);
- if((regex && re.exactMatch(spec)) || (!regex && spec == x))
+ if ((regex && re.exactMatch(short_spec)) || (!regex && short_spec == x))
return true;
//simple matching
@@ -1752,15 +1777,14 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QHash<QString, QString
if(flags & IncludeFlagFeature) {
if(!file.endsWith(Option::prf_ext))
file += Option::prf_ext;
- validateModes(); // init dir_sep
- if(file.indexOf(QLatin1Char('/')) == -1 || !QFile::exists(file)) {
+ {
QStringList *&feature_roots = all_feature_roots[host_build];
if(!feature_roots) {
feature_roots = new QStringList;
qmakeAddCacheClear(qmakeDeleteCacheClear<QStringList>, (void**)&feature_roots);
}
if (feature_roots->isEmpty())
- *feature_roots = qmake_feature_paths(prop, host_build);
+ *feature_roots = qmakeFeaturePaths();
debug_msg(2, "Looking for feature '%s' in (%s)", file.toLatin1().constData(),
feature_roots->join("::").toLatin1().constData());
int start_root = 0;
@@ -1791,8 +1815,7 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QHash<QString, QString
if(place["QMAKE_INTERNAL_INCLUDED_FEATURES"].indexOf(file) != -1)
return IncludeFeatureAlreadyLoaded;
place["QMAKE_INTERNAL_INCLUDED_FEATURES"].append(file);
- }
- if(QDir::isRelativePath(file)) {
+ } else if (QDir::isRelativePath(file)) {
QStringList include_roots;
if(Option::output_dir != qmake_getpwd())
include_roots << qmake_getpwd();
@@ -1812,10 +1835,6 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QHash<QString, QString
} else if (!QFile::exists(file)) {
return IncludeNoExist;
}
- if(Option::mkfile::do_preprocess) //nice to see this first..
- fprintf(stderr, "#switching file %s(%s) - %s:%d\n", (flags & IncludeFlagFeature) ? "load" : "include",
- file.toLatin1().constData(),
- parser.file.toLatin1().constData(), parser.line_no);
debug_msg(1, "Project Parser: %s'ing file %s.", (flags & IncludeFlagFeature) ? "load" : "include",
file.toLatin1().constData());
@@ -1860,6 +1879,7 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QHash<QString, QString
}
parser = pi;
qmake_setpwd(oldpwd);
+ place["PWD"] = QStringList(qmake_getpwd());
if(!parsed)
return IncludeParseFailure;
return IncludeSuccess;
@@ -3202,9 +3222,7 @@ QMakeProject::doProjectTest(QString func, QList<QStringList> args_list, QHash<QS
parser.file.toLatin1().constData(), parser.line_no);
return false;
}
- if (args.first() == "recursive") {
- recursive = true;
- } else if (args.first() == "host_build") {
+ if (args.first() == "host_build") {
if (!host_build && isActiveConfig("cross_compile")) {
host_build = true;
need_restart = true;
@@ -3319,12 +3337,14 @@ QMakeProject::doProjectTest(QString func, QList<QStringList> args_list, QHash<QS
if (superfile.isEmpty()) {
superfile = Option::output_dir + QLatin1String("/.qmake.super");
printf("Info: creating super cache file %s\n", superfile.toLatin1().constData());
+ vars["_QMAKE_SUPER_CACHE_"] << superfile;
}
fn = superfile;
} else {
if (cachefile.isEmpty()) {
cachefile = Option::output_dir + QLatin1String("/.qmake.cache");
printf("Info: creating cache file %s\n", cachefile.toLatin1().constData());
+ vars["_QMAKE_CACHE_"] << cachefile;
if (cached_build_root.isEmpty()) {
cached_build_root = Option::output_dir;
cached_source_root = values("_PRO_FILE_PWD_", place).first();
@@ -3642,7 +3662,7 @@ QMakeProject::doVariableReplaceExpand(const QString &str, QHash<QString, QString
} else if(var_type == FUNCTION) {
replacement = doProjectExpand(var, args, place);
} else if(var_type == VAR) {
- replacement = values(var, place);
+ replacement = magicValues(var, place);
}
if(!(replaced++) && start_var)
current = str.left(start_var);
@@ -3717,188 +3737,44 @@ QMakeProject::doVariableReplaceExpand(const QString &str, QHash<QString, QString
return ret;
}
-QStringList &QMakeProject::values(const QString &_var, QHash<QString, QStringList> &place)
+QStringList QMakeProject::magicValues(const QString &_var, const QHash<QString, QStringList> &place) const
{
QString var = varMap(_var);
- if(var == QLatin1String("LITERAL_WHITESPACE")) { //a real space in a token)
- var = ".BUILTIN." + var;
- place[var] = QStringList(QLatin1String("\t"));
- } else if(var == QLatin1String("LITERAL_DOLLAR")) { //a real $
- var = ".BUILTIN." + var;
- place[var] = QStringList(QLatin1String("$"));
- } else if(var == QLatin1String("LITERAL_HASH")) { //a real #
- var = ".BUILTIN." + var;
- place[var] = QStringList("#");
- } else if(var == QLatin1String("OUT_PWD")) { //the out going dir
- var = ".BUILTIN." + var;
- place[var] = QStringList(Option::output_dir);
- } else if(var == QLatin1String("PWD") || //current working dir (of _FILE_)
- var == QLatin1String("IN_PWD")) {
- var = ".BUILTIN." + var;
- place[var] = QStringList(qmake_getpwd());
- } else if(var == QLatin1String("DIR_SEPARATOR")) {
- validateModes();
- var = ".BUILTIN." + var;
- place[var] = QStringList(Option::dir_sep);
- } else if(var == QLatin1String("DIRLIST_SEPARATOR")) {
- var = ".BUILTIN." + var;
- place[var] = QStringList(Option::dirlist_sep);
- } else if(var == QLatin1String("_LINE_")) { //parser line number
- var = ".BUILTIN." + var;
- place[var] = QStringList(QString::number(parser.line_no));
+ if (var == QLatin1String("_LINE_")) { //parser line number
+ return QStringList(QString::number(parser.line_no));
} else if(var == QLatin1String("_FILE_")) { //parser file
- var = ".BUILTIN." + var;
- place[var] = QStringList(parser.file);
- } else if(var == QLatin1String("_DATE_")) { //current date/time
- var = ".BUILTIN." + var;
- place[var] = QStringList(QDateTime::currentDateTime().toString());
- } else if(var == QLatin1String("_PRO_FILE_")) {
- var = ".BUILTIN." + var;
- place[var] = QStringList(pfile);
- } else if(var == QLatin1String("_PRO_FILE_PWD_")) {
- var = ".BUILTIN." + var;
- place[var] = QStringList(pfile.isEmpty() ? qmake_getpwd() : QFileInfo(pfile).absolutePath());
- } else if(var == QLatin1String("_QMAKE_CACHE_")) {
- var = ".BUILTIN." + var;
- if(Option::mkfile::do_cache)
- place[var] = QStringList(cachefile);
- } else if(var == QLatin1String("_QMAKE_SUPER_CACHE_")) {
- var = ".BUILTIN." + var;
- if(Option::mkfile::do_cache && !superfile.isEmpty())
- place[var] = QStringList(superfile);
- } else if(var == QLatin1String("TEMPLATE")) {
- if(!Option::user_template.isEmpty()) {
- var = ".BUILTIN.USER." + var;
- place[var] = QStringList(Option::user_template);
- } else {
- QString orig_template, real_template;
- if(!place[var].isEmpty())
- orig_template = place[var].first();
- real_template = orig_template.isEmpty() ? "app" : orig_template;
- if(!Option::user_template_prefix.isEmpty() && !orig_template.startsWith(Option::user_template_prefix))
- real_template.prepend(Option::user_template_prefix);
- if(real_template != orig_template) {
- var = ".BUILTIN." + var;
- place[var] = QStringList(real_template);
- }
- }
- } else if(var.startsWith(QLatin1String("QMAKE_HOST."))) {
- QString ret, type = var.mid(11);
-#if defined(Q_OS_WIN32)
- if(type == "os") {
- ret = "Windows";
- } else if(type == "name") {
- DWORD name_length = 1024;
- wchar_t name[1024];
- if (GetComputerName(name, &name_length))
- ret = QString::fromWCharArray(name);
- } else if(type == "version" || type == "version_string") {
- QSysInfo::WinVersion ver = QSysInfo::WindowsVersion;
- if(type == "version")
- ret = QString::number(ver);
- else if(ver == QSysInfo::WV_Me)
- ret = "WinMe";
- else if(ver == QSysInfo::WV_95)
- ret = "Win95";
- else if(ver == QSysInfo::WV_98)
- ret = "Win98";
- else if(ver == QSysInfo::WV_NT)
- ret = "WinNT";
- else if(ver == QSysInfo::WV_2000)
- ret = "Win2000";
- else if(ver == QSysInfo::WV_2000)
- ret = "Win2003";
- else if(ver == QSysInfo::WV_XP)
- ret = "WinXP";
- else if(ver == QSysInfo::WV_VISTA)
- ret = "WinVista";
- else
- ret = "Unknown";
- } else if(type == "arch") {
- SYSTEM_INFO info;
- GetSystemInfo(&info);
- switch(info.wProcessorArchitecture) {
-#ifdef PROCESSOR_ARCHITECTURE_AMD64
- case PROCESSOR_ARCHITECTURE_AMD64:
- ret = "x86_64";
- break;
-#endif
- case PROCESSOR_ARCHITECTURE_INTEL:
- ret = "x86";
- break;
- case PROCESSOR_ARCHITECTURE_IA64:
-#ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
- case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
-#endif
- ret = "IA64";
- break;
- default:
- ret = "Unknown";
- break;
- }
- }
-#elif defined(Q_OS_UNIX)
- struct utsname name;
- if(!uname(&name)) {
- if(type == "os")
- ret = name.sysname;
- else if(type == "name")
- ret = name.nodename;
- else if(type == "version")
- ret = name.release;
- else if(type == "version_string")
- ret = name.version;
- else if(type == "arch")
- ret = name.machine;
- }
-#endif
- var = ".BUILTIN.HOST." + type;
- place[var] = QStringList(ret);
- } else if (var == QLatin1String("QMAKE_DIR_SEP")) {
- if (place[var].isEmpty())
- return values("DIR_SEPARATOR", place);
- } else if (var == QLatin1String("QMAKE_EXT_OBJ")) {
- if (place[var].isEmpty()) {
- var = ".BUILTIN." + var;
- place[var] = QStringList(Option::obj_ext);
- }
- } else if (var == QLatin1String("QMAKE_QMAKE")) {
- if (place[var].isEmpty())
- place[var] = QStringList(
- !Option::qmake_abslocation.isEmpty()
- ? Option::qmake_abslocation
- : QLibraryInfo::rawLocation(QLibraryInfo::HostBinariesPath,
- QLibraryInfo::EffectivePaths) + "/qmake");
- }
-#if defined(Q_OS_WIN32) && defined(Q_CC_MSVC)
- else if(var.startsWith(QLatin1String("QMAKE_TARGET."))) {
- QString ret, type = var.mid(13);
- if(type == "arch") {
- QString paths = QString::fromLocal8Bit(qgetenv("PATH"));
- QString vcBin64 = QString::fromLocal8Bit(qgetenv("VCINSTALLDIR"));
- if (!vcBin64.endsWith('\\'))
- vcBin64.append('\\');
- vcBin64.append("bin\\amd64");
- QString vcBinX86_64 = QString::fromLocal8Bit(qgetenv("VCINSTALLDIR"));
- if (!vcBinX86_64.endsWith('\\'))
- vcBinX86_64.append('\\');
- vcBinX86_64.append("bin\\x86_amd64");
- if(paths.contains(vcBin64,Qt::CaseInsensitive) || paths.contains(vcBinX86_64,Qt::CaseInsensitive))
- ret = "x86_64";
- else
- ret = "x86";
- }
- place[var] = QStringList(ret);
+ return QStringList(parser.file);
}
-#endif
- //qDebug("REPLACE [%s]->[%s]", qPrintable(var), qPrintable(place[var].join("::")));
return place[var];
}
-bool QMakeProject::isEmpty(const QString &v)
+QStringList &QMakeProject::values(const QString &_var, QHash<QString, QStringList> &place)
{
- QHash<QString, QStringList>::ConstIterator it = vars.constFind(varMap(v));
+ QString var = varMap(_var);
+ return place[var];
+}
+
+bool QMakeProject::isEmpty(const QString &v) const
+{
+ QHash<QString, QStringList>::ConstIterator it = vars.constFind(v);
return it == vars.constEnd() || it->isEmpty();
}
+void
+QMakeProject::dump() const
+{
+ QStringList out;
+ for (QHash<QString, QStringList>::ConstIterator it = vars.begin(); it != vars.end(); ++it) {
+ if (!it.key().startsWith('.')) {
+ QString str = it.key() + " =";
+ foreach (const QString &v, it.value())
+ str += ' ' + quoteValue(v);
+ out << str;
+ }
+ }
+ out.sort();
+ foreach (const QString &v, out)
+ puts(qPrintable(v));
+}
+
QT_END_NAMESPACE
diff --git a/qmake/project.h b/qmake/project.h
index e733f6097c..266053a972 100644
--- a/qmake/project.h
+++ b/qmake/project.h
@@ -78,19 +78,20 @@ class QMakeProject
FunctionBlock *function;
QHash<QString, FunctionBlock*> testFunctions, replaceFunctions;
- bool recursive;
bool host_build;
bool need_restart;
bool own_prop;
bool backslashWarned;
+ QString project_build_root;
QString conffile;
QString superfile;
QString cachefile;
+ QString real_spec, short_spec;
QString pfile;
QMakeProperty *prop;
void reset();
QStringList extra_configs;
- QHash<QString, QStringList> vars, base_vars, extra_vars;
+ QHash<QString, QStringList> vars, init_vars, base_vars, extra_vars;
bool parse(const QString &text, QHash<QString, QStringList> &place, int line_count=1);
enum IncludeStatus {
@@ -113,9 +114,11 @@ class QMakeProject
QStringList doVariableReplaceExpand(const QString &str, QHash<QString, QStringList> &place, bool *ok=0);
void init(QMakeProperty *);
void cleanup();
+ void loadDefaults();
+ void setupProject();
QStringList &values(const QString &v, QHash<QString, QStringList> &place);
- void validateModes();
- void resolveSpec(QString *spec, const QString &qmakespec);
+ QStringList magicValues(const QString &v, const QHash<QString, QStringList> &place) const;
+ QStringList qmakeFeaturePaths();
public:
QMakeProject(QMakeProperty *p = 0) { init(p); }
@@ -134,8 +137,10 @@ public:
QStringList userTestFunctions() { return testFunctions.keys(); }
QString projectFile();
+ QString buildRoot() const { return project_build_root; }
QString confFile() const { return conffile; }
QString cacheFile() const { return cachefile; }
+ QString specDir() const { return real_spec; }
inline QMakeProperty *properties() { return prop; }
bool doProjectTest(QString str, QHash<QString, QStringList> &place);
@@ -160,14 +165,17 @@ public:
bool isActiveConfig(const QString &x, bool regex=false,
QHash<QString, QStringList> *place=NULL);
- bool isSet(const QString &v); // No compat mapping, no magic variables
- bool isEmpty(const QString &v); // With compat mapping, but no magic variables
- QStringList &values(const QString &v); // With compat mapping and magic variables
- QString first(const QString &v); // ditto
- int intValue(const QString &v, int defaultValue = 0); // ditto
- QHash<QString, QStringList> &variables(); // No compat mapping and magic, obviously
+ bool isSet(const QString &v) const { return vars.contains(v); }
+ bool isEmpty(const QString &v) const;
+ QStringList values(const QString &v) const { return vars[v]; }
+ QStringList &values(const QString &v) { return vars[v]; }
+ QString first(const QString &v) const;
+ int intValue(const QString &v, int defaultValue = 0) const;
+ const QHash<QString, QStringList> &variables() const { return vars; }
+ QHash<QString, QStringList> &variables() { return vars; }
+
+ void dump() const;
- bool isRecursive() const { return recursive; }
bool isHostBuild() const { return host_build; }
protected:
@@ -185,13 +193,7 @@ inline QString QMakeProject::projectFile()
return pfile;
}
-inline QStringList &QMakeProject::values(const QString &v)
-{ return values(v, vars); }
-
-inline bool QMakeProject::isSet(const QString &v)
-{ return vars.contains(v); }
-
-inline QString QMakeProject::first(const QString &v)
+inline QString QMakeProject::first(const QString &v) const
{
const QStringList vals = values(v);
if(vals.isEmpty())
@@ -199,7 +201,7 @@ inline QString QMakeProject::first(const QString &v)
return vals.first();
}
-inline int QMakeProject::intValue(const QString &v, int defaultValue)
+inline int QMakeProject::intValue(const QString &v, int defaultValue) const
{
const QString str = first(v);
if (!str.isEmpty()) {
@@ -211,9 +213,6 @@ inline int QMakeProject::intValue(const QString &v, int defaultValue)
return defaultValue;
}
-inline QHash<QString, QStringList> &QMakeProject::variables()
-{ return vars; }
-
QT_END_NAMESPACE
#endif // PROJECT_H
diff --git a/qmake/property.cpp b/qmake/property.cpp
index 8d2e14ca11..171a085796 100644
--- a/qmake/property.cpp
+++ b/qmake/property.cpp
@@ -104,15 +104,7 @@ void QMakeProperty::initSettings()
}
QString
-QMakeProperty::keyBase(bool version) const
-{
- if (version)
- return QString(qmake_version()) + "/";
- return QString();
-}
-
-QString
-QMakeProperty::value(QString v, bool just_check)
+QMakeProperty::value(const QString &v)
{
QString val = m_values.value(v);
if (!val.isNull())
@@ -127,56 +119,31 @@ QMakeProperty::value(QString v, bool just_check)
#endif
initSettings();
- int slash = v.lastIndexOf('/');
- QVariant var = settings->value(keyBase(slash == -1) + v);
- bool ok = var.isValid();
- QString ret = var.toString();
- if(!ok) {
- QString version = qmake_version();
- if(slash != -1) {
- version = v.left(slash-1);
- v = v.mid(slash+1);
- }
- settings->beginGroup(keyBase(false));
- QStringList subs = settings->childGroups();
- settings->endGroup();
- subs.sort();
- for (int x = subs.count() - 1; x >= 0; x--) {
- QString s = subs[x];
- if(s.isEmpty() || s > version)
- continue;
- var = settings->value(keyBase(false) + s + "/" + v);
- ok = var.isValid();
- ret = var.toString();
- if (ok) {
- if(!just_check)
- debug_msg(1, "Fell back from %s -> %s for '%s'.", version.toLatin1().constData(),
- s.toLatin1().constData(), v.toLatin1().constData());
- return ret;
- }
- }
- }
- return ok ? ret : QString();
+ if (!settings->contains(v))
+ return settings->value("2.01a/" + v).toString(); // Backwards compat
+ return settings->value(v).toString();
}
bool
QMakeProperty::hasValue(QString v)
{
- return !value(v, true).isNull();
+ return !value(v).isNull();
}
void
QMakeProperty::setValue(QString var, const QString &val)
{
initSettings();
- settings->setValue(keyBase() + var, val);
+ settings->setValue(var, val);
+ settings->remove("2.01a/" + var); // Backwards compat
}
void
QMakeProperty::remove(const QString &var)
{
initSettings();
- settings->remove(keyBase() + var);
+ settings->remove(var);
+ settings->remove("2.01a/" + var); // Backwards compat
}
bool
@@ -186,23 +153,14 @@ QMakeProperty::exec()
if(Option::qmake_mode == Option::QMAKE_QUERY_PROPERTY) {
if(Option::prop::properties.isEmpty()) {
initSettings();
- settings->beginGroup(keyBase(false));
- QStringList subs = settings->childGroups();
+ QStringList keys = settings->childKeys();
+ settings->beginGroup("2.01a");
+ keys += settings->childKeys();
settings->endGroup();
- subs.sort();
- for(int x = subs.count() - 1; x >= 0; x--) {
- QString s = subs[x];
- if(s.isEmpty())
- continue;
- settings->beginGroup(keyBase(false) + s);
- QStringList keys = settings->childKeys();
- settings->endGroup();
- for(QStringList::ConstIterator it2 = keys.begin(); it2 != keys.end(); it2++) {
- QString ret = settings->value(keyBase(false) + s + "/" + (*it2)).toString();
- if(s != qmake_version())
- fprintf(stdout, "%s/", s.toLatin1().constData());
- fprintf(stdout, "%s:%s\n", (*it2).toLatin1().constData(), ret.toLatin1().constData());
- }
+ keys.removeDuplicates();
+ foreach (const QString &key, keys) {
+ QString val = settings->value(settings->contains(key) ? key : "2.01a/" + key).toString();
+ fprintf(stdout, "%s:%s\n", qPrintable(key), qPrintable(val));
}
QStringList specialProps;
for (int i = 0; i < sizeof(propList)/sizeof(propList[0]); i++)
diff --git a/qmake/property.h b/qmake/property.h
index 6195e482fb..13767ff405 100644
--- a/qmake/property.h
+++ b/qmake/property.h
@@ -54,8 +54,6 @@ class QMakeProperty
{
QSettings *settings;
void initSettings();
- QString keyBase(bool =true) const;
- QString value(QString, bool just_check);
QHash<QString, QString> m_values;
@@ -64,7 +62,7 @@ public:
~QMakeProperty();
bool hasValue(QString);
- QString value(QString v) { return value(v, false); }
+ QString value(const QString &);
void setValue(QString, const QString &);
void remove(const QString &);
diff --git a/tests/auto/tools/qmake/testdata/functions/functions.pro b/tests/auto/tools/qmake/testdata/functions/functions.pro
index daab1fd954..6660e8d4fa 100644
--- a/tests/auto/tools/qmake/testdata/functions/functions.pro
+++ b/tests/auto/tools/qmake/testdata/functions/functions.pro
@@ -1,17 +1,17 @@
-CONFIG = qt thread
+VAR = qt thread
defineTest(testReplace) {
!isEqual(1, $$2):message("FAILED: $$3: got $$1, expected $${2}.")
}
#count
-!count( CONFIG, 2 ) {
- message( "FAILED: count function: $$CONFIG" )
+!count( VAR, 2 ) {
+ message( "FAILED: count function: $$VAR" )
}
#contains
-!contains( CONFIG, thread ) {
- message( "FAILED: contains function: $$CONFIG" )
+!contains( VAR, thread ) {
+ message( "FAILED: contains function: $$VAR" )
}
#exists
@@ -20,8 +20,8 @@ defineTest(testReplace) {
}
#isEmpty
-isEmpty( CONFIG ) {
- message( "FAILED: isEmpty function: $CONFIG" )
+isEmpty( VAR ) {
+ message( "FAILED: isEmpty function: $VAR" )
}
#files
diff --git a/tests/auto/tools/qmake/testdata/operators/operators.pro b/tests/auto/tools/qmake/testdata/operators/operators.pro
index 5285c1a982..d6eb3d13c7 100644
--- a/tests/auto/tools/qmake/testdata/operators/operators.pro
+++ b/tests/auto/tools/qmake/testdata/operators/operators.pro
@@ -1,24 +1,24 @@
-CONFIG = qt thread
+VAR = qt thread
-CONFIG += debug
-!contains( CONFIG, debug ) {
+VAR += debug
+!contains( VAR, debug ) {
message( "FAILED: +=" )
}
-CONFIG -= thread
-contains( CONFIG, thread ) {
+VAR -= thread
+contains( VAR, thread ) {
message( "FAILED: -=" )
}
-CONFIG = thread
-CONFIG *= thread
-!count( CONFIG, 1 ) {
+VAR = thread
+VAR *= thread
+!count( VAR, 1 ) {
message( "FAILED: *=" )
}
-CONFIG = thread QT_DLL debug
-CONFIG ~= s/QT_+/Q_
-!contains( CONFIG, Q_DLL ) {
+VAR = thread QT_DLL debug
+VAR ~= s/QT_+/Q_
+!contains( VAR, Q_DLL ) {
message( "FAILED: ~=" )
}
diff --git a/tests/auto/tools/qmake/testdata/variables/variables.pro b/tests/auto/tools/qmake/testdata/variables/variables.pro
index cefcddf0fb..d5d1e56939 100644
--- a/tests/auto/tools/qmake/testdata/variables/variables.pro
+++ b/tests/auto/tools/qmake/testdata/variables/variables.pro
@@ -1,14 +1,14 @@
-CONFIG = 1 2 3 4 5
-JOINEDCONFIG = $$join( CONFIG, "-GLUE-", "-BEFORE-", "-AFTER-" )
-!contains( JOINEDCONFIG, -BEFORE-1-GLUE-2-GLUE-3-GLUE-4-GLUE-5-AFTER- ) {
- message( "FAILED: join [$$JOINEDCONFIG != -BEFORE-1-GLUE-2-GLUE-3-GLUE-4-GLUE-5-AFTER-]" )
+VAR = 1 2 3 4 5
+JOINEDVAR = $$join( VAR, "-GLUE-", "-BEFORE-", "-AFTER-" )
+!contains( JOINEDVAR, -BEFORE-1-GLUE-2-GLUE-3-GLUE-4-GLUE-5-AFTER- ) {
+ message( "FAILED: join [$$JOINEDVAR != -BEFORE-1-GLUE-2-GLUE-3-GLUE-4-GLUE-5-AFTER-]" )
}
# To test member we need to use join
-NEWCONFIG = $$member( CONFIG, 4 ) $$member( CONFIG, 3 ) $$member( CONFIG, 2 )
-JOINEDNEWCONFIG = $$join( NEWCONFIG, "-" )
-!contains( JOINEDNEWCONFIG, 5-4-3 ) {
- message( "FAILED: member [$$JOINEDNEWCONFIG != 5-4-3]" )
+NEWVAR = $$member( VAR, 4 ) $$member( VAR, 3 ) $$member( VAR, 2 )
+JOINEDNEWVAR = $$join( NEWVAR, "-" )
+!contains( JOINEDNEWVAR, 5-4-3 ) {
+ message( "FAILED: member [$$JOINEDNEWVAR != 5-4-3]" )
}
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index bcb597d72f..fb666e221e 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -3011,7 +3011,7 @@ QString Configure::addDefine(QString def)
#if !defined(EVAL)
bool Configure::copySpec(const char *name, const char *pfx, const QString &spec)
{
- // Copy configured mkspec to default directory, but remove the old one first, if there is any
+ // "Link" configured mkspec to default directory, but remove the old one first, if there is any
QString defSpec = buildPath + "/mkspecs/" + name;
QFileInfo defSpecInfo(defSpec);
if (defSpecInfo.exists()) {
@@ -3022,10 +3022,18 @@ bool Configure::copySpec(const char *name, const char *pfx, const QString &spec)
}
}
- QString pltSpec = sourcePath + "/mkspecs/" + spec;
- QString includeSpec = buildPath + "/mkspecs/" + spec;
- if (!Environment::cpdir(pltSpec, defSpec, includeSpec)) {
- cout << "Couldn't update default " << pfx << "mkspec! Does " << qPrintable(pltSpec) << " exist?" << endl;
+ QDir::current().mkpath(defSpec);
+ QFile qfile(defSpec + "/qmake.conf");
+ if (qfile.open(QFile::WriteOnly | QFile::Text)) {
+ QTextStream fileStream;
+ fileStream.setDevice(&qfile);
+ QString srcSpec = buildPath + "/mkspecs/" + spec; // We copied it to the build dir
+ fileStream << "QMAKESPEC_ORIGINAL = " << formatPath(srcSpec) << endl;
+ fileStream << "include(" << formatPath(QDir(defSpec).relativeFilePath(srcSpec + "/qmake.conf")) << ")" << endl;
+ qfile.close();
+ }
+ if (qfile.error() != QFile::NoError) {
+ cout << "Couldn't update default " << pfx << "mkspec: " << qPrintable(qfile.errorString()) << endl;
dictionary["DONE"] = "error";
return false;
}
diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp
index 0365340833..45dc9d9417 100644
--- a/tools/configure/environment.cpp
+++ b/tools/configure/environment.cpp
@@ -454,21 +454,12 @@ QString Environment::execute(const QString &command, int *returnCode)
/*!
Copies the \a srcDir contents into \a destDir.
- If \a includeSrcDir is not empty, any files with 'h', 'prf', or 'conf' suffixes
- will not be copied over from \a srcDir. Instead a new file will be created
- in \a destDir with the same name and that file will include a file with the
- same name from the \a includeSrcDir using relative path and appropriate
- syntax for the file type.
-
Returns true if copying was successful.
*/
-bool Environment::cpdir(const QString &srcDir,
- const QString &destDir,
- const QString &includeSrcDir)
+bool Environment::cpdir(const QString &srcDir, const QString &destDir)
{
QString cleanSrcName = QDir::cleanPath(srcDir);
QString cleanDstName = QDir::cleanPath(destDir);
- QString cleanIncludeName = QDir::cleanPath(includeSrcDir);
#ifdef CONFIGURE_DEBUG_CP_DIR
qDebug() << "Attempt to cpdir " << cleanSrcName << "->" << cleanDstName;
@@ -480,59 +471,21 @@ bool Environment::cpdir(const QString &srcDir,
bool result = true;
QDir dir = QDir(cleanSrcName);
- QDir destinationDir = QDir(cleanDstName);
QFileInfoList allEntries = dir.entryInfoList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
for (int i = 0; result && (i < allEntries.count()); ++i) {
QFileInfo entry = allEntries.at(i);
bool intermediate = true;
if (entry.isDir()) {
- QString newIncSrcDir;
- if (!includeSrcDir.isEmpty())
- newIncSrcDir = QString("%1/%2").arg(cleanIncludeName).arg(entry.fileName());
-
intermediate = cpdir(QString("%1/%2").arg(cleanSrcName).arg(entry.fileName()),
- QString("%1/%2").arg(cleanDstName).arg(entry.fileName()),
- newIncSrcDir);
+ QString("%1/%2").arg(cleanDstName).arg(entry.fileName()));
} else {
QString destFile = QString("%1/%2").arg(cleanDstName).arg(entry.fileName());
#ifdef CONFIGURE_DEBUG_CP_DIR
qDebug() << "About to cp (file)" << entry.absoluteFilePath() << "->" << destFile;
#endif
QFile::remove(destFile);
- QString suffix = entry.suffix();
- if (!includeSrcDir.isEmpty() && (suffix == "prf" || suffix == "conf" || suffix == "h")) {
- QString relativeIncludeFilePath = QString("%1/%2").arg(cleanIncludeName).arg(entry.fileName());
- relativeIncludeFilePath = destinationDir.relativeFilePath(relativeIncludeFilePath);
-#ifdef CONFIGURE_DEBUG_CP_DIR
- qDebug() << "...instead generate relative include to" << relativeIncludeFilePath;
-#endif
- QFile currentFile(destFile);
- if (currentFile.open(QFile::WriteOnly | QFile::Text)) {
- QTextStream fileStream;
- fileStream.setDevice(&currentFile);
-
- if (suffix == "prf" || suffix == "conf") {
- if (entry.fileName() == "qmake.conf") {
- // While QMAKESPEC_ORIGINAL being relative or absolute doesn't matter for the
- // primary use of this variable by qmake to identify the original mkspec, the
- // variable is also used for few special cases where the absolute path is required.
- // Conversely, the include of the original qmake.conf must be done using relative path,
- // as some Qt binary deployments are done in a manner that doesn't allow for patching
- // the paths at the installation time.
- fileStream << "QMAKESPEC_ORIGINAL=" << cleanSrcName << endl << endl;
- }
- fileStream << "include(" << relativeIncludeFilePath << ")" << endl << endl;
- } else if (suffix == "h") {
- fileStream << "#include \"" << relativeIncludeFilePath << "\"" << endl << endl;
- }
-
- fileStream.flush();
- currentFile.close();
- }
- } else {
- intermediate = QFile::copy(entry.absoluteFilePath(), destFile);
- SetFileAttributes((wchar_t*)destFile.utf16(), FILE_ATTRIBUTE_NORMAL);
- }
+ intermediate = QFile::copy(entry.absoluteFilePath(), destFile);
+ SetFileAttributes((wchar_t*)destFile.utf16(), FILE_ATTRIBUTE_NORMAL);
}
if(!intermediate) {
qDebug() << "cpdir: Failure for " << entry.fileName() << entry.isDir();
diff --git a/tools/configure/environment.h b/tools/configure/environment.h
index 979d538e8a..58e9c18137 100644
--- a/tools/configure/environment.h
+++ b/tools/configure/environment.h
@@ -67,9 +67,7 @@ public:
static int execute(QStringList arguments, const QStringList &additionalEnv, const QStringList &removeEnv);
static QString execute(const QString &command, int *returnCode = 0);
- static bool cpdir(const QString &srcDir,
- const QString &destDir,
- const QString &includeSrcDir = QString());
+ static bool cpdir(const QString &srcDir, const QString &destDir);
static bool rmdir(const QString &name);
private: