//convenience
const char *Option::application_argv0 = 0;
QString Option::prf_ext;
-QString Option::js_ext;
QString Option::prl_ext;
QString Option::libtool_ext;
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;
QString Option::lex_ext;
QString Option::yacc_ext;
QString Option::pro_ext;
-QString Option::mmp_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;
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;
//QMAKE_GENERATE_MAKEFILE stuff
QString Option::mkfile::qmakespec;
+QString Option::mkfile::xqmakespec;
int Option::mkfile::cachefile_depth = -1;
bool Option::mkfile::do_deps = true;
bool Option::mkfile::do_mocs = true;
bool Option::mkfile::do_preprocess = false;
bool Option::mkfile::do_stub_makefile = false;
bool Option::mkfile::do_cache = true;
-QString Option::mkfile::project_root;
-QString Option::mkfile::project_build_root;
+QString Option::mkfile::source_root;
+QString Option::mkfile::build_root;
QString Option::mkfile::cachefile;
QStringList Option::mkfile::project_files;
QString Option::mkfile::qmakespec_commandline;
+QString Option::mkfile::xqmakespec_commandline;
static Option::QMAKE_MODE default_mode(QString progname)
{
} 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;
} 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;
} else if(opt == "d") {
Option::debug_level++;
} else if(opt == "version" || opt == "v" || opt == "-version") {
} 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];
} else if(opt == "platform" || opt == "spec") {
Option::mkfile::qmakespec = cleanSpec(argv[++x]);
Option::mkfile::qmakespec_commandline = argv[x];
+ } else if (opt == "xplatform" || opt == "xspec") {
+ Option::mkfile::xqmakespec = cleanSpec(argv[++x]);
+ Option::mkfile::xqmakespec_commandline = argv[x];
} else {
fprintf(stderr, "***Unknown option -%s\n", opt.toLatin1().constData());
return Option::QMAKE_CMDLINE_SHOW_USAGE | Option::QMAKE_CMDLINE_ERROR;
if (!user_configs.isEmpty())
Option::before_user_vars += "CONFIG += " + user_configs.join(" ");
- return Option::QMAKE_CMDLINE_SUCCESS;
-}
+ if (Option::mkfile::xqmakespec.isEmpty())
+ Option::mkfile::xqmakespec = Option::mkfile::qmakespec;
-#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;
+ return Option::QMAKE_CMDLINE_SUCCESS;
}
-#endif
int
Option::init(int argc, char **argv)
{
+#if defined(Q_OS_MAC)
+ Option::host_mode = Option::HOST_MACX_MODE;
+#elif defined(Q_OS_UNIX)
+ Option::host_mode = Option::HOST_UNIX_MODE;
+#else
+ Option::host_mode = Option::HOST_WIN_MODE;
+#endif
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::js_ext = ".js";
- 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";
- Option::mmp_ext = ".mmp";
#ifdef Q_OS_WIN
Option::dirlist_sep = ";";
- Option::shellPath = detectShellPath();
- Option::res_ext = ".res";
#else
Option::dirlist_sep = ":";
- Option::shellPath = QStringList("sh");
#endif
- Option::sysenv_mod = "QMAKE_ENV_";
Option::field_sep = ' ';
if(argc && 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;
}
//last chance for defaults
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
- if(Option::mkfile::qmakespec.isNull() || Option::mkfile::qmakespec.isEmpty())
+ if (Option::mkfile::xqmakespec.isEmpty())
+ Option::mkfile::xqmakespec = QString::fromLocal8Bit(qgetenv("XQMAKESPEC").constData());
+ if (Option::mkfile::qmakespec.isEmpty()) {
Option::mkfile::qmakespec = QString::fromLocal8Bit(qgetenv("QMAKESPEC").constData());
+ if (Option::mkfile::xqmakespec.isEmpty())
+ Option::mkfile::xqmakespec = Option::mkfile::qmakespec;
+ }
//try REALLY hard to do it for them, lazy..
if(Option::mkfile::project_files.isEmpty()) {
}
#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";
- }
-}
-
-QStringList Option::mkspecPaths()
-{
- QStringList ret;
- const QString concat = QLatin1String("/mkspecs");
-
- QByteArray qmakepath = qgetenv("QMAKEPATH");
- if (!qmakepath.isEmpty()) {
- const QStringList lst = splitPathList(QString::fromLocal8Bit(qmakepath));
- for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
- ret << ((*it) + concat);
+ if (Option::host_mode == Option::HOST_WIN_MODE) {
+ Option::dir_sep = "\\";
+ } else {
+ Option::dir_sep = "/";
}
- if (!Option::mkfile::project_build_root.isEmpty())
- ret << Option::mkfile::project_build_root + concat;
- if (!Option::mkfile::project_root.isEmpty())
- ret << Option::mkfile::project_root + concat;
- ret << QLibraryInfo::location(QLibraryInfo::HostDataPath) + concat;
- ret.removeDuplicates();
- return ret;
-}
-bool Option::resolveSpec(QString *spec)
-{
- QString qmakespec = fixEnvVariables(*spec);
- if (qmakespec.isEmpty())
- qmakespec = "default";
- if (QDir::isRelativePath(qmakespec)) {
- QStringList mkspec_roots = mkspecPaths();
- debug_msg(2, "Looking for mkspec %s in (%s)", qmakespec.toLatin1().constData(),
- mkspec_roots.join("::").toLatin1().constData());
- for (QStringList::ConstIterator it = mkspec_roots.begin(); it != mkspec_roots.end(); ++it) {
- QString mkspec = (*it) + QLatin1Char('/') + qmakespec;
- if (QFile::exists(mkspec)) {
- *spec = mkspec;
- return true;
- }
- }
- fprintf(stderr, "Could not find mkspecs for your QMAKESPEC(%s) after trying:\n\t%s\n",
- qmakespec.toLatin1().constData(), mkspec_roots.join("\n\t").toLatin1().constData());
- return false;
- }
- return true;
+ return QMAKE_CMDLINE_SUCCESS;
}
-bool Option::prepareProject(const QString &pfile)
+void Option::prepareProject(const QString &pfile)
{
- mkfile::project_build_root.clear();
- if (mkfile::do_cache) {
- if (mkfile::cachefile.isEmpty()) { //find it as it has not been specified
- QDir dir(output_dir);
- while (!dir.exists(QLatin1String(".qmake.cache")))
- if (dir.isRoot() || !dir.cdUp())
- goto no_cache;
- mkfile::cachefile = dir.filePath(QLatin1String(".qmake.cache"));
- mkfile::project_build_root = dir.path();
- } else {
- QFileInfo fi(mkfile::cachefile);
- mkfile::cachefile = QDir::cleanPath(fi.absoluteFilePath());
- mkfile::project_build_root = QDir::cleanPath(fi.absolutePath());
- }
-
- if (mkfile::qmakespec.isEmpty()) {
- QMakeProject cproj;
- if (!cproj.read(mkfile::cachefile, QMakeProject::ReadProFile))
- return false;
- mkfile::qmakespec = cproj.first(QLatin1String("QMAKESPEC"));
- }
- }
- no_cache:
-
QString srcpath = (pfile != "-")
? QDir::cleanPath(QFileInfo(pfile).absolutePath()) : qmake_getpwd();
- if (srcpath != output_dir || mkfile::project_build_root.isEmpty()) {
- QDir srcdir(srcpath);
- QDir dstdir(output_dir);
- do {
- if (!mkfile::project_build_root.isEmpty()) {
- // If we already know the build root, just match up the source root with it.
- if (dstdir.path() == mkfile::project_build_root) {
- mkfile::project_root = srcdir.path();
- break;
- }
- } else {
- // Look for mkspecs/ in source and build. First to win determines the root.
- if (dstdir.exists("mkspecs") || srcdir.exists("mkspecs")) {
- mkfile::project_build_root = dstdir.path();
- mkfile::project_root = srcdir.path();
- if (mkfile::project_root == mkfile::project_build_root)
- mkfile::project_root.clear();
- break;
- }
- }
- } while (!srcdir.isRoot() && srcdir.cdUp() && !dstdir.isRoot() && dstdir.cdUp());
+ if (srcpath != output_dir) {
+ if (!srcpath.endsWith(QLatin1Char('/')))
+ srcpath += QLatin1Char('/');
+ QString dstpath = output_dir;
+ if (!dstpath.endsWith(QLatin1Char('/')))
+ dstpath += QLatin1Char('/');
+ int srcLen = srcpath.length();
+ int dstLen = dstpath.length();
+ int lastSl = -1;
+ while (++lastSl, srcpath.at(--srcLen) == dstpath.at(--dstLen))
+ if (srcpath.at(srcLen) == QLatin1Char('/'))
+ lastSl = 0;
+ mkfile::source_root = srcpath.left(srcLen + lastSl);
+ mkfile::build_root = dstpath.left(dstLen + lastSl);
} else {
- mkfile::project_root.clear();
+ mkfile::source_root.clear();
}
-
- if (!resolveSpec(&Option::mkfile::qmakespec))
- return false;
-
- return true;
}
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");
+ Option::shellPath = project->values("QMAKE_SH");
return true;
}