repurpose deprecated -E switch
[profile/ivi/qtbase.git] / qmake / option.cpp
index b2a1e69..91ff405 100644 (file)
@@ -54,28 +54,23 @@ QT_BEGIN_NAMESPACE
 //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;
 
@@ -95,8 +90,6 @@ 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;
@@ -107,6 +100,7 @@ QStringList Option::projfile::project_dirs;
 
 //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;
@@ -114,11 +108,12 @@ bool Option::mkfile::do_dep_heuristics = 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)
 {
@@ -262,22 +257,11 @@ Option::parseCommandLine(int argc, char **argv, int skip)
             } 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") {
@@ -322,13 +306,15 @@ 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];
                     } 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;
@@ -383,63 +369,30 @@ Option::parseCommandLine(int argc, char **argv, int skip)
     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) {
@@ -478,6 +431,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;
     }
@@ -538,8 +499,13 @@ Option::init(int argc, char **argv)
     //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()) {
@@ -553,188 +519,60 @@ 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";
-   }
-}
-
-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;
 }