summaryrefslogtreecommitdiffstats
path: root/qmake/project.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qmake/project.cpp')
-rw-r--r--qmake/project.cpp540
1 files changed, 208 insertions, 332 deletions
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