1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the tools applications of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include "configureapp.h"
43 #include "environment.h"
44 #ifdef COMMERCIAL_VERSION
50 #include <qdiriterator.h>
51 #include <qtemporaryfile.h>
54 #include <qfileinfo.h>
55 #include <qtextstream.h>
74 std::ostream &operator<<(std::ostream &s, const QString &val) {
75 s << val.toLocal8Bit().data();
82 // Macros to simplify options marking
83 #define MARK_OPTION(x,y) ( dictionary[ #x ] == #y ? "*" : " " )
86 bool writeToFile(const char* text, const QString &filename)
88 QByteArray symFile(text);
90 QDir dir(QFileInfo(file).absoluteDir());
92 dir.mkpath(dir.absolutePath());
93 if (!file.open(QFile::WriteOnly | QFile::Text)) {
94 cout << "Couldn't write to " << qPrintable(filename) << ": " << qPrintable(file.errorString())
102 Configure::Configure(int& argc, char** argv)
104 // Default values for indentation
108 // Get console buffer output width
109 CONSOLE_SCREEN_BUFFER_INFO info;
110 HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
111 if (GetConsoleScreenBufferInfo(hStdout, &info))
112 outputWidth = info.dwSize.X - 1;
113 outputWidth = qMin(outputWidth, 79); // Anything wider gets unreadable
114 if (outputWidth < 35) // Insanely small, just use 79
119 ** Set up the initial state, the default
121 dictionary[ "CONFIGCMD" ] = argv[ 0 ];
123 for (i = 1; i < argc; i++)
124 configCmdLine += argv[ i ];
126 if (configCmdLine.size() >= 2 && configCmdLine.at(0) == "-srcdir") {
127 sourcePath = QDir::cleanPath(configCmdLine.at(1));
128 sourceDir = QDir(sourcePath);
129 configCmdLine.erase(configCmdLine.begin(), configCmdLine.begin() + 2);
131 // Get the path to the executable
132 wchar_t module_name[MAX_PATH];
133 GetModuleFileName(0, module_name, sizeof(module_name) / sizeof(wchar_t));
134 QFileInfo sourcePathInfo = QString::fromWCharArray(module_name);
135 sourcePath = sourcePathInfo.absolutePath();
136 sourceDir = sourcePathInfo.dir();
138 buildPath = QDir::currentPath();
140 const QString installPath = QString("C:\\Qt\\%1").arg(QT_VERSION_STR);
142 const QString installPath = buildPath;
144 if (sourceDir != buildDir) { //shadow builds!
145 if (!findFile("perl") && !findFile("perl.exe")) {
146 cout << "Error: Creating a shadow build of Qt requires" << endl
147 << "perl to be in the PATH environment";
148 exit(0); // Exit cleanly for Ctrl+C
151 cout << "Preparing build tree..." << endl;
152 QDir(buildPath).mkpath("bin");
154 { //make a syncqt script(s) that can be used in the shadow
155 QFile syncqt(buildPath + "/bin/syncqt");
156 // no QFile::Text, just in case the perl interpreter can't cope with them (unlikely)
157 if (syncqt.open(QFile::WriteOnly)) {
158 QTextStream stream(&syncqt);
159 stream << "#!/usr/bin/perl -w" << endl
160 << "require \"" << sourcePath + "/bin/syncqt\";" << endl;
162 QFile syncqt_bat(buildPath + "/bin/syncqt.bat");
163 if (syncqt_bat.open(QFile::WriteOnly | QFile::Text)) {
164 QTextStream stream(&syncqt_bat);
165 stream << "@echo off" << endl
166 << "call " << QDir::toNativeSeparators(sourcePath + "/bin/syncqt.bat")
167 << " -qtdir \"" << QDir::toNativeSeparators(buildPath) << "\" %*" << endl;
172 QFile configtests(buildPath + "/bin/qtmodule-configtests");
173 // no QFile::Text, just in case the perl interpreter can't cope with them (unlikely)
174 if (configtests.open(QFile::WriteOnly)) {
175 QTextStream stream(&configtests);
176 stream << "#!/usr/bin/perl -w" << endl
177 << "require \"" << sourcePath + "/bin/qtmodule-configtests\";" << endl;
179 // For Windows CE and shadow builds we need to copy these to the
181 QFile::copy(sourcePath + "/bin/setcepaths.bat" , buildPath + "/bin/setcepaths.bat");
183 buildDir.mkpath("mkspecs");
184 if (!Environment::cpdir(sourcePath + "/mkspecs", buildPath + "/mkspecs")){
185 cout << "Couldn't copy mkspecs!" << sourcePath << " " << buildPath << endl;
186 dictionary["DONE"] = "error";
191 defaultBuildParts << QStringLiteral("libs") << QStringLiteral("tools") << QStringLiteral("examples");
192 dictionary[ "QT_SOURCE_TREE" ] = sourcePath;
193 dictionary[ "QT_BUILD_TREE" ] = buildPath;
194 dictionary[ "QT_INSTALL_PREFIX" ] = installPath;
196 dictionary[ "QMAKESPEC" ] = getenv("QMAKESPEC");
197 if (dictionary[ "QMAKESPEC" ].size() == 0) {
198 dictionary[ "QMAKESPEC" ] = Environment::detectQMakeSpec();
199 dictionary[ "QMAKESPEC_FROM" ] = "detected";
201 dictionary[ "QMAKESPEC_FROM" ] = "env";
204 dictionary[ "QCONFIG" ] = "full";
205 dictionary[ "EMBEDDED" ] = "no";
206 dictionary[ "BUILD_QMAKE" ] = "yes";
207 dictionary[ "DSPFILES" ] = "yes";
208 dictionary[ "VCPROJFILES" ] = "yes";
209 dictionary[ "QMAKE_INTERNAL" ] = "no";
210 dictionary[ "FAST" ] = "no";
211 dictionary[ "NOPROCESS" ] = "no";
212 dictionary[ "WIDGETS" ] = "yes";
213 dictionary[ "RTTI" ] = "yes";
214 dictionary[ "SSE2" ] = "auto";
215 dictionary[ "SSE3" ] = "auto";
216 dictionary[ "SSSE3" ] = "auto";
217 dictionary[ "SSE4_1" ] = "auto";
218 dictionary[ "SSE4_2" ] = "auto";
219 dictionary[ "AVX" ] = "auto";
220 dictionary[ "AVX2" ] = "auto";
221 dictionary[ "IWMMXT" ] = "auto";
222 dictionary[ "SYNCQT" ] = "auto";
223 dictionary[ "CE_CRT" ] = "no";
224 dictionary[ "CETEST" ] = "auto";
225 dictionary[ "CE_SIGNATURE" ] = "no";
226 dictionary[ "PHONON_BACKEND" ] = "yes";
227 dictionary[ "AUDIO_BACKEND" ] = "auto";
228 dictionary[ "WMSDK" ] = "auto";
229 dictionary[ "DIRECTSHOW" ] = "no";
230 dictionary[ "V8SNAPSHOT" ] = "auto";
231 dictionary[ "QML_DEBUG" ] = "yes";
232 dictionary[ "PLUGIN_MANIFESTS" ] = "yes";
233 dictionary[ "DIRECTWRITE" ] = "no";
234 dictionary[ "NIS" ] = "no";
235 dictionary[ "NEON" ] = "no";
236 dictionary[ "LARGE_FILE" ] = "yes";
237 dictionary[ "FONT_CONFIG" ] = "no";
238 dictionary[ "POSIX_IPC" ] = "no";
239 dictionary[ "QT_GLIB" ] = "no";
240 dictionary[ "QT_ICONV" ] = "auto";
241 dictionary[ "QT_CUPS" ] = "auto";
242 dictionary[ "CFG_GCC_SYSROOT" ] = "yes";
244 //Only used when cross compiling.
245 dictionary[ "QT_INSTALL_SETTINGS" ] = "/etc/xdg";
248 QFile qglobal_h(sourcePath + "/src/corelib/global/qglobal.h");
249 if (qglobal_h.open(QFile::ReadOnly)) {
250 QTextStream read(&qglobal_h);
251 QRegExp version_regexp("^# *define *QT_VERSION_STR *\"([^\"]*)\"");
253 while (!read.atEnd()) {
254 line = read.readLine();
255 if (version_regexp.exactMatch(line)) {
256 version = version_regexp.cap(1).trimmed();
257 if (!version.isEmpty())
264 if (version.isEmpty())
265 version = QString("%1.%2.%3").arg(QT_VERSION>>16).arg(((QT_VERSION>>8)&0xff)).arg(QT_VERSION&0xff);
267 dictionary[ "VERSION" ] = version;
269 QRegExp version_re("([0-9]*)\\.([0-9]*)\\.([0-9]*)(|-.*)");
270 if (version_re.exactMatch(version)) {
271 dictionary[ "VERSION_MAJOR" ] = version_re.cap(1);
272 dictionary[ "VERSION_MINOR" ] = version_re.cap(2);
273 dictionary[ "VERSION_PATCH" ] = version_re.cap(3);
277 dictionary[ "REDO" ] = "no";
278 dictionary[ "DEPENDENCIES" ] = "no";
280 dictionary[ "BUILD" ] = "debug";
281 dictionary[ "BUILDALL" ] = "auto"; // Means yes, but not explicitly
283 dictionary[ "BUILDTYPE" ] = "none";
285 dictionary[ "BUILDDEV" ] = "no";
287 dictionary[ "SHARED" ] = "yes";
289 dictionary[ "ZLIB" ] = "auto";
291 dictionary[ "PCRE" ] = "auto";
293 dictionary[ "ICU" ] = "auto";
295 dictionary[ "GIF" ] = "auto";
296 dictionary[ "JPEG" ] = "auto";
297 dictionary[ "PNG" ] = "auto";
298 dictionary[ "LIBJPEG" ] = "auto";
299 dictionary[ "LIBPNG" ] = "auto";
300 dictionary[ "FREETYPE" ] = "yes";
302 dictionary[ "ACCESSIBILITY" ] = "yes";
303 dictionary[ "OPENGL" ] = "yes";
304 dictionary[ "OPENVG" ] = "no";
305 dictionary[ "OPENSSL" ] = "auto";
306 dictionary[ "DBUS" ] = "auto";
308 dictionary[ "STYLE_WINDOWS" ] = "yes";
309 dictionary[ "STYLE_WINDOWSXP" ] = "auto";
310 dictionary[ "STYLE_WINDOWSVISTA" ] = "auto";
311 dictionary[ "STYLE_PLASTIQUE" ] = "yes";
312 dictionary[ "STYLE_CLEANLOOKS" ]= "yes";
313 dictionary[ "STYLE_WINDOWSCE" ] = "no";
314 dictionary[ "STYLE_WINDOWSMOBILE" ] = "no";
315 dictionary[ "STYLE_MOTIF" ] = "yes";
316 dictionary[ "STYLE_CDE" ] = "yes";
317 dictionary[ "STYLE_GTK" ] = "no";
319 dictionary[ "SQL_MYSQL" ] = "no";
320 dictionary[ "SQL_ODBC" ] = "no";
321 dictionary[ "SQL_OCI" ] = "no";
322 dictionary[ "SQL_PSQL" ] = "no";
323 dictionary[ "SQL_TDS" ] = "no";
324 dictionary[ "SQL_DB2" ] = "no";
325 dictionary[ "SQL_SQLITE" ] = "auto";
326 dictionary[ "SQL_SQLITE_LIB" ] = "qt";
327 dictionary[ "SQL_SQLITE2" ] = "no";
328 dictionary[ "SQL_IBASE" ] = "no";
330 QString tmp = dictionary[ "QMAKESPEC" ];
331 if (tmp.contains("\\")) {
332 tmp = tmp.mid(tmp.lastIndexOf("\\") + 1);
334 tmp = tmp.mid(tmp.lastIndexOf("/") + 1);
336 dictionary[ "QMAKESPEC" ] = tmp;
338 dictionary[ "INCREDIBUILD_XGE" ] = "auto";
339 dictionary[ "LTCG" ] = "no";
340 dictionary[ "NATIVE_GESTURES" ] = "yes";
341 dictionary[ "MSVC_MP" ] = "no";
344 Configure::~Configure()
346 for (int i=0; i<3; ++i) {
347 QList<MakeItem*> items = makeList[i];
348 for (int j=0; j<items.size(); ++j)
353 QString Configure::formatPath(const QString &path)
355 QString ret = QDir::cleanPath(path);
356 // This amount of quoting is deemed sufficient.
357 if (ret.contains(QLatin1Char(' '))) {
358 ret.prepend(QLatin1Char('"'));
359 ret.append(QLatin1Char('"'));
364 QString Configure::formatPaths(const QStringList &paths)
367 foreach (const QString &path, paths) {
369 ret += QLatin1Char(' ');
370 ret += formatPath(path);
375 // We could use QDir::homePath() + "/.qt-license", but
376 // that will only look in the first of $HOME,$USERPROFILE
377 // or $HOMEDRIVE$HOMEPATH. So, here we try'em all to be
378 // more forgiving for the end user..
379 QString Configure::firstLicensePath()
381 QStringList allPaths;
382 allPaths << "./.qt-license"
383 << QString::fromLocal8Bit(getenv("HOME")) + "/.qt-license"
384 << QString::fromLocal8Bit(getenv("USERPROFILE")) + "/.qt-license"
385 << QString::fromLocal8Bit(getenv("HOMEDRIVE")) + QString::fromLocal8Bit(getenv("HOMEPATH")) + "/.qt-license";
386 for (int i = 0; i< allPaths.count(); ++i)
387 if (QFile::exists(allPaths.at(i)))
388 return allPaths.at(i);
392 // #### somehow I get a compiler error about vc++ reaching the nesting limit without
393 // undefining the ansi for scoping.
398 void Configure::parseCmdLine()
400 int argCount = configCmdLine.size();
402 const QStringList imageFormats = QStringList() << "gif" << "png" << "jpeg";
405 if (argCount < 1) // skip rest if no arguments
407 else if (configCmdLine.at(i) == "-redo") {
408 dictionary[ "REDO" ] = "yes";
409 configCmdLine.clear();
412 else if (configCmdLine.at(i) == "-loadconfig") {
415 dictionary[ "REDO" ] = "yes";
416 dictionary[ "CUSTOMCONFIG" ] = "_" + configCmdLine.at(i);
417 configCmdLine.clear();
420 dictionary[ "HELP" ] = "yes";
424 argCount = configCmdLine.size();
427 // Look first for XQMAKESPEC
428 for (int j = 0 ; j < argCount; ++j)
430 if (configCmdLine.at(j) == "-xplatform") {
434 dictionary["XQMAKESPEC"] = configCmdLine.at(j);
435 if (!dictionary[ "XQMAKESPEC" ].isEmpty())
436 applySpecSpecifics();
440 for (; i<configCmdLine.size(); ++i) {
441 bool continueElse[] = {false, false};
442 if (configCmdLine.at(i) == "-help"
443 || configCmdLine.at(i) == "-h"
444 || configCmdLine.at(i) == "-?")
445 dictionary[ "HELP" ] = "yes";
448 else if (configCmdLine.at(i) == "-qconfig") {
452 dictionary[ "QCONFIG" ] = configCmdLine.at(i);
455 else if (configCmdLine.at(i) == "-release") {
456 dictionary[ "BUILD" ] = "release";
457 if (dictionary[ "BUILDALL" ] == "auto")
458 dictionary[ "BUILDALL" ] = "no";
459 } else if (configCmdLine.at(i) == "-debug") {
460 dictionary[ "BUILD" ] = "debug";
461 if (dictionary[ "BUILDALL" ] == "auto")
462 dictionary[ "BUILDALL" ] = "no";
463 } else if (configCmdLine.at(i) == "-debug-and-release")
464 dictionary[ "BUILDALL" ] = "yes";
466 else if (configCmdLine.at(i) == "-shared")
467 dictionary[ "SHARED" ] = "yes";
468 else if (configCmdLine.at(i) == "-static")
469 dictionary[ "SHARED" ] = "no";
470 else if (configCmdLine.at(i) == "-developer-build")
471 dictionary[ "BUILDDEV" ] = "yes";
472 else if (configCmdLine.at(i) == "-opensource") {
473 dictionary[ "BUILDTYPE" ] = "opensource";
475 else if (configCmdLine.at(i) == "-commercial") {
476 dictionary[ "BUILDTYPE" ] = "commercial";
478 else if (configCmdLine.at(i) == "-ltcg") {
479 dictionary[ "LTCG" ] = "yes";
481 else if (configCmdLine.at(i) == "-no-ltcg") {
482 dictionary[ "LTCG" ] = "no";
484 else if (configCmdLine.at(i) == "-mp") {
485 dictionary[ "MSVC_MP" ] = "yes";
487 else if (configCmdLine.at(i) == "-no-mp") {
488 dictionary[ "MSVC_MP" ] = "no";
490 else if (configCmdLine.at(i) == "-force-asserts") {
491 dictionary[ "FORCE_ASSERTS" ] = "yes";
497 else if (configCmdLine.at(i) == "-platform") {
501 dictionary[ "QMAKESPEC" ] = configCmdLine.at(i);
502 dictionary[ "QMAKESPEC_FROM" ] = "commandline";
503 } else if (configCmdLine.at(i) == "-arch") {
507 dictionary["OBSOLETE_ARCH_ARG"] = "yes";
508 } else if (configCmdLine.at(i) == "-embedded") {
509 dictionary[ "EMBEDDED" ] = "yes";
510 } else if (configCmdLine.at(i) == "-xplatform") {
517 else if (configCmdLine.at(i) == "-no-zlib") {
518 // No longer supported since Qt 4.4.0
519 // But save the information for later so that we can print a warning
521 // If you REALLY really need no zlib support, you can still disable
522 // it by doing the following:
523 // add "no-zlib" to mkspecs/qconfig.pri
524 // #define QT_NO_COMPRESS (probably by adding to src/corelib/global/qconfig.h)
526 // There's no guarantee that Qt will build under those conditions
528 dictionary[ "ZLIB_FORCED" ] = "yes";
529 } else if (configCmdLine.at(i) == "-qt-zlib") {
530 dictionary[ "ZLIB" ] = "qt";
531 } else if (configCmdLine.at(i) == "-system-zlib") {
532 dictionary[ "ZLIB" ] = "system";
535 else if (configCmdLine.at(i) == "-qt-pcre") {
536 dictionary[ "PCRE" ] = "qt";
537 } else if (configCmdLine.at(i) == "-system-pcre") {
538 dictionary[ "PCRE" ] = "system";
541 else if (configCmdLine.at(i) == "-icu") {
542 dictionary[ "ICU" ] = "yes";
543 } else if (configCmdLine.at(i) == "-no-icu") {
544 dictionary[ "ICU" ] = "no";
547 // Image formats --------------------------------------------
548 else if (configCmdLine.at(i) == "-no-gif")
549 dictionary[ "GIF" ] = "no";
551 else if (configCmdLine.at(i) == "-no-libjpeg") {
552 dictionary[ "JPEG" ] = "no";
553 dictionary[ "LIBJPEG" ] = "no";
554 } else if (configCmdLine.at(i) == "-qt-libjpeg") {
555 dictionary[ "LIBJPEG" ] = "qt";
556 } else if (configCmdLine.at(i) == "-system-libjpeg") {
557 dictionary[ "LIBJPEG" ] = "system";
560 else if (configCmdLine.at(i) == "-no-libpng") {
561 dictionary[ "PNG" ] = "no";
562 dictionary[ "LIBPNG" ] = "no";
563 } else if (configCmdLine.at(i) == "-qt-libpng") {
564 dictionary[ "LIBPNG" ] = "qt";
565 } else if (configCmdLine.at(i) == "-system-libpng") {
566 dictionary[ "LIBPNG" ] = "system";
569 // Text Rendering --------------------------------------------
570 else if (configCmdLine.at(i) == "-no-freetype")
571 dictionary[ "FREETYPE" ] = "no";
572 else if (configCmdLine.at(i) == "-qt-freetype")
573 dictionary[ "FREETYPE" ] = "yes";
574 else if (configCmdLine.at(i) == "-system-freetype")
575 dictionary[ "FREETYPE" ] = "system";
577 // CE- C runtime --------------------------------------------
578 else if (configCmdLine.at(i) == "-crt") {
582 QDir cDir(configCmdLine.at(i));
584 cout << "WARNING: Could not find directory (" << qPrintable(configCmdLine.at(i)) << ")for C runtime deployment" << endl;
586 dictionary[ "CE_CRT" ] = QDir::toNativeSeparators(cDir.absolutePath());
587 } else if (configCmdLine.at(i) == "-qt-crt") {
588 dictionary[ "CE_CRT" ] = "yes";
589 } else if (configCmdLine.at(i) == "-no-crt") {
590 dictionary[ "CE_CRT" ] = "no";
592 // cetest ---------------------------------------------------
593 else if (configCmdLine.at(i) == "-no-cetest") {
594 dictionary[ "CETEST" ] = "no";
595 dictionary[ "CETEST_REQUESTED" ] = "no";
596 } else if (configCmdLine.at(i) == "-cetest") {
597 // although specified to use it, we stay at "auto" state
598 // this is because checkAvailability() adds variables
599 // we need for crosscompilation; but remember if we asked
601 dictionary[ "CETEST_REQUESTED" ] = "yes";
603 // Qt/CE - signing tool -------------------------------------
604 else if (configCmdLine.at(i) == "-signature") {
608 QFileInfo info(configCmdLine.at(i));
610 cout << "WARNING: Could not find signature file (" << qPrintable(configCmdLine.at(i)) << ")" << endl;
612 dictionary[ "CE_SIGNATURE" ] = QDir::toNativeSeparators(info.absoluteFilePath());
614 // Styles ---------------------------------------------------
615 else if (configCmdLine.at(i) == "-qt-style-windows")
616 dictionary[ "STYLE_WINDOWS" ] = "yes";
617 else if (configCmdLine.at(i) == "-no-style-windows")
618 dictionary[ "STYLE_WINDOWS" ] = "no";
620 else if (configCmdLine.at(i) == "-qt-style-windowsce")
621 dictionary[ "STYLE_WINDOWSCE" ] = "yes";
622 else if (configCmdLine.at(i) == "-no-style-windowsce")
623 dictionary[ "STYLE_WINDOWSCE" ] = "no";
624 else if (configCmdLine.at(i) == "-qt-style-windowsmobile")
625 dictionary[ "STYLE_WINDOWSMOBILE" ] = "yes";
626 else if (configCmdLine.at(i) == "-no-style-windowsmobile")
627 dictionary[ "STYLE_WINDOWSMOBILE" ] = "no";
629 else if (configCmdLine.at(i) == "-qt-style-windowsxp")
630 dictionary[ "STYLE_WINDOWSXP" ] = "yes";
631 else if (configCmdLine.at(i) == "-no-style-windowsxp")
632 dictionary[ "STYLE_WINDOWSXP" ] = "no";
634 else if (configCmdLine.at(i) == "-qt-style-windowsvista")
635 dictionary[ "STYLE_WINDOWSVISTA" ] = "yes";
636 else if (configCmdLine.at(i) == "-no-style-windowsvista")
637 dictionary[ "STYLE_WINDOWSVISTA" ] = "no";
639 else if (configCmdLine.at(i) == "-qt-style-plastique")
640 dictionary[ "STYLE_PLASTIQUE" ] = "yes";
641 else if (configCmdLine.at(i) == "-no-style-plastique")
642 dictionary[ "STYLE_PLASTIQUE" ] = "no";
644 else if (configCmdLine.at(i) == "-qt-style-cleanlooks")
645 dictionary[ "STYLE_CLEANLOOKS" ] = "yes";
646 else if (configCmdLine.at(i) == "-no-style-cleanlooks")
647 dictionary[ "STYLE_CLEANLOOKS" ] = "no";
649 else if (configCmdLine.at(i) == "-qt-style-motif")
650 dictionary[ "STYLE_MOTIF" ] = "yes";
651 else if (configCmdLine.at(i) == "-no-style-motif")
652 dictionary[ "STYLE_MOTIF" ] = "no";
654 else if (configCmdLine.at(i) == "-qt-style-cde")
655 dictionary[ "STYLE_CDE" ] = "yes";
656 else if (configCmdLine.at(i) == "-no-style-cde")
657 dictionary[ "STYLE_CDE" ] = "no";
659 // Work around compiler nesting limitation
661 continueElse[1] = true;
662 if (!continueElse[1]) {
665 // OpenGL Support -------------------------------------------
666 else if (configCmdLine.at(i) == "-no-opengl") {
667 dictionary[ "OPENGL" ] = "no";
668 } else if (configCmdLine.at(i) == "-opengl-es-cm") {
669 dictionary[ "OPENGL" ] = "yes";
670 dictionary[ "OPENGL_ES_CM" ] = "yes";
671 } else if (configCmdLine.at(i) == "-opengl-es-2") {
672 dictionary[ "OPENGL" ] = "yes";
673 dictionary[ "OPENGL_ES_2" ] = "yes";
674 } else if (configCmdLine.at(i) == "-opengl") {
675 dictionary[ "OPENGL" ] = "yes";
680 if (configCmdLine.at(i) == "es1") {
681 dictionary[ "OPENGL_ES_CM" ] = "yes";
682 } else if ( configCmdLine.at(i) == "es2" ) {
683 dictionary[ "OPENGL_ES_2" ] = "yes";
684 } else if ( configCmdLine.at(i) == "desktop" ) {
685 // OPENGL=yes suffices
687 cout << "Argument passed to -opengl option is not valid." << endl;
688 dictionary[ "DONE" ] = "error";
691 // External location of ANGLE library (Open GL ES 2)
692 } else if (configCmdLine.at(i) == QStringLiteral("-angle")) {
695 const QFileInfo fi(configCmdLine.at(i));
697 cout << "Argument passed to -angle option is not a directory." << endl;
698 dictionary.insert(QStringLiteral("DONE"), QStringLiteral( "error"));
700 dictionary.insert(QStringLiteral("ANGLE_DIR"), fi.absoluteFilePath());
703 // OpenVG Support -------------------------------------------
704 else if (configCmdLine.at(i) == "-openvg") {
705 dictionary[ "OPENVG" ] = "yes";
706 } else if (configCmdLine.at(i) == "-no-openvg") {
707 dictionary[ "OPENVG" ] = "no";
710 // Databases ------------------------------------------------
711 else if (configCmdLine.at(i) == "-qt-sql-mysql")
712 dictionary[ "SQL_MYSQL" ] = "yes";
713 else if (configCmdLine.at(i) == "-plugin-sql-mysql")
714 dictionary[ "SQL_MYSQL" ] = "plugin";
715 else if (configCmdLine.at(i) == "-no-sql-mysql")
716 dictionary[ "SQL_MYSQL" ] = "no";
718 else if (configCmdLine.at(i) == "-qt-sql-odbc")
719 dictionary[ "SQL_ODBC" ] = "yes";
720 else if (configCmdLine.at(i) == "-plugin-sql-odbc")
721 dictionary[ "SQL_ODBC" ] = "plugin";
722 else if (configCmdLine.at(i) == "-no-sql-odbc")
723 dictionary[ "SQL_ODBC" ] = "no";
725 else if (configCmdLine.at(i) == "-qt-sql-oci")
726 dictionary[ "SQL_OCI" ] = "yes";
727 else if (configCmdLine.at(i) == "-plugin-sql-oci")
728 dictionary[ "SQL_OCI" ] = "plugin";
729 else if (configCmdLine.at(i) == "-no-sql-oci")
730 dictionary[ "SQL_OCI" ] = "no";
732 else if (configCmdLine.at(i) == "-qt-sql-psql")
733 dictionary[ "SQL_PSQL" ] = "yes";
734 else if (configCmdLine.at(i) == "-plugin-sql-psql")
735 dictionary[ "SQL_PSQL" ] = "plugin";
736 else if (configCmdLine.at(i) == "-no-sql-psql")
737 dictionary[ "SQL_PSQL" ] = "no";
739 else if (configCmdLine.at(i) == "-qt-sql-tds")
740 dictionary[ "SQL_TDS" ] = "yes";
741 else if (configCmdLine.at(i) == "-plugin-sql-tds")
742 dictionary[ "SQL_TDS" ] = "plugin";
743 else if (configCmdLine.at(i) == "-no-sql-tds")
744 dictionary[ "SQL_TDS" ] = "no";
746 else if (configCmdLine.at(i) == "-qt-sql-db2")
747 dictionary[ "SQL_DB2" ] = "yes";
748 else if (configCmdLine.at(i) == "-plugin-sql-db2")
749 dictionary[ "SQL_DB2" ] = "plugin";
750 else if (configCmdLine.at(i) == "-no-sql-db2")
751 dictionary[ "SQL_DB2" ] = "no";
753 else if (configCmdLine.at(i) == "-qt-sql-sqlite")
754 dictionary[ "SQL_SQLITE" ] = "yes";
755 else if (configCmdLine.at(i) == "-plugin-sql-sqlite")
756 dictionary[ "SQL_SQLITE" ] = "plugin";
757 else if (configCmdLine.at(i) == "-no-sql-sqlite")
758 dictionary[ "SQL_SQLITE" ] = "no";
759 else if (configCmdLine.at(i) == "-system-sqlite")
760 dictionary[ "SQL_SQLITE_LIB" ] = "system";
761 else if (configCmdLine.at(i) == "-qt-sql-sqlite2")
762 dictionary[ "SQL_SQLITE2" ] = "yes";
763 else if (configCmdLine.at(i) == "-plugin-sql-sqlite2")
764 dictionary[ "SQL_SQLITE2" ] = "plugin";
765 else if (configCmdLine.at(i) == "-no-sql-sqlite2")
766 dictionary[ "SQL_SQLITE2" ] = "no";
768 else if (configCmdLine.at(i) == "-qt-sql-ibase")
769 dictionary[ "SQL_IBASE" ] = "yes";
770 else if (configCmdLine.at(i) == "-plugin-sql-ibase")
771 dictionary[ "SQL_IBASE" ] = "plugin";
772 else if (configCmdLine.at(i) == "-no-sql-ibase")
773 dictionary[ "SQL_IBASE" ] = "no";
775 // Image formats --------------------------------------------
776 else if (configCmdLine.at(i).startsWith("-qt-imageformat-") &&
777 imageFormats.contains(configCmdLine.at(i).section('-', 3)))
778 dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "yes";
779 else if (configCmdLine.at(i).startsWith("-plugin-imageformat-") &&
780 imageFormats.contains(configCmdLine.at(i).section('-', 3)))
781 dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "plugin";
782 else if (configCmdLine.at(i).startsWith("-no-imageformat-") &&
783 imageFormats.contains(configCmdLine.at(i).section('-', 3)))
784 dictionary[ configCmdLine.at(i).section('-', 3).toUpper() ] = "no";
786 // IDE project generation -----------------------------------
787 else if (configCmdLine.at(i) == "-no-dsp")
788 dictionary[ "DSPFILES" ] = "no";
789 else if (configCmdLine.at(i) == "-dsp")
790 dictionary[ "DSPFILES" ] = "yes";
792 else if (configCmdLine.at(i) == "-no-vcp")
793 dictionary[ "VCPFILES" ] = "no";
794 else if (configCmdLine.at(i) == "-vcp")
795 dictionary[ "VCPFILES" ] = "yes";
797 else if (configCmdLine.at(i) == "-no-vcproj")
798 dictionary[ "VCPROJFILES" ] = "no";
799 else if (configCmdLine.at(i) == "-vcproj")
800 dictionary[ "VCPROJFILES" ] = "yes";
802 else if (configCmdLine.at(i) == "-no-incredibuild-xge")
803 dictionary[ "INCREDIBUILD_XGE" ] = "no";
804 else if (configCmdLine.at(i) == "-incredibuild-xge")
805 dictionary[ "INCREDIBUILD_XGE" ] = "yes";
806 else if (configCmdLine.at(i) == "-native-gestures")
807 dictionary[ "NATIVE_GESTURES" ] = "yes";
808 else if (configCmdLine.at(i) == "-no-native-gestures")
809 dictionary[ "NATIVE_GESTURES" ] = "no";
811 // Others ---------------------------------------------------
812 else if (configCmdLine.at(i) == "-fast")
813 dictionary[ "FAST" ] = "yes";
814 else if (configCmdLine.at(i) == "-no-fast")
815 dictionary[ "FAST" ] = "no";
817 else if (configCmdLine.at(i) == "-widgets")
818 dictionary[ "WIDGETS" ] = "yes";
819 else if (configCmdLine.at(i) == "-no-widgets")
820 dictionary[ "WIDGETS" ] = "no";
822 else if (configCmdLine.at(i) == "-rtti")
823 dictionary[ "RTTI" ] = "yes";
824 else if (configCmdLine.at(i) == "-no-rtti")
825 dictionary[ "RTTI" ] = "no";
827 else if (configCmdLine.at(i) == "-accessibility")
828 dictionary[ "ACCESSIBILITY" ] = "yes";
829 else if (configCmdLine.at(i) == "-no-accessibility") {
830 dictionary[ "ACCESSIBILITY" ] = "no";
831 cout << "Setting accessibility to NO" << endl;
834 else if (configCmdLine.at(i) == "-no-sse2")
835 dictionary[ "SSE2" ] = "no";
836 else if (configCmdLine.at(i) == "-sse2")
837 dictionary[ "SSE2" ] = "yes";
838 else if (configCmdLine.at(i) == "-no-sse3")
839 dictionary[ "SSE3" ] = "no";
840 else if (configCmdLine.at(i) == "-sse3")
841 dictionary[ "SSE3" ] = "yes";
842 else if (configCmdLine.at(i) == "-no-ssse3")
843 dictionary[ "SSSE3" ] = "no";
844 else if (configCmdLine.at(i) == "-ssse3")
845 dictionary[ "SSSE3" ] = "yes";
846 else if (configCmdLine.at(i) == "-no-sse4.1")
847 dictionary[ "SSE4_1" ] = "no";
848 else if (configCmdLine.at(i) == "-sse4.1")
849 dictionary[ "SSE4_1" ] = "yes";
850 else if (configCmdLine.at(i) == "-no-sse4.2")
851 dictionary[ "SSE4_2" ] = "no";
852 else if (configCmdLine.at(i) == "-sse4.2")
853 dictionary[ "SSE4_2" ] = "yes";
854 else if (configCmdLine.at(i) == "-no-avx")
855 dictionary[ "AVX" ] = "no";
856 else if (configCmdLine.at(i) == "-avx")
857 dictionary[ "AVX" ] = "yes";
858 else if (configCmdLine.at(i) == "-no-avx2")
859 dictionary[ "AVX2" ] = "no";
860 else if (configCmdLine.at(i) == "-avx2")
861 dictionary[ "AVX2" ] = "yes";
862 else if (configCmdLine.at(i) == "-no-iwmmxt")
863 dictionary[ "IWMMXT" ] = "no";
864 else if (configCmdLine.at(i) == "-iwmmxt")
865 dictionary[ "IWMMXT" ] = "yes";
867 else if (configCmdLine.at(i) == "-no-openssl") {
868 dictionary[ "OPENSSL"] = "no";
869 } else if (configCmdLine.at(i) == "-openssl") {
870 dictionary[ "OPENSSL" ] = "yes";
871 } else if (configCmdLine.at(i) == "-openssl-linked") {
872 dictionary[ "OPENSSL" ] = "linked";
873 } else if (configCmdLine.at(i) == "-no-qdbus") {
874 dictionary[ "DBUS" ] = "no";
875 } else if (configCmdLine.at(i) == "-qdbus") {
876 dictionary[ "DBUS" ] = "yes";
877 } else if (configCmdLine.at(i) == "-no-dbus") {
878 dictionary[ "DBUS" ] = "no";
879 } else if (configCmdLine.at(i) == "-dbus") {
880 dictionary[ "DBUS" ] = "yes";
881 } else if (configCmdLine.at(i) == "-dbus-linked") {
882 dictionary[ "DBUS" ] = "linked";
883 } else if (configCmdLine.at(i) == "-audio-backend") {
884 dictionary[ "AUDIO_BACKEND" ] = "yes";
885 } else if (configCmdLine.at(i) == "-no-audio-backend") {
886 dictionary[ "AUDIO_BACKEND" ] = "no";
887 } else if (configCmdLine.at(i) == "-no-phonon-backend") {
888 dictionary[ "PHONON_BACKEND" ] = "no";
889 } else if (configCmdLine.at(i) == "-phonon-backend") {
890 dictionary[ "PHONON_BACKEND" ] = "yes";
891 } else if (configCmdLine.at(i) == "-phonon-wince-ds9") {
892 dictionary[ "DIRECTSHOW" ] = "yes";
893 } else if (configCmdLine.at(i) == "-no-qml-debug") {
894 dictionary[ "QML_DEBUG" ] = "no";
895 } else if (configCmdLine.at(i) == "-qml-debug") {
896 dictionary[ "QML_DEBUG" ] = "yes";
897 } else if (configCmdLine.at(i) == "-no-plugin-manifests") {
898 dictionary[ "PLUGIN_MANIFESTS" ] = "no";
899 } else if (configCmdLine.at(i) == "-plugin-manifests") {
900 dictionary[ "PLUGIN_MANIFESTS" ] = "yes";
903 // Work around compiler nesting limitation
905 continueElse[0] = true;
906 if (!continueElse[0]) {
909 else if (configCmdLine.at(i) == "-internal")
910 dictionary[ "QMAKE_INTERNAL" ] = "yes";
912 else if (configCmdLine.at(i) == "-no-syncqt")
913 dictionary[ "SYNCQT" ] = "no";
915 else if (configCmdLine.at(i) == "-no-qmake")
916 dictionary[ "BUILD_QMAKE" ] = "no";
917 else if (configCmdLine.at(i) == "-qmake")
918 dictionary[ "BUILD_QMAKE" ] = "yes";
920 else if (configCmdLine.at(i) == "-dont-process")
921 dictionary[ "NOPROCESS" ] = "yes";
922 else if (configCmdLine.at(i) == "-process")
923 dictionary[ "NOPROCESS" ] = "no";
925 else if (configCmdLine.at(i) == "-no-qmake-deps")
926 dictionary[ "DEPENDENCIES" ] = "no";
927 else if (configCmdLine.at(i) == "-qmake-deps")
928 dictionary[ "DEPENDENCIES" ] = "yes";
931 else if (configCmdLine.at(i) == "-qtnamespace") {
935 dictionary[ "QT_NAMESPACE" ] = configCmdLine.at(i);
936 } else if (configCmdLine.at(i) == "-qtlibinfix") {
940 dictionary[ "QT_LIBINFIX" ] = configCmdLine.at(i);
941 } else if (configCmdLine.at(i) == "-D") {
945 qmakeDefines += configCmdLine.at(i);
946 } else if (configCmdLine.at(i) == "-I") {
950 qmakeIncludes += configCmdLine.at(i);
951 } else if (configCmdLine.at(i) == "-L") {
955 QFileInfo checkDirectory(configCmdLine.at(i));
956 if (!checkDirectory.isDir()) {
957 cout << "Argument passed to -L option is not a directory path. Did you mean the -l option?" << endl;
958 dictionary[ "DONE" ] = "error";
961 qmakeLibs += QString("-L" + configCmdLine.at(i));
962 } else if (configCmdLine.at(i) == "-l") {
966 qmakeLibs += QString("-l" + configCmdLine.at(i));
967 } else if (configCmdLine.at(i).startsWith("OPENSSL_LIBS=")) {
968 opensslLibs = configCmdLine.at(i);
969 } else if (configCmdLine.at(i).startsWith("OPENSSL_LIBS_DEBUG=")) {
970 opensslLibsDebug = configCmdLine.at(i);
971 } else if (configCmdLine.at(i).startsWith("OPENSSL_LIBS_RELEASE=")) {
972 opensslLibsRelease = configCmdLine.at(i);
973 } else if (configCmdLine.at(i).startsWith("PSQL_LIBS=")) {
974 psqlLibs = configCmdLine.at(i);
975 } else if (configCmdLine.at(i).startsWith("SYBASE=")) {
976 sybase = configCmdLine.at(i);
977 } else if (configCmdLine.at(i).startsWith("SYBASE_LIBS=")) {
978 sybaseLibs = configCmdLine.at(i);
981 else if ((configCmdLine.at(i) == "-override-version") || (configCmdLine.at(i) == "-version-override")){
985 dictionary[ "VERSION" ] = configCmdLine.at(i);
988 else if (configCmdLine.at(i) == "-saveconfig") {
992 dictionary[ "CUSTOMCONFIG" ] = "_" + configCmdLine.at(i);
995 else if (configCmdLine.at(i) == "-confirm-license") {
996 dictionary["LICENSE_CONFIRMED"] = "yes";
999 else if (configCmdLine.at(i) == "-make") {
1003 buildParts += configCmdLine.at(i);
1004 } else if (configCmdLine.at(i) == "-nomake") {
1008 nobuildParts.append(configCmdLine.at(i));
1011 // Directories ----------------------------------------------
1012 else if (configCmdLine.at(i) == "-prefix") {
1016 dictionary[ "QT_INSTALL_PREFIX" ] = configCmdLine.at(i);
1019 else if (configCmdLine.at(i) == "-bindir") {
1023 dictionary[ "QT_INSTALL_BINS" ] = configCmdLine.at(i);
1026 else if (configCmdLine.at(i) == "-libdir") {
1030 dictionary[ "QT_INSTALL_LIBS" ] = configCmdLine.at(i);
1033 else if (configCmdLine.at(i) == "-docdir") {
1037 dictionary[ "QT_INSTALL_DOCS" ] = configCmdLine.at(i);
1040 else if (configCmdLine.at(i) == "-headerdir") {
1044 dictionary[ "QT_INSTALL_HEADERS" ] = configCmdLine.at(i);
1047 else if (configCmdLine.at(i) == "-plugindir") {
1051 dictionary[ "QT_INSTALL_PLUGINS" ] = configCmdLine.at(i);
1054 else if (configCmdLine.at(i) == "-importdir") {
1058 dictionary[ "QT_INSTALL_IMPORTS" ] = configCmdLine.at(i);
1060 else if (configCmdLine.at(i) == "-datadir") {
1064 dictionary[ "QT_INSTALL_DATA" ] = configCmdLine.at(i);
1067 else if (configCmdLine.at(i) == "-translationdir") {
1071 dictionary[ "QT_INSTALL_TRANSLATIONS" ] = configCmdLine.at(i);
1074 else if (configCmdLine.at(i) == "-examplesdir") {
1078 dictionary[ "QT_INSTALL_EXAMPLES" ] = configCmdLine.at(i);
1081 else if (configCmdLine.at(i) == "-testsdir") {
1085 dictionary[ "QT_INSTALL_TESTS" ] = configCmdLine.at(i);
1088 else if (configCmdLine.at(i) == "-sysroot") {
1092 dictionary[ "CFG_SYSROOT" ] = configCmdLine.at(i);
1094 else if (configCmdLine.at(i) == "-no-gcc-sysroot") {
1095 dictionary[ "CFG_GCC_SYSROOT" ] = "no";
1098 else if (configCmdLine.at(i) == "-hostprefix") {
1100 if (i == argCount || configCmdLine.at(i).startsWith('-'))
1101 dictionary[ "QT_HOST_PREFIX" ] = dictionary[ "QT_BUILD_TREE" ];
1103 dictionary[ "QT_HOST_PREFIX" ] = configCmdLine.at(i);
1106 else if (configCmdLine.at(i) == "-hostbindir") {
1110 dictionary[ "QT_HOST_BINS" ] = configCmdLine.at(i);
1113 else if (configCmdLine.at(i) == "-hostdatadir") {
1117 dictionary[ "QT_HOST_DATA" ] = configCmdLine.at(i);
1120 else if (configCmdLine.at(i) == "-make-tool") {
1124 dictionary[ "MAKE" ] = configCmdLine.at(i);
1127 else if (configCmdLine.at(i).indexOf(QRegExp("^-(en|dis)able-")) != -1) {
1128 // Scan to see if any specific modules and drivers are enabled or disabled
1129 for (QStringList::Iterator module = modules.begin(); module != modules.end(); ++module) {
1130 if (configCmdLine.at(i) == QString("-enable-") + (*module)) {
1131 enabledModules += (*module);
1134 else if (configCmdLine.at(i) == QString("-disable-") + (*module)) {
1135 disabledModules += (*module);
1141 else if (configCmdLine.at(i) == "-directwrite") {
1142 dictionary["DIRECTWRITE"] = "yes";
1143 } else if (configCmdLine.at(i) == "-no-directwrite") {
1144 dictionary["DIRECTWRITE"] = "no";
1147 else if (configCmdLine.at(i) == "-nis") {
1148 dictionary["NIS"] = "yes";
1149 } else if (configCmdLine.at(i) == "-no-nis") {
1150 dictionary["NIS"] = "no";
1153 else if (configCmdLine.at(i) == "-cups") {
1154 dictionary["QT_CUPS"] = "yes";
1155 } else if (configCmdLine.at(i) == "-no-cups") {
1156 dictionary["QT_CUPS"] = "no";
1159 else if (configCmdLine.at(i) == "-iconv") {
1160 dictionary["QT_ICONV"] = "yes";
1161 } else if (configCmdLine.at(i) == "-no-iconv") {
1162 dictionary["QT_ICONV"] = "no";
1163 } else if (configCmdLine.at(i) == "-sun-iconv") {
1164 dictionary["QT_ICONV"] = "sun";
1165 } else if (configCmdLine.at(i) == "-gnu-iconv") {
1166 dictionary["QT_ICONV"] = "gnu";
1169 else if (configCmdLine.at(i) == "-neon") {
1170 dictionary["NEON"] = "yes";
1171 } else if (configCmdLine.at(i) == "-no-neon") {
1172 dictionary["NEON"] = "no";
1175 else if (configCmdLine.at(i) == "-largefile") {
1176 dictionary["LARGE_FILE"] = "yes";
1179 else if (configCmdLine.at(i) == "-fontconfig") {
1180 dictionary["FONT_CONFIG"] = "yes";
1181 } else if (configCmdLine.at(i) == "-no-fontconfig") {
1182 dictionary["FONT_CONFIG"] = "no";
1185 else if (configCmdLine.at(i) == "-posix-ipc") {
1186 dictionary["POSIX_IPC"] = "yes";
1189 else if (configCmdLine.at(i) == "-glib") {
1190 dictionary["QT_GLIB"] = "yes";
1193 else if (configCmdLine.at(i) == "-sysconfdir") {
1198 dictionary["QT_INSTALL_SETTINGS"] = configCmdLine.at(i);
1202 dictionary[ "HELP" ] = "yes";
1203 cout << "Unknown option " << configCmdLine.at(i) << endl;
1210 // Ensure that QMAKESPEC exists in the mkspecs folder
1211 const QString mkspecPath(sourcePath + "/mkspecs");
1212 QDirIterator itMkspecs(mkspecPath, QDir::AllDirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
1213 QStringList mkspecs;
1215 while (itMkspecs.hasNext()) {
1216 QString mkspec = itMkspecs.next();
1218 mkspec.remove(0, mkspecPath.length() + 1);
1222 if (dictionary["QMAKESPEC"].toLower() == "features"
1223 || !mkspecs.contains(dictionary["QMAKESPEC"], Qt::CaseInsensitive)) {
1224 dictionary[ "HELP" ] = "yes";
1225 if (dictionary ["QMAKESPEC_FROM"] == "commandline") {
1226 cout << "Invalid option \"" << dictionary["QMAKESPEC"] << "\" for -platform." << endl;
1227 } else if (dictionary ["QMAKESPEC_FROM"] == "env") {
1228 cout << "QMAKESPEC environment variable is set to \"" << dictionary["QMAKESPEC"]
1229 << "\" which is not a supported platform" << endl;
1230 } else { // was autodetected from environment
1231 cout << "Unable to detect the platform from environment. Use -platform command line"
1232 "argument or set the QMAKESPEC environment variable and run configure again" << endl;
1234 cout << "See the README file for a list of supported operating systems and compilers." << endl;
1236 if (dictionary[ "QMAKESPEC" ].endsWith("-icc") ||
1237 dictionary[ "QMAKESPEC" ].endsWith("-msvc") ||
1238 dictionary[ "QMAKESPEC" ].endsWith("-msvc.net") ||
1239 dictionary[ "QMAKESPEC" ].endsWith("-msvc2002") ||
1240 dictionary[ "QMAKESPEC" ].endsWith("-msvc2003") ||
1241 dictionary[ "QMAKESPEC" ].endsWith("-msvc2005") ||
1242 dictionary[ "QMAKESPEC" ].endsWith("-msvc2008") ||
1243 dictionary[ "QMAKESPEC" ].endsWith("-msvc2010") ||
1244 dictionary[ "QMAKESPEC" ].endsWith("-msvc11")) {
1245 if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "nmake";
1246 dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32";
1247 } else if (dictionary[ "QMAKESPEC" ] == QString("win32-g++")) {
1248 if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "mingw32-make";
1249 dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32-g++";
1251 if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "make";
1252 dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32";
1256 // Tell the user how to proceed building Qt after configure finished its job
1257 dictionary["QTBUILDINSTRUCTION"] = dictionary["MAKE"];
1258 if (dictionary.contains("XQMAKESPEC")) {
1259 if (dictionary["XQMAKESPEC"].startsWith("wince")) {
1260 dictionary["QTBUILDINSTRUCTION"] =
1261 QString("setcepaths.bat ") + dictionary["XQMAKESPEC"] + QString(" && ") + dictionary["MAKE"];
1265 // Tell the user how to confclean before the next configure
1266 dictionary["CONFCLEANINSTRUCTION"] = dictionary["MAKE"] + QString(" confclean");
1268 // Ensure that -spec (XQMAKESPEC) exists in the mkspecs folder as well
1269 if (dictionary.contains("XQMAKESPEC") &&
1270 !mkspecs.contains(dictionary["XQMAKESPEC"], Qt::CaseInsensitive)) {
1271 dictionary["HELP"] = "yes";
1272 cout << "Invalid option \"" << dictionary["XQMAKESPEC"] << "\" for -xplatform." << endl;
1275 // Ensure that the crt to be deployed can be found
1276 if (dictionary["CE_CRT"] != QLatin1String("yes") && dictionary["CE_CRT"] != QLatin1String("no")) {
1277 QDir cDir(dictionary["CE_CRT"]);
1278 QStringList entries = cDir.entryList();
1279 bool hasDebug = entries.contains("msvcr80.dll");
1280 bool hasRelease = entries.contains("msvcr80d.dll");
1281 if ((dictionary["BUILDALL"] == "auto") && (!hasDebug || !hasRelease)) {
1282 cout << "Could not find debug and release c-runtime." << endl;
1283 cout << "You need to have msvcr80.dll and msvcr80d.dll in" << endl;
1284 cout << "the path specified. Setting to -no-crt";
1285 dictionary[ "CE_CRT" ] = "no";
1286 } else if ((dictionary["BUILD"] == "debug") && !hasDebug) {
1287 cout << "Could not find debug c-runtime (msvcr80d.dll) in the directory specified." << endl;
1288 cout << "Setting c-runtime automatic deployment to -no-crt" << endl;
1289 dictionary[ "CE_CRT" ] = "no";
1290 } else if ((dictionary["BUILD"] == "release") && !hasRelease) {
1291 cout << "Could not find release c-runtime (msvcr80.dll) in the directory specified." << endl;
1292 cout << "Setting c-runtime automatic deployment to -no-crt" << endl;
1293 dictionary[ "CE_CRT" ] = "no";
1297 // Allow tests for private classes to be compiled against internal builds
1298 if (dictionary["BUILDDEV"] == "yes")
1299 qtConfig += "private_tests";
1301 if (dictionary["FORCE_ASSERTS"] == "yes")
1302 qtConfig += "force_asserts";
1305 for (QStringList::Iterator dis = disabledModules.begin(); dis != disabledModules.end(); ++dis) {
1306 modules.removeAll((*dis));
1308 for (QStringList::Iterator ena = enabledModules.begin(); ena != enabledModules.end(); ++ena) {
1309 if (modules.indexOf((*ena)) == -1)
1312 qtConfig += modules;
1314 for (QStringList::Iterator it = disabledModules.begin(); it != disabledModules.end(); ++it)
1315 qtConfig.removeAll(*it);
1317 if ((dictionary[ "REDO" ] != "yes") && (dictionary[ "HELP" ] != "yes"))
1323 void Configure::validateArgs()
1325 // Validate the specified config
1327 // Get all possible configurations from the file system.
1329 QStringList filters;
1330 filters << "qconfig-*.h";
1331 dir.setNameFilters(filters);
1332 dir.setPath(sourcePath + "/src/corelib/global/");
1334 QStringList stringList = dir.entryList();
1336 QStringList::Iterator it;
1337 for (it = stringList.begin(); it != stringList.end(); ++it)
1338 allConfigs << it->remove("qconfig-").remove(".h");
1339 allConfigs << "full";
1341 // Try internal configurations first.
1342 QStringList possible_configs = QStringList()
1348 int index = possible_configs.indexOf(dictionary["QCONFIG"]);
1350 for (int c = 0; c <= index; c++) {
1351 qmakeConfig += possible_configs[c] + "-config";
1356 // If the internal configurations failed, try others.
1357 QStringList::Iterator config;
1358 for (config = allConfigs.begin(); config != allConfigs.end(); ++config) {
1359 if ((*config) == dictionary[ "QCONFIG" ])
1362 if (config == allConfigs.end()) {
1363 dictionary[ "HELP" ] = "yes";
1364 cout << "No such configuration \"" << qPrintable(dictionary[ "QCONFIG" ]) << "\"" << endl ;
1367 qmakeConfig += (*config) + "-config";
1372 // Output helper functions --------------------------------[ Start ]-
1374 Determines the length of a string token.
1376 static int tokenLength(const char *str)
1381 const char *nextToken = strpbrk(str, " _/\n\r");
1382 if (nextToken == str || !nextToken)
1385 return int(nextToken - str);
1389 Prints out a string which starts at position \a startingAt, and
1390 indents each wrapped line with \a wrapIndent characters.
1391 The wrap point is set to the console width, unless that width
1392 cannot be determined, or is too small.
1394 void Configure::desc(const char *description, int startingAt, int wrapIndent)
1396 int linePos = startingAt;
1398 bool firstLine = true;
1399 const char *nextToken = description;
1400 while (*nextToken) {
1401 int nextTokenLen = tokenLength(nextToken);
1402 if (*nextToken == '\n' // Wrap on newline, duh
1403 || (linePos + nextTokenLen > outputWidth)) // Wrap at outputWidth
1408 if (*nextToken == '\n')
1412 if (!firstLine && linePos < wrapIndent) { // Indent to wrapIndent
1413 printf("%*s", wrapIndent , "");
1414 linePos = wrapIndent;
1415 if (*nextToken == ' ') {
1420 printf("%.*s", nextTokenLen, nextToken);
1421 linePos += nextTokenLen;
1422 nextToken += nextTokenLen;
1427 Prints out an option with its description wrapped at the
1428 description starting point. If \a skipIndent is true, the
1429 indentation to the option is not outputted (used by marked option
1430 version of desc()). Extra spaces between option and its
1431 description is filled with\a fillChar, if there's available
1434 void Configure::desc(const char *option, const char *description, bool skipIndent, char fillChar)
1437 printf("%*s", optionIndent, "");
1439 int remaining = descIndent - optionIndent - strlen(option);
1440 int wrapIndent = descIndent + qMax(0, 1 - remaining);
1441 printf("%s", option);
1443 if (remaining > 2) {
1444 printf(" "); // Space in front
1445 for (int i = remaining; i > 2; --i)
1446 printf("%c", fillChar); // Fill, if available space
1448 printf(" "); // Space between option and description
1450 desc(description, wrapIndent, wrapIndent);
1455 Same as above, except it also marks an option with an '*', if
1456 the option is default action.
1458 void Configure::desc(const char *mark_option, const char *mark, const char *option, const char *description, char fillChar)
1460 const QString markedAs = dictionary.value(mark_option);
1461 if (markedAs == "auto" && markedAs == mark) // both "auto", always => +
1463 else if (markedAs == "auto") // setting marked as "auto" and option is default => +
1464 printf(" %c " , (defaultTo(mark_option) == QLatin1String(mark))? '+' : ' ');
1465 else if (QLatin1String(mark) == "auto" && markedAs != "no") // description marked as "auto" and option is available => +
1466 printf(" %c " , checkAvailability(mark_option) ? '+' : ' ');
1467 else // None are "auto", (markedAs == mark) => *
1468 printf(" %c " , markedAs == QLatin1String(mark) ? '*' : ' ');
1470 desc(option, description, true, fillChar);
1474 Modifies the default configuration based on given -platform option.
1475 Eg. switches to different default styles for Windows CE.
1477 void Configure::applySpecSpecifics()
1479 if (!dictionary[ "XQMAKESPEC" ].isEmpty()) {
1480 //Disable building tools, docs and translations when cross compiling.
1481 nobuildParts << "docs" << "translations" << "tools";
1484 if (dictionary[ "XQMAKESPEC" ].startsWith("wince")) {
1485 dictionary[ "STYLE_WINDOWSXP" ] = "no";
1486 dictionary[ "STYLE_WINDOWSVISTA" ] = "no";
1487 dictionary[ "STYLE_PLASTIQUE" ] = "no";
1488 dictionary[ "STYLE_CLEANLOOKS" ] = "no";
1489 dictionary[ "STYLE_WINDOWSCE" ] = "yes";
1490 dictionary[ "STYLE_WINDOWSMOBILE" ] = "yes";
1491 dictionary[ "STYLE_MOTIF" ] = "no";
1492 dictionary[ "STYLE_CDE" ] = "no";
1493 dictionary[ "FREETYPE" ] = "no";
1494 dictionary[ "OPENGL" ] = "no";
1495 dictionary[ "OPENSSL" ] = "no";
1496 dictionary[ "RTTI" ] = "no";
1497 dictionary[ "SSE2" ] = "no";
1498 dictionary[ "SSE3" ] = "no";
1499 dictionary[ "SSSE3" ] = "no";
1500 dictionary[ "SSE4_1" ] = "no";
1501 dictionary[ "SSE4_2" ] = "no";
1502 dictionary[ "AVX" ] = "no";
1503 dictionary[ "AVX2" ] = "no";
1504 dictionary[ "IWMMXT" ] = "no";
1505 dictionary[ "CE_CRT" ] = "yes";
1506 dictionary[ "DIRECTSHOW" ] = "no";
1507 dictionary[ "LARGE_FILE" ] = "no";
1508 // We only apply MMX/IWMMXT for mkspecs we know they work
1509 if (dictionary[ "XQMAKESPEC" ].startsWith("wincewm")) {
1510 dictionary[ "MMX" ] = "yes";
1511 dictionary[ "IWMMXT" ] = "yes";
1512 dictionary[ "DIRECTSHOW" ] = "yes";
1514 } else if (dictionary[ "XQMAKESPEC" ].startsWith("linux")) { //TODO actually wrong.
1516 dictionary[ "STYLE_WINDOWSXP" ] = "no";
1517 dictionary[ "STYLE_WINDOWSVISTA" ] = "no";
1518 dictionary[ "KBD_DRIVERS" ] = "tty";
1519 dictionary[ "GFX_DRIVERS" ] = "linuxfb";
1520 dictionary[ "MOUSE_DRIVERS" ] = "pc linuxtp";
1521 dictionary[ "OPENGL" ] = "no";
1522 dictionary[ "DBUS"] = "no";
1523 dictionary[ "QT_INOTIFY" ] = "no";
1524 dictionary[ "QT_CUPS" ] = "no";
1525 dictionary[ "QT_GLIB" ] = "no";
1526 dictionary[ "QT_ICONV" ] = "no";
1528 dictionary["DECORATIONS"] = "default windows styled";
1532 QString Configure::locateFileInPaths(const QString &fileName, const QStringList &paths)
1535 for (QStringList::ConstIterator it = paths.begin(); it != paths.end(); ++it) {
1536 // Remove any leading or trailing ", this is commonly used in the environment
1538 QString path = (*it);
1539 if (path.startsWith("\""))
1540 path = path.right(path.length() - 1);
1541 if (path.endsWith("\""))
1542 path = path.left(path.length() - 1);
1543 if (d.exists(path + QDir::separator() + fileName)) {
1550 QString Configure::locateFile(const QString &fileName)
1552 QString file = fileName.toLower();
1554 #if defined(Q_OS_WIN32)
1555 QRegExp splitReg("[;,]");
1557 QRegExp splitReg("[:]");
1559 if (file.endsWith(".h"))
1560 paths = QString::fromLocal8Bit(getenv("INCLUDE")).split(splitReg, QString::SkipEmptyParts);
1561 else if (file.endsWith(".lib"))
1562 paths = QString::fromLocal8Bit(getenv("LIB")).split(splitReg, QString::SkipEmptyParts);
1564 paths = QString::fromLocal8Bit(getenv("PATH")).split(splitReg, QString::SkipEmptyParts);
1565 return locateFileInPaths(file, paths);
1568 // Output helper functions ---------------------------------[ Stop ]-
1571 bool Configure::displayHelp()
1573 if (dictionary[ "HELP" ] == "yes") {
1574 desc("Usage: configure\n"
1575 "[-release] [-debug] [-debug-and-release] [-shared] [-static]\n"
1576 "[-no-fast] [-fast] \n"
1577 "[-no-accessibility] [-accessibility] [-no-rtti] [-rtti]\n"
1578 "[-no-sql-<driver>] [-qt-sql-<driver>]\n"
1579 "[-plugin-sql-<driver>] [-system-sqlite]\n"
1580 "[-D <define>] [-I <includepath>] [-L <librarypath>]\n"
1581 "[-help] [-no-dsp] [-dsp] [-no-vcproj] [-vcproj]\n"
1582 "[-no-qmake] [-qmake] [-dont-process] [-process]\n"
1583 "[-no-style-<style>] [-qt-style-<style>] [-redo]\n"
1584 "[-saveconfig <config>] [-loadconfig <config>]\n"
1585 "[-qt-zlib] [-system-zlib] [-qt-pcre] [-system-pcre] [-no-gif]\n"
1586 "[-no-libpng] [-qt-libpng] [-system-libpng]\n"
1587 "[-no-libjpeg] [-qt-libjpeg] [-system-libjpeg]\n"
1588 "[-sse2] [-no-sse2] [-sse3] [-no-sse3]\n"
1589 "[-ssse3] [-no-ssse3]\n"
1590 "[-sse4.1] [-no-sse4.1] [-sse4.2] [-no-sse4.2]\n"
1591 "[-avx] [-no-avx] [-avx2] [-no-avx2]\n"
1592 "[-no-iwmmxt] [-iwmmxt] [-openssl] [-openssl-linked]\n"
1593 "[-no-openssl] [-no-dbus] [-dbus] [-dbus-linked] [-platform <spec>]\n"
1594 "[-qtnamespace <namespace>] [-qtlibinfix <infix>] [-no-phonon]\n"
1595 "[-phonon] [-no-phonon-backend] [-phonon-backend]\n"
1596 "[-no-multimedia] [-multimedia] [-no-audio-backend] [-audio-backend]\n"
1597 "[-no-script] [-script] [-no-scripttools] [-scripttools]\n"
1598 "[-no-webkit] [-webkit] [-webkit-debug]\n"
1599 "[-no-directwrite] [-directwrite] [-no-widgets] [-icu]\n"
1600 "[-no-nis] [-nis] [-no-cups] [-cups] [-no-iconv]\n"
1601 "[-iconv] [-sun-iconv] [-gnu-iconv] [-neon] [-no-neon]\n"
1602 "[-largefile] [-font-config] [-no-fontconfig] [-posix-ipc]\n"
1603 "[-glib] [-sysconfdir <dir>]\n\n", 0, 7);
1605 desc("Installation options:\n\n");
1607 desc("These are optional, but you may specify install directories.\n\n", 0, 1);
1609 desc( "-prefix <dir>", "This will install everything relative to <dir> (default $QT_INSTALL_PREFIX)\n\n");
1611 desc( "-hostprefix [dir]", "Tools and libraries needed when developing applications are installed in [dir]. "
1612 "If [dir] is not given, the current build directory will be used. (default PREFIX)\n");
1614 desc("You may use these to separate different parts of the install:\n\n");
1616 desc( "-bindir <dir>", "Executables will be installed to <dir> (default PREFIX/bin)");
1617 desc( "-libdir <dir>", "Libraries will be installed to <dir> (default PREFIX/lib)");
1618 desc( "-docdir <dir>", "Documentation will be installed to <dir> (default PREFIX/doc)");
1619 desc( "-headerdir <dir>", "Headers will be installed to <dir> (default PREFIX/include)");
1620 desc( "-plugindir <dir>", "Plugins will be installed to <dir> (default PREFIX/plugins)");
1621 desc( "-importdir <dir>", "Imports for QML will be installed to <dir> (default PREFIX/imports)");
1622 desc( "-datadir <dir>", "Data used by Qt programs will be installed to <dir> (default PREFIX)");
1623 desc( "-translationdir <dir>", "Translations of Qt programs will be installed to <dir> (default PREFIX/translations)");
1624 desc( "-examplesdir <dir>", "Examples will be installed to <dir> (default PREFIX/examples)");
1625 desc( "-testsdir <dir>", "Tests will be installed to <dir> (default PREFIX/tests)");
1627 desc( "-hostbindir <dir>", "Host executables will be installed to <dir> (default HOSTPREFIX/bin)");
1628 desc( "-hostdatadir <dir>", "Data used by qmake will be installed to <dir> (default HOSTPREFIX)");
1631 desc("Configure options:\n\n");
1633 desc(" The defaults (*) are usually acceptable. A plus (+) denotes a default value"
1634 " that needs to be evaluated. If the evaluation succeeds, the feature is"
1635 " included. Here is a short explanation of each option:\n\n", 0, 1);
1637 desc("BUILD", "release","-release", "Compile and link Qt with debugging turned off.");
1638 desc("BUILD", "debug", "-debug", "Compile and link Qt with debugging turned on.");
1639 desc("BUILDALL", "yes", "-debug-and-release", "Compile and link two Qt libraries, with and without debugging turned on.\n");
1641 desc("OPENSOURCE", "opensource", "-opensource", "Compile and link the Open-Source Edition of Qt.");
1642 desc("COMMERCIAL", "commercial", "-commercial", "Compile and link the Commercial Edition of Qt.\n");
1644 desc("BUILDDEV", "yes", "-developer-build", "Compile and link Qt with Qt developer options (including auto-tests exporting)\n");
1646 desc("SHARED", "yes", "-shared", "Create and use shared Qt libraries.");
1647 desc("SHARED", "no", "-static", "Create and use static Qt libraries.\n");
1649 desc("LTCG", "yes", "-ltcg", "Use Link Time Code Generation. (Release builds only)");
1650 desc("LTCG", "no", "-no-ltcg", "Do not use Link Time Code Generation.\n");
1652 desc("FAST", "no", "-no-fast", "Configure Qt normally by generating Makefiles for all project files.");
1653 desc("FAST", "yes", "-fast", "Configure Qt quickly by generating Makefiles only for library and "
1654 "subdirectory targets. All other Makefiles are created as wrappers "
1655 "which will in turn run qmake\n");
1657 desc( "-make <part>", "Add part to the list of parts to be built at make time.");
1658 for (int i=0; i<defaultBuildParts.size(); ++i)
1659 desc( "", qPrintable(QString(" %1").arg(defaultBuildParts.at(i))), false, ' ');
1660 desc( "-nomake <part>", "Exclude part from the list of parts to be built.\n");
1662 desc("WIDGETS", "no", "-no-widgets", "Disable QtWidgets module\n");
1664 desc("ACCESSIBILITY", "no", "-no-accessibility", "Do not compile Windows Active Accessibility support.");
1665 desc("ACCESSIBILITY", "yes", "-accessibility", "Compile Windows Active Accessibility support.\n");
1667 desc( "-no-sql-<driver>", "Disable SQL <driver> entirely, by default none are turned on.");
1668 desc( "-qt-sql-<driver>", "Enable a SQL <driver> in the Qt Library.");
1669 desc( "-plugin-sql-<driver>", "Enable SQL <driver> as a plugin to be linked to at run time.\n"
1670 "Available values for <driver>:");
1671 desc("SQL_MYSQL", "auto", "", " mysql", ' ');
1672 desc("SQL_PSQL", "auto", "", " psql", ' ');
1673 desc("SQL_OCI", "auto", "", " oci", ' ');
1674 desc("SQL_ODBC", "auto", "", " odbc", ' ');
1675 desc("SQL_TDS", "auto", "", " tds", ' ');
1676 desc("SQL_DB2", "auto", "", " db2", ' ');
1677 desc("SQL_SQLITE", "auto", "", " sqlite", ' ');
1678 desc("SQL_SQLITE2", "auto", "", " sqlite2", ' ');
1679 desc("SQL_IBASE", "auto", "", " ibase", ' ');
1680 desc( "", "(drivers marked with a '+' have been detected as available on this system)\n", false, ' ');
1682 desc( "-system-sqlite", "Use sqlite from the operating system.\n");
1684 desc("OPENGL", "no","-no-opengl", "Disables OpenGL functionality\n");
1685 desc("OPENGL", "no","-opengl <api>", "Enable OpenGL support with specified API version.\n"
1686 "Available values for <api>:");
1687 desc("", "", "", " desktop - Enable support for Desktop OpenGL", ' ');
1688 desc("OPENGL_ES_CM", "no", "", " es1 - Enable support for OpenGL ES Common Profile", ' ');
1689 desc("OPENGL_ES_2", "no", "", " es2 - Enable support for OpenGL ES 2.0", ' ');
1691 desc("OPENVG", "no","-no-openvg", "Disables OpenVG functionality\n");
1692 desc("OPENVG", "yes","-openvg", "Enables OpenVG functionality");
1693 desc( "-force-asserts", "Activate asserts in release mode.\n");
1695 desc( "-platform <spec>", "The operating system and compiler you are building on.\n(default %QMAKESPEC%)\n");
1696 desc( "-xplatform <spec>", "The operating system and compiler you are cross compiling to.\n");
1697 desc( "", "See the README file for a list of supported operating systems and compilers.\n", false, ' ');
1698 desc( "-sysroot <dir>", "Sets <dir> as the target compiler's and qmake's sysroot and also sets pkg-config paths.");
1699 desc( "-no-gcc-sysroot", "When using -sysroot, it disables the passing of --sysroot to the compiler ");
1701 desc("NIS", "no", "-no-nis", "Do not build NIS support.");
1702 desc("NIS", "yes", "-nis", "Build NIS support.");
1704 desc("NEON", "yes", "-neon", "Enable the use of NEON instructions.");
1705 desc("NEON", "no", "-no-neon", "Do not enable the use of NEON instructions.");
1707 desc("QT_ICONV", "disable", "-no-iconv", "Do not enable support for iconv(3).");
1708 desc("QT_ICONV", "yes", "-iconv", "Enable support for iconv(3).");
1709 desc("QT_ICONV", "yes", "-sun-iconv", "Enable support for iconv(3) using sun-iconv.");
1710 desc("QT_ICONV", "yes", "-gnu-iconv", "Enable support for iconv(3) using gnu-libiconv");
1712 desc("LARGE_FILE", "yes", "-largefile", "Enables Qt to access files larger than 4 GB.");
1714 desc("FONT_CONFIG", "yes", "-fontconfig", "Build with FontConfig support.");
1715 desc("FONT_CONFIG", "no", "-no-fontconfig" "Do not build with FontConfig support.");
1717 desc("POSIX_IPC", "yes", "-posix-ipc", "Enable POSIX IPC.");
1719 desc("QT_GLIB", "yes", "-glib", "Enable Glib support.");
1721 desc("QT_INSTALL_SETTINGS", "auto", "-sysconfdir", "Settings used by Qt programs will be looked for in <dir>.");
1724 desc( "-qtnamespace <namespace>", "Wraps all Qt library code in 'namespace name {...}");
1725 desc( "-qtlibinfix <infix>", "Renames all Qt* libs to Qt*<infix>\n");
1726 desc( "-D <define>", "Add an explicit define to the preprocessor.");
1727 desc( "-I <includepath>", "Add an explicit include path.");
1728 desc( "-L <librarypath>", "Add an explicit library path.");
1729 desc( "-l <libraryname>", "Add an explicit library name, residing in a librarypath.\n");
1732 desc( "-help, -h, -?", "Display this information.\n");
1735 // 3rd party stuff options go below here --------------------------------------------------------------------------------
1736 desc("Third Party Libraries:\n\n");
1738 desc("ZLIB", "qt", "-qt-zlib", "Use the zlib bundled with Qt.");
1739 desc("ZLIB", "system", "-system-zlib", "Use zlib from the operating system.\nSee http://www.gzip.org/zlib\n");
1741 desc("PCRE", "qt", "-qt-pcre", "Use the PCRE library bundled with Qt.");
1742 desc("PCRE", "qt", "-system-pcre", "Use the PCRE library from the operating system.\nSee http://pcre.org/\n");
1744 desc("ICU", "yes", "-icu", "Use the ICU library.");
1745 desc("ICU", "no", "-no-icu", "Do not use the ICU library.\nSee http://site.icu-project.org/\n");
1747 desc("GIF", "no", "-no-gif", "Do not compile GIF reading support.");
1749 desc("LIBPNG", "no", "-no-libpng", "Do not compile PNG support.");
1750 desc("LIBPNG", "qt", "-qt-libpng", "Use the libpng bundled with Qt.");
1751 desc("LIBPNG", "system","-system-libpng", "Use libpng from the operating system.\nSee http://www.libpng.org/pub/png\n");
1753 desc("LIBJPEG", "no", "-no-libjpeg", "Do not compile JPEG support.");
1754 desc("LIBJPEG", "qt", "-qt-libjpeg", "Use the libjpeg bundled with Qt.");
1755 desc("LIBJPEG", "system","-system-libjpeg", "Use libjpeg from the operating system.\nSee http://www.ijg.org\n");
1757 desc("FREETYPE", "no", "-no-freetype", "Do not compile in Freetype2 support.");
1758 desc("FREETYPE", "yes", "-qt-freetype", "Use the libfreetype bundled with Qt.");
1759 desc("FREETYPE", "yes", "-system-freetype", "Use the libfreetype provided by the system.");
1761 // Qt\Windows only options go below here --------------------------------------------------------------------------------
1762 desc("Qt for Windows only:\n\n");
1764 desc("DSPFILES", "no", "-no-dsp", "Do not generate VC++ .dsp files.");
1765 desc("DSPFILES", "yes", "-dsp", "Generate VC++ .dsp files, only if spec \"win32-msvc\".\n");
1767 desc("VCPROJFILES", "no", "-no-vcproj", "Do not generate VC++ .vcproj files.");
1768 desc("VCPROJFILES", "yes", "-vcproj", "Generate VC++ .vcproj files, only if platform \"win32-msvc.net\".\n");
1770 desc("INCREDIBUILD_XGE", "no", "-no-incredibuild-xge", "Do not add IncrediBuild XGE distribution commands to custom build steps.");
1771 desc("INCREDIBUILD_XGE", "yes", "-incredibuild-xge", "Add IncrediBuild XGE distribution commands to custom build steps. This will distribute MOC and UIC steps, and other custom buildsteps which are added to the INCREDIBUILD_XGE variable.\n(The IncrediBuild distribution commands are only added to Visual Studio projects)\n");
1773 desc("PLUGIN_MANIFESTS", "no", "-no-plugin-manifests", "Do not embed manifests in plugins.");
1774 desc("PLUGIN_MANIFESTS", "yes", "-plugin-manifests", "Embed manifests in plugins.\n");
1775 desc( "-angle <dir>", "Use ANGLE library from location <dir>.\n");
1777 desc("BUILD_QMAKE", "no", "-no-qmake", "Do not compile qmake.");
1778 desc("BUILD_QMAKE", "yes", "-qmake", "Compile qmake.\n");
1780 desc("NOPROCESS", "yes", "-dont-process", "Do not generate Makefiles/Project files. This will override -no-fast if specified.");
1781 desc("NOPROCESS", "no", "-process", "Generate Makefiles/Project files.\n");
1783 desc("RTTI", "no", "-no-rtti", "Do not compile runtime type information.");
1784 desc("RTTI", "yes", "-rtti", "Compile runtime type information.\n");
1785 desc("SSE2", "no", "-no-sse2", "Do not compile with use of SSE2 instructions");
1786 desc("SSE2", "yes", "-sse2", "Compile with use of SSE2 instructions");
1787 desc("SSE3", "no", "-no-sse3", "Do not compile with use of SSE3 instructions");
1788 desc("SSE3", "yes", "-sse3", "Compile with use of SSE3 instructions");
1789 desc("SSSE3", "no", "-no-ssse3", "Do not compile with use of SSSE3 instructions");
1790 desc("SSSE3", "yes", "-ssse3", "Compile with use of SSSE3 instructions");
1791 desc("SSE4_1", "no", "-no-sse4.1", "Do not compile with use of SSE4.1 instructions");
1792 desc("SSE4_1", "yes", "-sse4.1", "Compile with use of SSE4.1 instructions");
1793 desc("SSE4_2", "no", "-no-sse4.2", "Do not compile with use of SSE4.2 instructions");
1794 desc("SSE4_2", "yes", "-sse4.2", "Compile with use of SSE4.2 instructions");
1795 desc("AVX", "no", "-no-avx", "Do not compile with use of AVX instructions");
1796 desc("AVX", "yes", "-avx", "Compile with use of AVX instructions");
1797 desc("AVX2", "no", "-no-avx2", "Do not compile with use of AVX2 instructions");
1798 desc("AVX2", "yes", "-avx2", "Compile with use of AVX2 instructions");
1799 desc("OPENSSL", "no", "-no-openssl", "Do not compile in OpenSSL support");
1800 desc("OPENSSL", "yes", "-openssl", "Compile in run-time OpenSSL support");
1801 desc("OPENSSL", "linked","-openssl-linked", "Compile in linked OpenSSL support");
1802 desc("DBUS", "no", "-no-dbus", "Do not compile in D-Bus support");
1803 desc("DBUS", "yes", "-dbus", "Compile in D-Bus support and load libdbus-1 dynamically");
1804 desc("DBUS", "linked", "-dbus-linked", "Compile in D-Bus support and link to libdbus-1");
1805 desc("PHONON_BACKEND","no", "-no-phonon-backend","Do not compile the platform-specific Phonon backend-plugin");
1806 desc("PHONON_BACKEND","yes","-phonon-backend", "Compile in the platform-specific Phonon backend-plugin");
1807 desc("AUDIO_BACKEND", "no","-no-audio-backend", "Do not compile in the platform audio backend into QtMultimedia");
1808 desc("AUDIO_BACKEND", "yes","-audio-backend", "Compile in the platform audio backend into QtMultimedia");
1809 desc("QML_DEBUG", "no", "-no-qml-debug", "Do not build the QML debugging support");
1810 desc("QML_DEBUG", "yes", "-qml-debug", "Build the QML debugging support");
1811 desc("DIRECTWRITE", "no", "-no-directwrite", "Do not build support for DirectWrite font rendering");
1812 desc("DIRECTWRITE", "yes", "-directwrite", "Build support for DirectWrite font rendering (experimental, requires DirectWrite availability on target systems, e.g. Windows Vista with Platform Update, Windows 7, etc.)");
1814 desc( "-no-style-<style>", "Disable <style> entirely.");
1815 desc( "-qt-style-<style>", "Enable <style> in the Qt Library.\nAvailable styles: ");
1817 desc("STYLE_WINDOWS", "yes", "", " windows", ' ');
1818 desc("STYLE_WINDOWSXP", "auto", "", " windowsxp", ' ');
1819 desc("STYLE_WINDOWSVISTA", "auto", "", " windowsvista", ' ');
1820 desc("STYLE_PLASTIQUE", "yes", "", " plastique", ' ');
1821 desc("STYLE_CLEANLOOKS", "yes", "", " cleanlooks", ' ');
1822 desc("STYLE_MOTIF", "yes", "", " motif", ' ');
1823 desc("STYLE_CDE", "yes", "", " cde", ' ');
1824 desc("STYLE_WINDOWSCE", "yes", "", " windowsce", ' ');
1825 desc("STYLE_WINDOWSMOBILE" , "yes", "", " windowsmobile", ' ');
1826 desc("NATIVE_GESTURES", "no", "-no-native-gestures", "Do not use native gestures on Windows 7.");
1827 desc("NATIVE_GESTURES", "yes", "-native-gestures", "Use native gestures on Windows 7.");
1828 desc("MSVC_MP", "no", "-no-mp", "Do not use multiple processors for compiling with MSVC");
1829 desc("MSVC_MP", "yes", "-mp", "Use multiple processors for compiling with MSVC (-MP)");
1831 /* We do not support -qconfig on Windows yet
1833 desc( "-qconfig <local>", "Use src/tools/qconfig-local.h rather than the default.\nPossible values for local:");
1834 for (int i=0; i<allConfigs.size(); ++i)
1835 desc( "", qPrintable(QString(" %1").arg(allConfigs.at(i))), false, ' ');
1839 desc( "-loadconfig <config>", "Run configure with the parameters from file configure_<config>.cache.");
1840 desc( "-saveconfig <config>", "Run configure and save the parameters in file configure_<config>.cache.");
1841 desc( "-redo", "Run configure with the same parameters as last time.\n");
1843 // Qt\Windows CE only options go below here -----------------------------------------------------------------------------
1844 desc("Qt for Windows CE only:\n\n");
1845 desc("IWMMXT", "no", "-no-iwmmxt", "Do not compile with use of IWMMXT instructions");
1846 desc("IWMMXT", "yes", "-iwmmxt", "Do compile with use of IWMMXT instructions (Qt for Windows CE on Arm only)");
1847 desc("CE_CRT", "no", "-no-crt" , "Do not add the C runtime to default deployment rules");
1848 desc("CE_CRT", "yes", "-qt-crt", "Qt identifies C runtime during project generation");
1849 desc( "-crt <path>", "Specify path to C runtime used for project generation.");
1850 desc("CETEST", "no", "-no-cetest", "Do not compile Windows CE remote test application");
1851 desc("CETEST", "yes", "-cetest", "Compile Windows CE remote test application");
1852 desc( "-signature <file>", "Use file for signing the target project");
1854 desc("DIRECTSHOW", "no", "-phonon-wince-ds9", "Enable Phonon Direct Show 9 backend for Windows CE");
1860 QString Configure::findFileInPaths(const QString &fileName, const QString &paths)
1862 #if defined(Q_OS_WIN32)
1863 QRegExp splitReg("[;,]");
1865 QRegExp splitReg("[:]");
1867 QStringList pathList = paths.split(splitReg, QString::SkipEmptyParts);
1869 for (QStringList::ConstIterator it = pathList.begin(); it != pathList.end(); ++it) {
1870 // Remove any leading or trailing ", this is commonly used in the environment
1872 QString path = (*it);
1873 if (path.startsWith('\"'))
1874 path = path.right(path.length() - 1);
1875 if (path.endsWith('\"'))
1876 path = path.left(path.length() - 1);
1877 if (d.exists(path + QDir::separator() + fileName))
1883 static QString mingwPaths(const QString &mingwPath, const QString &pathName)
1886 QDir mingwDir = QFileInfo(mingwPath).dir();
1887 const QFileInfoList subdirs = mingwDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
1888 for (int i = 0 ;i < subdirs.length(); ++i) {
1889 const QFileInfo &fi = subdirs.at(i);
1890 const QString name = fi.fileName();
1891 if (name == pathName)
1892 ret += fi.absoluteFilePath() + ';';
1893 else if (name.contains("mingw"))
1894 ret += fi.absoluteFilePath() + QDir::separator() + pathName + ';';
1899 bool Configure::findFile(const QString &fileName)
1901 const QString file = fileName.toLower();
1902 const QString pathEnvVar = QString::fromLocal8Bit(getenv("PATH"));
1903 const QString mingwPath = dictionary["QMAKESPEC"].endsWith("-g++") ?
1904 findFileInPaths("g++.exe", pathEnvVar) : QString();
1907 if (file.endsWith(".h")) {
1908 if (!mingwPath.isNull()) {
1909 if (!findFileInPaths(file, mingwPaths(mingwPath, "include")).isNull())
1911 //now let's try the additional compiler path
1913 const QFileInfoList mingwConfigs = QDir(mingwPath + QLatin1String("/../lib/gcc")).entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
1914 for (int i = 0; i < mingwConfigs.length(); ++i) {
1915 const QDir mingwLibDir = mingwConfigs.at(i).absoluteFilePath();
1916 foreach(const QFileInfo &version, mingwLibDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) {
1917 if (!findFileInPaths(file, version.absoluteFilePath() + QLatin1String("/include")).isNull())
1922 paths = QString::fromLocal8Bit(getenv("INCLUDE"));
1923 } else if (file.endsWith(".lib") || file.endsWith(".a")) {
1924 if (!mingwPath.isNull() && !findFileInPaths(file, mingwPaths(mingwPath, "lib")).isNull())
1926 paths = QString::fromLocal8Bit(getenv("LIB"));
1930 return !findFileInPaths(file, paths).isNull();
1934 Default value for options marked as "auto" if the test passes.
1935 (Used both by the autoDetection() below, and the desc() function
1936 to mark (+) the default option of autodetecting options.
1938 QString Configure::defaultTo(const QString &option)
1940 // We prefer using the system version of the 3rd party libs
1941 if (option == "ZLIB"
1943 || option == "LIBJPEG"
1944 || option == "LIBPNG")
1947 // PNG is always built-in, never a plugin
1948 if (option == "PNG")
1951 // These database drivers and image formats can be built-in or plugins.
1952 // Prefer plugins when Qt is shared.
1953 if (dictionary[ "SHARED" ] == "yes") {
1954 if (option == "SQL_MYSQL"
1955 || option == "SQL_MYSQL"
1956 || option == "SQL_ODBC"
1957 || option == "SQL_OCI"
1958 || option == "SQL_PSQL"
1959 || option == "SQL_TDS"
1960 || option == "SQL_DB2"
1961 || option == "SQL_SQLITE"
1962 || option == "SQL_SQLITE2"
1963 || option == "SQL_IBASE"
1969 // By default we do not want to compile OCI driver when compiling with
1970 // MinGW, due to lack of such support from Oracle. It prob. wont work.
1971 // (Customer may force the use though)
1972 if (dictionary["QMAKESPEC"].endsWith("-g++")
1973 && option == "SQL_OCI")
1976 if (option == "SYNCQT"
1977 && (!QFile::exists(sourcePath + "/bin/syncqt") ||
1978 !QFile::exists(sourcePath + "/bin/syncqt.bat")))
1985 Checks the system for the availability of a feature.
1986 Returns true if the feature is available, else false.
1988 bool Configure::checkAvailability(const QString &part)
1990 bool available = false;
1991 if (part == "STYLE_WINDOWSXP")
1992 available = (platform() == WINDOWS) && findFile("uxtheme.h");
1994 else if (part == "ZLIB")
1995 available = findFile("zlib.h");
1997 else if (part == "PCRE")
1998 available = findFile("pcre.h");
2000 else if (part == "ICU")
2001 available = findFile("unicode/utypes.h") && findFile("unicode/ucol.h") && findFile("unicode/ustring.h") && findFile("icuin.lib");
2003 else if (part == "LIBJPEG")
2004 available = findFile("jpeglib.h");
2005 else if (part == "LIBPNG")
2006 available = findFile("png.h");
2007 else if (part == "SQL_MYSQL")
2008 available = findFile("mysql.h") && findFile("libmySQL.lib");
2009 else if (part == "SQL_ODBC")
2010 available = findFile("sql.h") && findFile("sqlext.h") && findFile("odbc32.lib");
2011 else if (part == "SQL_OCI")
2012 available = findFile("oci.h") && findFile("oci.lib");
2013 else if (part == "SQL_PSQL")
2014 available = findFile("libpq-fe.h") && findFile("libpq.lib") && findFile("ws2_32.lib") && findFile("advapi32.lib");
2015 else if (part == "SQL_TDS")
2016 available = findFile("sybfront.h") && findFile("sybdb.h") && findFile("ntwdblib.lib");
2017 else if (part == "SQL_DB2")
2018 available = findFile("sqlcli.h") && findFile("sqlcli1.h") && findFile("db2cli.lib");
2019 else if (part == "SQL_SQLITE")
2020 available = true; // Built in, we have a fork
2021 else if (part == "SQL_SQLITE_LIB") {
2022 if (dictionary[ "SQL_SQLITE_LIB" ] == "system") {
2023 if ((platform() == QNX) || (platform() == BLACKBERRY)) {
2025 dictionary[ "QT_LFLAGS_SQLITE" ] += "-lsqlite3 -lz";
2027 available = findFile("sqlite3.h") && findFile("sqlite3.lib");
2029 dictionary[ "QT_LFLAGS_SQLITE" ] += "sqlite3.lib";
2034 } else if (part == "SQL_SQLITE2")
2035 available = findFile("sqlite.h") && findFile("sqlite.lib");
2036 else if (part == "SQL_IBASE")
2037 available = findFile("ibase.h") && (findFile("gds32_ms.lib") || findFile("gds32.lib"));
2038 else if (part == "IWMMXT")
2039 available = (dictionary.value("XQMAKESPEC").startsWith("wince"));
2040 else if (part == "OPENGL_ES_CM")
2041 available = (dictionary.value("XQMAKESPEC").startsWith("wince"));
2042 else if (part == "OPENGL_ES_2")
2043 available = (dictionary.value("XQMAKESPEC").startsWith("wince"));
2044 else if (part == "DIRECTSHOW")
2045 available = (dictionary.value("XQMAKESPEC").startsWith("wince"));
2046 else if (part == "SSE2")
2047 available = tryCompileProject("common/sse2");
2048 else if (part == "SSE3")
2049 available = tryCompileProject("common/sse3");
2050 else if (part == "SSSE3")
2051 available = tryCompileProject("common/ssse3");
2052 else if (part == "SSE4_1")
2053 available = tryCompileProject("common/sse4_1");
2054 else if (part == "SSE4_2")
2055 available = tryCompileProject("common/sse4_2");
2056 else if (part == "AVX")
2057 available = tryCompileProject("common/avx");
2058 else if (part == "AVX2")
2059 available = tryCompileProject("common/avx2");
2060 else if (part == "OPENSSL")
2061 available = findFile("openssl\\ssl.h");
2062 else if (part == "DBUS")
2063 available = findFile("dbus\\dbus.h");
2064 else if (part == "CETEST") {
2065 QString rapiHeader = locateFile("rapi.h");
2066 QString rapiLib = locateFile("rapi.lib");
2067 available = (dictionary.value("XQMAKESPEC").startsWith("wince")) && !rapiHeader.isEmpty() && !rapiLib.isEmpty();
2069 dictionary[ "QT_CE_RAPI_INC" ] += QLatin1String("\"") + rapiHeader + QLatin1String("\"");
2070 dictionary[ "QT_CE_RAPI_LIB" ] += QLatin1String("\"") + rapiLib + QLatin1String("\"");
2072 else if (dictionary[ "CETEST_REQUESTED" ] == "yes") {
2073 cout << "cetest could not be enabled: rapi.h and rapi.lib could not be found." << endl;
2074 cout << "Make sure the environment is set up for compiling with ActiveSync." << endl;
2075 dictionary[ "DONE" ] = "error";
2078 else if (part == "INCREDIBUILD_XGE")
2079 available = findFile("BuildConsole.exe") && findFile("xgConsole.exe");
2080 else if (part == "PHONON") {
2081 available = findFile("vmr9.h") && findFile("dshow.h") && findFile("dmo.h") && findFile("dmodshow.h")
2082 && (findFile("strmiids.lib") || findFile("libstrmiids.a"))
2083 && (findFile("dmoguids.lib") || findFile("libdmoguids.a"))
2084 && (findFile("msdmo.lib") || findFile("libmsdmo.a"))
2085 && findFile("d3d9.h");
2088 cout << "All the required DirectShow/Direct3D files couldn't be found." << endl
2089 << "Make sure you have either the platform SDK AND the DirectShow SDK or the Windows SDK installed." << endl
2090 << "If you have the DirectShow SDK installed, please make sure that you have run the <path to SDK>\\SetEnv.Cmd script." << endl;
2091 if (!findFile("vmr9.h")) cout << "vmr9.h not found" << endl;
2092 if (!findFile("dshow.h")) cout << "dshow.h not found" << endl;
2093 if (!findFile("strmiids.lib")) cout << "strmiids.lib not found" << endl;
2094 if (!findFile("dmoguids.lib")) cout << "dmoguids.lib not found" << endl;
2095 if (!findFile("msdmo.lib")) cout << "msdmo.lib not found" << endl;
2096 if (!findFile("d3d9.h")) cout << "d3d9.h not found" << endl;
2098 } else if (part == "WMSDK") {
2099 available = findFile("wmsdk.h");
2100 } else if (part == "V8SNAPSHOT") {
2102 } else if (part == "AUDIO_BACKEND") {
2104 } else if (part == "DIRECTWRITE") {
2105 available = findFile("dwrite.h") && findFile("d2d1.h") && findFile("dwrite.lib");
2106 } else if (part == "ICONV") {
2107 available = tryCompileProject("unix/iconv") || tryCompileProject("unix/gnu-libiconv");
2108 } else if (part == "CUPS") {
2109 available = (platform() != WINDOWS) && (platform() != WINDOWS_CE) && tryCompileProject("unix/cups");
2116 Autodetect options marked as "auto".
2118 void Configure::autoDetection()
2121 if (dictionary["STYLE_WINDOWSXP"] == "auto")
2122 dictionary["STYLE_WINDOWSXP"] = checkAvailability("STYLE_WINDOWSXP") ? defaultTo("STYLE_WINDOWSXP") : "no";
2123 if (dictionary["STYLE_WINDOWSVISTA"] == "auto") // Vista style has the same requirements as XP style
2124 dictionary["STYLE_WINDOWSVISTA"] = checkAvailability("STYLE_WINDOWSXP") ? defaultTo("STYLE_WINDOWSVISTA") : "no";
2126 // Compression detection
2127 if (dictionary["ZLIB"] == "auto")
2128 dictionary["ZLIB"] = checkAvailability("ZLIB") ? defaultTo("ZLIB") : "qt";
2131 if (dictionary["PCRE"] == "auto")
2132 dictionary["PCRE"] = checkAvailability("PCRE") ? defaultTo("PCRE") : "qt";
2135 if (dictionary["ICU"] == "auto")
2136 dictionary["ICU"] = checkAvailability("ICU") ? "yes" : "no";
2138 // Image format detection
2139 if (dictionary["GIF"] == "auto")
2140 dictionary["GIF"] = defaultTo("GIF");
2141 if (dictionary["JPEG"] == "auto")
2142 dictionary["JPEG"] = defaultTo("JPEG");
2143 if (dictionary["PNG"] == "auto")
2144 dictionary["PNG"] = defaultTo("PNG");
2145 if (dictionary["LIBJPEG"] == "auto")
2146 dictionary["LIBJPEG"] = checkAvailability("LIBJPEG") ? defaultTo("LIBJPEG") : "qt";
2147 if (dictionary["LIBPNG"] == "auto")
2148 dictionary["LIBPNG"] = checkAvailability("LIBPNG") ? defaultTo("LIBPNG") : "qt";
2150 // SQL detection (not on by default)
2151 if (dictionary["SQL_MYSQL"] == "auto")
2152 dictionary["SQL_MYSQL"] = checkAvailability("SQL_MYSQL") ? defaultTo("SQL_MYSQL") : "no";
2153 if (dictionary["SQL_ODBC"] == "auto")
2154 dictionary["SQL_ODBC"] = checkAvailability("SQL_ODBC") ? defaultTo("SQL_ODBC") : "no";
2155 if (dictionary["SQL_OCI"] == "auto")
2156 dictionary["SQL_OCI"] = checkAvailability("SQL_OCI") ? defaultTo("SQL_OCI") : "no";
2157 if (dictionary["SQL_PSQL"] == "auto")
2158 dictionary["SQL_PSQL"] = checkAvailability("SQL_PSQL") ? defaultTo("SQL_PSQL") : "no";
2159 if (dictionary["SQL_TDS"] == "auto")
2160 dictionary["SQL_TDS"] = checkAvailability("SQL_TDS") ? defaultTo("SQL_TDS") : "no";
2161 if (dictionary["SQL_DB2"] == "auto")
2162 dictionary["SQL_DB2"] = checkAvailability("SQL_DB2") ? defaultTo("SQL_DB2") : "no";
2163 if (dictionary["SQL_SQLITE"] == "auto")
2164 dictionary["SQL_SQLITE"] = checkAvailability("SQL_SQLITE") ? defaultTo("SQL_SQLITE") : "no";
2165 if (dictionary["SQL_SQLITE_LIB"] == "system")
2166 if (!checkAvailability("SQL_SQLITE_LIB"))
2167 dictionary["SQL_SQLITE_LIB"] = "no";
2168 if (dictionary["SQL_SQLITE2"] == "auto")
2169 dictionary["SQL_SQLITE2"] = checkAvailability("SQL_SQLITE2") ? defaultTo("SQL_SQLITE2") : "no";
2170 if (dictionary["SQL_IBASE"] == "auto")
2171 dictionary["SQL_IBASE"] = checkAvailability("SQL_IBASE") ? defaultTo("SQL_IBASE") : "no";
2172 if (dictionary["SSE2"] == "auto")
2173 dictionary["SSE2"] = checkAvailability("SSE2") ? "yes" : "no";
2174 if (dictionary["SSE3"] == "auto")
2175 dictionary["SSE3"] = checkAvailability("SSE3") ? "yes" : "no";
2176 if (dictionary["SSSE3"] == "auto")
2177 dictionary["SSSE3"] = checkAvailability("SSSE3") ? "yes" : "no";
2178 if (dictionary["SSE4_1"] == "auto")
2179 dictionary["SSE4_1"] = checkAvailability("SSE4_1") ? "yes" : "no";
2180 if (dictionary["SSE4_2"] == "auto")
2181 dictionary["SSE4_2"] = checkAvailability("SSE4_2") ? "yes" : "no";
2182 if (dictionary["AVX"] == "auto")
2183 dictionary["AVX"] = checkAvailability("AVX") ? "yes" : "no";
2184 if (dictionary["AVX2"] == "auto")
2185 dictionary["AVX2"] = checkAvailability("AVX2") ? "yes" : "no";
2186 if (dictionary["IWMMXT"] == "auto")
2187 dictionary["IWMMXT"] = checkAvailability("IWMMXT") ? "yes" : "no";
2188 if (dictionary["OPENSSL"] == "auto")
2189 dictionary["OPENSSL"] = checkAvailability("OPENSSL") ? "yes" : "no";
2190 if (dictionary["DBUS"] == "auto")
2191 dictionary["DBUS"] = checkAvailability("DBUS") ? "yes" : "no";
2192 if (dictionary["V8SNAPSHOT"] == "auto")
2193 dictionary["V8SNAPSHOT"] = (dictionary["V8"] == "yes") && checkAvailability("V8SNAPSHOT") ? "yes" : "no";
2194 if (dictionary["QML_DEBUG"] == "auto")
2195 dictionary["QML_DEBUG"] = dictionary["QML"] == "yes" ? "yes" : "no";
2196 if (dictionary["AUDIO_BACKEND"] == "auto")
2197 dictionary["AUDIO_BACKEND"] = checkAvailability("AUDIO_BACKEND") ? "yes" : "no";
2198 if (dictionary["WMSDK"] == "auto")
2199 dictionary["WMSDK"] = checkAvailability("WMSDK") ? "yes" : "no";
2201 // Qt/WinCE remote test application
2202 if (dictionary["CETEST"] == "auto")
2203 dictionary["CETEST"] = checkAvailability("CETEST") ? "yes" : "no";
2205 // Detection of IncrediBuild buildconsole
2206 if (dictionary["INCREDIBUILD_XGE"] == "auto")
2207 dictionary["INCREDIBUILD_XGE"] = checkAvailability("INCREDIBUILD_XGE") ? "yes" : "no";
2209 // Detection of iconv support
2210 if (dictionary["QT_ICONV"] == "auto")
2211 dictionary["QT_ICONV"] = checkAvailability("ICONV") ? "yes" : "no";
2213 // Detection of cups support
2214 if (dictionary["QT_CUPS"] == "auto")
2215 dictionary["QT_CUPS"] = checkAvailability("CUPS") ? "yes" : "no";
2217 // Mark all unknown "auto" to the default value..
2218 for (QMap<QString,QString>::iterator i = dictionary.begin(); i != dictionary.end(); ++i) {
2219 if (i.value() == "auto")
2220 i.value() = defaultTo(i.key());
2224 bool Configure::verifyConfiguration()
2226 if (dictionary["SQL_SQLITE_LIB"] == "no" && dictionary["SQL_SQLITE"] != "no") {
2227 cout << "WARNING: Configure could not detect the presence of a system SQLite3 lib." << endl
2228 << "Configure will therefore continue with the SQLite3 lib bundled with Qt." << endl
2229 << "(Press any key to continue..)";
2230 if (_getch() == 3) // _Any_ keypress w/no echo(eat <Enter> for stdout)
2231 exit(0); // Exit cleanly for Ctrl+C
2233 dictionary["SQL_SQLITE_LIB"] = "qt"; // Set to Qt's bundled lib an continue
2235 if (dictionary["QMAKESPEC"].endsWith("-g++")
2236 && dictionary["SQL_OCI"] != "no") {
2237 cout << "WARNING: Qt does not support compiling the Oracle database driver with" << endl
2238 << "MinGW, due to lack of such support from Oracle. Consider disabling the" << endl
2239 << "Oracle driver, as the current build will most likely fail." << endl;
2240 cout << "(Press any key to continue..)";
2241 if (_getch() == 3) // _Any_ keypress w/no echo(eat <Enter> for stdout)
2242 exit(0); // Exit cleanly for Ctrl+C
2244 if (dictionary["QMAKESPEC"].endsWith("win32-msvc.net")) {
2245 cout << "WARNING: The makespec win32-msvc.net is deprecated. Consider using" << endl
2246 << "win32-msvc2002 or win32-msvc2003 instead." << endl;
2247 cout << "(Press any key to continue..)";
2248 if (_getch() == 3) // _Any_ keypress w/no echo(eat <Enter> for stdout)
2249 exit(0); // Exit cleanly for Ctrl+C
2251 if (0 != dictionary["ARM_FPU_TYPE"].size()) {
2252 QStringList l= QStringList()
2256 if (!(l.contains(dictionary["ARM_FPU_TYPE"])))
2257 cout << QString("WARNING: Using unsupported fpu flag: %1").arg(dictionary["ARM_FPU_TYPE"]) << endl;
2259 if (dictionary["DIRECTWRITE"] == "yes" && !checkAvailability("DIRECTWRITE")) {
2260 cout << "WARNING: To be able to compile the DirectWrite font engine you will" << endl
2261 << "need the Microsoft DirectWrite and Microsoft Direct2D development" << endl
2262 << "files such as headers and libraries." << endl
2263 << "(Press any key to continue..)";
2264 if (_getch() == 3) // _Any_ keypress w/no echo(eat <Enter> for stdout)
2265 exit(0); // Exit cleanly for Ctrl+C
2272 Things that affect the Qt API/ABI:
2274 minimal-config small-config medium-config large-config full-config
2279 Things that do not affect the Qt API/ABI:
2280 system-jpeg no-jpeg jpeg
2281 system-png no-png png
2282 system-zlib no-zlib zlib
2293 X11 : x11sm xinerama xcursor xfixes xrandr xrender fontconfig xkb
2294 Embedded: embedded freetype
2296 void Configure::generateBuildKey()
2298 QString spec = dictionary["QMAKESPEC"];
2300 QString compiler = "msvc"; // ICC is compatible
2301 if (spec.endsWith("-g++"))
2303 else if (spec.endsWith("-borland"))
2304 compiler = "borland";
2306 // Build options which changes the Qt API/ABI
2307 QStringList build_options;
2308 if (!dictionary["QCONFIG"].isEmpty())
2309 build_options += dictionary["QCONFIG"] + "-config ";
2310 build_options.sort();
2312 // Sorted defines that start with QT_NO_
2313 QStringList build_defines = qmakeDefines.filter(QRegExp("^QT_NO_"));
2314 build_defines.sort();
2317 void Configure::generateOutputVars()
2319 // Generate variables for output
2320 QString build = dictionary[ "BUILD" ];
2321 bool buildAll = (dictionary[ "BUILDALL" ] == "yes");
2322 if (build == "debug") {
2324 qtConfig += "debug_and_release build_all release";
2325 qtConfig += "debug";
2326 } else if (build == "release") {
2328 qtConfig += "debug_and_release build_all debug";
2329 qtConfig += "release";
2332 if (dictionary[ "SHARED" ] == "no")
2333 qtConfig += "static";
2335 qtConfig += "shared";
2337 if (dictionary[ "WIDGETS" ] == "no")
2338 qtConfig += "no-widgets";
2340 // Compression --------------------------------------------------
2341 if (dictionary[ "ZLIB" ] == "qt")
2343 else if (dictionary[ "ZLIB" ] == "system")
2344 qtConfig += "system-zlib";
2346 // PCRE ---------------------------------------------------------
2347 if (dictionary[ "PCRE" ] == "qt")
2348 qmakeConfig += "pcre";
2350 // ICU ---------------------------------------------------------
2351 if (dictionary[ "ICU" ] == "yes")
2354 // Image formates -----------------------------------------------
2355 if (dictionary[ "GIF" ] == "no")
2356 qtConfig += "no-gif";
2357 else if (dictionary[ "GIF" ] == "yes")
2360 if (dictionary[ "JPEG" ] == "no")
2361 qtConfig += "no-jpeg";
2362 else if (dictionary[ "JPEG" ] == "yes")
2364 if (dictionary[ "LIBJPEG" ] == "system")
2365 qtConfig += "system-jpeg";
2367 if (dictionary[ "PNG" ] == "no")
2368 qtConfig += "no-png";
2369 else if (dictionary[ "PNG" ] == "yes")
2371 if (dictionary[ "LIBPNG" ] == "system")
2372 qtConfig += "system-png";
2374 // Text rendering --------------------------------------------------
2375 if (dictionary[ "FREETYPE" ] == "yes")
2376 qtConfig += "freetype";
2377 else if (dictionary[ "FREETYPE" ] == "system")
2378 qtConfig += "system-freetype";
2380 // Styles -------------------------------------------------------
2381 if (dictionary[ "STYLE_WINDOWS" ] == "yes")
2382 qmakeStyles += "windows";
2384 if (dictionary[ "STYLE_PLASTIQUE" ] == "yes")
2385 qmakeStyles += "plastique";
2387 if (dictionary[ "STYLE_CLEANLOOKS" ] == "yes")
2388 qmakeStyles += "cleanlooks";
2390 if (dictionary[ "STYLE_WINDOWSXP" ] == "yes")
2391 qmakeStyles += "windowsxp";
2393 if (dictionary[ "STYLE_WINDOWSVISTA" ] == "yes")
2394 qmakeStyles += "windowsvista";
2396 if (dictionary[ "STYLE_MOTIF" ] == "yes")
2397 qmakeStyles += "motif";
2399 if (dictionary[ "STYLE_SGI" ] == "yes")
2400 qmakeStyles += "sgi";
2402 if (dictionary[ "STYLE_WINDOWSCE" ] == "yes")
2403 qmakeStyles += "windowsce";
2405 if (dictionary[ "STYLE_WINDOWSMOBILE" ] == "yes")
2406 qmakeStyles += "windowsmobile";
2408 if (dictionary[ "STYLE_CDE" ] == "yes")
2409 qmakeStyles += "cde";
2411 // Databases ----------------------------------------------------
2412 if (dictionary[ "SQL_MYSQL" ] == "yes")
2413 qmakeSql += "mysql";
2414 else if (dictionary[ "SQL_MYSQL" ] == "plugin")
2415 qmakeSqlPlugins += "mysql";
2417 if (dictionary[ "SQL_ODBC" ] == "yes")
2419 else if (dictionary[ "SQL_ODBC" ] == "plugin")
2420 qmakeSqlPlugins += "odbc";
2422 if (dictionary[ "SQL_OCI" ] == "yes")
2424 else if (dictionary[ "SQL_OCI" ] == "plugin")
2425 qmakeSqlPlugins += "oci";
2427 if (dictionary[ "SQL_PSQL" ] == "yes")
2429 else if (dictionary[ "SQL_PSQL" ] == "plugin")
2430 qmakeSqlPlugins += "psql";
2432 if (dictionary[ "SQL_TDS" ] == "yes")
2434 else if (dictionary[ "SQL_TDS" ] == "plugin")
2435 qmakeSqlPlugins += "tds";
2437 if (dictionary[ "SQL_DB2" ] == "yes")
2439 else if (dictionary[ "SQL_DB2" ] == "plugin")
2440 qmakeSqlPlugins += "db2";
2442 if (dictionary[ "SQL_SQLITE" ] == "yes")
2443 qmakeSql += "sqlite";
2444 else if (dictionary[ "SQL_SQLITE" ] == "plugin")
2445 qmakeSqlPlugins += "sqlite";
2447 if (dictionary[ "SQL_SQLITE_LIB" ] == "system")
2448 qmakeConfig += "system-sqlite";
2450 if (dictionary[ "SQL_SQLITE2" ] == "yes")
2451 qmakeSql += "sqlite2";
2452 else if (dictionary[ "SQL_SQLITE2" ] == "plugin")
2453 qmakeSqlPlugins += "sqlite2";
2455 if (dictionary[ "SQL_IBASE" ] == "yes")
2456 qmakeSql += "ibase";
2457 else if (dictionary[ "SQL_IBASE" ] == "plugin")
2458 qmakeSqlPlugins += "ibase";
2460 // Other options ------------------------------------------------
2461 if (dictionary[ "BUILDALL" ] == "yes") {
2462 qtConfig += "build_all";
2464 qmakeConfig += dictionary[ "BUILD" ];
2465 dictionary[ "QMAKE_OUTDIR" ] = dictionary[ "BUILD" ];
2467 if (buildParts.isEmpty()) {
2468 buildParts = defaultBuildParts;
2470 if (dictionary["BUILDDEV"] == "yes")
2471 buildParts += "tests";
2473 while (!nobuildParts.isEmpty())
2474 buildParts.removeAll(nobuildParts.takeFirst());
2475 if (!buildParts.contains("libs"))
2476 buildParts += "libs";
2477 buildParts.removeDuplicates();
2479 if (dictionary["MSVC_MP"] == "yes")
2480 qmakeConfig += "msvc_mp";
2482 if (dictionary[ "SHARED" ] == "yes") {
2483 QString version = dictionary[ "VERSION" ];
2484 if (!version.isEmpty()) {
2485 qmakeVars += "QMAKE_QT_VERSION_OVERRIDE = " + version.left(version.indexOf("."));
2486 version.remove(QLatin1Char('.'));
2488 dictionary[ "QMAKE_OUTDIR" ] += "_shared";
2490 dictionary[ "QMAKE_OUTDIR" ] += "_static";
2493 if (dictionary[ "ACCESSIBILITY" ] == "yes")
2494 qtConfig += "accessibility";
2496 if (!qmakeLibs.isEmpty())
2497 qmakeVars += "LIBS += " + formatPaths(qmakeLibs);
2499 if (!dictionary["QT_LFLAGS_SQLITE"].isEmpty())
2500 qmakeVars += "QT_LFLAGS_SQLITE += " + formatPath(dictionary["QT_LFLAGS_SQLITE"]);
2502 if (dictionary[ "OPENGL" ] == "yes")
2503 qtConfig += "opengl";
2505 if (dictionary["OPENGL_ES_CM"] == "yes") {
2506 qtConfig += "opengles1";
2510 if (dictionary["OPENGL_ES_2"] == "yes") {
2511 qtConfig += "opengles2";
2515 if (dictionary["OPENVG"] == "yes") {
2516 qtConfig += "openvg";
2521 if (dictionary["DIRECTSHOW"] == "yes")
2522 qtConfig += "directshow";
2524 if (dictionary[ "OPENSSL" ] == "yes")
2525 qtConfig += "openssl";
2526 else if (dictionary[ "OPENSSL" ] == "linked")
2527 qtConfig += "openssl-linked";
2529 if (dictionary[ "DBUS" ] == "yes")
2531 else if (dictionary[ "DBUS" ] == "linked")
2532 qtConfig += "dbus dbus-linked";
2534 if (dictionary[ "CETEST" ] == "yes")
2535 qtConfig += "cetest";
2538 if (dictionary["PHONON_BACKEND"] == "yes")
2539 qtConfig += "phonon-backend";
2542 if (dictionary["AUDIO_BACKEND"] == "yes")
2543 qtConfig += "audio-backend";
2545 if (dictionary["DIRECTWRITE"] == "yes")
2546 qtConfig += "directwrite";
2548 if (dictionary[ "NATIVE_GESTURES" ] == "yes")
2549 qtConfig += "native-gestures";
2553 if (dictionary["NIS"] == "yes")
2556 if (dictionary["QT_CUPS"] == "yes")
2559 if (dictionary["QT_ICONV"] == "yes")
2560 qtConfig += "iconv";
2561 else if (dictionary["QT_ICONV"] == "sun")
2562 qtConfig += "sun-libiconv";
2563 else if (dictionary["QT_ICONV"] == "gnu")
2564 qtConfig += "gnu-libiconv";
2566 if (dictionary["FONT_CONFIG"] == "yes") {
2567 qtConfig += "fontconfig";
2568 qmakeVars += "QMAKE_CFLAGS_FONTCONFIG =";
2569 qmakeVars += "QMAKE_LIBS_FONTCONFIG = -lfreetype -lfontconfig";
2572 if (dictionary["QT_GLIB"] == "yes")
2575 // We currently have no switch for QtConcurrent, so add it unconditionally.
2576 qtConfig += "concurrent";
2579 if (dictionary[ "V8SNAPSHOT" ] == "yes")
2580 qtConfig += "v8snapshot";
2582 // Add config levels --------------------------------------------
2583 QStringList possible_configs = QStringList()
2590 QString set_config = dictionary["QCONFIG"];
2591 if (possible_configs.contains(set_config)) {
2592 foreach (const QString &cfg, possible_configs) {
2593 qtConfig += (cfg + "-config");
2594 if (cfg == set_config)
2599 if (dictionary.contains("XQMAKESPEC") && (dictionary["QMAKESPEC"] != dictionary["XQMAKESPEC"])) {
2600 qmakeConfig += "cross_compile";
2601 dictionary["CROSS_COMPILE"] = "yes";
2604 // Directories and settings for .qmake.cache --------------------
2606 if (dictionary.contains("XQMAKESPEC") && dictionary[ "XQMAKESPEC" ].startsWith("linux"))
2607 dictionary[ "QMAKE_RPATHDIR" ] = dictionary[ "QT_INSTALL_LIBS" ];
2609 qmakeVars += QString("OBJECTS_DIR = ") + formatPath("tmp/obj/" + dictionary["QMAKE_OUTDIR"]);
2610 qmakeVars += QString("MOC_DIR = ") + formatPath("tmp/moc/" + dictionary["QMAKE_OUTDIR"]);
2611 qmakeVars += QString("RCC_DIR = ") + formatPath("tmp/rcc/" + dictionary["QMAKE_OUTDIR"]);
2613 if (!qmakeDefines.isEmpty())
2614 qmakeVars += QString("DEFINES += ") + qmakeDefines.join(" ");
2615 if (!qmakeIncludes.isEmpty())
2616 qmakeVars += QString("INCLUDEPATH += ") + formatPaths(qmakeIncludes);
2617 if (!opensslLibs.isEmpty())
2618 qmakeVars += opensslLibs;
2619 if (dictionary[ "OPENSSL" ] == "linked") {
2620 if (!opensslLibsDebug.isEmpty() || !opensslLibsRelease.isEmpty()) {
2621 if (opensslLibsDebug.isEmpty() || opensslLibsRelease.isEmpty()) {
2622 cout << "Error: either both or none of OPENSSL_LIBS_DEBUG/_RELEASE must be defined." << endl;
2625 qmakeVars += opensslLibsDebug;
2626 qmakeVars += opensslLibsRelease;
2627 } else if (opensslLibs.isEmpty()) {
2628 qmakeVars += QString("OPENSSL_LIBS = -lssleay32 -llibeay32");
2631 if (!psqlLibs.isEmpty())
2632 qmakeVars += QString("QT_LFLAGS_PSQL=") + psqlLibs.section("=", 1);
2635 QStringList lflagsTDS;
2636 if (!sybase.isEmpty())
2637 lflagsTDS += QString("-L") + formatPath(sybase.section("=", 1) + "/lib");
2638 if (!sybaseLibs.isEmpty())
2639 lflagsTDS += sybaseLibs.section("=", 1);
2640 if (!lflagsTDS.isEmpty())
2641 qmakeVars += QString("QT_LFLAGS_TDS=") + lflagsTDS.join(" ");
2644 if (!qmakeSql.isEmpty())
2645 qmakeVars += QString("sql-drivers += ") + qmakeSql.join(" ");
2646 if (!qmakeSqlPlugins.isEmpty())
2647 qmakeVars += QString("sql-plugins += ") + qmakeSqlPlugins.join(" ");
2648 if (!qmakeStyles.isEmpty())
2649 qmakeVars += QString("styles += ") + qmakeStyles.join(" ");
2650 if (!qmakeStylePlugins.isEmpty())
2651 qmakeVars += QString("style-plugins += ") + qmakeStylePlugins.join(" ");
2653 if (dictionary["QMAKESPEC"].endsWith("-g++")) {
2654 QString includepath = qgetenv("INCLUDE");
2655 bool hasSh = Environment::detectExecutable("sh.exe");
2656 QChar separator = (!includepath.contains(":\\") && hasSh ? QChar(':') : QChar(';'));
2657 qmakeVars += QString("TMPPATH = $$quote($$(INCLUDE))");
2658 qmakeVars += QString("QMAKE_INCDIR_POST += $$split(TMPPATH,\"%1\")").arg(separator);
2659 qmakeVars += QString("TMPPATH = $$quote($$(LIB))");
2660 qmakeVars += QString("QMAKE_LIBDIR_POST += $$split(TMPPATH,\"%1\")").arg(separator);
2663 if (!dictionary[ "QMAKESPEC" ].length()) {
2664 cout << "Configure could not detect your compiler. QMAKESPEC must either" << endl
2665 << "be defined as an environment variable, or specified as an" << endl
2666 << "argument with -platform" << endl;
2667 dictionary[ "HELP" ] = "yes";
2669 QStringList winPlatforms;
2670 QDir mkspecsDir(sourcePath + "/mkspecs");
2671 const QFileInfoList &specsList = mkspecsDir.entryInfoList();
2672 for (int i = 0; i < specsList.size(); ++i) {
2673 const QFileInfo &fi = specsList.at(i);
2674 if (fi.fileName().left(5) == "win32") {
2675 winPlatforms += fi.fileName();
2678 cout << "Available platforms are: " << qPrintable(winPlatforms.join(", ")) << endl;
2679 dictionary[ "DONE" ] = "error";
2684 void Configure::generateCachefile()
2686 // Generate .qmake.cache
2687 QFile cacheFile(buildPath + "/.qmake.cache");
2688 if (cacheFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file.
2689 QTextStream cacheStream(&cacheFile);
2691 cacheStream << "include($$PWD/mkspecs/qmodule.pri)" << endl;
2693 for (QStringList::Iterator var = qmakeVars.begin(); var != qmakeVars.end(); ++var) {
2694 cacheStream << (*var) << endl;
2696 cacheStream << "CONFIG += " << qmakeConfig.join(" ") << "depend_includepath no_private_qt_headers_warning QTDIR_build" << endl;
2698 cacheStream.flush();
2702 // Generate qmodule.pri
2703 QFile moduleFile(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qmodule.pri");
2704 if (moduleFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file.
2705 QTextStream moduleStream(&moduleFile);
2707 moduleStream << "#paths" << endl;
2708 moduleStream << "QT_BUILD_TREE = " << formatPath(dictionary["QT_BUILD_TREE"]) << endl;
2709 moduleStream << "QT_SOURCE_TREE = " << formatPath(dictionary["QT_SOURCE_TREE"]) << endl;
2710 moduleStream << "QT_BUILD_PARTS += " << buildParts.join(" ") << endl << endl;
2712 if (dictionary["QT_EDITION"] != "QT_EDITION_OPENSOURCE")
2713 moduleStream << "DEFINES *= QT_EDITION=QT_EDITION_DESKTOP" << endl;
2715 if (dictionary["CETEST"] == "yes") {
2716 moduleStream << "QT_CE_RAPI_INC = " << formatPath(dictionary["QT_CE_RAPI_INC"]) << endl;
2717 moduleStream << "QT_CE_RAPI_LIB = " << formatPath(dictionary["QT_CE_RAPI_LIB"]) << endl;
2720 moduleStream << "#Qt for Windows CE c-runtime deployment" << endl
2721 << "QT_CE_C_RUNTIME = " << formatPath(dictionary["CE_CRT"]) << endl;
2723 if (dictionary["CE_SIGNATURE"] != QLatin1String("no"))
2724 moduleStream << "DEFAULT_SIGNATURE=" << dictionary["CE_SIGNATURE"] << endl;
2727 if (!dictionary["KBD_DRIVERS"].isEmpty())
2728 moduleStream << "kbd-drivers += "<< dictionary["KBD_DRIVERS"]<<endl;
2729 if (!dictionary["GFX_DRIVERS"].isEmpty())
2730 moduleStream << "gfx-drivers += "<< dictionary["GFX_DRIVERS"]<<endl;
2731 if (!dictionary["MOUSE_DRIVERS"].isEmpty())
2732 moduleStream << "mouse-drivers += "<< dictionary["MOUSE_DRIVERS"]<<endl;
2733 if (!dictionary["DECORATIONS"].isEmpty())
2734 moduleStream << "decorations += "<<dictionary["DECORATIONS"]<<endl;
2736 moduleStream << "CONFIG += create_prl link_prl";
2737 if (dictionary[ "SSE2" ] == "yes")
2738 moduleStream << " sse2";
2739 if (dictionary[ "SSE3" ] == "yes")
2740 moduleStream << " sse3";
2741 if (dictionary[ "SSSE3" ] == "yes")
2742 moduleStream << " ssse3";
2743 if (dictionary[ "SSE4_1" ] == "yes")
2744 moduleStream << " sse4_1";
2745 if (dictionary[ "SSE4_2" ] == "yes")
2746 moduleStream << " sse4_2";
2747 if (dictionary[ "AVX" ] == "yes")
2748 moduleStream << " avx";
2749 if (dictionary[ "AVX2" ] == "yes")
2750 moduleStream << " avx2";
2751 if (dictionary[ "IWMMXT" ] == "yes")
2752 moduleStream << " iwmmxt";
2753 if (dictionary[ "NEON" ] == "yes")
2754 moduleStream << " neon";
2755 if (dictionary[ "LARGE_FILE" ] == "yes")
2756 moduleStream << " largefile";
2757 moduleStream << endl;
2759 moduleStream.flush();
2765 const char *qmakespec;
2767 const char *subarchKey;
2770 ArchData(const char *t, const char *qm, const char *k, const char *sak)
2771 : qmakespec(qm), key(k), subarchKey(sak), type(t)
2776 Runs qmake on config.tests/arch/arch.pro, which will detect the target arch
2777 for the compiler we are using
2779 void Configure::detectArch()
2781 QString oldpwd = QDir::currentPath();
2783 QString newpwd = QString("%1/config.tests/arch").arg(buildPath);
2784 if (!QDir().exists(newpwd) && !QDir().mkpath(newpwd)) {
2785 cout << "Failed to create directory " << qPrintable(QDir::toNativeSeparators(newpwd)) << endl;
2786 dictionary["DONE"] = "error";
2789 if (!QDir::setCurrent(newpwd)) {
2790 cout << "Failed to change working directory to " << qPrintable(QDir::toNativeSeparators(newpwd)) << endl;
2791 dictionary["DONE"] = "error";
2795 QVector<ArchData> qmakespecs;
2796 if (dictionary.contains("XQMAKESPEC"))
2797 qmakespecs << ArchData("target", "XQMAKESPEC", "QT_ARCH", "QT_CPU_FEATURES");
2798 qmakespecs << ArchData("host", "QMAKESPEC", "QT_HOST_ARCH", "QT_HOST_CPU_FEATURES");
2800 for (int i = 0; i < qmakespecs.count(); ++i) {
2801 const ArchData &data = qmakespecs.at(i);
2802 QString qmakespec = dictionary.value(data.qmakespec);
2803 QString key = data.key;
2804 QString subarchKey = data.subarchKey;
2807 QString command = QString("%1 -spec %2 %3 2>&1")
2808 .arg(QDir::toNativeSeparators(buildPath + "/bin/qmake.exe"),
2809 QDir::toNativeSeparators(qmakespec),
2810 QDir::toNativeSeparators(sourcePath + "/config.tests/arch/arch.pro"));
2811 Environment::execute(command);
2814 command = dictionary[ "MAKE" ];
2815 if (command.contains("nmake"))
2816 command += " /NOLOGO";
2818 Environment::execute(command);
2820 // find the executable that was generated
2821 QFile exe("arch.exe");
2822 if (!exe.open(QFile::ReadOnly)) { // no Text, this is binary
2823 exe.setFileName("arch");
2824 if (!exe.open(QFile::ReadOnly)) {
2825 cout << "Could not find output file: " << qPrintable(exe.errorString()) << endl;
2826 dictionary["DONE"] = "error";
2830 QByteArray exeContents = exe.readAll();
2833 static const char archMagic[] = "==Qt=magic=Qt== Architecture:";
2834 int magicPos = exeContents.indexOf(archMagic);
2835 if (magicPos == -1) {
2836 cout << "Internal error, could not find the architecture of the "
2837 << data.type << " executable" << endl;
2838 dictionary["DONE"] = "error";
2841 //cout << "Found magic at offset 0x" << hex << magicPos << endl;
2843 // the conversion from QByteArray will stop at the ending NUL anyway
2844 QString arch = QString::fromLatin1(exeContents.constData() + magicPos
2845 + sizeof(archMagic) - 1);
2846 dictionary[key] = arch;
2848 static const char subarchMagic[] = "==Qt=magic=Qt== Sub-architecture:";
2849 magicPos = exeContents.indexOf(subarchMagic);
2850 if (magicPos == -1) {
2851 cout << "Internal error, could not find the sub-architecture of the "
2852 << data.type << " executable" << endl;
2853 dictionary["DONE"] = "error";
2857 QString subarch = QString::fromLatin1(exeContents.constData() + magicPos
2858 + sizeof(subarchMagic) - 1);
2859 dictionary[subarchKey] = subarch;
2861 //cout << "Detected arch '" << qPrintable(arch) << "'\n";
2862 //cout << "Detected sub-arch '" << qPrintable(subarch) << "'\n";
2865 Environment::execute(command + " distclean");
2868 if (!dictionary.contains("QT_HOST_ARCH"))
2869 dictionary["QT_HOST_ARCH"] = "unknown";
2870 if (!dictionary.contains("QT_ARCH")) {
2871 dictionary["QT_ARCH"] = dictionary["QT_HOST_ARCH"];
2872 dictionary["QT_CPU_FEATURES"] = dictionary["QT_HOST_CPU_FEATURES"];
2875 QDir::setCurrent(oldpwd);
2878 bool Configure::tryCompileProject(const QString &projectPath, const QString &extraOptions)
2880 QString oldpwd = QDir::currentPath();
2882 QString newpwd = QString("%1/config.tests/%2").arg(buildPath, projectPath);
2883 if (!QDir().exists(newpwd) && !QDir().mkpath(newpwd)) {
2884 cout << "Failed to create directory " << qPrintable(QDir::toNativeSeparators(newpwd)) << endl;
2885 dictionary["DONE"] = "error";
2888 if (!QDir::setCurrent(newpwd)) {
2889 cout << "Failed to change working directory to " << qPrintable(QDir::toNativeSeparators(newpwd)) << endl;
2890 dictionary["DONE"] = "error";
2895 QString command = QString("%1 %2 %3 2>&1")
2896 .arg(QDir::toNativeSeparators(buildPath + "/bin/qmake.exe"),
2897 QDir::toNativeSeparators(sourcePath + "/config.tests/" + projectPath),
2900 QString output = Environment::execute(command, &code);
2901 //cout << output << endl;
2905 command = dictionary[ "MAKE" ];
2906 if (command.contains("nmake"))
2907 command += " /NOLOGO";
2908 command += " -s 2>&1";
2909 output = Environment::execute(command, &code);
2910 //cout << output << endl;
2913 Environment::execute(command + " distclean 2>&1");
2916 QDir::setCurrent(oldpwd);
2920 void Configure::generateQConfigPri()
2922 // Generate qconfig.pri
2923 QFile configFile(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qconfig.pri");
2924 if (configFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file.
2925 QTextStream configStream(&configFile);
2927 configStream << "CONFIG+= ";
2928 configStream << dictionary[ "BUILD" ];
2930 if (dictionary[ "LTCG" ] == "yes")
2931 configStream << " ltcg";
2932 if (dictionary[ "RTTI" ] == "yes")
2933 configStream << " rtti";
2934 if (dictionary["INCREDIBUILD_XGE"] == "yes")
2935 configStream << " incredibuild_xge";
2936 if (dictionary["PLUGIN_MANIFESTS"] == "no")
2937 configStream << " no_plugin_manifest";
2938 if (dictionary["CROSS_COMPILE"] == "yes")
2939 configStream << " cross_compile";
2941 if (dictionary["DIRECTWRITE"] == "yes")
2942 configStream << "directwrite";
2944 // ### For compatibility only, should be removed later.
2945 configStream << " qpa";
2947 configStream << endl;
2948 configStream << "QT_ARCH = " << dictionary["QT_ARCH"] << endl;
2949 configStream << "QT_HOST_ARCH = " << dictionary["QT_HOST_ARCH"] << endl;
2950 configStream << "QT_CPU_FEATURES = " << dictionary["QT_CPU_FEATURES"] << endl;
2951 configStream << "QT_HOST_CPU_FEATURES = " << dictionary["QT_HOST_CPU_FEATURES"] << endl;
2952 if (dictionary["QT_EDITION"].contains("OPENSOURCE"))
2953 configStream << "QT_EDITION = " << QLatin1String("OpenSource") << endl;
2955 configStream << "QT_EDITION = " << dictionary["EDITION"] << endl;
2956 configStream << "QT_CONFIG += " << qtConfig.join(" ") << endl;
2958 configStream << "#versioning " << endl
2959 << "QT_VERSION = " << dictionary["VERSION"] << endl
2960 << "QT_MAJOR_VERSION = " << dictionary["VERSION_MAJOR"] << endl
2961 << "QT_MINOR_VERSION = " << dictionary["VERSION_MINOR"] << endl
2962 << "QT_PATCH_VERSION = " << dictionary["VERSION_PATCH"] << endl;
2964 if (!dictionary["CFG_SYSROOT"].isEmpty() && dictionary["CFG_GCC_SYSROOT"] == "yes") {
2965 configStream << endl
2966 << "# sysroot" << endl
2967 << "!host_build {" << endl
2968 << " QMAKE_CFLAGS += --sysroot=$$[QT_SYSROOT]" << endl
2969 << " QMAKE_CXXFLAGS += --sysroot=$$[QT_SYSROOT]" << endl
2970 << " QMAKE_LFLAGS += --sysroot=$$[QT_SYSROOT]" << endl
2974 if (!dictionary["QMAKE_RPATHDIR"].isEmpty())
2975 configStream << "QMAKE_RPATHDIR += " << formatPath(dictionary["QMAKE_RPATHDIR"]) << endl;
2977 if (!dictionary["QT_LIBINFIX"].isEmpty())
2978 configStream << "QT_LIBINFIX = " << dictionary["QT_LIBINFIX"] << endl;
2980 if (!dictionary["QT_NAMESPACE"].isEmpty())
2981 configStream << "#namespaces" << endl << "QT_NAMESPACE = " << dictionary["QT_NAMESPACE"] << endl;
2983 if (dictionary.value(QStringLiteral("OPENGL_ES_2")) == QStringLiteral("yes")) {
2984 const QString angleDir = dictionary.value(QStringLiteral("ANGLE_DIR"));
2985 if (!angleDir.isEmpty()) {
2987 << "QMAKE_INCDIR_OPENGL_ES2 = " << angleDir << "/include\n"
2988 << "QMAKE_LIBDIR_OPENGL_ES2_DEBUG = " << angleDir << "/lib/Debug\n"
2989 << "QMAKE_LIBDIR_OPENGL_ES2_RELEASE = " << angleDir << "/lib/Release\n";
2993 configStream.flush();
2999 QString Configure::addDefine(QString def)
3001 QString result, defNeg, defD = def;
3003 defD.replace(QRegExp("=.*"), "");
3004 def.replace(QRegExp("="), " ");
3006 if (def.startsWith("QT_NO_")) {
3008 defNeg.replace("QT_NO_", "QT_");
3009 } else if (def.startsWith("QT_")) {
3011 defNeg.replace("QT_", "QT_NO_");
3014 if (defNeg.isEmpty()) {
3015 result = "#ifndef $DEFD\n"
3019 result = "#if defined($DEFD) && defined($DEFNEG)\n"
3021 "#elif !defined($DEFD)\n"
3025 result.replace("$DEFNEG", defNeg);
3026 result.replace("$DEFD", defD);
3027 result.replace("$DEF", def);
3032 bool Configure::copySpec(const char *name, const char *pfx, const QString &spec)
3034 // "Link" configured mkspec to default directory, but remove the old one first, if there is any
3035 QString defSpec = buildPath + "/mkspecs/" + name;
3036 QFileInfo defSpecInfo(defSpec);
3037 if (defSpecInfo.exists()) {
3038 if (!Environment::rmdir(defSpec)) {
3039 cout << "Couldn't update default " << pfx << "mkspec! Are files in " << qPrintable(defSpec) << " read-only?" << endl;
3040 dictionary["DONE"] = "error";
3045 QDir::current().mkpath(defSpec);
3046 QFile qfile(defSpec + "/qmake.conf");
3047 if (qfile.open(QFile::WriteOnly | QFile::Text)) {
3048 QTextStream fileStream;
3049 fileStream.setDevice(&qfile);
3050 QString srcSpec = buildPath + "/mkspecs/" + spec; // We copied it to the build dir
3051 fileStream << "QMAKESPEC_ORIGINAL = " << formatPath(srcSpec) << endl;
3052 fileStream << "include(" << formatPath(QDir(defSpec).relativeFilePath(srcSpec + "/qmake.conf")) << ")" << endl;
3055 if (qfile.error() != QFile::NoError) {
3056 cout << "Couldn't update default " << pfx << "mkspec: " << qPrintable(qfile.errorString()) << endl;
3057 dictionary["DONE"] = "error";
3063 void Configure::generateConfigfiles()
3065 QDir(buildPath).mkpath("src/corelib/global");
3066 QString outName(buildPath + "/src/corelib/global/qconfig.h");
3067 QTemporaryFile tmpFile;
3068 QTextStream tmpStream;
3070 if (tmpFile.open()) {
3071 tmpStream.setDevice(&tmpFile);
3073 if (dictionary[ "QCONFIG" ] == "full") {
3074 tmpStream << "/* Everything */" << endl;
3076 QString configName("qconfig-" + dictionary[ "QCONFIG" ] + ".h");
3077 tmpStream << "/* Copied from " << configName << "*/" << endl;
3078 tmpStream << "#ifndef QT_BOOTSTRAPPED" << endl;
3079 QFile inFile(sourcePath + "/src/corelib/global/" + configName);
3080 if (inFile.open(QFile::ReadOnly)) {
3081 QByteArray buffer = inFile.readAll();
3082 tmpFile.write(buffer.constData(), buffer.size());
3085 tmpStream << "#endif // QT_BOOTSTRAPPED" << endl;
3089 if (dictionary[ "SHARED" ] == "no") {
3090 tmpStream << "/* Qt was configured for a static build */" << endl
3091 << "#if !defined(QT_SHARED) && !defined(QT_STATIC)" << endl
3092 << "# define QT_STATIC" << endl
3096 tmpStream << "/* License information */" << endl;
3097 tmpStream << "#define QT_PRODUCT_LICENSEE \"" << licenseInfo[ "LICENSEE" ] << "\"" << endl;
3098 tmpStream << "#define QT_PRODUCT_LICENSE \"" << dictionary[ "EDITION" ] << "\"" << endl;
3100 tmpStream << "// Qt Edition" << endl;
3101 tmpStream << "#ifndef QT_EDITION" << endl;
3102 tmpStream << "# define QT_EDITION " << dictionary["QT_EDITION"] << endl;
3103 tmpStream << "#endif" << endl;
3105 if (dictionary["BUILDDEV"] == "yes") {
3106 dictionary["QMAKE_INTERNAL"] = "yes";
3107 tmpStream << "/* Used for example to export symbols for the certain autotests*/" << endl;
3108 tmpStream << "#define QT_BUILD_INTERNAL" << endl;
3112 tmpStream << endl << "// Compile time features" << endl;
3114 QStringList qconfigList;
3115 if (dictionary["STYLE_WINDOWS"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWS";
3116 if (dictionary["STYLE_PLASTIQUE"] != "yes") qconfigList += "QT_NO_STYLE_PLASTIQUE";
3117 if (dictionary["STYLE_CLEANLOOKS"] != "yes") qconfigList += "QT_NO_STYLE_CLEANLOOKS";
3118 if (dictionary["STYLE_WINDOWSXP"] != "yes" && dictionary["STYLE_WINDOWSVISTA"] != "yes")
3119 qconfigList += "QT_NO_STYLE_WINDOWSXP";
3120 if (dictionary["STYLE_WINDOWSVISTA"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSVISTA";
3121 if (dictionary["STYLE_MOTIF"] != "yes") qconfigList += "QT_NO_STYLE_MOTIF";
3122 if (dictionary["STYLE_CDE"] != "yes") qconfigList += "QT_NO_STYLE_CDE";
3124 // ### We still need the QT_NO_STYLE_S60 define for compiling Qt. Remove later!
3125 qconfigList += "QT_NO_STYLE_S60";
3127 if (dictionary["STYLE_WINDOWSCE"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSCE";
3128 if (dictionary["STYLE_WINDOWSMOBILE"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSMOBILE";
3129 if (dictionary["STYLE_GTK"] != "yes") qconfigList += "QT_NO_STYLE_GTK";
3131 if (dictionary["GIF"] == "yes") qconfigList += "QT_BUILTIN_GIF_READER=1";
3132 if (dictionary["PNG"] != "yes") qconfigList += "QT_NO_IMAGEFORMAT_PNG";
3133 if (dictionary["JPEG"] != "yes") qconfigList += "QT_NO_IMAGEFORMAT_JPEG";
3134 if (dictionary["ZLIB"] == "no") {
3135 qconfigList += "QT_NO_ZLIB";
3136 qconfigList += "QT_NO_COMPRESS";
3139 if (dictionary["ACCESSIBILITY"] == "no") qconfigList += "QT_NO_ACCESSIBILITY";
3140 if (dictionary["WIDGETS"] == "no") qconfigList += "QT_NO_WIDGETS";
3141 if (dictionary["OPENGL"] == "no") qconfigList += "QT_NO_OPENGL";
3142 if (dictionary["OPENVG"] == "no") qconfigList += "QT_NO_OPENVG";
3143 if (dictionary["OPENSSL"] == "no") {
3144 qconfigList += "QT_NO_OPENSSL";
3145 qconfigList += "QT_NO_SSL";
3147 if (dictionary["OPENSSL"] == "linked") qconfigList += "QT_LINKED_OPENSSL";
3148 if (dictionary["DBUS"] == "no") qconfigList += "QT_NO_DBUS";
3149 if (dictionary["QML_DEBUG"] == "no") qconfigList += "QT_QML_NO_DEBUGGER";
3150 if (dictionary["FREETYPE"] == "no") qconfigList += "QT_NO_FREETYPE";
3151 if (dictionary["NATIVE_GESTURES"] == "no") qconfigList += "QT_NO_NATIVE_GESTURES";
3153 if (dictionary["OPENGL_ES_CM"] == "yes" ||
3154 dictionary["OPENGL_ES_2"] == "yes") qconfigList += "QT_OPENGL_ES";
3156 if (dictionary["OPENGL_ES_CM"] == "yes") qconfigList += "QT_OPENGL_ES_1";
3157 if (dictionary["OPENGL_ES_2"] == "yes") qconfigList += "QT_OPENGL_ES_2";
3158 if (dictionary["SQL_MYSQL"] == "yes") qconfigList += "QT_SQL_MYSQL";
3159 if (dictionary["SQL_ODBC"] == "yes") qconfigList += "QT_SQL_ODBC";
3160 if (dictionary["SQL_OCI"] == "yes") qconfigList += "QT_SQL_OCI";
3161 if (dictionary["SQL_PSQL"] == "yes") qconfigList += "QT_SQL_PSQL";
3162 if (dictionary["SQL_TDS"] == "yes") qconfigList += "QT_SQL_TDS";
3163 if (dictionary["SQL_DB2"] == "yes") qconfigList += "QT_SQL_DB2";
3164 if (dictionary["SQL_SQLITE"] == "yes") qconfigList += "QT_SQL_SQLITE";
3165 if (dictionary["SQL_SQLITE2"] == "yes") qconfigList += "QT_SQL_SQLITE2";
3166 if (dictionary["SQL_IBASE"] == "yes") qconfigList += "QT_SQL_IBASE";
3168 if (dictionary["POSIX_IPC"] == "yes") qconfigList += "QT_POSIX_IPC";
3170 if (dictionary["FONT_CONFIG"] == "no") qconfigList += "QT_NO_FONTCONFIG";
3172 if (dictionary["NIS"] == "yes")
3173 qconfigList += "QT_NIS";
3175 qconfigList += "QT_NO_NIS";
3177 if (dictionary["LARGE_FILE"] == "yes")
3178 tmpStream << "#define QT_LARGEFILE_SUPPORT 64" << endl;
3182 for (int i = 0; i < qconfigList.count(); ++i)
3183 tmpStream << addDefine(qconfigList.at(i));
3185 if (dictionary[ "QT_CUPS" ] == "no")
3186 tmpStream<<"#define QT_NO_CUPS"<<endl;
3188 if (dictionary[ "QT_ICONV" ] == "no")
3189 tmpStream<<"#define QT_NO_ICONV"<<endl;
3191 if (dictionary[ "QT_GLIB" ] == "no")
3192 tmpStream<<"#define QT_NO_GLIB"<<endl;
3194 if (dictionary[ "QT_INOTIFY" ] == "no")
3195 tmpStream<<"#define QT_NO_INOTIFY"<<endl;
3197 tmpStream<<"#define QT_QPA_DEFAULT_PLATFORM_NAME \"" << qpaPlatformName() << "\""<<endl;
3202 // Replace old qconfig.h with new one
3203 ::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
3204 QFile::remove(outName);
3205 tmpFile.copy(outName);
3209 QTemporaryFile tmpFile3;
3210 if (tmpFile3.open()) {
3211 tmpStream.setDevice(&tmpFile3);
3212 tmpStream << "/* Evaluation license key */" << endl
3213 << "static const volatile char qt_eval_key_data [512 + 12] = \"qt_qevalkey=" << licenseInfo["LICENSEKEYEXT"] << "\";" << endl;
3218 outName = buildPath + "/src/corelib/global/qconfig_eval.cpp";
3219 ::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
3220 QFile::remove(outName);
3222 if (dictionary["EDITION"] == "Evaluation" || qmakeDefines.contains("QT_EVAL"))
3223 tmpFile3.copy(outName);
3230 void Configure::displayConfig()
3233 sout.open(QString(buildPath + "/config.summary").toLocal8Bit().constData(),
3234 ios::in | ios::out | ios::trunc);
3236 // Give some feedback
3237 sout << "Environment:" << endl;
3238 QString env = QString::fromLocal8Bit(getenv("INCLUDE")).replace(QRegExp("[;,]"), "\r\n ");
3241 sout << " INCLUDE=\r\n " << env << endl;
3242 env = QString::fromLocal8Bit(getenv("LIB")).replace(QRegExp("[;,]"), "\r\n ");
3245 sout << " LIB=\r\n " << env << endl;
3246 env = QString::fromLocal8Bit(getenv("PATH")).replace(QRegExp("[;,]"), "\r\n ");
3249 sout << " PATH=\r\n " << env << endl;
3251 if (dictionary[QStringLiteral("EDITION")] != QStringLiteral("OpenSource")) {
3252 QString l1 = licenseInfo[ "LICENSEE" ];
3253 QString l2 = licenseInfo[ "LICENSEID" ];
3254 QString l3 = dictionary["EDITION"] + ' ' + "Edition";
3255 QString l4 = licenseInfo[ "EXPIRYDATE" ];
3256 sout << "Licensee...................." << (l1.isNull() ? "" : l1) << endl;
3257 sout << "License ID.................." << (l2.isNull() ? "" : l2) << endl;
3258 sout << "Product license............." << (l3.isNull() ? "" : l3) << endl;
3259 sout << "Expiry Date................." << (l4.isNull() ? "" : l4) << endl << endl;
3262 sout << "Configuration:" << endl;
3263 sout << " " << qmakeConfig.join("\r\n ") << endl;
3264 sout << "Qt Configuration:" << endl;
3265 sout << " " << qtConfig.join("\r\n ") << endl;
3268 if (dictionary.contains("XQMAKESPEC"))
3269 sout << "QMAKESPEC..................." << dictionary[ "XQMAKESPEC" ] << " (" << dictionary["QMAKESPEC_FROM"] << ")" << endl;
3271 sout << "QMAKESPEC..................." << dictionary[ "QMAKESPEC" ] << " (" << dictionary["QMAKESPEC_FROM"] << ")" << endl;
3272 sout << "Architecture................" << dictionary["QT_ARCH"]
3273 << ", features:" << dictionary["QT_CPU_FEATURES"] << endl;
3274 sout << "Host Architecture..........." << dictionary["QT_HOST_ARCH"]
3275 << ", features:" << dictionary["QT_HOST_CPU_FEATURES"] << endl;
3276 sout << "Maketool...................." << dictionary[ "MAKE" ] << endl;
3277 sout << "Debug symbols..............." << (dictionary[ "BUILD" ] == "debug" ? "yes" : "no") << endl;
3278 sout << "Link Time Code Generation..." << dictionary[ "LTCG" ] << endl;
3279 sout << "Accessibility support......." << dictionary[ "ACCESSIBILITY" ] << endl;
3280 sout << "RTTI support................" << dictionary[ "RTTI" ] << endl;
3281 sout << "SSE2 support................" << dictionary[ "SSE2" ] << endl;
3282 sout << "SSE3 support................" << dictionary[ "SSE3" ] << endl;
3283 sout << "SSSE3 support..............." << dictionary[ "SSSE3" ] << endl;
3284 sout << "SSE4.1 support.............." << dictionary[ "SSE4_1" ] << endl;
3285 sout << "SSE4.2 support.............." << dictionary[ "SSE4_2" ] << endl;
3286 sout << "AVX support................." << dictionary[ "AVX" ] << endl;
3287 sout << "AVX2 support................" << dictionary[ "AVX2" ] << endl;
3288 sout << "NEON support................" << dictionary[ "NEON" ] << endl;
3289 sout << "IWMMXT support.............." << dictionary[ "IWMMXT" ] << endl;
3290 sout << "OpenGL support.............." << dictionary[ "OPENGL" ] << endl;
3291 sout << "Large File support.........." << dictionary[ "LARGE_FILE" ] << endl;
3292 sout << "NIS support................." << dictionary[ "NIS" ] << endl;
3293 sout << "Iconv support..............." << dictionary[ "QT_ICONV" ] << endl;
3294 sout << "Glib support................" << dictionary[ "QT_GLIB" ] << endl;
3295 sout << "CUPS support................" << dictionary[ "QT_CUPS" ] << endl;
3296 if (dictionary.value(QStringLiteral("OPENGL_ES_2")) == QStringLiteral("yes")) {
3297 const QString angleDir = dictionary.value(QStringLiteral("ANGLE_DIR"));
3298 if (!angleDir.isEmpty())
3299 sout << "ANGLE......................." << QDir::toNativeSeparators(angleDir) << endl;
3301 sout << "OpenVG support.............." << dictionary[ "OPENVG" ] << endl;
3302 sout << "OpenSSL support............." << dictionary[ "OPENSSL" ] << endl;
3303 sout << "QtDBus support.............." << dictionary[ "DBUS" ] << endl;
3304 sout << "QtWidgets module support...." << dictionary[ "WIDGETS" ] << endl;
3305 sout << "QML debugging..............." << dictionary[ "QML_DEBUG" ] << endl;
3306 sout << "DirectWrite support........." << dictionary[ "DIRECTWRITE" ] << endl << endl;
3308 sout << "Third Party Libraries:" << endl;
3309 sout << " ZLIB support............" << dictionary[ "ZLIB" ] << endl;
3310 sout << " GIF support............." << dictionary[ "GIF" ] << endl;
3311 sout << " JPEG support............" << dictionary[ "JPEG" ] << endl;
3312 sout << " PNG support............." << dictionary[ "PNG" ] << endl;
3313 sout << " FreeType support........" << dictionary[ "FREETYPE" ] << endl << endl;
3314 sout << " PCRE support............" << dictionary[ "PCRE" ] << endl;
3315 sout << " ICU support............." << dictionary[ "ICU" ] << endl;
3317 sout << "Styles:" << endl;
3318 sout << " Windows................." << dictionary[ "STYLE_WINDOWS" ] << endl;
3319 sout << " Windows XP.............." << dictionary[ "STYLE_WINDOWSXP" ] << endl;
3320 sout << " Windows Vista..........." << dictionary[ "STYLE_WINDOWSVISTA" ] << endl;
3321 sout << " Plastique..............." << dictionary[ "STYLE_PLASTIQUE" ] << endl;
3322 sout << " Cleanlooks.............." << dictionary[ "STYLE_CLEANLOOKS" ] << endl;
3323 sout << " Motif..................." << dictionary[ "STYLE_MOTIF" ] << endl;
3324 sout << " CDE....................." << dictionary[ "STYLE_CDE" ] << endl;
3325 sout << " Windows CE.............." << dictionary[ "STYLE_WINDOWSCE" ] << endl;
3326 sout << " Windows Mobile.........." << dictionary[ "STYLE_WINDOWSMOBILE" ] << endl << endl;
3328 sout << "Sql Drivers:" << endl;
3329 sout << " ODBC...................." << dictionary[ "SQL_ODBC" ] << endl;
3330 sout << " MySQL..................." << dictionary[ "SQL_MYSQL" ] << endl;
3331 sout << " OCI....................." << dictionary[ "SQL_OCI" ] << endl;
3332 sout << " PostgreSQL.............." << dictionary[ "SQL_PSQL" ] << endl;
3333 sout << " TDS....................." << dictionary[ "SQL_TDS" ] << endl;
3334 sout << " DB2....................." << dictionary[ "SQL_DB2" ] << endl;
3335 sout << " SQLite.................." << dictionary[ "SQL_SQLITE" ] << " (" << dictionary[ "SQL_SQLITE_LIB" ] << ")" << endl;
3336 sout << " SQLite2................." << dictionary[ "SQL_SQLITE2" ] << endl;
3337 sout << " InterBase..............." << dictionary[ "SQL_IBASE" ] << endl << endl;
3339 sout << "Sources are in.............." << QDir::toNativeSeparators(dictionary["QT_SOURCE_TREE"]) << endl;
3340 sout << "Build is done in............" << QDir::toNativeSeparators(dictionary["QT_BUILD_TREE"]) << endl;
3341 sout << "Install prefix.............." << QDir::toNativeSeparators(dictionary["QT_INSTALL_PREFIX"]) << endl;
3342 sout << "Headers installed to........" << QDir::toNativeSeparators(dictionary["QT_INSTALL_HEADERS"]) << endl;
3343 sout << "Libraries installed to......" << QDir::toNativeSeparators(dictionary["QT_INSTALL_LIBS"]) << endl;
3344 sout << "Plugins installed to........" << QDir::toNativeSeparators(dictionary["QT_INSTALL_PLUGINS"]) << endl;
3345 sout << "Imports installed to........" << QDir::toNativeSeparators(dictionary["QT_INSTALL_IMPORTS"]) << endl;
3346 sout << "Binaries installed to......." << QDir::toNativeSeparators(dictionary["QT_INSTALL_BINS"]) << endl;
3347 sout << "Docs installed to..........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_DOCS"]) << endl;
3348 sout << "Data installed to..........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_DATA"]) << endl;
3349 sout << "Translations installed to..." << QDir::toNativeSeparators(dictionary["QT_INSTALL_TRANSLATIONS"]) << endl;
3350 sout << "Examples installed to......." << QDir::toNativeSeparators(dictionary["QT_INSTALL_EXAMPLES"]) << endl;
3351 sout << "Tests installed to.........." << QDir::toNativeSeparators(dictionary["QT_INSTALL_TESTS"]) << endl;
3353 if (dictionary.contains("XQMAKESPEC") && dictionary["XQMAKESPEC"].startsWith(QLatin1String("wince"))) {
3354 sout << "Using c runtime detection..." << dictionary[ "CE_CRT" ] << endl;
3355 sout << "Cetest support.............." << dictionary[ "CETEST" ] << endl;
3356 sout << "Signature..................." << dictionary[ "CE_SIGNATURE"] << endl << endl;
3359 if (checkAvailability("INCREDIBUILD_XGE"))
3360 sout << "Using IncrediBuild XGE......" << dictionary["INCREDIBUILD_XGE"] << endl;
3361 if (!qmakeDefines.isEmpty()) {
3362 sout << "Defines.....................";
3363 for (QStringList::Iterator defs = qmakeDefines.begin(); defs != qmakeDefines.end(); ++defs)
3364 sout << (*defs) << " ";
3367 if (!qmakeIncludes.isEmpty()) {
3368 sout << "Include paths...............";
3369 for (QStringList::Iterator incs = qmakeIncludes.begin(); incs != qmakeIncludes.end(); ++incs)
3370 sout << (*incs) << " ";
3373 if (!qmakeLibs.isEmpty()) {
3374 sout << "Additional libraries........";
3375 for (QStringList::Iterator libs = qmakeLibs.begin(); libs != qmakeLibs.end(); ++libs)
3376 sout << (*libs) << " ";
3379 if (dictionary[ "QMAKE_INTERNAL" ] == "yes") {
3380 sout << "Using internal configuration." << endl;
3382 if (dictionary[ "SHARED" ] == "no") {
3383 sout << "WARNING: Using static linking will disable the use of plugins." << endl;
3384 sout << " Make sure you compile ALL needed modules into the library." << endl;
3386 if (dictionary[ "OPENSSL" ] == "linked") {
3387 if (!opensslLibsDebug.isEmpty() || !opensslLibsRelease.isEmpty()) {
3388 sout << "Using OpenSSL libraries:" << endl;
3389 sout << " debug : " << opensslLibsDebug << endl;
3390 sout << " release: " << opensslLibsRelease << endl;
3391 sout << " both : " << opensslLibs << endl;
3392 } else if (opensslLibs.isEmpty()) {
3393 sout << "NOTE: When linking against OpenSSL, you can override the default" << endl;
3394 sout << "library names through OPENSSL_LIBS and optionally OPENSSL_LIBS_DEBUG/OPENSSL_LIBS_RELEASE" << endl;
3395 sout << "For example:" << endl;
3396 sout << " configure -openssl-linked OPENSSL_LIBS=\"-lssleay32 -llibeay32\"" << endl;
3399 if (dictionary[ "ZLIB_FORCED" ] == "yes") {
3400 QString which_zlib = "supplied";
3401 if (dictionary[ "ZLIB" ] == "system")
3402 which_zlib = "system";
3404 sout << "NOTE: The -no-zlib option was supplied but is no longer supported." << endl
3406 << "Qt now requires zlib support in all builds, so the -no-zlib" << endl
3407 << "option was ignored. Qt will be built using the " << which_zlib
3410 if (dictionary["OBSOLETE_ARCH_ARG"] == "yes") {
3412 << "NOTE: The -arch option is obsolete." << endl
3414 << "Qt now detects the target and host architectures based on compiler" << endl
3415 << "output. Qt will be built using " << dictionary["QT_ARCH"] << " for the target architecture" << endl
3416 << "and " << dictionary["QT_HOST_ARCH"] << " for the host architecture (note that these two" << endl
3417 << "will be the same unless you are cross-compiling)." << endl
3421 // display config.summary
3422 sout.seekg(0, ios::beg);
3426 cout << str << endl;
3432 void Configure::generateHeaders()
3434 if (dictionary["SYNCQT"] == "yes") {
3435 if (findFile("perl.exe")) {
3436 cout << "Running syncqt..." << endl;
3438 args += buildPath + "/bin/syncqt.bat";
3441 env += QString("QTDIR=" + sourcePath);
3442 env += QString("PATH=" + buildPath + "/bin/;" + qgetenv("PATH"));
3443 int retc = Environment::execute(args, env, QStringList());
3445 cout << "syncqt failed, return code " << retc << endl << endl;
3446 dictionary["DONE"] = "error";
3449 cout << "Perl not found in environment - cannot run syncqt." << endl;
3450 dictionary["DONE"] = "error";
3455 void Configure::generateQConfigCpp()
3457 // if QT_INSTALL_* have not been specified on commandline, define them now from QT_INSTALL_PREFIX
3458 // if prefix is empty (WINCE), make all of them empty, if they aren't set
3459 bool qipempty = false;
3460 if (dictionary["QT_INSTALL_PREFIX"].isEmpty())
3463 if (!dictionary["QT_INSTALL_DOCS"].size())
3464 dictionary["QT_INSTALL_DOCS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/doc";
3465 if (!dictionary["QT_INSTALL_HEADERS"].size())
3466 dictionary["QT_INSTALL_HEADERS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/include";
3467 if (!dictionary["QT_INSTALL_LIBS"].size())
3468 dictionary["QT_INSTALL_LIBS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/lib";
3469 if (!dictionary["QT_INSTALL_BINS"].size())
3470 dictionary["QT_INSTALL_BINS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/bin";
3471 if (!dictionary["QT_INSTALL_PLUGINS"].size())
3472 dictionary["QT_INSTALL_PLUGINS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/plugins";
3473 if (!dictionary["QT_INSTALL_IMPORTS"].size())
3474 dictionary["QT_INSTALL_IMPORTS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/imports";
3475 if (!dictionary["QT_INSTALL_DATA"].size())
3476 dictionary["QT_INSTALL_DATA"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"];
3477 if (!dictionary["QT_INSTALL_TRANSLATIONS"].size())
3478 dictionary["QT_INSTALL_TRANSLATIONS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/translations";
3479 if (!dictionary["QT_INSTALL_EXAMPLES"].size())
3480 dictionary["QT_INSTALL_EXAMPLES"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/examples";
3481 if (!dictionary["QT_INSTALL_TESTS"].size())
3482 dictionary["QT_INSTALL_TESTS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/tests";
3484 bool haveHpx = false;
3485 if (dictionary["QT_HOST_PREFIX"].isEmpty())
3486 dictionary["QT_HOST_PREFIX"] = dictionary["QT_INSTALL_PREFIX"];
3489 if (dictionary["QT_HOST_BINS"].isEmpty())
3490 dictionary["QT_HOST_BINS"] = haveHpx ? dictionary["QT_HOST_PREFIX"] + "/bin" : dictionary["QT_INSTALL_BINS"];
3491 if (dictionary["QT_HOST_DATA"].isEmpty())
3492 dictionary["QT_HOST_DATA"] = haveHpx ? dictionary["QT_HOST_PREFIX"] : dictionary["QT_INSTALL_DATA"];
3494 // Generate the new qconfig.cpp file
3495 QDir(buildPath).mkpath("src/corelib/global");
3496 const QString outName(buildPath + "/src/corelib/global/qconfig.cpp");
3498 QTemporaryFile tmpFile;
3499 if (tmpFile.open()) {
3500 QTextStream tmpStream(&tmpFile);
3501 tmpStream << "/* Licensed */" << endl
3502 << "static const char qt_configure_licensee_str [512 + 12] = \"qt_lcnsuser=" << licenseInfo["LICENSEE"] << "\";" << endl
3503 << "static const char qt_configure_licensed_products_str [512 + 12] = \"qt_lcnsprod=" << dictionary["EDITION"] << "\";" << endl
3505 << "/* Build date */" << endl
3506 << "static const char qt_configure_installation [11 + 12] = \"qt_instdate=" << QDate::currentDate().toString(Qt::ISODate) << "\";" << endl
3508 << "static const char qt_configure_prefix_path_strs[][12 + 512] = {" << endl
3509 << " \"qt_prfxpath=" << formatPath(dictionary["QT_INSTALL_PREFIX"]) << "\"," << endl
3510 << " \"qt_docspath=" << formatPath(dictionary["QT_INSTALL_DOCS"]) << "\"," << endl
3511 << " \"qt_hdrspath=" << formatPath(dictionary["QT_INSTALL_HEADERS"]) << "\"," << endl
3512 << " \"qt_libspath=" << formatPath(dictionary["QT_INSTALL_LIBS"]) << "\"," << endl
3513 << " \"qt_binspath=" << formatPath(dictionary["QT_INSTALL_BINS"]) << "\"," << endl
3514 << " \"qt_plugpath=" << formatPath(dictionary["QT_INSTALL_PLUGINS"]) << "\"," << endl
3515 << " \"qt_impspath=" << formatPath(dictionary["QT_INSTALL_IMPORTS"]) << "\"," << endl
3516 << " \"qt_datapath=" << formatPath(dictionary["QT_INSTALL_DATA"]) << "\"," << endl
3517 << " \"qt_trnspath=" << formatPath(dictionary["QT_INSTALL_TRANSLATIONS"]) << "\"," << endl
3518 << " \"qt_xmplpath=" << formatPath(dictionary["QT_INSTALL_EXAMPLES"]) << "\"," << endl
3519 << " \"qt_tstspath=" << formatPath(dictionary["QT_INSTALL_TESTS"]) << "\"," << endl
3520 << "#ifdef QT_BUILD_QMAKE" << endl
3521 << " \"qt_ssrtpath=" << formatPath(dictionary["CFG_SYSROOT"]) << "\"," << endl
3522 << " \"qt_hpfxpath=" << formatPath(dictionary["QT_HOST_PREFIX"]) << "\"," << endl
3523 << " \"qt_hbinpath=" << formatPath(dictionary["QT_HOST_BINS"]) << "\"," << endl
3524 << " \"qt_hdatpath=" << formatPath(dictionary["QT_HOST_DATA"]) << "\"," << endl
3528 if ((platform() != WINDOWS) && (platform() != WINDOWS_CE))
3529 tmpStream << "static const char qt_configure_settings_path_str [256 + 12] = \"qt_stngpath=" << formatPath(dictionary["QT_INSTALL_SETTINGS"]) << "\";" << endl;
3532 << "/* strlen( \"qt_lcnsxxxx\") == 12 */" << endl
3533 << "#define QT_CONFIGURE_LICENSEE qt_configure_licensee_str + 12;" << endl
3534 << "#define QT_CONFIGURE_LICENSED_PRODUCTS qt_configure_licensed_products_str + 12;" << endl;
3536 if ((platform() != WINDOWS) && (platform() != WINDOWS_CE))
3537 tmpStream << "#define QT_CONFIGURE_SETTINGS_PATH qt_configure_settings_path_str + 12;" << endl;
3542 // Replace old qconfig.cpp with new one
3543 ::SetFileAttributes((wchar_t*)outName.utf16(), FILE_ATTRIBUTE_NORMAL);
3544 QFile::remove(outName);
3545 tmpFile.copy(outName);
3550 void Configure::buildQmake()
3552 if (dictionary[ "BUILD_QMAKE" ] == "yes") {
3556 QString pwd = QDir::currentPath();
3557 if (!QDir(buildPath).mkpath("qmake")) {
3558 cout << "Cannot create qmake build dir." << endl;
3559 dictionary[ "DONE" ] = "error";
3562 if (!QDir::setCurrent(buildPath + "/qmake")) {
3563 cout << "Cannot enter qmake build dir." << endl;
3564 dictionary[ "DONE" ] = "error";
3568 QString makefile = "Makefile";
3570 QFile out(makefile);
3571 if (out.open(QFile::WriteOnly | QFile::Text)) {
3572 QTextStream stream(&out);
3573 stream << "#AutoGenerated by configure.exe" << endl
3574 << "BUILD_PATH = " << QDir::toNativeSeparators(buildPath) << endl
3575 << "SOURCE_PATH = " << QDir::toNativeSeparators(sourcePath) << endl;
3576 stream << "QMAKESPEC = " << dictionary["QMAKESPEC"] << endl
3577 << "QT_VERSION = " << dictionary["VERSION"] << endl;
3579 if (dictionary["EDITION"] == "OpenSource" ||
3580 dictionary["QT_EDITION"].contains("OPENSOURCE"))
3581 stream << "QMAKE_OPENSOURCE_EDITION = yes" << endl;
3584 QFile in(sourcePath + "/qmake/" + dictionary["QMAKEMAKEFILE"]);
3585 if (in.open(QFile::ReadOnly | QFile::Text)) {
3586 QString d = in.readAll();
3587 //### need replaces (like configure.sh)? --Sam
3588 stream << d << endl;
3595 args += dictionary[ "MAKE" ];
3599 cout << "Creating qmake..." << endl;
3600 int exitCode = Environment::execute(args, QStringList(), QStringList());
3603 args += dictionary[ "MAKE" ];
3607 exitCode = Environment::execute(args, QStringList(), QStringList());
3609 cout << "Cleaning qmake failed, return code " << exitCode << endl << endl;
3610 dictionary[ "DONE" ] = "error";
3613 args += dictionary[ "MAKE" ];
3616 exitCode = Environment::execute(args, QStringList(), QStringList());
3618 cout << "Building qmake failed, return code " << exitCode << endl << endl;
3619 dictionary[ "DONE" ] = "error";
3623 QDir::setCurrent(pwd);
3627 QFile confFile(buildPath + "/bin/qt.conf");
3628 if (confFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file.
3629 QTextStream confStream(&confFile);
3630 confStream << "[EffectivePaths]" << endl
3631 << "Prefix=.." << endl;
3637 //create default mkspecs
3638 QString spec = dictionary.contains("XQMAKESPEC") ? dictionary["XQMAKESPEC"] : dictionary["QMAKESPEC"];
3639 if (!copySpec("default", "", spec)
3640 || !copySpec("default-host", "host ", dictionary["QMAKESPEC"])) {
3641 cout << "Error installing default mkspecs" << endl << endl;
3648 void Configure::findProjects(const QString& dirName)
3650 if (dictionary[ "NOPROCESS" ] == "no") {
3654 ProjectType qmakeTemplate;
3655 const QFileInfoList &list = dir.entryInfoList(QStringList(QLatin1String("*.pro")),
3656 QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
3657 for (int i = 0; i < list.size(); ++i) {
3658 const QFileInfo &fi = list.at(i);
3659 if (fi.fileName() != "qmake.pro") {
3660 entryName = dirName + "/" + fi.fileName();
3662 findProjects(entryName);
3664 qmakeTemplate = projectType(fi.absoluteFilePath());
3665 switch (qmakeTemplate) {
3674 makeList[makeListNumber].append(new MakeItem(sourceDir.relativeFilePath(fi.absolutePath()),
3685 void Configure::appendMakeItem(int inList, const QString &item)
3690 dir.prepend("/src");
3691 makeList[inList].append(new MakeItem(sourcePath + dir,
3692 item + ".pro", buildPath + dir + "/Makefile", Lib));
3693 if (dictionary[ "DSPFILES" ] == "yes") {
3694 makeList[inList].append(new MakeItem(sourcePath + dir,
3695 item + ".pro", buildPath + dir + "/" + item + ".dsp", Lib));
3697 if (dictionary[ "VCPFILES" ] == "yes") {
3698 makeList[inList].append(new MakeItem(sourcePath + dir,
3699 item + ".pro", buildPath + dir + "/" + item + ".vcp", Lib));
3701 if (dictionary[ "VCPROJFILES" ] == "yes") {
3702 makeList[inList].append(new MakeItem(sourcePath + dir,
3703 item + ".pro", buildPath + dir + "/" + item + ".vcproj", Lib));
3707 void Configure::generateMakefiles()
3709 if (dictionary[ "NOPROCESS" ] == "no") {
3711 cout << "Creating makefiles in src..." << endl;
3714 QString spec = dictionary.contains("XQMAKESPEC") ? dictionary[ "XQMAKESPEC" ] : dictionary[ "QMAKESPEC" ];
3715 if (spec != "win32-msvc")
3716 dictionary[ "DSPFILES" ] = "no";
3718 if (spec != "win32-msvc.net" && !spec.startsWith("win32-msvc2") && !spec.startsWith(QLatin1String("wince")))
3719 dictionary[ "VCPROJFILES" ] = "no";
3722 QString pwd = QDir::currentPath();
3723 if (dictionary["FAST"] != "yes") {
3725 bool generate = true;
3726 bool doDsp = (dictionary["DSPFILES"] == "yes" || dictionary["VCPFILES"] == "yes"
3727 || dictionary["VCPROJFILES"] == "yes");
3729 QString pwd = QDir::currentPath();
3730 QString dirPath = buildPath + dirName;
3733 args << buildPath + "/bin/qmake";
3736 if (dictionary[ "DEPENDENCIES" ] == "no")
3737 args << "-nodepend";
3738 args << "-tp" << "vc";
3739 doDsp = false; // DSP files will be done
3740 printf("Generating Visual Studio project files...\n");
3742 printf("Generating Makefiles...\n");
3743 generate = false; // Now Makefiles will be done
3746 args << (sourcePath + "/qtbase.pro");
3749 if (!dictionary[ "QMAKEADDITIONALARGS" ].isEmpty())
3750 args << dictionary[ "QMAKEADDITIONALARGS" ];
3752 QDir::setCurrent(dirPath);
3753 if (int exitCode = Environment::execute(args, QStringList(), QStringList())) {
3754 cout << "Qmake failed, return code " << exitCode << endl << endl;
3755 dictionary[ "DONE" ] = "error";
3759 findProjects(sourcePath);
3760 for (i=0; i<3; i++) {
3761 for (int j=0; j<makeList[i].size(); ++j) {
3762 MakeItem *it=makeList[i][j];
3763 if (it->directory == "tools/configure")
3764 continue; // don't overwrite our own Makefile
3766 QString dirPath = it->directory + '/';
3767 QString projectName = it->proFile;
3768 QString makefileName = buildPath + "/" + dirPath + it->target;
3770 // For shadowbuilds, we need to create the path first
3771 QDir buildPathDir(buildPath);
3772 if (sourcePath != buildPath && !buildPathDir.exists(dirPath))
3773 buildPathDir.mkpath(dirPath);
3777 args << QDir::toNativeSeparators(buildPath + "/bin/qmake.exe");
3778 args << sourcePath + "/" + dirPath + projectName;
3779 args << dictionary[ "QMAKE_ALL_ARGS" ];
3781 cout << "For " << qPrintable(QDir::toNativeSeparators(dirPath + projectName)) << endl;
3784 if (!dictionary[ "QMAKEADDITIONALARGS" ].isEmpty())
3785 args << dictionary[ "QMAKEADDITIONALARGS" ];
3787 QDir::setCurrent(dirPath);
3789 QFile file(makefileName);
3790 if (!file.open(QFile::WriteOnly | QFile::Text)) {
3791 printf("failed on dirPath=%s, makefile=%s\n",
3792 qPrintable(QDir::toNativeSeparators(dirPath)),
3793 qPrintable(QDir::toNativeSeparators(makefileName)));
3796 QTextStream txt(&file);
3798 txt << "\t" << args.join(" ") << "\n";
3799 txt << "\t$(MAKE) -$(MAKEFLAGS) -f " << it->target << "\n";
3800 txt << "first: all\n";
3801 txt << "qmake: FORCE\n";
3802 txt << "\t" << args.join(" ") << "\n";
3807 QDir::setCurrent(pwd);
3809 cout << "Processing of project files have been disabled." << endl;
3810 cout << "Only use this option if you really know what you're doing." << endl << endl;
3815 void Configure::showSummary()
3817 QString make = dictionary[ "MAKE" ];
3818 if (!dictionary.contains("XQMAKESPEC")) {
3819 cout << endl << endl << "Qt is now configured for building. Just run " << qPrintable(make) << "." << endl;
3820 cout << "To reconfigure, run " << qPrintable(make) << " confclean and configure." << endl << endl;
3821 } else if (dictionary.value("QMAKESPEC").startsWith("wince")) {
3822 // we are cross compiling for Windows CE
3823 cout << endl << endl << "Qt is now configured for building. To start the build run:" << endl
3824 << "\tsetcepaths " << dictionary.value("XQMAKESPEC") << endl
3825 << "\t" << qPrintable(make) << endl
3826 << "To reconfigure, run " << qPrintable(make) << " confclean and configure." << endl << endl;
3830 Configure::ProjectType Configure::projectType(const QString& proFileName)
3832 QFile proFile(proFileName);
3833 if (proFile.open(QFile::ReadOnly)) {
3834 QString buffer = proFile.readLine(1024);
3835 while (!buffer.isEmpty()) {
3836 QStringList segments = buffer.split(QRegExp("\\s"));
3837 QStringList::Iterator it = segments.begin();
3839 if (segments.size() >= 3) {
3840 QString keyword = (*it++);
3841 QString operation = (*it++);
3842 QString value = (*it++);
3844 if (keyword == "TEMPLATE") {
3847 else if (value == "subdirs")
3852 buffer = proFile.readLine(1024);
3856 // Default to app handling
3862 bool Configure::showLicense(QString orgLicenseFile)
3864 if (dictionary["LICENSE_CONFIRMED"] == "yes") {
3865 cout << "You have already accepted the terms of the license." << endl << endl;
3869 bool haveGpl3 = false;
3870 QString licenseFile = orgLicenseFile;
3872 if (dictionary["EDITION"] == "OpenSource" || dictionary["EDITION"] == "Snapshot") {
3873 haveGpl3 = QFile::exists(orgLicenseFile + "/LICENSE.GPL3");
3874 theLicense = "GNU Lesser General Public License (LGPL) version 2.1";
3876 theLicense += "\nor the GNU General Public License (GPL) version 3";
3878 // the first line of the license file tells us which license it is
3879 QFile file(licenseFile);
3880 if (!file.open(QFile::ReadOnly)) {
3881 cout << "Failed to load LICENSE file" << endl;
3884 theLicense = file.readLine().trimmed();
3889 cout << "You are licensed to use this software under the terms of" << endl
3890 << "the " << theLicense << "." << endl
3892 if (dictionary["EDITION"] == "OpenSource" || dictionary["EDITION"] == "Snapshot") {
3894 cout << "Type '3' to view the GNU General Public License version 3 (GPLv3)." << endl;
3895 cout << "Type 'L' to view the Lesser GNU General Public License version 2.1 (LGPLv2.1)." << endl;
3897 cout << "Type '?' to view the " << theLicense << "." << endl;
3899 cout << "Type 'y' to accept this license offer." << endl
3900 << "Type 'n' to decline this license offer." << endl
3902 << "Do you accept the terms of the license?" << endl;
3904 accept = tolower(accept);
3906 if (accept == 'y') {
3908 } else if (accept == 'n') {
3911 if (dictionary["EDITION"] == "OpenSource" || dictionary["EDITION"] == "Snapshot") {
3913 licenseFile = orgLicenseFile + "/LICENSE.GPL3";
3915 licenseFile = orgLicenseFile + "/LICENSE.LGPL";
3917 // Get console line height, to fill the screen properly
3918 int i = 0, screenHeight = 25; // default
3919 CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
3920 HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
3921 if (GetConsoleScreenBufferInfo(stdOut, &consoleInfo))
3922 screenHeight = consoleInfo.srWindow.Bottom
3923 - consoleInfo.srWindow.Top
3924 - 1; // Some overlap for context
3926 // Prompt the license content to the user
3927 QFile file(licenseFile);
3928 if (!file.open(QFile::ReadOnly)) {
3929 cout << "Failed to load LICENSE file" << licenseFile << endl;
3932 QStringList licenseContent = QString(file.readAll()).split('\n');
3933 while (i < licenseContent.size()) {
3934 cout << licenseContent.at(i) << endl;
3935 if (++i % screenHeight == 0) {
3936 cout << "(Press any key for more..)";
3937 if (_getch() == 3) // _Any_ keypress w/no echo(eat <Enter> for stdout)
3938 exit(0); // Exit cleanly for Ctrl+C
3939 cout << "\r"; // Overwrite text above
3946 void Configure::readLicense()
3948 dictionary["PLATFORM NAME"] = platformName();
3949 dictionary["LICENSE FILE"] = sourcePath;
3951 bool openSource = false;
3952 bool hasOpenSource = QFile::exists(dictionary["LICENSE FILE"] + "/LICENSE.GPL3") || QFile::exists(dictionary["LICENSE FILE"] + "/LICENSE.LGPL");
3953 if (dictionary["BUILDTYPE"] == "commercial") {
3955 } else if (dictionary["BUILDTYPE"] == "opensource") {
3957 } else if (hasOpenSource) { // No Open Source? Just display the commercial license right away
3960 cout << "Which edition of Qt do you want to use ?" << endl;
3961 cout << "Type 'c' if you want to use the Commercial Edition." << endl;
3962 cout << "Type 'o' if you want to use the Open Source Edition." << endl;
3964 accept = tolower(accept);
3966 if (accept == 'c') {
3969 } else if (accept == 'o') {
3975 if (hasOpenSource && openSource) {
3976 cout << endl << "This is the " << dictionary["PLATFORM NAME"] << " Open Source Edition." << endl;
3977 licenseInfo["LICENSEE"] = "Open Source";
3978 dictionary["EDITION"] = "OpenSource";
3979 dictionary["QT_EDITION"] = "QT_EDITION_OPENSOURCE";
3981 if (!showLicense(dictionary["LICENSE FILE"])) {
3982 cout << "Configuration aborted since license was not accepted";
3983 dictionary["DONE"] = "error";
3986 } else if (openSource) {
3987 cout << endl << "Cannot find the GPL license files! Please download the Open Source version of the library." << endl;
3988 dictionary["DONE"] = "error";
3990 #ifdef COMMERCIAL_VERSION
3992 Tools::checkLicense(dictionary, licenseInfo, firstLicensePath());
3993 if (dictionary["DONE"] != "error") {
3994 // give the user some feedback, and prompt for license acceptance
3995 cout << endl << "This is the " << dictionary["PLATFORM NAME"] << " " << dictionary["EDITION"] << " Edition."<< endl << endl;
3996 if (!showLicense(dictionary["LICENSE FILE"])) {
3997 cout << "Configuration aborted since license was not accepted";
3998 dictionary["DONE"] = "error";
4003 #else // !COMMERCIAL_VERSION
4005 cout << endl << "Cannot build commercial edition from the open source version of the library." << endl;
4006 dictionary["DONE"] = "error";
4011 void Configure::reloadCmdLine()
4013 if (dictionary[ "REDO" ] == "yes") {
4014 QFile inFile(buildPath + "/configure" + dictionary[ "CUSTOMCONFIG" ] + ".cache");
4015 if (inFile.open(QFile::ReadOnly)) {
4016 QTextStream inStream(&inFile);
4019 while (buffer.length()) {
4020 configCmdLine += buffer;
4028 void Configure::saveCmdLine()
4030 if (dictionary[ "REDO" ] != "yes") {
4031 QFile outFile(buildPath + "/configure" + dictionary[ "CUSTOMCONFIG" ] + ".cache");
4032 if (outFile.open(QFile::WriteOnly | QFile::Text)) {
4033 QTextStream outStream(&outFile);
4034 for (QStringList::Iterator it = configCmdLine.begin(); it != configCmdLine.end(); ++it) {
4035 outStream << (*it) << " " << endl;
4044 bool Configure::isDone()
4046 return !dictionary["DONE"].isEmpty();
4049 bool Configure::isOk()
4051 return (dictionary[ "DONE" ] != "error");
4054 QString Configure::platformName() const
4056 switch (platform()) {
4059 return QStringLiteral("Qt for Windows");
4061 return QStringLiteral("Qt for Windows CE");
4063 return QStringLiteral("Qt for QNX");
4065 return QStringLiteral("Qt for Blackberry");
4069 QString Configure::qpaPlatformName() const
4071 switch (platform()) {
4075 return QStringLiteral("windows");
4077 return QStringLiteral("qnx");
4079 return QStringLiteral("blackberry");
4083 int Configure::platform() const
4085 const QString qMakeSpec = dictionary.value("QMAKESPEC");
4086 const QString xQMakeSpec = dictionary.value("XQMAKESPEC");
4088 if ((qMakeSpec.startsWith("wince") || xQMakeSpec.startsWith("wince")))
4091 if (xQMakeSpec.contains("qnx"))
4094 if (xQMakeSpec.contains("blackberry"))
4101 Configure::filesDiffer(const QString &fn1, const QString &fn2)
4103 QFile file1(fn1), file2(fn2);
4104 if (!file1.open(QFile::ReadOnly) || !file2.open(QFile::ReadOnly))
4106 const int chunk = 2048;
4107 int used1 = 0, used2 = 0;
4108 char b1[chunk], b2[chunk];
4109 while (!file1.atEnd() && !file2.atEnd()) {
4111 used1 = file1.read(b1, chunk);
4113 used2 = file2.read(b2, chunk);
4114 if (used1 > 0 && used2 > 0) {
4115 const int cmp = qMin(used1, used2);
4116 if (memcmp(b1, b2, cmp))
4119 memcpy(b1, b1+cmp, used1);
4121 memcpy(b2, b2+cmp, used2);
4124 return !file1.atEnd() || !file2.atEnd();