qmake/option.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
child 33 3e2da88830cd
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
    82 //mode
    82 //mode
    83 Option::QMAKE_MODE Option::qmake_mode = Option::QMAKE_GENERATE_NOTHING;
    83 Option::QMAKE_MODE Option::qmake_mode = Option::QMAKE_GENERATE_NOTHING;
    84 
    84 
    85 //all modes
    85 //all modes
    86 QString Option::qmake_abslocation;
    86 QString Option::qmake_abslocation;
    87 int Option::warn_level = WarnLogic;
    87 int Option::warn_level = WarnLogic | WarnDeprecated;
    88 int Option::debug_level = 0;
    88 int Option::debug_level = 0;
    89 QFile Option::output;
    89 QFile Option::output;
    90 QString Option::output_dir;
    90 QString Option::output_dir;
    91 bool Option::recursive = false;
    91 Option::QMAKE_RECURSIVE Option::recursive = Option::QMAKE_RECURSIVE_DEFAULT;
    92 QStringList Option::before_user_vars;
    92 QStringList Option::before_user_vars;
    93 QStringList Option::after_user_vars;
    93 QStringList Option::after_user_vars;
    94 QStringList Option::user_configs;
    94 QStringList Option::user_configs;
    95 QStringList Option::after_user_configs;
    95 QStringList Option::after_user_configs;
    96 QString Option::user_template;
    96 QString Option::user_template;
    97 QString Option::user_template_prefix;
    97 QString Option::user_template_prefix;
    98 QStringList Option::shellPath;
    98 QStringList Option::shellPath;
    99 #if defined(Q_OS_WIN32)
    99 Option::HOST_MODE Option::host_mode = Option::HOST_UNKNOWN_MODE;
   100 Option::TARG_MODE Option::target_mode = Option::TARG_WIN_MODE;
   100 Option::TARG_MODE Option::target_mode = Option::TARG_UNKNOWN_MODE;
   101 #elif defined(Q_OS_MAC)
   101 bool Option::target_mode_overridden = false;
   102 Option::TARG_MODE Option::target_mode = Option::TARG_MACX_MODE;
       
   103 #else
       
   104 Option::TARG_MODE Option::target_mode = Option::TARG_UNIX_MODE;
       
   105 #endif
       
   106 
   102 
   107 //QMAKE_*_PROPERTY stuff
   103 //QMAKE_*_PROPERTY stuff
   108 QStringList Option::prop::properties;
   104 QStringList Option::prop::properties;
   109 
   105 
   110 //QMAKE_GENERATE_PROJECT stuff
   106 //QMAKE_GENERATE_PROJECT stuff
   125 QStringList Option::mkfile::project_files;
   121 QStringList Option::mkfile::project_files;
   126 QString Option::mkfile::qmakespec_commandline;
   122 QString Option::mkfile::qmakespec_commandline;
   127 
   123 
   128 static Option::QMAKE_MODE default_mode(QString progname)
   124 static Option::QMAKE_MODE default_mode(QString progname)
   129 {
   125 {
   130     int s = progname.lastIndexOf(Option::dir_sep);
   126     int s = progname.lastIndexOf(QDir::separator());
   131     if(s != -1)
   127     if(s != -1)
   132         progname = progname.right(progname.length() - (s + 1));
   128         progname = progname.right(progname.length() - (s + 1));
   133     if(progname == "qmakegen")
   129     if(progname == "qmakegen")
   134         return Option::QMAKE_GENERATE_PROJECT;
   130         return Option::QMAKE_GENERATE_PROJECT;
   135     else if(progname == "qt-config")
   131     else if(progname == "qt-config")
   136         return Option::QMAKE_QUERY_PROPERTY;
   132         return Option::QMAKE_QUERY_PROPERTY;
   137     return Option::QMAKE_GENERATE_MAKEFILE;
   133     return Option::QMAKE_GENERATE_MAKEFILE;
       
   134 }
       
   135 
       
   136 static QString detectProjectFile(const QString &path)
       
   137 {
       
   138     QString ret;
       
   139     QDir dir(path);
       
   140     if(dir.exists(dir.dirName() + Option::pro_ext)) {
       
   141         ret = dir.filePath(dir.dirName()) + Option::pro_ext;
       
   142     } else { //last try..
       
   143         QStringList profiles = dir.entryList(QStringList("*" + Option::pro_ext));
       
   144         if(profiles.count() == 1)
       
   145             ret = dir.filePath(profiles.at(0));
       
   146     }
       
   147     return ret;
   138 }
   148 }
   139 
   149 
   140 QString project_builtin_regx();
   150 QString project_builtin_regx();
   141 bool usage(const char *a0)
   151 bool usage(const char *a0)
   142 {
   152 {
   159             "                 In this mode qmake interprets files as project files to\n"
   169             "                 In this mode qmake interprets files as project files to\n"
   160             "                 be processed, if skipped qmake will try to find a project\n"
   170             "                 be processed, if skipped qmake will try to find a project\n"
   161             "                 file in your current working directory\n"
   171             "                 file in your current working directory\n"
   162             "\n"
   172             "\n"
   163             "Warnings Options:\n"
   173             "Warnings Options:\n"
   164             "  -Wnone         Turn off all warnings\n"
   174             "  -Wnone         Turn off all warnings; specific ones may be re-enabled by\n"
       
   175             "                 later -W options\n"
   165             "  -Wall          Turn on all warnings\n"
   176             "  -Wall          Turn on all warnings\n"
   166             "  -Wparser       Turn on parser warnings\n"
   177             "  -Wparser       Turn on parser warnings\n"
   167             "  -Wlogic        Turn on logic warnings\n"
   178             "  -Wlogic        Turn on logic warnings (on by default)\n"
       
   179             "  -Wdeprecated   Turn on deprecation warnings (on by default)\n"
   168             "\n"
   180             "\n"
   169             "Options:\n"
   181             "Options:\n"
   170             "   * You can place any variable assignment in options and it will be     *\n"
   182             "   * You can place any variable assignment in options and it will be     *\n"
   171             "   * processed as if it was in [files]. These assignments will be parsed *\n"
   183             "   * processed as if it was in [files]. These assignments will be parsed *\n"
   172             "   * before [files].                                                     *\n"
   184             "   * before [files].                                                     *\n"
   173             "  -o file        Write output to file\n"
   185             "  -o file        Write output to file\n"
   174             "  -unix          Run in unix mode\n"
       
   175             "  -win32         Run in win32 mode\n"
       
   176             "  -macx          Run in Mac OS X mode\n"
       
   177             "  -d             Increase debug level\n"
   186             "  -d             Increase debug level\n"
   178             "  -t templ       Overrides TEMPLATE as templ\n"
   187             "  -t templ       Overrides TEMPLATE as templ\n"
   179             "  -tp prefix     Overrides TEMPLATE so that prefix is prefixed into the value\n"
   188             "  -tp prefix     Overrides TEMPLATE so that prefix is prefixed into the value\n"
   180             "  -help          This help\n"
   189             "  -help          This help\n"
   181             "  -v             Version information\n"
   190             "  -v             Version information\n"
   209 
   218 
   210             //first param is a mode, or we default
   219             //first param is a mode, or we default
   211             if(x == 1) {
   220             if(x == 1) {
   212                 bool specified = true;
   221                 bool specified = true;
   213                 if(opt == "project") {
   222                 if(opt == "project") {
   214                     Option::recursive = true;
   223                     Option::recursive = Option::QMAKE_RECURSIVE_YES;
   215                     Option::qmake_mode = Option::QMAKE_GENERATE_PROJECT;
   224                     Option::qmake_mode = Option::QMAKE_GENERATE_PROJECT;
   216                 } else if(opt == "prl") {
   225                 } else if(opt == "prl") {
   217                     Option::mkfile::do_deps = false;
   226                     Option::mkfile::do_deps = false;
   218                     Option::mkfile::do_mocs = false;
   227                     Option::mkfile::do_mocs = false;
   219                     Option::qmake_mode = Option::QMAKE_GENERATE_PRL;
   228                     Option::qmake_mode = Option::QMAKE_GENERATE_PRL;
   236                 before = false;
   245                 before = false;
   237             } else if(opt == "t" || opt == "template") {
   246             } else if(opt == "t" || opt == "template") {
   238                 Option::user_template = argv[++x];
   247                 Option::user_template = argv[++x];
   239             } else if(opt == "tp" || opt == "template_prefix") {
   248             } else if(opt == "tp" || opt == "template_prefix") {
   240                 Option::user_template_prefix = argv[++x];
   249                 Option::user_template_prefix = argv[++x];
   241             } else if(opt == "mac9") {
       
   242                 Option::target_mode = TARG_MAC9_MODE;
       
   243             } else if(opt == "macx") {
   250             } else if(opt == "macx") {
       
   251                 fprintf(stderr, "-macx is deprecated.\n");
       
   252                 Option::host_mode = HOST_MACX_MODE;
   244                 Option::target_mode = TARG_MACX_MODE;
   253                 Option::target_mode = TARG_MACX_MODE;
       
   254                 Option::target_mode_overridden = true;
   245             } else if(opt == "unix") {
   255             } else if(opt == "unix") {
       
   256                 fprintf(stderr, "-unix is deprecated.\n");
       
   257                 Option::host_mode = HOST_UNIX_MODE;
   246                 Option::target_mode = TARG_UNIX_MODE;
   258                 Option::target_mode = TARG_UNIX_MODE;
       
   259                 Option::target_mode_overridden = true;
   247             } else if(opt == "win32") {
   260             } else if(opt == "win32") {
       
   261                 fprintf(stderr, "-win32 is deprecated.\n");
       
   262                 Option::host_mode = HOST_WIN_MODE;
   248                 Option::target_mode = TARG_WIN_MODE;
   263                 Option::target_mode = TARG_WIN_MODE;
       
   264                 Option::target_mode_overridden = true;
   249             } else if(opt == "d") {
   265             } else if(opt == "d") {
   250                 Option::debug_level++;
   266                 Option::debug_level++;
   251             } else if(opt == "version" || opt == "v" || opt == "-version") {
   267             } else if(opt == "version" || opt == "v" || opt == "-version") {
   252                 fprintf(stdout,
   268                 fprintf(stdout,
   253                         "QMake version %s\n"
   269                         "QMake version %s\n"
   264                 Option::warn_level |= WarnAll;
   280                 Option::warn_level |= WarnAll;
   265             } else if(opt == "Wparser") {
   281             } else if(opt == "Wparser") {
   266                 Option::warn_level |= WarnParser;
   282                 Option::warn_level |= WarnParser;
   267             } else if(opt == "Wlogic") {
   283             } else if(opt == "Wlogic") {
   268                 Option::warn_level |= WarnLogic;
   284                 Option::warn_level |= WarnLogic;
       
   285             } else if(opt == "Wdeprecated") {
       
   286                 Option::warn_level |= WarnDeprecated;
   269             } else if(opt == "Wnone") {
   287             } else if(opt == "Wnone") {
   270                 Option::warn_level = WarnNone;
   288                 Option::warn_level = WarnNone;
   271             } else if(opt == "r" || opt == "recursive") {
   289             } else if(opt == "r" || opt == "recursive") {
   272                 Option::recursive = true;
   290                 Option::recursive = Option::QMAKE_RECURSIVE_YES;
   273             } else if(opt == "norecursive") {
   291             } else if(opt == "nr" || opt == "norecursive") {
   274                 Option::recursive = false;
   292                 Option::recursive = Option::QMAKE_RECURSIVE_NO;
   275             } else if(opt == "config") {
   293             } else if(opt == "config") {
   276                 Option::user_configs += argv[++x];
   294                 Option::user_configs += argv[++x];
   277             } else {
   295             } else {
   278                 if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
   296                 if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
   279                    Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
   297                    Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
   324                 } else {
   342                 } else {
   325                     QFileInfo fi(arg);
   343                     QFileInfo fi(arg);
   326                     if(!fi.makeAbsolute()) //strange
   344                     if(!fi.makeAbsolute()) //strange
   327                         arg = fi.filePath();
   345                         arg = fi.filePath();
   328                     if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
   346                     if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
   329                        Option::qmake_mode == Option::QMAKE_GENERATE_PRL)
   347                        Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
       
   348                         if(fi.isDir()) {
       
   349                             QString proj = detectProjectFile(arg);
       
   350                             if (!proj.isNull())
       
   351                                 arg = proj;
       
   352                         }
   330                         Option::mkfile::project_files.append(arg);
   353                         Option::mkfile::project_files.append(arg);
   331                     else if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT)
   354                     } else if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) {
   332                         Option::projfile::project_dirs.append(arg);
   355                         Option::projfile::project_dirs.append(arg);
   333                     else
   356                     } else {
   334                         handled = false;
   357                         handled = false;
       
   358                     }
   335                 }
   359                 }
   336                 if(!handled) {
   360                 if(!handled) {
   337                     return Option::QMAKE_CMDLINE_SHOW_USAGE | Option::QMAKE_CMDLINE_ERROR;
   361                     return Option::QMAKE_CMDLINE_SHOW_USAGE | Option::QMAKE_CMDLINE_ERROR;
   338                 }
   362                 }
   339             }
   363             }
   389     Option::pro_ext = ".pro";
   413     Option::pro_ext = ".pro";
   390     Option::mmp_ext = ".mmp";
   414     Option::mmp_ext = ".mmp";
   391 #ifdef Q_OS_WIN
   415 #ifdef Q_OS_WIN
   392     Option::dirlist_sep = ";";
   416     Option::dirlist_sep = ";";
   393     Option::shellPath = detectShellPath();
   417     Option::shellPath = detectShellPath();
       
   418     Option::res_ext = ".res";
   394 #else
   419 #else
   395     Option::dirlist_sep = ":";
   420     Option::dirlist_sep = ":";
       
   421     Option::shellPath = QStringList("sh");
   396 #endif
   422 #endif
   397     Option::sysenv_mod = "QMAKE_ENV_";
   423     Option::sysenv_mod = "QMAKE_ENV_";
   398     Option::field_sep = ' ';
   424     Option::field_sep = ' ';
   399 
   425 
   400     if(argc && argv) {
   426     if(argc && argv) {
   496         if(Option::mkfile::qmakespec.isNull() || Option::mkfile::qmakespec.isEmpty())
   522         if(Option::mkfile::qmakespec.isNull() || Option::mkfile::qmakespec.isEmpty())
   497             Option::mkfile::qmakespec = QString::fromLocal8Bit(qgetenv("QMAKESPEC").constData());
   523             Option::mkfile::qmakespec = QString::fromLocal8Bit(qgetenv("QMAKESPEC").constData());
   498 
   524 
   499         //try REALLY hard to do it for them, lazy..
   525         //try REALLY hard to do it for them, lazy..
   500         if(Option::mkfile::project_files.isEmpty()) {
   526         if(Option::mkfile::project_files.isEmpty()) {
   501             QString pwd = qmake_getpwd(),
   527             QString proj = detectProjectFile(qmake_getpwd());
   502                    proj = pwd + "/" + pwd.right(pwd.length() - (pwd.lastIndexOf('/') + 1)) + Option::pro_ext;
   528             if(!proj.isNull())
   503             if(QFile::exists(proj)) {
       
   504                 Option::mkfile::project_files.append(proj);
   529                 Option::mkfile::project_files.append(proj);
   505             } else { //last try..
       
   506                 QStringList profiles = QDir(pwd).entryList(QStringList("*" + Option::pro_ext));
       
   507                 if(profiles.count() == 1)
       
   508                     Option::mkfile::project_files.append(pwd + "/" + profiles[0]);
       
   509             }
       
   510 #ifndef QT_BUILD_QMAKE_LIBRARY
   530 #ifndef QT_BUILD_QMAKE_LIBRARY
   511             if(Option::mkfile::project_files.isEmpty()) {
   531             if(Option::mkfile::project_files.isEmpty()) {
   512                 usage(argv[0]);
   532                 usage(argv[0]);
   513                 return Option::QMAKE_CMDLINE_ERROR;
   533                 return Option::QMAKE_CMDLINE_ERROR;
   514             }
   534             }
   515 #endif
   535 #endif
   516         }
   536         }
       
   537     } else if (Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) {
       
   538 #if defined(Q_OS_MAC)
       
   539         Option::host_mode = Option::HOST_MACX_MODE;
       
   540         Option::target_mode = Option::TARG_MACX_MODE;
       
   541 #elif defined(Q_OS_UNIX)
       
   542         Option::host_mode = Option::HOST_UNIX_MODE;
       
   543         Option::target_mode = Option::TARG_UNIX_MODE;
       
   544 #else
       
   545         Option::host_mode = Option::HOST_WIN_MODE;
       
   546         Option::target_mode = Option::TARG_WIN_MODE;
       
   547 #endif
   517     }
   548     }
   518 
   549 
   519     //defaults for globals
   550     //defaults for globals
   520     if(Option::target_mode == Option::TARG_WIN_MODE) {
   551     if (Option::host_mode != Option::HOST_UNKNOWN_MODE)
   521         Option::dir_sep = "\\";
   552         applyHostMode();
   522         Option::obj_ext = ".obj";
       
   523         Option::res_ext = ".res";
       
   524     } else {
       
   525         if(Option::target_mode == Option::TARG_MAC9_MODE)
       
   526             Option::dir_sep = ":";
       
   527         else
       
   528             Option::dir_sep = "/";
       
   529         Option::obj_ext = ".o";
       
   530     }
       
   531     Option::qmake_abslocation = Option::fixPathToTargetOS(Option::qmake_abslocation);
       
   532     return QMAKE_CMDLINE_SUCCESS;
   553     return QMAKE_CMDLINE_SUCCESS;
       
   554 }
       
   555 
       
   556 void Option::applyHostMode()
       
   557 {
       
   558    if (Option::host_mode == Option::HOST_WIN_MODE) {
       
   559        Option::dir_sep = "\\";
       
   560        Option::obj_ext = ".obj";
       
   561    } else {
       
   562        Option::dir_sep = "/";
       
   563        Option::obj_ext = ".o";
       
   564    }
       
   565    Option::qmake_abslocation = Option::fixPathToTargetOS(Option::qmake_abslocation);
   533 }
   566 }
   534 
   567 
   535 bool Option::postProcessProject(QMakeProject *project)
   568 bool Option::postProcessProject(QMakeProject *project)
   536 {
   569 {
   537     Option::cpp_ext = project->variables()["QMAKE_EXT_CPP"];
   570     Option::cpp_ext = project->variables()["QMAKE_EXT_CPP"];
   586 }
   619 }
   587 
   620 
   588 QString
   621 QString
   589 Option::fixString(QString string, uchar flags)
   622 Option::fixString(QString string, uchar flags)
   590 {
   623 {
   591     const QString orig_string = string;
   624     //const QString orig_string = string;
   592     static QHash<FixStringCacheKey, QString> *cache = 0;
   625     static QHash<FixStringCacheKey, QString> *cache = 0;
   593     if(!cache) {
   626     if(!cache) {
   594         cache = new QHash<FixStringCacheKey, QString>;
   627         cache = new QHash<FixStringCacheKey, QString>;
   595         qmakeAddCacheClear(qmakeDeleteCacheClear_QHashFixStringCacheKeyQString, (void**)&cache);
   628         qmakeAddCacheClear(qmakeDeleteCacheClear_QHashFixStringCacheKeyQString, (void**)&cache);
   596     }
   629     }