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 } |