From 97b856b78859861f16304debad29889f691d9eb7 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Sun, 14 Aug 2016 09:48:55 +0200 Subject: Use the qmake based configuration system also on Windows Adapt configure.exe to use qmake to do most of the work of configuring Qt. This unifies a large part of our configuration system between Unix and Windows. configure.exe is now still doing the license check, creating qconfig.cpp, building qmake, and not much more. On the way, re-implement the still missing Windows-specific tests with the new system. The opengles2 vs. opengl-desktop conditions got a bit convoluted, as Unix prefers desktop GL, while Windows GLES2 (via ANGLE). Superficially, there is a circular dependency, but the platform scopes are supposed to break it. Done-with: Oswald Buddenhagen Change-Id: Ia1941f2c34b7f5bd4990a7673cd737361381c2e7 Reviewed-by: Lars Knoll Reviewed-by: Oswald Buddenhagen --- tools/configure/configureapp.cpp | 2856 +++----------------------------------- tools/configure/configureapp.h | 59 +- tools/configure/environment.cpp | 151 -- tools/configure/environment.h | 9 - tools/configure/main.cpp | 25 +- 5 files changed, 188 insertions(+), 2912 deletions(-) (limited to 'tools') diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 059d2b15e7..83807cef2b 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -76,7 +76,7 @@ static inline void promptKeyPress() exit(0); // Exit cleanly for Ctrl+C } -Configure::Configure(int& argc, char** argv) : verbose(0) +Configure::Configure(int& argc, char** argv) { // Default values for indentation optionIndent = 4; @@ -117,11 +117,9 @@ Configure::Configure(int& argc, char** argv) : verbose(0) QDir(buildPath).mkpath("bin"); buildDir.mkpath("mkspecs"); + buildDir.mkpath("config.tests"); } - defaultBuildParts << QStringLiteral("libs") << QStringLiteral("tools") << QStringLiteral("examples"); - allBuildParts = defaultBuildParts; - allBuildParts << QStringLiteral("tests"); dictionary[ "QT_INSTALL_PREFIX" ] = installPath; dictionary[ "QMAKESPEC" ] = getenv("QMAKESPEC"); @@ -132,50 +130,7 @@ Configure::Configure(int& argc, char** argv) : verbose(0) dictionary[ "QMAKESPEC_FROM" ] = "env"; } - dictionary[ "WIDGETS" ] = "yes"; - dictionary[ "GUI" ] = "yes"; - dictionary[ "RTTI" ] = "yes"; - dictionary[ "STRIP" ] = "yes"; - dictionary[ "PCH" ] = "yes"; - dictionary[ "SEPARATE_DEBUG_INFO" ] = "no"; - dictionary[ "SSE2" ] = "auto"; - dictionary[ "SSE3" ] = "auto"; - dictionary[ "SSSE3" ] = "auto"; - dictionary[ "SSE4_1" ] = "auto"; - dictionary[ "SSE4_2" ] = "auto"; - dictionary[ "AVX" ] = "auto"; - dictionary[ "AVX2" ] = "auto"; - dictionary[ "AVX512" ] = "auto"; dictionary[ "SYNCQT" ] = "auto"; - dictionary[ "WMF_BACKEND" ] = "no"; - dictionary[ "QML_DEBUG" ] = "yes"; - dictionary[ "PLUGIN_MANIFESTS" ] = "no"; - dictionary[ "DIRECTWRITE" ] = "auto"; - dictionary[ "DIRECTWRITE2" ] = "auto"; - dictionary[ "DIRECT2D" ] = "no"; - dictionary[ "NIS" ] = "no"; - dictionary[ "NEON" ] = "auto"; - dictionary[ "LARGE_FILE" ] = "yes"; - dictionary[ "FONT_CONFIG" ] = "no"; - dictionary[ "POSIX_IPC" ] = "no"; - dictionary[ "QT_GLIB" ] = "no"; - dictionary[ "QT_ICONV" ] = "auto"; - dictionary[ "QT_EVDEV" ] = "auto"; - dictionary[ "QT_MTDEV" ] = "auto"; - dictionary[ "QT_TSLIB" ] = "auto"; - dictionary[ "QT_INOTIFY" ] = "auto"; - dictionary[ "QT_EVENTFD" ] = "auto"; - dictionary[ "QT_CUPS" ] = "auto"; - dictionary[ "CFG_GCC_SYSROOT" ] = "yes"; - dictionary[ "SLOG2" ] = "no"; - dictionary[ "QNX_IMF" ] = "no"; - dictionary[ "PPS" ] = "no"; - dictionary[ "LGMON" ] = "no"; - dictionary[ "SYSTEM_PROXIES" ] = "yes"; - dictionary[ "SCTP" ] = "no"; - dictionary[ "WERROR" ] = "auto"; - dictionary[ "QREAL" ] = "double"; - dictionary[ "ATOMIC64" ] = "auto"; //Only used when cross compiling. dictionary[ "QT_INSTALL_SETTINGS" ] = "/etc/xdg"; @@ -210,70 +165,8 @@ Configure::Configure(int& argc, char** argv) : verbose(0) dictionary[ "REDO" ] = "no"; - dictionary[ "BUILD" ] = "debug"; - dictionary[ "BUILDALL" ] = "auto"; // Means yes, but not explicitly - dictionary[ "FORCEDEBUGINFO" ] = "no"; - dictionary[ "RELEASE_TOOLS" ] = "no"; - dictionary[ "BUILDTYPE" ] = "none"; - dictionary[ "BUILDDEV" ] = "no"; - - dictionary[ "COMPILE_EXAMPLES" ] = "yes"; - - dictionary[ "C++STD" ] = "auto"; - - dictionary[ "USE_GOLD_LINKER" ] = "no"; - - dictionary[ "ENABLE_NEW_DTAGS" ] = "no"; - - dictionary[ "SHARED" ] = "yes"; - - dictionary[ "STATIC_RUNTIME" ] = "no"; - - dictionary[ "SYSTEM_ZLIB" ] = "auto"; - - dictionary[ "PCRE" ] = "auto"; - - dictionary[ "ICU" ] = "no"; - - dictionary[ "ANGLE" ] = "auto"; - dictionary[ "DYNAMICGL" ] = "no"; - - dictionary[ "GIF" ] = "yes"; - dictionary[ "JPEG" ] = "yes"; - dictionary[ "PNG" ] = "yes"; - dictionary[ "LIBJPEG" ] = "auto"; - dictionary[ "LIBPNG" ] = "auto"; - dictionary[ "DOUBLECONVERSION" ] = "auto"; - dictionary[ "FREETYPE" ] = "yes"; - dictionary[ "FREETYPE_FROM" ] = "default"; - dictionary[ "HARFBUZZ" ] = "qt"; - - dictionary[ "ACCESSIBILITY" ] = "yes"; - dictionary[ "OPENGL" ] = "yes"; - dictionary[ "OPENGL_ES_2" ] = "yes"; - dictionary[ "SSL" ] = "auto"; - dictionary[ "OPENSSL" ] = "auto"; - dictionary[ "LIBPROXY" ] = "no"; - dictionary[ "DBUS" ] = "auto"; - - dictionary[ "STYLE_WINDOWS" ] = "yes"; - dictionary[ "STYLE_WINDOWSXP" ] = "auto"; - dictionary[ "STYLE_WINDOWSVISTA" ] = "auto"; - dictionary[ "STYLE_FUSION" ] = "yes"; - - dictionary[ "SQL_MYSQL" ] = "no"; - dictionary[ "SQL_ODBC" ] = "no"; - dictionary[ "SQL_OCI" ] = "no"; - dictionary[ "SQL_PSQL" ] = "no"; - dictionary[ "SQL_TDS" ] = "no"; - dictionary[ "SQL_DB2" ] = "no"; - dictionary[ "SQL_SQLITE" ] = "auto"; - dictionary[ "SQL_SQLITE_LIB" ] = "qt"; - dictionary[ "SQL_SQLITE2" ] = "no"; - dictionary[ "SQL_IBASE" ] = "no"; - QString tmp = dictionary[ "QMAKESPEC" ]; if (tmp.contains("\\")) { tmp = tmp.mid(tmp.lastIndexOf("\\") + 1); @@ -281,18 +174,6 @@ Configure::Configure(int& argc, char** argv) : verbose(0) tmp = tmp.mid(tmp.lastIndexOf("/") + 1); } dictionary[ "QMAKESPEC" ] = tmp; - - dictionary[ "INCREDIBUILD_XGE" ] = "auto"; - dictionary[ "LTCG" ] = "no"; - dictionary[ "MSVC_MP" ] = "no"; - - if (dictionary["QMAKESPEC"].startsWith("win32-g++")) { - const QString zero = QStringLiteral("0"); - const QStringList parts = Environment::gccVersion().split(QLatin1Char('.')); - dictionary["QT_GCC_MAJOR_VERSION"] = parts.value(0, zero); - dictionary["QT_GCC_MINOR_VERSION"] = parts.value(1, zero); - dictionary["QT_GCC_PATCH_VERSION"] = parts.value(2, zero); - } } Configure::~Configure() @@ -310,17 +191,6 @@ QString Configure::formatPath(const QString &path) return ret; } -QString Configure::formatPaths(const QStringList &paths) -{ - QString ret; - foreach (const QString &path, paths) { - if (!ret.isEmpty()) - ret += QLatin1Char(' '); - ret += formatPath(path); - } - return ret; -} - // #### somehow I get a compiler error about vc++ reaching the nesting limit without // undefining the ansi for scoping. #ifdef for @@ -364,111 +234,12 @@ void Configure::parseCmdLine() } for (; i 1) { - dictionary[ "DONE" ] = "error"; - - cout << "Error: Multiple matches for device '" << dictionary["XQMAKESPEC"] << "'. Candidates are:" << endl; - - foreach (const QString &device, family) - cout << "\t* " << device << endl; - } else { - Q_ASSERT(family.size() == 1); - dictionary["XQMAKESPEC"] = family.at(0); - } - - } else { - // Ensure that -spec (XQMAKESPEC) exists in the mkspecs folder as well - if (dictionary.contains("XQMAKESPEC") && - !mkspecs.contains(dictionary["XQMAKESPEC"], Qt::CaseInsensitive)) { - dictionary[ "DONE" ] = "error"; - cout << "Invalid option \"" << dictionary["XQMAKESPEC"] << "\" for -xplatform." << endl; - } - } - - // Allow tests for private classes to be compiled against internal builds - if (dictionary["BUILDDEV"] == "yes") { - qtConfig << "private_tests"; - if (dictionary["WERROR"] != "no") - qmakeConfig << "warnings_are_errors"; - if (dictionary["HEADERSCLEAN"] != "no") - qmakeConfig << "headersclean"; - } else { - if (dictionary["WERROR"] == "yes") - qmakeConfig << "warnings_are_errors"; - if (dictionary["HEADERSCLEAN"] == "yes") - qmakeConfig << "headersclean"; - } - - if (dictionary["FORCE_ASSERTS"] == "yes") - qtConfig += "force_asserts"; - - for (QStringList::Iterator dis = disabledModules.begin(); dis != disabledModules.end(); ++dis) { - modules.removeAll((*dis)); - } - for (QStringList::Iterator ena = enabledModules.begin(); ena != enabledModules.end(); ++ena) { - if (modules.indexOf((*ena)) == -1) - modules += (*ena); - } - qtConfig += modules; - - for (QStringList::Iterator it = disabledModules.begin(); it != disabledModules.end(); ++it) - qtConfig.removeAll(*it); - - if ((dictionary["REDO"] != "yes") && (dictionary["DONE"] != "error")) - saveCmdLine(); -} - -/*! - Modifies the default configuration based on given -platform option. - Eg. switches to different default styles for Windows CE. -*/ -void Configure::applySpecSpecifics() -{ - if (dictionary.contains("XQMAKESPEC")) { - //Disable building tools when cross compiling. - nobuildParts << "tools"; - } - - if (dictionary.value("XQMAKESPEC").startsWith("winphone") || dictionary.value("XQMAKESPEC").startsWith("winrt")) { - dictionary[ "STYLE_WINDOWSXP" ] = "no"; - dictionary[ "STYLE_WINDOWSVISTA" ] = "no"; - dictionary[ "LIBJPEG" ] = "qt"; - dictionary[ "LIBPNG" ] = "qt"; - dictionary[ "FREETYPE" ] = "yes"; - dictionary[ "SSL" ] = "yes"; - dictionary[ "OPENSSL" ] = "no"; - dictionary[ "DBUS" ] = "no"; - dictionary[ "SYSTEM_ZLIB" ] = "no"; - dictionary[ "PCRE" ] = "qt"; - dictionary[ "ICU" ] = "qt"; - dictionary[ "LARGE_FILE" ] = "no"; - } else if (dictionary.value("XQMAKESPEC").startsWith("linux")) { //TODO actually wrong. - //TODO - dictionary[ "STYLE_WINDOWSXP" ] = "no"; - dictionary[ "STYLE_WINDOWSVISTA" ] = "no"; - dictionary[ "OPENGL" ] = "no"; - dictionary[ "DBUS"] = "no"; - dictionary[ "QT_INOTIFY" ] = "no"; - dictionary[ "QT_CUPS" ] = "no"; - dictionary[ "QT_GLIB" ] = "no"; - dictionary[ "QT_ICONV" ] = "no"; - dictionary[ "QT_EVDEV" ] = "no"; - dictionary[ "QT_MTDEV" ] = "no"; - dictionary[ "FONT_CONFIG" ] = "auto"; - dictionary[ "ANGLE" ] = "no"; - - } else if (platform() == QNX) { - dictionary[ "REDUCE_EXPORTS" ] = "yes"; - dictionary["STACK_PROTECTOR_STRONG"] = "auto"; - dictionary["SLOG2"] = "auto"; - dictionary["QNX_IMF"] = "auto"; - dictionary["PPS"] = "auto"; - dictionary["LGMON"] = "auto"; - dictionary["QT_XKBCOMMON"] = "no"; - dictionary[ "ANGLE" ] = "no"; - dictionary[ "DYNAMICGL" ] = "no"; - dictionary[ "FONT_CONFIG" ] = "auto"; - dictionary[ "ICU" ] = "auto"; - dictionary[ "POLL" ] = "poll"; - dictionary[ "ZLIB" ] = "system"; - } else if (platform() == ANDROID) { - dictionary[ "REDUCE_EXPORTS" ] = "yes"; - dictionary[ "BUILD" ] = "release"; - dictionary[ "BUILDALL" ] = "no"; - dictionary[ "LARGE_FILE" ] = "no"; - dictionary[ "ANGLE" ] = "no"; - dictionary[ "DYNAMICGL" ] = "no"; - dictionary[ "REDUCE_RELOCATIONS" ] = "yes"; - dictionary[ "QT_GETIFADDRS" ] = "no"; - dictionary[ "QT_XKBCOMMON" ] = "no"; - dictionary["ANDROID_STYLE_ASSETS"] = "yes"; - dictionary[ "STYLE_ANDROID" ] = "yes"; - dictionary[ "POLL" ] = "poll"; - dictionary[ "ZLIB" ] = "system"; - } -} - -// Locate a file and return its containing directory. -QString Configure::locateFile(const QString &fileName) const -{ - const QString mkspec = dictionary.contains(QStringLiteral("XQMAKESPEC")) - ? dictionary[QStringLiteral("XQMAKESPEC")] : dictionary[QStringLiteral("QMAKESPEC")]; - const QString file = fileName.toLower(); - QStringList pathList; - if (file.endsWith(".h")) { - static const QStringList headerPaths = - Environment::headerPaths(Environment::compilerFromQMakeSpec(mkspec)); - pathList = qmakeIncludes; - pathList += headerPaths; - } else if (file.endsWith(".lib") || file.endsWith(".a")) { - static const QStringList libPaths = - Environment::libraryPaths(Environment::compilerFromQMakeSpec(mkspec)); - pathList = libPaths; - } else { - // Fallback for .exe and .dll (latter are not covered by QStandardPaths). - static const QStringList exePaths = Environment::path(); - pathList = exePaths; - } - return Environment::findFileInPaths(file, pathList); -} - -/*! - Default value for options marked as "auto" if the test passes. - (Used both by the autoDetection() below, and the desc() function - to mark (+) the default option of autodetecting options. -*/ -QString Configure::defaultTo(const QString &option) -{ - // We prefer using the system version of the 3rd party libs - if (option == "PCRE" - || option == "LIBJPEG" - || option == "LIBPNG") - return "system"; - - // These database drivers and image formats can be built-in or plugins. - // Prefer plugins when Qt is shared. - if (dictionary[ "SHARED" ] == "yes") { - if (option == "SQL_MYSQL" - || option == "SQL_MYSQL" - || option == "SQL_ODBC" - || option == "SQL_OCI" - || option == "SQL_PSQL" - || option == "SQL_TDS" - || option == "SQL_DB2" - || option == "SQL_SQLITE" - || option == "SQL_SQLITE2" - || option == "SQL_IBASE") - return "yes"; - } - - // By default we do not want to compile OCI driver when compiling with - // MinGW, due to lack of such support from Oracle. It prob. won't work. - // (Customer may force the use though) - if (dictionary["QMAKESPEC"].endsWith("-g++") - && option == "SQL_OCI") - return "no"; - - // keep 'auto' default for msvc, since we can't set the language supported - if (option == "C++STD" - && dictionary["QMAKESPEC"].contains("msvc")) - return "auto"; - - if (option == "SYNCQT" - && (!QFile::exists(sourcePath + "/.git"))) - return "no"; - - return "yes"; -} - -bool Configure::checkAngleAvailability(QString *errorMessage /* = 0 */) const -{ - // Check for Direct X SDK (include lib and direct shader compiler 'fxc'). - // Up to Direct X SDK June 2010 and for MinGW, this is pointed to by the - // DXSDK_DIR variable. Starting with Windows Kit 8, it is included - // in the Windows SDK. Checking for the header is not sufficient since - // it is also present in MinGW. - const QString directXSdk = Environment::detectDirectXSdk(); - const Compiler compiler = Environment::compilerFromQMakeSpec(dictionary[QStringLiteral("QMAKESPEC")]); - const QString compilerHeader = QStringLiteral("d3dcompiler.h"); - if (!findFile(compilerHeader)) { - if (errorMessage) - *errorMessage = QString::fromLatin1("The header '%1' could not be found.").arg(compilerHeader); - return false; - } - if (dictionary["SSE2"] != "no") { - const QString intrinHeader = QStringLiteral("intrin.h"); // Not present on MinGW-32 - if (!findFile(intrinHeader)) { - if (errorMessage) - *errorMessage = QString::fromLatin1("The header '%1' required for SSE2 could not be found.").arg(intrinHeader); - return false; - } - } - - const QString directXLibrary = QStringLiteral("d3d11.lib"); // Ensures at least the June 2010 DXSDK is present - if (!findFile(directXLibrary)) { - if (errorMessage) - *errorMessage = QString::fromLatin1("The library '%1' could not be found.").arg(directXLibrary); - return false; - } - const QString fxcBinary = QStringLiteral("fxc.exe"); - QStringList additionalPaths; - if (!directXSdk.isEmpty()) - additionalPaths.push_back(directXSdk + QStringLiteral("/Utilities/bin/x86")); - QString fxcPath = QStandardPaths::findExecutable(fxcBinary, additionalPaths); - if (fxcPath.isEmpty()) { - if (errorMessage) - *errorMessage = QString::fromLatin1("The shader compiler '%1' could not be found.").arg(fxcBinary); - return false; - } - return true; -} - -QString Configure::checkAvx512Availability() -{ - static const char avx512features[][5] = { "cd", "er", "pf", "bw", "dq", "vl", "ifma", "vbmi" }; - - // try AVX512 Foundation. No Foundation, nothing else works. - if (!tryCompileProject("common/avx512", "AVX512=F")) - return QString(); - - QString available = "avx512f"; - for (size_t i = 0; i < sizeof(avx512features)/sizeof(avx512features[0]); ++i) { - if (tryCompileProject("common/avx512", QStringLiteral("AVX512=%0").arg(avx512features[i]).toUpper())) { - available += " avx512"; - available += avx512features[i]; - } - } - return available; -} - -/*! - Checks the system for the availability of a feature. - Returns true if the feature is available, else false. -*/ - -bool Configure::checkAvailability(const QString &part) -{ - bool available = false; - if (part == "STYLE_WINDOWSXP") - available = (platform() == WINDOWS) && findFile("uxtheme.h"); - - else if (part == "OBJCOPY") - available = tryCompileProject("unix/objcopy"); - - else if (part == "ATOMIC64") - available = tryCompileProject("common/atomic64"); - - else if (part == "ATOMIC64-LIBATOMIC") - available = tryCompileProject("common/atomic64", "LIBS+=-latomic"); - - else if (part == "ATOMICFPTR") - available = tryCompileProject("common/atomicfptr"); - - else if (part == "SYSTEM_ZLIB") - available = findFile("zlib.h"); - - else if (part == "PCRE") - available = findFile("pcre.h"); - - else if (part == "ICU") - available = tryCompileProject("unix/icu"); - - else if (part == "HARFBUZZ") - available = tryCompileProject("unix/harfbuzz"); - - else if (part == "LIBJPEG") - available = findFile("jpeglib.h"); - else if (part == "LIBPNG") - available = findFile("png.h"); - else if (part == "SQL_MYSQL") - available = findFile("mysql.h") && findFile("libmySQL.lib"); - else if (part == "SQL_ODBC") - available = findFile("sql.h") && findFile("sqlext.h") && findFile("odbc32.lib"); - else if (part == "SQL_OCI") - available = findFile("oci.h") && findFile("oci.lib"); - else if (part == "SQL_PSQL") - available = findFile("libpq-fe.h") && findFile("libpq.lib") && findFile("ws2_32.lib") && findFile("advapi32.lib"); - else if (part == "SQL_TDS") - available = findFile("sybfront.h") && findFile("sybdb.h") && findFile("ntwdblib.lib"); - else if (part == "SQL_DB2") - available = findFile("sqlcli.h") && findFile("sqlcli1.h") && findFile("db2cli.lib"); - else if (part == "SQL_SQLITE") - available = true; // Built in, we have a fork - else if (part == "SQL_SQLITE_LIB") { - if (dictionary[ "SQL_SQLITE_LIB" ] == "system") { - if (platform() == QNX) { - available = true; - dictionary[ "QMAKE_LIBS_SQLITE" ] += "-lsqlite3 -lz"; - } else { - available = findFile("sqlite3.h") && findFile("sqlite3.lib"); - if (available) - dictionary[ "QMAKE_LIBS_SQLITE" ] += "sqlite3.lib"; - } - } else { - available = true; - } - } else if (part == "SQL_SQLITE2") - available = findFile("sqlite.h") && findFile("sqlite.lib"); - else if (part == "SQL_IBASE") - available = findFile("ibase.h") && (findFile("gds32_ms.lib") || findFile("gds32.lib")); - else if (part == "SSE2") - available = tryCompileProject("common/sse2"); - else if (part == "SSE3") - available = tryCompileProject("common/sse3"); - else if (part == "SSSE3") - available = tryCompileProject("common/ssse3"); - else if (part == "SSE4_1") - available = tryCompileProject("common/sse4_1"); - else if (part == "SSE4_2") - available = tryCompileProject("common/sse4_2"); - else if (part == "AVX") - available = tryCompileProject("common/avx"); - else if (part == "AVX2") - available = tryCompileProject("common/avx2"); - else if (part == "OPENSSL") - available = findFile("openssl\\ssl.h"); - else if (part == "LIBPROXY") - available = dictionary.contains("XQMAKESPEC") && tryCompileProject("common/libproxy"); - else if (part == "DBUS") - available = findFile("dbus\\dbus.h"); - else if (part == "INCREDIBUILD_XGE") { - available = !QStandardPaths::findExecutable(QStringLiteral("BuildConsole.exe")).isEmpty() - && !QStandardPaths::findExecutable(QStringLiteral("xgConsole.exe")).isEmpty(); - } else if (part == "WMF_BACKEND") { - available = findFile("mfapi.h") && findFile("mf.lib"); - } else if (part == "DIRECTWRITE") { - available = tryCompileProject("win/directwrite"); - } else if (part == "DIRECTWRITE2") { - available = tryCompileProject("win/directwrite2"); - } else if (part == "DIRECT2D") { - available = tryCompileProject("qpa/direct2d"); - } else if (part == "ICONV") { - available = tryCompileProject("unix/iconv") || tryCompileProject("unix/gnu-libiconv"); - } else if (part == "EVDEV") { - available = tryCompileProject("unix/evdev"); - } else if (part == "MTDEV") { - available = tryCompileProject("unix/mtdev"); - } else if (part == "TSLIB") { - available = tryCompileProject("unix/tslib"); - } else if (part == "INOTIFY") { - available = tryCompileProject("unix/inotify"); - } else if (part == "QT_EVENTFD") { - available = tryCompileProject("unix/eventfd"); - } else if (part == "CUPS") { - available = (platform() != WINDOWS) && (platform() != WINDOWS_RT) && tryCompileProject("unix/cups"); - } else if (part == "STACK_PROTECTOR_STRONG") { - available = (platform() == QNX) && compilerSupportsFlag("qcc -fstack-protector-strong"); - } else if (part == "SLOG2") { - available = tryCompileProject("unix/slog2"); - } else if (part == "QNX_IMF") { - available = tryCompileProject("unix/qqnx_imf"); - } else if (part == "PPS") { - available = (platform() == QNX) && tryCompileProject("unix/pps"); - } else if (part == "LGMON") { - available = (platform() == QNX) && tryCompileProject("unix/lgmon"); - } else if (part == "SCTP") { - available = tryCompileProject("unix/sctp"); - } else if (part == "NEON") { - available = dictionary["QT_CPU_FEATURES"].contains("neon"); - } else if (part == "FONT_CONFIG") { - available = tryCompileProject("unix/fontconfig"); - } else if (part == "DOUBLECONVERSION") { - available = tryCompileProject("unix/doubleconversion"); - } - - return available; -} - -/* - Autodetect options marked as "auto". -*/ -void Configure::autoDetection() -{ - cout << "Running configuration tests..." << endl; - - // Auto-detect CPU architectures. - detectArch(); - - if (dictionary["C++STD"] == "auto" && !dictionary["QMAKESPEC"].contains("msvc")) { - if (!tryCompileProject("common/c++14")) { - dictionary["C++STD"] = "c++11"; - } else if (!tryCompileProject("common/c++1z")) { - dictionary["C++STD"] = "c++14"; - } else { - dictionary["C++STD"] = "c++1z"; - } - } - - if (dictionary["ATOMIC64"] == "auto") - dictionary["ATOMIC64"] = checkAvailability("ATOMIC64") ? "yes" : - checkAvailability("ATOMIC64-LIBATOMIC") ? "libatomic" : "no"; - - // special case: - if (!checkAvailability("ATOMICFPTR")) { - dictionary["DONE"] = "error"; - cout << "ERROR: detected an std::atomic implementation that fails for function pointers." << endl - << "Please apply the patch corresponding to your Standard Library vendor, found in" << endl - << sourcePath << "/config.tests/common/atomicfptr" << endl; - return; - } - - // Style detection - if (dictionary["STYLE_WINDOWSXP"] == "auto") - dictionary["STYLE_WINDOWSXP"] = checkAvailability("STYLE_WINDOWSXP") ? defaultTo("STYLE_WINDOWSXP") : "no"; - if (dictionary["STYLE_WINDOWSVISTA"] == "auto") // Vista style has the same requirements as XP style - dictionary["STYLE_WINDOWSVISTA"] = checkAvailability("STYLE_WINDOWSXP") ? defaultTo("STYLE_WINDOWSVISTA") : "no"; - - // Compression detection - if (dictionary["SYSTEM_ZLIB"] == "auto") - dictionary["SYSTEM_ZLIB"] = checkAvailability("SYSTEM_ZLIB") ? "yes" : "no"; - - // PCRE detection - if (dictionary["PCRE"] == "auto") - dictionary["PCRE"] = checkAvailability("PCRE") ? defaultTo("PCRE") : "qt"; - - // ICU detection - if (dictionary["ICU"] == "auto") - dictionary["ICU"] = checkAvailability("ICU") ? "yes" : "no"; - - // ANGLE detection - if (dictionary["ANGLE"] == "auto") { - if (dictionary["OPENGL_ES_2"] == "yes" || dictionary["DYNAMICGL"] == "yes") { - QString err; - dictionary["ANGLE"] = checkAngleAvailability(&err) ? "yes" : "no"; - dictionary["ANGLE_FROM"] = "detected"; - dictionary["ANGLE_ERR"] = err; - } else { - dictionary["ANGLE"] = "no"; - } - } - - // Image format detection - if (dictionary["LIBJPEG"] == "auto") - dictionary["LIBJPEG"] = checkAvailability("LIBJPEG") ? defaultTo("LIBJPEG") : "qt"; - if (dictionary["LIBPNG"] == "auto") - dictionary["LIBPNG"] = checkAvailability("LIBPNG") ? defaultTo("LIBPNG") : "qt"; - - // SQL detection (not on by default) - if (dictionary["SQL_MYSQL"] == "auto") - dictionary["SQL_MYSQL"] = checkAvailability("SQL_MYSQL") ? defaultTo("SQL_MYSQL") : "no"; - if (dictionary["SQL_ODBC"] == "auto") - dictionary["SQL_ODBC"] = checkAvailability("SQL_ODBC") ? defaultTo("SQL_ODBC") : "no"; - if (dictionary["SQL_OCI"] == "auto") - dictionary["SQL_OCI"] = checkAvailability("SQL_OCI") ? defaultTo("SQL_OCI") : "no"; - if (dictionary["SQL_PSQL"] == "auto") - dictionary["SQL_PSQL"] = checkAvailability("SQL_PSQL") ? defaultTo("SQL_PSQL") : "no"; - if (dictionary["SQL_TDS"] == "auto") - dictionary["SQL_TDS"] = checkAvailability("SQL_TDS") ? defaultTo("SQL_TDS") : "no"; - if (dictionary["SQL_DB2"] == "auto") - dictionary["SQL_DB2"] = checkAvailability("SQL_DB2") ? defaultTo("SQL_DB2") : "no"; - if (dictionary["SQL_SQLITE"] == "auto") - dictionary["SQL_SQLITE"] = checkAvailability("SQL_SQLITE") ? defaultTo("SQL_SQLITE") : "no"; - if (dictionary["SQL_SQLITE_LIB"] == "system") - if (!checkAvailability("SQL_SQLITE_LIB")) - dictionary["SQL_SQLITE_LIB"] = "no"; - if (dictionary["SQL_SQLITE2"] == "auto") - dictionary["SQL_SQLITE2"] = checkAvailability("SQL_SQLITE2") ? defaultTo("SQL_SQLITE2") : "no"; - if (dictionary["SQL_IBASE"] == "auto") - dictionary["SQL_IBASE"] = checkAvailability("SQL_IBASE") ? defaultTo("SQL_IBASE") : "no"; - if (dictionary["SSE2"] == "auto") - dictionary["SSE2"] = checkAvailability("SSE2") ? "yes" : "no"; - if (dictionary["SSE3"] == "auto") - dictionary["SSE3"] = checkAvailability("SSE3") ? "yes" : "no"; - if (dictionary["SSSE3"] == "auto") - dictionary["SSSE3"] = checkAvailability("SSSE3") ? "yes" : "no"; - if (dictionary["SSE4_1"] == "auto") - dictionary["SSE4_1"] = checkAvailability("SSE4_1") ? "yes" : "no"; - if (dictionary["SSE4_2"] == "auto") - dictionary["SSE4_2"] = checkAvailability("SSE4_2") ? "yes" : "no"; - if (dictionary["AVX"] == "auto") - dictionary["AVX"] = checkAvailability("AVX") ? "yes" : "no"; - if (dictionary["AVX2"] == "auto") - dictionary["AVX2"] = checkAvailability("AVX2") ? "yes" : "no"; - if (dictionary["AVX512"] == "auto") - dictionary["AVX512"] = checkAvx512Availability(); - if (dictionary["NEON"] == "auto") - dictionary["NEON"] = checkAvailability("NEON") ? "yes" : "no"; - if (dictionary["SSL"] == "auto") { - if (platform() == WINDOWS_RT) { - dictionary["SSL"] = "yes"; - } else { - // On Desktop Windows openssl and ssl always have the same value (for now). OpenSSL is - // the only backend and if it is available and should be built, that also means that - // SSL support in general is enabled. - if (dictionary["OPENSSL"] == "auto") - dictionary["OPENSSL"] = checkAvailability("OPENSSL") ? "yes" : "no"; - dictionary["SSL"] = dictionary["OPENSSL"]; - } - } - if (dictionary["OPENSSL"] == "auto") - dictionary["OPENSSL"] = checkAvailability("OPENSSL") ? "yes" : "no"; - if (dictionary["LIBPROXY"] == "auto") - dictionary["LIBPROXY"] = checkAvailability("LIBPROXY") ? "yes" : "no"; - if (dictionary["DBUS"] == "auto") - dictionary["DBUS"] = checkAvailability("DBUS") ? "linked" : "runtime"; - if (dictionary["QML_DEBUG"] == "auto") - dictionary["QML_DEBUG"] = dictionary["QML"] == "yes" ? "yes" : "no"; - if (dictionary["WMF_BACKEND"] == "auto") - dictionary["WMF_BACKEND"] = checkAvailability("WMF_BACKEND") ? "yes" : "no"; - - // Detection of IncrediBuild buildconsole - if (dictionary["INCREDIBUILD_XGE"] == "auto") - dictionary["INCREDIBUILD_XGE"] = checkAvailability("INCREDIBUILD_XGE") ? "yes" : "no"; - - // Detection of iconv support - if (dictionary["QT_ICONV"] == "auto") - dictionary["QT_ICONV"] = checkAvailability("ICONV") ? "yes" : "no"; - - // Detection of evdev support - if (dictionary["QT_EVDEV"] == "auto") - dictionary["QT_EVDEV"] = checkAvailability("EVDEV") ? "yes" : "no"; - - // Detection of mtdev support - if (dictionary["QT_MTDEV"] == "auto") - dictionary["QT_MTDEV"] = checkAvailability("MTDEV") ? "yes" : "no"; - - // Detection of tslib support - if (dictionary["QT_TSLIB"] == "auto") - dictionary["QT_TSLIB"] = checkAvailability("TSLIB") ? "yes" : "no"; - - // Detection of inotify - if (dictionary["QT_INOTIFY"] == "auto") - dictionary["QT_INOTIFY"] = checkAvailability("INOTIFY") ? "yes" : "no"; - - // Detection of cups support - if (dictionary["QT_CUPS"] == "auto") - dictionary["QT_CUPS"] = checkAvailability("CUPS") ? "yes" : "no"; - - // Detection of -fstack-protector-strong support - if (dictionary["STACK_PROTECTOR_STRONG"] == "auto") - dictionary["STACK_PROTECTOR_STRONG"] = checkAvailability("STACK_PROTECTOR_STRONG") ? "yes" : "no"; - - if (platform() == QNX && dictionary["SLOG2"] == "auto") { - dictionary["SLOG2"] = checkAvailability("SLOG2") ? "yes" : "no"; - } - - if (platform() == QNX && dictionary["QNX_IMF"] == "auto") { - dictionary["QNX_IMF"] = checkAvailability("QNX_IMF") ? "yes" : "no"; - } - - if (dictionary["PPS"] == "auto") { - dictionary["PPS"] = checkAvailability("PPS") ? "yes" : "no"; - } - - if (platform() == QNX && dictionary["LGMON"] == "auto") { - dictionary["LGMON"] = checkAvailability("LGMON") ? "yes" : "no"; - } - - if (dictionary["SCTP"] == "auto") { - dictionary["SCTP"] = checkAvailability("SCTP") ? "yes" : "no"; - } - - if (dictionary["QT_EVENTFD"] == "auto") - dictionary["QT_EVENTFD"] = checkAvailability("QT_EVENTFD") ? "yes" : "no"; - - if (dictionary["FONT_CONFIG"] == "auto") - dictionary["FONT_CONFIG"] = checkAvailability("FONT_CONFIG") ? "yes" : "no"; - - if ((dictionary["FONT_CONFIG"] == "yes") && (dictionary["FREETYPE_FROM"] == "default")) - dictionary["FREETYPE"] = "system"; - - if (dictionary["DOUBLECONVERSION"] == "auto") - dictionary["DOUBLECONVERSION"] = checkAvailability("DOUBLECONVERSION") ? "system" : "qt"; - - if (dictionary["DIRECTWRITE"] == "auto") - dictionary["DIRECTWRITE"] = checkAvailability("DIRECTWRITE") ? "yes" : "no"; - - if (dictionary["DIRECTWRITE"] == "no") - dictionary["DIRECTWRITE2"] = "no"; - else if (dictionary["DIRECTWRITE2"] == "auto") - dictionary["DIRECTWRITE2"] = checkAvailability("DIRECTWRITE2") ? "yes" : "no"; - - // Mark all unknown "auto" to the default value.. - for (QMap::iterator i = dictionary.begin(); i != dictionary.end(); ++i) { - if (i.value() == "auto") - i.value() = defaultTo(i.key()); - } - - cout << "Done running configuration tests." << endl; -} - -bool Configure::verifyConfiguration() -{ - bool prompt = false; - if (dictionary["C++STD"] != "auto" - && dictionary["QMAKESPEC"].contains("msvc")) { - cout << "WARNING: It is not possible to change the C++ standard edition with MSVC compilers. " - "Therefore, the option -c++std " << dictionary["C++STD"] << " was ignored." << endl << endl; - dictionary["C++STD"] = "auto"; - } - - if (dictionary["STATIC_RUNTIME"] == "yes" && dictionary["SHARED"] == "yes") { - cout << "ERROR: -static-runtime requires -static" << endl << endl; - dictionary[ "DONE" ] = "error"; - } - - if (dictionary["SEPARATE_DEBUG_INFO"] == "yes") { - if (dictionary[ "SHARED" ] == "no") { - cout << "ERROR: -separate-debug-info is incompatible with -static" << endl << endl; - dictionary[ "DONE" ] = "error"; - } else if (dictionary[ "BUILD" ] != "debug" - && dictionary[ "BUILDALL" ] == "no" - && dictionary[ "FORCEDEBUGINFO" ] == "no") { - cout << "ERROR: -separate-debug-info needs -debug, -debug-and-release, or -force-debug-info" << endl << endl; - dictionary[ "DONE" ] = "error"; - } else if (dictionary["SEPARATE_DEBUG_INFO"] == "yes" && !checkAvailability("OBJCOPY")) { - cout << "ERROR: -separate-debug-info was requested but this binutils does not support it." << endl; - dictionary[ "DONE" ] = "error"; - } - } - - if (dictionary["SQL_SQLITE_LIB"] == "no" && dictionary["SQL_SQLITE"] != "no") { - cout << "WARNING: Configure could not detect the presence of a system SQLite3 lib." << endl - << "Configure will therefore continue with the SQLite3 lib bundled with Qt." << endl; - dictionary["SQL_SQLITE_LIB"] = "qt"; // Set to Qt's bundled lib an continue - prompt = true; - } - if (dictionary["QMAKESPEC"].endsWith("-g++") - && dictionary["SQL_OCI"] != "no") { - cout << "WARNING: Qt does not support compiling the Oracle database driver with" << endl - << "MinGW, due to lack of such support from Oracle. Consider disabling the" << endl - << "Oracle driver, as the current build will most likely fail." << endl; - prompt = true; - } - if (dictionary["DIRECTWRITE"] == "yes" && !checkAvailability("DIRECTWRITE")) { - cout << "WARNING: To be able to compile the DirectWrite font engine you will" << endl - << "need the Microsoft DirectWrite and Microsoft Direct2D development" << endl - << "files such as headers and libraries." << endl; - prompt = true; - } - - if (dictionary["DIRECT2D"] == "yes" && !checkAvailability("DIRECT2D")) { - cout << "WARNING: To be able to build the Direct2D platform plugin you will" << endl - << "need the Microsoft DirectWrite and Microsoft Direct2D development" << endl - << "files such as headers and libraries." << endl; - prompt = true; - } - - if (dictionary["ANGLE"] == "no") { - if (dictionary["ANGLE_FROM"] == "detected") { - QString errorMessage = dictionary["ANGLE_ERR"]; - cout << "WARNING: The DirectX SDK could not be detected:" << endl - << " " << qPrintable(errorMessage) << endl - << "Disabling the ANGLE backend." << endl; - prompt = true; - } - if (dictionary["OPENGL_ES_2"] == "yes" - && (platform() == WINDOWS || platform() == WINDOWS_RT)) { - cout << endl << "WARNING: Using OpenGL ES 2.0 without ANGLE." << endl - << "Specify -opengl desktop to use Open GL." << endl - << "The build will most likely fail." << endl; - prompt = true; - } - } else if (dictionary["ANGLE_FROM"] == "commandline") { - QString errorMessage; - if (!checkAngleAvailability(&errorMessage)) { - cout << "WARNING: ANGLE specified, but the DirectX SDK could not be detected:" << endl - << " " << qPrintable(errorMessage) << endl - << "The build will most likely fail." << endl; - } - } - - if (dictionary["OPENGL"] == "no" || dictionary["OPENGL_ES_2"] == "no") { - if (dictionary.value("XQMAKESPEC").startsWith("winphone") || - dictionary.value("XQMAKESPEC").startsWith("winrt")) { - cout << "ERROR: Only '-opengl es2' is valid for WinRT." << endl; - dictionary[ "DONE" ] = "error"; - } - } - - if ((dictionary["FONT_CONFIG"] == "yes") && (dictionary["FREETYPE_FROM"] == "commandline")) { - if (dictionary["FREETYPE"] == "yes") { - cout << "WARNING: Bundled FreeType can't be used." - " FontConfig use requires system FreeType." << endl; - dictionary["FREETYPE"] = "system"; - dictionary["FREETYPE_FROM"] = "override"; - prompt = true; - } else if (dictionary["FREETYPE"] == "no") { - cout << "WARNING: FreeType can't be disabled." - " FontConfig use requires system FreeType." << endl; - dictionary["FREETYPE"] = "system"; - dictionary["FREETYPE_FROM"] = "override"; - prompt = true; - } - } - - if (prompt) - promptKeyPress(); - - return true; -} - -void Configure::prepareConfigTests() -{ - // Generate an empty .qmake.cache file for config.tests - QDir buildDir(buildPath); - bool success = true; - if (!buildDir.exists("config.tests")) - success = buildDir.mkdir("config.tests"); - - QString fileName(buildPath + "/config.tests/.qmake.cache"); - QFile cacheFile(fileName); - success &= cacheFile.open(QIODevice::WriteOnly); - cacheFile.close(); - - if (!success) { - cout << "Failed to create file " << qPrintable(QDir::toNativeSeparators(fileName)) << endl; - dictionary[ "DONE" ] = "error"; - } -} - -void Configure::generateOutputVars() -{ - // Generate variables for output - QString build = dictionary[ "BUILD" ]; - bool buildAll = (dictionary[ "BUILDALL" ] == "yes"); - if (build == "debug") { - if (buildAll) - qtConfig += "debug_and_release build_all release"; - qtConfig += "debug"; - } else if (build == "release") { - if (buildAll) - qtConfig += "debug_and_release build_all debug"; - qtConfig += "release"; - } - if (dictionary[ "RELEASE_TOOLS" ] == "yes") - qtConfig += "release_tools"; - - if (dictionary[ "PCH" ] == "yes") - qmakeConfig += "precompile_header"; - else - qmakeVars += "CONFIG -= precompile_header"; - - if (dictionary[ "C++STD" ] == "c++11") - qtConfig += "c++11"; - else if (dictionary[ "C++STD" ] == "c++14") - qtConfig += "c++11 c++14"; - else if (dictionary[ "C++STD" ] == "c++1z") - qtConfig += "c++11 c++14 c++1z"; - - if (dictionary[ "USE_GOLD_LINKER" ] == "yes") - qmakeConfig += "use_gold_linker"; - - if (dictionary[ "ENABLE_NEW_DTAGS" ] == "yes") - qmakeConfig += "enable_new_dtags"; - - if (dictionary[ "SHARED" ] == "no") - qtConfig += "static"; - else - qtConfig += "shared"; - - if (dictionary[ "STATIC_RUNTIME" ] == "yes") - qtConfig += "static_runtime"; - - if (dictionary[ "GUI" ] == "no") { - qtConfig += "no-gui"; - dictionary [ "WIDGETS" ] = "no"; - } - - if (dictionary[ "WIDGETS" ] == "no") - qtConfig += "no-widgets"; - - // Compression -------------------------------------------------- - if (dictionary[ "SYSTEM_ZLIB" ] == "yes") - qtConfig += "system-zlib"; - - // PCRE --------------------------------------------------------- - if (dictionary[ "PCRE" ] == "qt") - qmakeConfig += "pcre"; - - // ICU --------------------------------------------------------- - if (dictionary[ "ICU" ] == "yes") - qtConfig += "icu"; - - // ANGLE -------------------------------------------------------- - if (dictionary[ "ANGLE" ] != "no") { - qtConfig += "angle"; - } - - // Dynamic OpenGL loading --------------------------------------- - if (dictionary[ "DYNAMICGL" ] != "no") { - qtConfig += "dynamicgl"; - } - - // Image formates ----------------------------------------------- - if (dictionary[ "GIF" ] == "yes") - qtConfig += "gif"; - - if (dictionary[ "JPEG" ] == "yes") - qtConfig += "jpeg"; - if (dictionary[ "LIBJPEG" ] == "system") - qtConfig += "system-jpeg"; - - if (dictionary[ "PNG" ] == "yes") - qtConfig += "png"; - if (dictionary[ "LIBPNG" ] == "system") - qtConfig += "system-png"; - - // Double conversion ----------------------------------------------- - if (dictionary[ "DOUBLECONVERSION" ] != "no") - qtConfig += "doubleconversion"; - if (dictionary[ "DOUBLECONVERSION" ] == "system") - qtConfig += "system-doubleconversion"; - - // Text rendering -------------------------------------------------- - if (dictionary[ "FREETYPE" ] != "no") - qtConfig += "freetype"; - if (dictionary[ "FREETYPE" ] == "system") - qtConfig += "system-freetype"; - - if (dictionary[ "HARFBUZZ" ] != "no") - qtConfig += "harfbuzz"; - if (dictionary[ "HARFBUZZ" ] == "system") - qtConfig += "system-harfbuzz"; - - // Styles ------------------------------------------------------- - if (dictionary[ "STYLE_WINDOWS" ] == "yes") - qmakeStyles += "windows"; - - if (dictionary[ "STYLE_FUSION" ] == "yes") - qmakeStyles += "fusion"; - - if (dictionary[ "STYLE_WINDOWSXP" ] == "yes") - qmakeStyles += "windowsxp"; - - if (dictionary[ "STYLE_WINDOWSVISTA" ] == "yes") - qmakeStyles += "windowsvista"; - - if (dictionary[ "STYLE_ANDROID" ] == "yes") - qmakeStyles += "android"; - - // Databases ---------------------------------------------------- - if (dictionary[ "SQL_MYSQL" ] == "yes") - qmakeSql += "mysql"; - if (dictionary[ "SQL_ODBC" ] == "yes") - qmakeSql += "odbc"; - if (dictionary[ "SQL_OCI" ] == "yes") - qmakeSql += "oci"; - if (dictionary[ "SQL_PSQL" ] == "yes") - qmakeSql += "psql"; - if (dictionary[ "SQL_TDS" ] == "yes") - qmakeSql += "tds"; - if (dictionary[ "SQL_DB2" ] == "yes") - qmakeSql += "db2"; - if (dictionary[ "SQL_SQLITE2" ] == "yes") - qmakeSql += "sqlite2"; - if (dictionary[ "SQL_IBASE" ] == "yes") - qmakeSql += "ibase"; - if (dictionary[ "SQL_SQLITE" ] == "yes") - qmakeSql += "sqlite"; - - if (dictionary[ "SQL_SQLITE_LIB" ] == "system") - qmakeConfig += "system-sqlite"; - - // Other options ------------------------------------------------ - if (dictionary[ "BUILDALL" ] == "yes") { - qtConfig += "build_all"; - } - if (dictionary[ "SEPARATE_DEBUG_INFO" ] == "yes") - qtConfig += "separate_debug_info"; - if (dictionary[ "FORCEDEBUGINFO" ] == "yes") - qmakeConfig += "force_debug_info"; - qmakeConfig += dictionary[ "BUILD" ]; - - if (buildParts.isEmpty()) { - buildParts = defaultBuildParts; - - if (dictionary["BUILDDEV"] == "yes") - buildParts += "tests"; - } - while (!nobuildParts.isEmpty()) - buildParts.removeAll(nobuildParts.takeFirst()); - if (!buildParts.contains("libs")) - buildParts += "libs"; - buildParts.removeDuplicates(); - if (dictionary[ "COMPILE_EXAMPLES" ] == "yes") - qmakeConfig += "compile_examples"; - - if (dictionary["MSVC_MP"] == "yes") - qmakeConfig += "msvc_mp"; - - if (dictionary["ATOMIC64"] == "libatomic") - qmakeConfig += "atomic64-libatomic"; - - if (dictionary[ "ACCESSIBILITY" ] == "yes") - qtConfig += "accessibility"; - - if (!qmakeLibs.isEmpty()) - qmakeVars += "EXTRA_LIBDIR += " + formatPaths(qmakeLibs); - - if (!dictionary["QMAKE_LIBS_SQLITE"].isEmpty()) - qmakeVars += "QMAKE_LIBS_SQLITE += " + dictionary["QMAKE_LIBS_SQLITE"]; - - if (dictionary[ "OPENGL" ] == "yes") - qtConfig += "opengl"; - - if (dictionary["OPENGL_ES_2"] == "yes") { - qtConfig += "opengles2"; - qtConfig += "egl"; - } - - if (dictionary[ "SSL" ] == "yes") - qtConfig += "ssl"; - - if (dictionary[ "OPENSSL" ] == "yes") - qtConfig += "openssl"; - else if (dictionary[ "OPENSSL" ] == "linked") - qtConfig += "openssl-linked"; - - if (dictionary[ "LIBPROXY" ] == "yes") - qtConfig += "libproxy"; - - if (dictionary[ "DBUS" ] == "runtime") - qtConfig += "dbus"; - else if (dictionary[ "DBUS" ] == "linked") - qtConfig += "dbus dbus-linked"; - - if (dictionary["QML_DEBUG"] == "no") - qtConfig += "no-qml-debug"; - - if (dictionary["WMF_BACKEND"] == "yes") - qtConfig += "wmf-backend"; - - if (dictionary["DIRECTWRITE"] == "yes") - qtConfig += "directwrite"; - - if (dictionary["DIRECTWRITE2"] == "yes") - qtConfig += "directwrite2"; - - if (dictionary["DIRECT2D"] == "yes") - qtConfig += "direct2d"; - - if (dictionary["NIS"] == "yes") - qtConfig += "nis"; - - if (dictionary["QT_CUPS"] == "yes") - qtConfig += "cups"; - - if (dictionary["QT_ICONV"] != "no") - qtConfig += "iconv"; - if (dictionary["QT_ICONV"] == "sun") - qtConfig += "sun-libiconv"; - else if (dictionary["QT_ICONV"] == "gnu") - qtConfig += "gnu-libiconv"; - - if (dictionary["QT_EVDEV"] == "yes") - qtConfig += "evdev"; - - if (dictionary["QT_MTDEV"] == "yes") - qtConfig += "mtdev"; - - if (dictionary[ "QT_TSLIB" ] == "yes") - qtConfig += "tslib"; - - if (dictionary["QT_INOTIFY"] == "yes") - qtConfig += "inotify"; - - if (dictionary["QT_EVENTFD"] == "yes") - qtConfig += "eventfd"; - - if (dictionary["FONT_CONFIG"] == "yes") { - qtConfig += "fontconfig"; - qmakeVars += "QMAKE_CFLAGS_FONTCONFIG ="; - qmakeVars += "QMAKE_LIBS_FONTCONFIG = -lfreetype -lfontconfig"; - } - - if (dictionary["QT_GLIB"] == "yes") - qtConfig += "glib"; - - if (dictionary["STACK_PROTECTOR_STRONG"] == "yes") - qtConfig += "stack-protector-strong"; - - if (dictionary["REDUCE_EXPORTS"] == "yes") - qtConfig += "reduce_exports"; - - if (!dictionary["POLL"].isEmpty()) - qtConfig += "poll_" + dictionary["POLL"]; - - // We currently have no switch for QtConcurrent, so add it unconditionally. - qtConfig += "concurrent"; - - if (dictionary[ "SYSTEM_PROXIES" ] == "yes") - qtConfig += "system-proxies"; - - if (dictionary[ "SCTP" ] == "yes") - qtConfig += "sctp"; - - if (dictionary.contains("XQMAKESPEC") && (dictionary["QMAKESPEC"] != dictionary["XQMAKESPEC"])) { - qmakeConfig += "cross_compile"; - dictionary["CROSS_COMPILE"] = "yes"; - } - - // Directories and settings for .qmake.cache -------------------- - - if (dictionary.contains("XQMAKESPEC") && dictionary[ "XQMAKESPEC" ].startsWith("linux")) - qtConfig += "rpath"; - - if (!qmakeDefines.isEmpty()) - qmakeVars += QString("EXTRA_DEFINES += ") + qmakeDefines.join(' '); - if (!qmakeIncludes.isEmpty()) - qmakeVars += QString("EXTRA_INCLUDEPATH += ") + formatPaths(qmakeIncludes); - if (!opensslLibs.isEmpty()) - qmakeVars += opensslLibs; - if (dictionary[ "OPENSSL" ] == "linked") { - if (!opensslLibsDebug.isEmpty() || !opensslLibsRelease.isEmpty()) { - if (opensslLibsDebug.isEmpty() || opensslLibsRelease.isEmpty()) { - cout << "Error: either both or none of OPENSSL_LIBS_DEBUG/_RELEASE must be defined." << endl; - exit(1); - } - qmakeVars += opensslLibsDebug; - qmakeVars += opensslLibsRelease; - } else if (opensslLibs.isEmpty()) { - qmakeVars += QString("OPENSSL_LIBS = -lssleay32 -llibeay32"); - } - if (!opensslPath.isEmpty()) { - qmakeVars += QString("OPENSSL_CFLAGS += -I%1/include").arg(opensslPath); - qmakeVars += QString("OPENSSL_LIBS += -L%1/lib").arg(opensslPath); - } - } - if (dictionary[ "DBUS" ] == "linked") { - if (!dbusPath.isEmpty()) { - qmakeVars += QString("QMAKE_CFLAGS_DBUS = -I%1/include").arg(dbusPath); - qmakeVars += QString("QMAKE_LIBS_DBUS = -L%1/lib").arg(dbusPath); - if (dbusHostPath.isEmpty()) - qmakeVars += QString("QT_HOST_CFLAGS_DBUS = -I%1/include").arg(dbusPath); - } - if (!dbusHostPath.isEmpty()) - qmakeVars += QString("QT_HOST_CFLAGS_DBUS = -I%1/include").arg(dbusHostPath); - } - if (dictionary[ "SQL_MYSQL" ] != "no" && !mysqlPath.isEmpty()) { - qmakeVars += QString("QMAKE_CFLAGS_MYSQL = -I%1/include").arg(mysqlPath); - qmakeVars += QString("QMAKE_LIBS_MYSQL = -L%1/lib").arg(mysqlPath); - } - if (!psqlLibs.isEmpty()) - qmakeVars += QString("QMAKE_LIBS_PSQL=") + psqlLibs.section("=", 1); - if (!zlibLibs.isEmpty()) - qmakeVars += zlibLibs; - - { - QStringList lflagsTDS; - if (!sybase.isEmpty()) - lflagsTDS += QString("-L") + formatPath(sybase.section("=", 1) + "/lib"); - if (!sybaseLibs.isEmpty()) - lflagsTDS += sybaseLibs.section("=", 1); - if (!lflagsTDS.isEmpty()) - qmakeVars += QString("QMAKE_LIBS_TDS=") + lflagsTDS.join(' '); - } - - if (!qmakeSql.isEmpty()) - qmakeVars += QString("sql-drivers += ") + qmakeSql.join(' '); - if (!qmakeStyles.isEmpty()) - qmakeVars += QString("styles += ") + qmakeStyles.join(' '); - - if (!dictionary[ "QMAKESPEC" ].length()) { - cout << "Configure could not detect your compiler. QMAKESPEC must either" << endl - << "be defined as an environment variable, or specified as an" << endl - << "argument with -platform" << endl; - - QStringList winPlatforms; - QDir mkspecsDir(sourcePath + "/mkspecs"); - const QFileInfoList &specsList = mkspecsDir.entryInfoList(); - for (int i = 0; i < specsList.size(); ++i) { - const QFileInfo &fi = specsList.at(i); - if (fi.fileName().left(5) == "win32") { - winPlatforms += fi.fileName(); - } - } - cout << "Available platforms are: " << qPrintable(winPlatforms.join(", ")) << endl; - dictionary[ "DONE" ] = "error"; - } -} - -void Configure::generateCachefile() -{ - // Generate qmodule.pri, which is loaded only by Qt modules - { - FileWriter moduleStream(buildPath + "/mkspecs/qmodule.pri"); - - moduleStream << "QT_BUILD_PARTS += " << buildParts.join(' ') << endl; - if (!skipModules.isEmpty()) - moduleStream << "QT_SKIP_MODULES += " << skipModules.join(' ') << endl; - moduleStream << endl; - - moduleStream << "host_build {" << endl; - moduleStream << " QT_CPU_FEATURES." << dictionary["QT_HOST_ARCH"] << - " = " << dictionary["QT_HOST_CPU_FEATURES"] << endl; - moduleStream << "} else {" << endl; - moduleStream << " QT_CPU_FEATURES." << dictionary["QT_ARCH"] << - " = " << dictionary["QT_CPU_FEATURES"] << endl; - moduleStream << "}" << endl; - moduleStream << "QT_COORD_TYPE += " << dictionary["QREAL"] << endl; - - if (dictionary["QT_XKBCOMMON"] == "no") - moduleStream << "DEFINES += QT_NO_XKBCOMMON" << endl; - - moduleStream << "CONFIG += " << qmakeConfig.join(' '); - if (dictionary[ "SSE2" ] == "yes") - moduleStream << " sse2"; - if (dictionary[ "SSE3" ] == "yes") - moduleStream << " sse3"; - if (dictionary[ "SSSE3" ] == "yes") - moduleStream << " ssse3"; - if (dictionary[ "SSE4_1" ] == "yes") - moduleStream << " sse4_1"; - if (dictionary[ "SSE4_2" ] == "yes") - moduleStream << " sse4_2"; - if (dictionary[ "AVX" ] == "yes") - moduleStream << " avx"; - if (dictionary[ "AVX2" ] == "yes") - moduleStream << " avx2"; - if (!dictionary[ "AVX512" ].isEmpty()) - moduleStream << ' ' << dictionary[ "AVX512" ]; - if (dictionary[ "NEON" ] == "yes") - moduleStream << " neon"; - if (dictionary[ "LARGE_FILE" ] == "yes") - moduleStream << " largefile"; - if (dictionary[ "STRIP" ] == "no") - moduleStream << " nostrip"; - if (dictionary[ "LTCG" ] == "yes") - moduleStream << " ltcg"; - moduleStream << endl; - - for (QStringList::Iterator var = qmakeVars.begin(); var != qmakeVars.end(); ++var) - moduleStream << (*var) << endl; - - if (!moduleStream.flush()) - dictionary[ "DONE" ] = "error"; - } -} - -void Configure::addSysroot(QString *command) -{ - const QString &sysroot = dictionary["CFG_SYSROOT"]; - if (!sysroot.isEmpty() && dictionary["CFG_GCC_SYSROOT"] == "yes") { - command->append(" QMAKE_LFLAGS+=--sysroot=" + sysroot); - command->append(" QMAKE_CXXFLAGS+=--sysroot=" + sysroot); - } -} - -struct ArchData { - bool isHost; - const char *qmakespec; - const char *key; - const char *subarchKey; - const char *type; - ArchData() {} - ArchData(bool h, const char *t, const char *qm, const char *k, const char *sak) - : isHost(h), qmakespec(qm), key(k), subarchKey(sak), type(t) - {} -}; - -/* - Runs qmake on config.tests/arch/arch.pro, which will detect the target arch - for the compiler we are using -*/ -void Configure::detectArch() -{ - QString oldpwd = QDir::currentPath(); - - QString newpwd = QString("%1/config.tests/arch").arg(buildPath); - if (!QDir().exists(newpwd) && !QDir().mkpath(newpwd)) { - cout << "Failed to create directory " << qPrintable(QDir::toNativeSeparators(newpwd)) << endl; - dictionary["DONE"] = "error"; - return; - } - if (!QDir::setCurrent(newpwd)) { - cout << "Failed to change working directory to " << qPrintable(QDir::toNativeSeparators(newpwd)) << endl; - dictionary["DONE"] = "error"; - return; - } + } - QVector qmakespecs; - if (dictionary.contains("XQMAKESPEC")) - qmakespecs << ArchData(false, "target", "XQMAKESPEC", "QT_ARCH", "QT_CPU_FEATURES"); - qmakespecs << ArchData(true, "host", "QMAKESPEC", "QT_HOST_ARCH", "QT_HOST_CPU_FEATURES"); - - for (int i = 0; i < qmakespecs.count(); ++i) { - const ArchData &data = qmakespecs.at(i); - QString qmakespec = dictionary.value(data.qmakespec); - QString key = data.key; - QString subarchKey = data.subarchKey; - - // run qmake - QString command = QString("%1 -spec %2 %3") - .arg(QDir::toNativeSeparators(QDir(newpwd).relativeFilePath(buildPath + "/bin/qmake.exe")), - QDir::toNativeSeparators(qmakespec), - QDir::toNativeSeparators(sourcePath + "/config.tests/arch/arch" - + (data.isHost ? "_host" : "") + ".pro")); - - if (!data.isHost) { - if (qmakespec.startsWith("winrt") || qmakespec.startsWith("winphone")) - command.append(" QMAKE_LFLAGS+=/ENTRY:main"); - addSysroot(&command); + else if (configCmdLine.at(i) == "-android-ndk") { + ++i; + if (i == argCount) + break; + dictionary[ "ANDROID_NDK_ROOT" ] = configCmdLine.at(i); } - int returnValue = 0; - Environment::execute(command, &returnValue); - if (returnValue != 0) { - cout << "QMake failed!" << endl; - dictionary["DONE"] = "error"; - return; + else if (configCmdLine.at(i) == "-android-sdk") { + ++i; + if (i == argCount) + break; + dictionary[ "ANDROID_SDK_ROOT" ] = configCmdLine.at(i); } - // compile - command = dictionary[ "MAKE" ]; - if (command.contains("nmake") || command.contains("jom")) - command += " /NOLOGO"; - command += " -s"; - Environment::execute(command); - - // find the executable that was generated - QString arch_exe; - if (qmakespec.startsWith("android")) { - arch_exe = "libarch.so"; - } else { - arch_exe = "arch.exe"; + else if (configCmdLine.at(i) == "-android-ndk-platform") { + ++i; + if (i == argCount) + break; + dictionary[ "ANDROID_PLATFORM" ] = configCmdLine.at(i); } - QFile exe(arch_exe); - if (!exe.open(QFile::ReadOnly)) { // no Text, this is binary - exe.setFileName("arch"); - if (!exe.open(QFile::ReadOnly)) { - cout << "Could not find output file '" << qPrintable(arch_exe) << "' or 'arch' in " << qPrintable(newpwd) << " : " << qPrintable(exe.errorString()) << endl; - dictionary["DONE"] = "error"; - return; - } + + else if (configCmdLine.at(i) == "-android-ndk-host") { + ++i; + if (i == argCount) + break; + dictionary[ "ANDROID_HOST" ] = configCmdLine.at(i); } - QByteArray exeContents = exe.readAll(); - exe.close(); - - static const char archMagic[] = "==Qt=magic=Qt== Architecture:"; - int magicPos = exeContents.indexOf(archMagic); - if (magicPos == -1) { - cout << "Internal error, could not find the architecture of the " - << data.type << " executable" << endl; - dictionary["DONE"] = "error"; - return; + + else if (configCmdLine.at(i) == "-android-arch") { + ++i; + if (i == argCount) + break; + dictionary[ "ANDROID_TARGET_ARCH" ] = configCmdLine.at(i); } - //cout << "Found magic at offset 0x" << hex << magicPos << endl; - - // the conversion from QByteArray will stop at the ending NUL anyway - QString arch = QString::fromLatin1(exeContents.constData() + magicPos - + sizeof(archMagic) - 1); - dictionary[key] = arch; - - static const char subarchMagic[] = "==Qt=magic=Qt== Sub-architecture:"; - magicPos = exeContents.indexOf(subarchMagic); - if (magicPos == -1) { - cout << "Internal error, could not find the sub-architecture of the " - << data.type << " executable" << endl; - dictionary["DONE"] = "error"; - return; + + else if (configCmdLine.at(i) == "-android-toolchain-version") { + ++i; + if (i == argCount) + break; + dictionary[ "ANDROID_NDK_TOOLCHAIN_VERSION" ] = configCmdLine.at(i); } - QString subarch = QString::fromLatin1(exeContents.constData() + magicPos - + sizeof(subarchMagic) - 1); - dictionary[subarchKey] = subarch; + else if (configCmdLine.at(i) == "-no-android-style-assets") { + dictionary[ "ANDROID_STYLE_ASSETS" ] = "no"; + } else if (configCmdLine.at(i) == "-android-style-assets") { + dictionary[ "ANDROID_STYLE_ASSETS" ] = "yes"; + } + } - //cout << "Detected arch '" << qPrintable(arch) << "'\n"; - //cout << "Detected sub-arch '" << qPrintable(subarch) << "'\n"; + // Ensure that QMAKESPEC exists in the mkspecs folder + const QString mkspecPath(sourcePath + "/mkspecs"); + QDirIterator itMkspecs(mkspecPath, QDir::AllDirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + QStringList mkspecs; - // clean up - Environment::execute(command + " distclean"); + while (itMkspecs.hasNext()) { + QString mkspec = itMkspecs.next(); + // Remove base PATH + mkspec.remove(0, mkspecPath.length() + 1); + mkspecs << mkspec; } - if (!dictionary.contains("QT_HOST_ARCH")) - dictionary["QT_HOST_ARCH"] = "unknown"; - if (!dictionary.contains("QT_ARCH")) { - dictionary["QT_ARCH"] = dictionary["QT_HOST_ARCH"]; - dictionary["QT_CPU_FEATURES"] = dictionary["QT_HOST_CPU_FEATURES"]; + if (dictionary["QMAKESPEC"].toLower() == "features" + || !mkspecs.contains(dictionary["QMAKESPEC"], Qt::CaseInsensitive)) { + dictionary[ "DONE" ] = "error"; + if (dictionary ["QMAKESPEC_FROM"] == "commandline") { + cout << "Invalid option \"" << dictionary["QMAKESPEC"] << "\" for -platform." << endl; + } else if (dictionary ["QMAKESPEC_FROM"] == "env") { + cout << "QMAKESPEC environment variable is set to \"" << dictionary["QMAKESPEC"] + << "\" which is not a supported platform" << endl; + } else { // was autodetected from environment + cout << "Unable to detect the platform from environment. Use -platform command line" << endl + << "argument or set the QMAKESPEC environment variable and run configure again." << endl; + } + cout << "See the README file for a list of supported operating systems and compilers." << endl; + } else { + if (dictionary[ "QMAKESPEC" ].endsWith("-icc") || + dictionary[ "QMAKESPEC" ].endsWith("-msvc2012") || + dictionary[ "QMAKESPEC" ].endsWith("-msvc2013") || + dictionary[ "QMAKESPEC" ].endsWith("-msvc2015")) { + if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "nmake"; + dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32"; + } else if (dictionary[ "QMAKESPEC" ].startsWith(QLatin1String("win32-g++"))) { + if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "mingw32-make"; + dictionary[ "QMAKEMAKEFILE" ] = "Makefile.unix"; + } else { + if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "make"; + dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32"; + } } - QDir::setCurrent(oldpwd); -} - -bool Configure::tryCompileProject(const QString &projectPath, const QString &extraOptions, - bool distClean) -{ - QString oldpwd = QDir::currentPath(); + if (isDeviceMkspec) { + const QStringList devices = mkspecs.filter("devices/", Qt::CaseInsensitive); + const QStringList family = devices.filter(dictionary["XQMAKESPEC"], Qt::CaseInsensitive); - QString newpwd = QString("%1/config.tests/%2").arg(buildPath, projectPath); - if (!QDir().exists(newpwd) && !QDir().mkpath(newpwd)) { - cout << "Failed to create directory " << qPrintable(QDir::toNativeSeparators(newpwd)) << endl; - dictionary["DONE"] = "error"; - return false; - } - if (!QDir::setCurrent(newpwd)) { - cout << "Failed to change working directory to " << qPrintable(QDir::toNativeSeparators(newpwd)) << endl; - dictionary["DONE"] = "error"; - return false; - } + if (family.isEmpty()) { + dictionary[ "DONE" ] = "error"; + cout << "Error: No device matching '" << dictionary["XQMAKESPEC"] << "'." << endl; + } else if (family.size() > 1) { + dictionary[ "DONE" ] = "error"; - // run qmake - QString command = QString("%1 %2 %3") - .arg(QDir::toNativeSeparators(QDir(newpwd).relativeFilePath(buildPath + "/bin/qmake.exe")), - QDir::toNativeSeparators(sourcePath + "/config.tests/" + projectPath), - extraOptions); - - if (dictionary.contains("XQMAKESPEC")) { - const QString qmakespec = dictionary["XQMAKESPEC"]; - if (qmakespec.startsWith("winrt") || qmakespec.startsWith("winphone")) - command.append(" QMAKE_LFLAGS+=/ENTRY:main"); - addSysroot(&command); - } + cout << "Error: Multiple matches for device '" << dictionary["XQMAKESPEC"] << "'. Candidates are:" << endl; - if (verbose) - cout << qPrintable(command) << endl; - else - command += " 2>&1"; - - int code = 0; - QString output = Environment::execute(command, &code); - //cout << output << endl; - - if (code == 0) { - // compile - command = dictionary[ "MAKE" ]; - if (command.contains("nmake") || command.contains("jom")) - command += " /NOLOGO"; - if (verbose) - cout << qPrintable(command) << endl; - else - command += " -s 2>&1"; - output = Environment::execute(command, &code); - //cout << output << endl; + foreach (const QString &device, family) + cout << "\t* " << device << endl; + } else { + Q_ASSERT(family.size() == 1); + dictionary["XQMAKESPEC"] = family.at(0); + } - // clean up - if (distClean) - Environment::execute(command + " distclean 2>&1"); + } else { + // Ensure that -spec (XQMAKESPEC) exists in the mkspecs folder as well + if (dictionary.contains("XQMAKESPEC") && + !mkspecs.contains(dictionary["XQMAKESPEC"], Qt::CaseInsensitive)) { + dictionary[ "DONE" ] = "error"; + cout << "Invalid option \"" << dictionary["XQMAKESPEC"] << "\" for -xplatform." << endl; + } } - QDir::setCurrent(oldpwd); - return code == 0; + if ((dictionary["REDO"] != "yes") && (dictionary["DONE"] != "error")) + saveCmdLine(); } -bool Configure::compilerSupportsFlag(const QString &compilerAndArgs) +/*! + Modifies the default configuration based on given -platform option. + Eg. switches to different default styles for Windows CE. +*/ +void Configure::applySpecSpecifics() { - QFile file("conftest.cpp"); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - cout << "could not open temp file for writing" << endl; - return false; - } - if (!file.write("int main() { return 0; }\r\n")) { - cout << "could not write to temp file" << endl; - return false; + if (platform() == ANDROID) + dictionary["ANDROID_STYLE_ASSETS"] = "yes"; +} + +void Configure::prepareConfigTests() +{ + // Generate an empty .qmake.cache file for config.tests + QDir buildDir(buildPath); + bool success = true; + if (!buildDir.exists("config.tests")) + success = buildDir.mkdir("config.tests"); + + QString fileName(buildPath + "/config.tests/.qmake.cache"); + QFile cacheFile(fileName); + success &= cacheFile.open(QIODevice::WriteOnly); + cacheFile.close(); + + if (!success) { + cout << "Failed to create file " << qPrintable(QDir::toNativeSeparators(fileName)) << endl; + dictionary[ "DONE" ] = "error"; } - file.close(); - // compilerAndArgs contains compiler because there is no way to query it - QString command = compilerAndArgs + " -o conftest-out.o conftest.cpp"; - int code = 0; - QString output = Environment::execute(command, &code); - file.remove(); - QFile::remove("conftest-out.o"); - return code == 0; } void Configure::generateQDevicePri() @@ -2687,240 +616,6 @@ void Configure::generateQDevicePri() dictionary[ "DONE" ] = "error"; } -void Configure::generateQConfigPri() -{ - // Generate qconfig.pri - { - FileWriter configStream(buildPath + "/mkspecs/qconfig.pri"); - - configStream << "CONFIG+= "; - configStream << dictionary[ "BUILD" ]; - configStream << (dictionary[ "SHARED" ] == "no" ? " static" : " shared"); - - if (dictionary["STATIC_RUNTIME"] == "yes") - configStream << " static_runtime"; - if (dictionary[ "RTTI" ] == "yes") - configStream << " rtti"; - if (dictionary["INCREDIBUILD_XGE"] == "yes") - configStream << " incredibuild_xge"; - if (dictionary["PLUGIN_MANIFESTS"] == "no") - configStream << " no_plugin_manifest"; - if (dictionary["CROSS_COMPILE"] == "yes") - configStream << " cross_compile"; - - if (dictionary[ "SLOG2" ] == "yes") - configStream << " slog2"; - - if (dictionary[ "QNX_IMF" ] == "yes") - configStream << " qqnx_imf"; - - if (dictionary[ "PPS" ] == "yes") - configStream << " qqnx_pps"; - - if (dictionary[ "LGMON" ] == "yes") - configStream << " lgmon"; - - if (dictionary["ANDROID_STYLE_ASSETS"] == "yes") - configStream << " android-style-assets"; - - configStream << endl; - configStream << "host_build {" << endl; - configStream << " QT_ARCH = " << dictionary["QT_HOST_ARCH"] << endl; - configStream << " QT_TARGET_ARCH = " << dictionary["QT_ARCH"] << endl; - configStream << "} else {" << endl; - configStream << " QT_ARCH = " << dictionary["QT_ARCH"] << endl; - configStream << "}" << endl; - configStream << "QT_CONFIG += " << qtConfig.join(' ') << endl; - - configStream << "#versioning " << endl - << "QT_VERSION = " << dictionary["VERSION"] << endl - << "QT_MAJOR_VERSION = " << dictionary["VERSION_MAJOR"] << endl - << "QT_MINOR_VERSION = " << dictionary["VERSION_MINOR"] << endl - << "QT_PATCH_VERSION = " << dictionary["VERSION_PATCH"] << endl; - - configStream << endl - << "QT_EDITION = " << dictionary["EDITION"] << endl; - - if (dictionary["EDITION"] != "OpenSource" && dictionary["EDITION"] != "Preview") { - configStream << "QT_LICHECK = " << dictionary["LICHECK"] << endl; - configStream << "QT_RELEASE_DATE = " << dictionary["RELEASEDATE"] << endl; - } - - if (!dictionary["CFG_SYSROOT"].isEmpty() && dictionary["CFG_GCC_SYSROOT"] == "yes") { - configStream << endl - << "# sysroot" << endl - << "!host_build {" << endl - << " QMAKE_CFLAGS += --sysroot=$$[QT_SYSROOT]" << endl - << " QMAKE_CXXFLAGS += --sysroot=$$[QT_SYSROOT]" << endl - << " QMAKE_LFLAGS += --sysroot=$$[QT_SYSROOT]" << endl - << "}" << endl; - } - - if (!dictionary["QT_LIBINFIX"].isEmpty()) - configStream << "QT_LIBINFIX = " << dictionary["QT_LIBINFIX"] << endl; - - if (!dictionary["QT_NAMESPACE"].isEmpty()) - configStream << "#namespaces" << endl << "QT_NAMESPACE = " << dictionary["QT_NAMESPACE"] << endl; - - if (dictionary[ "SHARED" ] == "no") - configStream << "QT_DEFAULT_QPA_PLUGIN = q" << qpaPlatformName() << endl; - - if (!dictionary["QT_GCC_MAJOR_VERSION"].isEmpty()) { - configStream << "QT_GCC_MAJOR_VERSION = " << dictionary["QT_GCC_MAJOR_VERSION"] << endl - << "QT_GCC_MINOR_VERSION = " << dictionary["QT_GCC_MINOR_VERSION"] << endl - << "QT_GCC_PATCH_VERSION = " << dictionary["QT_GCC_PATCH_VERSION"] << endl; - } - - if (!configStream.flush()) - dictionary[ "DONE" ] = "error"; - } -} - -QString Configure::addDefine(QString def) -{ - QString result, defNeg, defD = def; - - defD.replace(QRegExp("=.*"), ""); - def.replace(QRegExp("="), " "); - - if (def.startsWith("QT_NO_")) { - defNeg = defD; - defNeg.replace("QT_NO_", "QT_"); - } else if (def.startsWith("QT_")) { - defNeg = defD; - defNeg.replace("QT_", "QT_NO_"); - } - - if (defNeg.isEmpty()) { - result = "#ifndef $DEFD\n" - "# define $DEF\n" - "#endif\n\n"; - } else { - result = "#if defined($DEFD) && defined($DEFNEG)\n" - "# undef $DEFD\n" - "#elif !defined($DEFD)\n" - "# define $DEF\n" - "#endif\n\n"; - } - result.replace("$DEFNEG", defNeg); - result.replace("$DEFD", defD); - result.replace("$DEF", def); - return result; -} - -void Configure::generateConfigfiles() -{ - { - FileWriter tmpStream(buildPath + "/src/corelib/global/qconfig.h"); - - tmpStream << "#define QT_VERSION_MAJOR " << dictionary["VERSION_MAJOR"] << endl - << "#define QT_VERSION_MINOR " << dictionary["VERSION_MINOR"] << endl - << "#define QT_VERSION_PATCH " << dictionary["VERSION_PATCH"] << endl - << "#define QT_VERSION_STR \"" << dictionary["VERSION"] << "\"\n" - << endl; - tmpStream << endl; - - if (dictionary[ "SHARED" ] == "no") { - tmpStream << "/* Qt was configured for a static build */" << endl - << "#if !defined(QT_SHARED) && !defined(QT_STATIC)" << endl - << "# define QT_STATIC" << endl - << "#endif" << endl - << endl; - } - tmpStream << "/* License information */" << endl; - tmpStream << "#define QT_PRODUCT_LICENSEE \"" << dictionary[ "LICENSEE" ] << "\"" << endl; - tmpStream << "#define QT_PRODUCT_LICENSE \"" << dictionary[ "EDITION" ] << "\"" << endl; - tmpStream << endl; - if (dictionary["BUILDDEV"] == "yes") { - tmpStream << "/* Used for example to export symbols for the certain autotests*/" << endl; - tmpStream << "#define QT_BUILD_INTERNAL" << endl; - tmpStream << endl; - } - - tmpStream << endl << "// Compiler sub-arch support" << endl; - if (dictionary[ "SSE2" ] == "yes") - tmpStream << "#define QT_COMPILER_SUPPORTS_SSE2 1" << endl; - if (dictionary[ "SSE3" ] == "yes") - tmpStream << "#define QT_COMPILER_SUPPORTS_SSE3 1" << endl; - if (dictionary[ "SSSE3" ] == "yes") - tmpStream << "#define QT_COMPILER_SUPPORTS_SSSE3 1" << endl; - if (dictionary[ "SSE4_1" ] == "yes") - tmpStream << "#define QT_COMPILER_SUPPORTS_SSE4_1 1" << endl; - if (dictionary[ "SSE4_2" ] == "yes") - tmpStream << "#define QT_COMPILER_SUPPORTS_SSE4_2 1" << endl; - if (dictionary[ "AVX" ] == "yes") - tmpStream << "#define QT_COMPILER_SUPPORTS_AVX 1" << endl; - if (dictionary[ "AVX2" ] == "yes") - tmpStream << "#define QT_COMPILER_SUPPORTS_AVX2 1" << endl; - foreach (const QString &avx512feature, dictionary[ "AVX512" ].split(' ', QString::SkipEmptyParts)) - tmpStream << "#define QT_COMPILER_SUPPRTS_" << avx512feature.toUpper() << " 1" << endl; - - if (dictionary["QREAL"] != "double") { - tmpStream << "#define QT_COORD_TYPE " << dictionary["QREAL"] << endl; - tmpStream << "#define QT_COORD_TYPE_STRING " << dictionary["QREAL_STRING"] << endl; - } - - tmpStream << endl << "// Compile time features" << endl; - - QStringList qconfigList; - if (dictionary["PNG"] != "yes") qconfigList += "QT_NO_IMAGEFORMAT_PNG"; - - if (dictionary["ACCESSIBILITY"] == "no") qconfigList += "QT_NO_ACCESSIBILITY"; - if (dictionary["WIDGETS"] == "no") qconfigList += "QT_NO_WIDGETS"; - if (dictionary["GUI"] == "no") qconfigList += "QT_NO_GUI"; - if (dictionary["OPENGL"] == "no") qconfigList += "QT_NO_OPENGL"; - if (dictionary["SSL"] == "no") qconfigList += "QT_NO_SSL"; - if (dictionary["OPENSSL"] == "no") qconfigList += "QT_NO_OPENSSL"; - if (dictionary["OPENSSL"] == "linked") qconfigList += "QT_LINKED_OPENSSL"; - if (dictionary["DBUS"] == "no") qconfigList += "QT_NO_DBUS"; - if (dictionary["FREETYPE"] == "no") qconfigList += "QT_NO_FREETYPE"; - if (dictionary["HARFBUZZ"] == "no") qconfigList += "QT_NO_HARFBUZZ"; - - if (dictionary["OPENGL_ES_2"] == "yes") qconfigList += "QT_OPENGL_ES"; - if (dictionary["OPENGL_ES_2"] == "yes") qconfigList += "QT_OPENGL_ES_2"; - if (dictionary["DYNAMICGL"] == "yes") qconfigList += "QT_OPENGL_DYNAMIC"; - - if (dictionary["POSIX_IPC"] == "yes") - qconfigList += "QT_POSIX_IPC"; - else if ((platform() != ANDROID) && (platform() != WINDOWS) && (platform() != WINDOWS_RT)) - qconfigList << "QT_NO_SYSTEMSEMAPHORE" << "QT_NO_SHAREDMEMORY"; - - if (dictionary["FONT_CONFIG"] == "no") qconfigList += "QT_NO_FONTCONFIG"; - - if (dictionary["NIS"] == "yes") - qconfigList += "QT_NIS"; - else - qconfigList += "QT_NO_NIS"; - - if (dictionary["SCTP"] == "no") qconfigList += "QT_NO_SCTP"; - - if (dictionary["LARGE_FILE"] == "yes") qconfigList += "QT_LARGEFILE_SUPPORT=64"; - if (dictionary["QT_CUPS"] == "no") qconfigList += "QT_NO_CUPS"; - if (dictionary["QT_ICONV"] == "no") qconfigList += "QT_NO_ICONV"; - if (dictionary["QT_EVDEV"] == "no") qconfigList += "QT_NO_EVDEV"; - if (dictionary["QT_MTDEV"] == "no") qconfigList += "QT_NO_MTDEV"; - if (dictionary["QT_TSLIB"] == "no") qconfigList += "QT_NO_TSLIB"; - if (dictionary["QT_GLIB"] == "no") qconfigList += "QT_NO_GLIB"; - if (dictionary["QT_INOTIFY"] == "no") qconfigList += "QT_NO_INOTIFY"; - if (dictionary["QT_EVENTFD"] == "no") qconfigList += "QT_NO_EVENTFD"; - if (dictionary["ATOMIC64"] == "no") qconfigList += "QT_NO_STD_ATOMIC64"; - - if (dictionary["REDUCE_EXPORTS"] == "yes") qconfigList += "QT_VISIBILITY_AVAILABLE"; - if (dictionary["REDUCE_RELOCATIONS"] == "yes") qconfigList += "QT_REDUCE_RELOCATIONS"; - if (dictionary["QT_GETIFADDRS"] == "no") qconfigList += "QT_NO_GETIFADDRS"; - - qconfigList.sort(); - for (int i = 0; i < qconfigList.count(); ++i) - tmpStream << addDefine(qconfigList.at(i)); - - tmpStream<<"#define QT_QPA_DEFAULT_PLATFORM_NAME \"" << qpaPlatformName() << "\""<" : "SSE2") - << (dictionary[ "SSE3" ] == "no" ? "" : " SSE3") - << (dictionary[ "SSSE3" ] == "no" ? "" : " SSSE3") - << (dictionary[ "SSE4_1" ] == "no" ? "" : " SSE4.1") - << (dictionary[ "SSE4_2" ] == "no" ? "" : " SSE4.2") - << endl; - sout << "AVX support................." - << (dictionary[ "AVX" ] == "no" ? "" : "AVX") - << (dictionary[ "AVX2" ] == "no" ? "" : " AVX2") - << endl; - sout << "AVX512 support.............." - << (dictionary[ "AVX512" ].isEmpty() ? QString("") : dictionary[ "AVX512" ].toUpper()) << endl; - sout << "NEON support................" << dictionary[ "NEON" ] << endl; - sout << "OpenGL support.............." << dictionary[ "OPENGL" ] << endl; - sout << "NIS support................." << dictionary[ "NIS" ] << endl; - sout << "Iconv support..............." << dictionary[ "QT_ICONV" ] << endl; - sout << "Evdev support..............." << dictionary[ "QT_EVDEV" ] << endl; - sout << "Mtdev support..............." << dictionary[ "QT_MTDEV" ] << endl; - sout << "Inotify support............." << dictionary[ "QT_INOTIFY" ] << endl; - sout << "eventfd(7) support.........." << dictionary[ "QT_EVENTFD" ] << endl; - sout << "Glib support................" << dictionary[ "QT_GLIB" ] << endl; - sout << "CUPS support................" << dictionary[ "QT_CUPS" ] << endl; - sout << "SSL support................." << dictionary[ "SSL" ] << endl; - sout << "OpenSSL support............." << dictionary[ "OPENSSL" ] << endl; - sout << "libproxy support............" << dictionary[ "LIBPROXY" ] << endl; - sout << "Qt D-Bus support............" << dictionary[ "DBUS" ] << endl; - sout << "Qt Widgets module support..." << dictionary[ "WIDGETS" ] << endl; - sout << "Qt GUI module support......." << dictionary[ "GUI" ] << endl; - sout << "QML debugging..............." << dictionary[ "QML_DEBUG" ] << endl; - sout << "DirectWrite support........." << dictionary[ "DIRECTWRITE" ] << endl; - sout << "DirectWrite 2 support......." << dictionary[ "DIRECTWRITE2" ] << endl; - sout << "Use system proxies.........." << dictionary[ "SYSTEM_PROXIES" ] << endl; - sout << "SCTP support................" << dictionary[ "SCTP" ] << endl; - sout << endl; - - sout << "QPA Backends:" << endl; - sout << " GDI....................." << "yes" << endl; - sout << " Direct2D................" << dictionary[ "DIRECT2D" ] << endl; - sout << endl; - - sout << "Third Party Libraries:" << endl; - sout << " ZLIB support............" << (dictionary[ "SYSTEM_ZLIB" ] == QLatin1String("yes") ? QLatin1String("system") : QLatin1String("qt")) << endl; - sout << " GIF support............." << dictionary[ "GIF" ] << endl; - sout << " JPEG support............" << dictionary[ "JPEG" ] << " (" << dictionary[ "LIBJPEG" ] << ")" << endl; - sout << " PNG support............." << dictionary[ "PNG" ] << " (" << dictionary[ "LIBPNG" ] << ")" << endl; - sout << " DoubleConversion........" << dictionary[ "DOUBLECONVERSION" ] << endl; - sout << " FreeType support........" << dictionary[ "FREETYPE" ] << endl; - sout << " Fontconfig support......" << dictionary[ "FONT_CONFIG" ] << endl; - sout << " HarfBuzz support........" << dictionary[ "HARFBUZZ" ] << endl; - sout << " PCRE support............" << dictionary[ "PCRE" ] << endl; - sout << " ICU support............." << dictionary[ "ICU" ] << endl; - if (platform() == QNX) { - sout << " SLOG2 support..........." << dictionary[ "SLOG2" ] << endl; - sout << " IMF support............." << dictionary[ "QNX_IMF" ] << endl; - sout << " PPS support............." << dictionary[ "PPS" ] << endl; - sout << " LGMON support..........." << dictionary[ "LGMON" ] << endl; - } - sout << " ANGLE..................." << dictionary[ "ANGLE" ] << endl; - sout << " Dynamic OpenGL.........." << dictionary[ "DYNAMICGL" ] << endl; - sout << endl; - - sout << "Styles:" << endl; - sout << " Windows................." << dictionary[ "STYLE_WINDOWS" ] << endl; - sout << " Windows XP.............." << dictionary[ "STYLE_WINDOWSXP" ] << endl; - sout << " Windows Vista..........." << dictionary[ "STYLE_WINDOWSVISTA" ] << endl; - sout << " Fusion.................." << dictionary[ "STYLE_FUSION" ] << endl; - sout << endl; - - sout << "Sql Drivers:" << endl; - sout << " ODBC...................." << dictionary[ "SQL_ODBC" ] << endl; - sout << " MySQL..................." << dictionary[ "SQL_MYSQL" ] << endl; - sout << " OCI....................." << dictionary[ "SQL_OCI" ] << endl; - sout << " PostgreSQL.............." << dictionary[ "SQL_PSQL" ] << endl; - sout << " TDS....................." << dictionary[ "SQL_TDS" ] << endl; - sout << " DB2....................." << dictionary[ "SQL_DB2" ] << endl; - sout << " SQLite.................." << dictionary[ "SQL_SQLITE" ] << " (" << dictionary[ "SQL_SQLITE_LIB" ] << ")" << endl; - sout << " SQLite2................." << dictionary[ "SQL_SQLITE2" ] << endl; - sout << " InterBase..............." << dictionary[ "SQL_IBASE" ] << endl; - sout << endl; - - sout << "Sources are in.............." << QDir::toNativeSeparators(sourcePath) << endl; - sout << "Build is done in............" << QDir::toNativeSeparators(buildPath) << endl; - sout << "Install prefix.............." << QDir::toNativeSeparators(dictionary["QT_INSTALL_PREFIX"]) << endl; - sout << "Headers installed to........" << formatConfigPath("QT_REL_INSTALL_HEADERS") << endl; - sout << "Libraries installed to......" << formatConfigPath("QT_REL_INSTALL_LIBS") << endl; - sout << "Arch-dep. data to..........." << formatConfigPath("QT_REL_INSTALL_ARCHDATA") << endl; - sout << "Plugins installed to........" << formatConfigPath("QT_REL_INSTALL_PLUGINS") << endl; - sout << "Library execs installed to.." << formatConfigPath("QT_REL_INSTALL_LIBEXECS") << endl; - sout << "QML1 imports installed to..." << formatConfigPath("QT_REL_INSTALL_IMPORTS") << endl; - sout << "QML2 imports installed to..." << formatConfigPath("QT_REL_INSTALL_QML") << endl; - sout << "Binaries installed to......." << formatConfigPath("QT_REL_INSTALL_BINS") << endl; - sout << "Arch-indep. data to........." << formatConfigPath("QT_REL_INSTALL_DATA") << endl; - sout << "Docs installed to..........." << formatConfigPath("QT_REL_INSTALL_DOCS") << endl; - sout << "Translations installed to..." << formatConfigPath("QT_REL_INSTALL_TRANSLATIONS") << endl; - sout << "Examples installed to......." << formatConfigPath("QT_REL_INSTALL_EXAMPLES") << endl; - sout << "Tests installed to.........." << formatConfigPath("QT_REL_INSTALL_TESTS") << endl; - - if (checkAvailability("INCREDIBUILD_XGE")) - sout << "Using IncrediBuild XGE......" << dictionary["INCREDIBUILD_XGE"] << endl; - if (!qmakeDefines.isEmpty()) { - sout << "Defines....................."; - for (QStringList::Iterator defs = qmakeDefines.begin(); defs != qmakeDefines.end(); ++defs) - sout << (*defs) << " "; - sout << endl; - } - if (!qmakeIncludes.isEmpty()) { - sout << "Include paths..............."; - for (QStringList::Iterator incs = qmakeIncludes.begin(); incs != qmakeIncludes.end(); ++incs) - sout << (*incs) << " "; - sout << endl; - } - if (!qmakeLibs.isEmpty()) { - sout << "Additional libraries........"; - for (QStringList::Iterator libs = qmakeLibs.begin(); libs != qmakeLibs.end(); ++libs) - sout << (*libs) << " "; - sout << endl; - } - if (dictionary[ "SHARED" ] == "no") { - sout << "WARNING: Using static linking will disable the use of plugins." << endl; - sout << " Make sure you compile ALL needed modules into the library." << endl; - } - if (dictionary[ "OPENSSL" ] == "linked") { - if (!opensslLibsDebug.isEmpty() || !opensslLibsRelease.isEmpty()) { - sout << "Using OpenSSL libraries:" << endl; - sout << " debug : " << opensslLibsDebug << endl; - sout << " release: " << opensslLibsRelease << endl; - sout << " both : " << opensslLibs << endl; - } else if (opensslLibs.isEmpty()) { - sout << "NOTE: When linking against OpenSSL, you can override the default" << endl; - sout << "library names through OPENSSL_LIBS and optionally OPENSSL_LIBS_DEBUG/OPENSSL_LIBS_RELEASE" << endl; - sout << "For example:" << endl; - sout << " configure -openssl-linked OPENSSL_LIBS=\"-lssleay32 -llibeay32\"" << endl; - } - } - if (dictionary["RELEASE_TOOLS"] == "yes" && dictionary["BUILD"] != "debug" ) { - sout << endl - << "NOTE: -optimized-tools is not useful in -release mode." << endl; - } - if (!dictionary["PREFIX_COMPLAINTS"].isEmpty()) { - sout << endl - << dictionary["PREFIX_COMPLAINTS"] << endl - << endl; - } - - // display config.summary - sout.seekg(0, ios::beg); - while (sout.good()) { - string str; - getline(sout, str); - cout << str << endl; - } -} - void Configure::generateHeaders() { if (dictionary["SYNCQT"] == "auto") - dictionary["SYNCQT"] = defaultTo("SYNCQT"); + dictionary["SYNCQT"] = QFile::exists(sourcePath + "/.git") ? "yes" : "no"; if (dictionary["SYNCQT"] == "yes") { if (!QStandardPaths::findExecutable(QStringLiteral("perl.exe")).isEmpty()) { @@ -3534,6 +1012,58 @@ void Configure::buildQmake() } +void Configure::configure() +{ + static const char * const files[] = { "qmodule", "qconfig" }; + + for (int i = 0; i < 2; i++) { + QFile file(buildPath + "/mkspecs/" + files[i] + ".pri"); + QString oldfn = file.fileName() + ".old"; + if (file.exists() && !QFileInfo::exists(oldfn)) + QFile::rename(file.fileName(), oldfn); + if (!file.open(QFile::WriteOnly | QFile::Text)) { + cout << "Failed to create file " << qPrintable(file.fileName()) << endl; + dictionary[ "DONE" ] = "error"; + return; + } + file.close(); + } + + FileWriter ci(buildPath + "/config.tests/configure.cfg"); + ci << "# Feature defaults set by configure command line\n" + << "config.input.qt_edition = " << dictionary["EDITION"] << "\n" + << "config.input.qt_licheck = " << dictionary["LICHECK"] << "\n" + << "config.input.qt_release_date = " << dictionary["RELEASEDATE"]; + if (!ci.flush()) { + dictionary[ "DONE" ] = "error"; + return; + } + + QStringList args; + args << buildPath + "/bin/qmake" + << "-o" << "Makefile.cfg" + << sourcePath + "/configure.pri" + << "--" << configCmdLine; + + if (int exitCode = Environment::execute(args, QStringList(), QStringList())) { + cout << "Qmake failed, return code " << exitCode << endl << endl; + dictionary[ "DONE" ] = "error"; + } + + for (int i = 0; i < 2; i++) { + QFile file(buildPath + "/mkspecs/" + files[i] + ".pri"); + QFile oldFile(file.fileName() + ".old"); + if (oldFile.open(QIODevice::ReadOnly | QIODevice::Text) + && file.open(QIODevice::ReadOnly | QIODevice::Text) + && oldFile.readAll() == file.readAll()) { + file.remove(); + oldFile.rename(file.fileName()); + } else { + oldFile.remove(); + } + } +} + void Configure::generateMakefiles() { QString pwd = QDir::currentPath(); @@ -3556,13 +1086,6 @@ void Configure::generateMakefiles() QDir::setCurrent(pwd); } -void Configure::showSummary() -{ - QString make = dictionary[ "MAKE" ]; - cout << endl << endl << "Qt is now configured for building. Just run " << qPrintable(make) << "." << endl; - cout << "To reconfigure, run " << qPrintable(make) << " confclean and configure." << endl << endl; -} - bool Configure::showLicense(QString orgLicenseFile) { if (dictionary["LICENSE_CONFIRMED"] == "yes") { @@ -3754,23 +1277,6 @@ QString Configure::platformName() const } } -QString Configure::qpaPlatformName() const -{ - switch (platform()) { - default: - case WINDOWS: - return QStringLiteral("windows"); - case WINDOWS_RT: - return QStringLiteral("winrt"); - case QNX: - return QStringLiteral("qnx"); - case ANDROID: - return QStringLiteral("android"); - case OTHER: - return QStringLiteral("xcb"); - } -} - int Configure::platform() const { const QString xQMakeSpec = dictionary.value("XQMAKESPEC"); diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h index 9d3f7e39a8..6af83d44cd 100644 --- a/tools/configure/configureapp.h +++ b/tools/configure/configureapp.h @@ -44,76 +44,32 @@ public: void parseCmdLine(); - QString defaultTo(const QString &option); - bool checkAvailability(const QString &part); void generateQConfigCpp(); void buildQmake(); - void autoDetection(); - bool verifyConfiguration(); - void generateOutputVars(); + void prepareConfigureInput(); + void configure(); + void generateHeaders(); - void generateCachefile(); - void displayConfig(); void generateMakefiles(); - void generateConfigfiles(); - void detectArch(); - void generateQConfigPri(); void generateQDevicePri(); void prepareConfigTests(); - void showSummary(); bool showLicense(QString licenseFile); void readLicense(); - QString addDefine(QString def); - bool isDone(); bool isOk(); int platform() const; QString platformName() const; - QString qpaPlatformName() const; private: - bool checkAngleAvailability(QString *errorMessage = 0) const; - QString checkAvx512Availability(); - int verbose; // Our variable dictionaries QMap dictionary; - QStringList allBuildParts; - QStringList defaultBuildParts; - QStringList buildParts; - QStringList nobuildParts; - QStringList skipModules; - QStringList disabledModules; - QStringList enabledModules; - QStringList modules; QStringList configCmdLine; - QStringList qmakeConfig; - QStringList qtConfig; - - QStringList qmakeSql; - - QStringList qmakeStyles; - - QStringList qmakeVars; - QStringList qmakeDefines; - QStringList qmakeIncludes; - QStringList qmakeLibs; - QString opensslLibs; - QString opensslLibsDebug; - QString opensslLibsRelease; - QString opensslPath; - QString dbusPath; - QString dbusHostPath; - QString mysqlPath; - QString psqlLibs; - QString zlibLibs; - QString sybase; - QString sybaseLibs; QString outputLine; @@ -132,19 +88,10 @@ private: void addConfStr(int group, const QString &val); QString formatPath(const QString &path); - QString formatPaths(const QStringList &paths); - QString locateFile(const QString &fileName) const; - bool findFile(const QString &fileName) const { return !locateFile(fileName).isEmpty(); } - static QString findFileInPaths(const QString &fileName, const QStringList &paths); void reloadCmdLine(int idx); void saveCmdLine(); - void addSysroot(QString *command); - bool tryCompileProject(const QString &projectPath, const QString &extraOptions = QString(), - bool distClean = true); - bool compilerSupportsFlag(const QString &compilerAndArgs); - void applySpecSpecifics(); QString formatConfigPath(const char *var); diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp index dfcc322065..78298f1068 100644 --- a/tools/configure/environment.cpp +++ b/tools/configure/environment.cpp @@ -118,35 +118,6 @@ QString Environment::detectQMakeSpec() return spec; } -Compiler Environment::compilerFromQMakeSpec(const QString &qmakeSpec) -{ - if (qmakeSpec == QLatin1String("win32-msvc2015")) - return CC_MSVC2015; - if (qmakeSpec == QLatin1String("win32-msvc2013")) - return CC_MSVC2013; - if (qmakeSpec == QLatin1String("win32-msvc2012")) - return CC_MSVC2012; - if (qmakeSpec == QLatin1String("win32-icc")) - return CC_INTEL; - if (qmakeSpec == QLatin1String("win32-g++")) - return CC_MINGW; - if (qmakeSpec == QLatin1String("win32-borland")) - return CC_BORLAND; - return CC_UNKNOWN; -} - -QString Environment::gccVersion() -{ - CompilerInfo *info = compilerInfo(CC_MINGW); - int returnValue = 0; - QString version = execute(QStringLiteral("%1 -dumpversion").arg(info->executable), &returnValue); - if (returnValue != 0) { - cout << "Could not get mingw version" << returnValue << qPrintable(version); - version.resize(0); - } - return version; -} - /*! Returns the enum of the compiler which was detected on the system. The compilers are detected in the order as entered into the @@ -431,126 +402,4 @@ QString Environment::execute(const QString &command, int *returnCode) return output; } -static QStringList splitPathList(const QString &path) -{ -#if defined(Q_OS_WIN) - QRegExp splitReg(QStringLiteral("[;,]")); -#else - QRegExp splitReg(QStringLiteral("[:]")); -#endif - QStringList result = path.split(splitReg, QString::SkipEmptyParts); - const QStringList::iterator end = result.end(); - for (QStringList::iterator it = result.begin(); it != end; ++it) { - // Remove any leading or trailing ", this is commonly used in the environment - // variables - if (it->startsWith('"')) - it->remove(0, 1); - if (it->endsWith('"')) - it->chop(1); - *it = QDir::cleanPath(*it); - if (it->endsWith(QLatin1Char('/'))) - it->chop(1); - } - return result; -} - -QString Environment::findFileInPaths(const QString &fileName, const QStringList &paths) -{ - if (!paths.isEmpty()) { - QDir d; - const QChar separator = QDir::separator(); - foreach (const QString &path, paths) - if (d.exists(path + separator + fileName)) - return path; - } - return QString(); -} - -QStringList Environment::path() -{ - return splitPathList(QString::fromLocal8Bit(qgetenv("PATH"))); -} - -static QStringList mingwPaths(const QString &mingwPath, const QString &pathName) -{ - QStringList ret; - QDir mingwDir(mingwPath); - const QFileInfoList subdirs = mingwDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - for (int i = 0 ;i < subdirs.length(); ++i) { - const QFileInfo &fi = subdirs.at(i); - const QString name = fi.fileName(); - if (name == pathName) - ret += fi.absoluteFilePath(); - else if (name.contains(QLatin1String("mingw"))) { - ret += fi.absoluteFilePath() + QLatin1Char('/') + pathName; - } - } - return ret; -} - -// Return MinGW location from "c:\mingw\bin" -> "c:\mingw" -static inline QString detectMinGW() -{ - const QString gcc = QStandardPaths::findExecutable(QLatin1String("g++.exe")); - return gcc.isEmpty() ? - gcc : QFileInfo(QFileInfo(gcc).absolutePath()).absolutePath(); -} - -// Detect Direct X SDK up tp June 2010. Included in Windows Kit 8. -QString Environment::detectDirectXSdk() -{ - const QByteArray directXSdkEnv = qgetenv("DXSDK_DIR"); - if (directXSdkEnv.isEmpty()) - return QString(); - QString directXSdk = QDir::cleanPath(QString::fromLocal8Bit(directXSdkEnv)); - if (directXSdk.endsWith(QLatin1Char('/'))) - directXSdk.truncate(directXSdk.size() - 1); - return directXSdk; -} - -QStringList Environment::headerPaths(Compiler compiler) -{ - QStringList headerPaths; - if (compiler == CC_MINGW) { - const QString mingwPath = detectMinGW(); - headerPaths = mingwPaths(mingwPath, QLatin1String("include")); - // Additional compiler paths - const QFileInfoList mingwConfigs = QDir(mingwPath + QLatin1String("/lib/gcc")).entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - for (int i = 0; i < mingwConfigs.length(); ++i) { - const QDir mingwLibDir = mingwConfigs.at(i).absoluteFilePath(); - foreach (const QFileInfo &version, mingwLibDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) - headerPaths += version.absoluteFilePath() + QLatin1String("/include"); - } - } else { - headerPaths = splitPathList(QString::fromLocal8Bit(getenv("INCLUDE"))); - } - - // Add Direct X SDK for ANGLE - const QString directXSdk = detectDirectXSdk(); - if (!directXSdk.isEmpty()) // Add Direct X SDK for ANGLE - headerPaths += directXSdk + QLatin1String("/include"); - return headerPaths; -} - -QStringList Environment::libraryPaths(Compiler compiler) -{ - QStringList libraryPaths; - if (compiler == CC_MINGW) { - libraryPaths = mingwPaths(detectMinGW(), "lib"); - } else { - libraryPaths = splitPathList(QString::fromLocal8Bit(qgetenv("LIB"))); - } - - // Add Direct X SDK for ANGLE - const QString directXSdk = detectDirectXSdk(); - if (!directXSdk.isEmpty()) { -#ifdef Q_OS_WIN64 - libraryPaths += directXSdk + QLatin1String("/lib/x64"); -#else - libraryPaths += directXSdk + QLatin1String("/lib/x86"); -#endif - } - return libraryPaths; -} - QT_END_NAMESPACE diff --git a/tools/configure/environment.h b/tools/configure/environment.h index 12646b6d88..d14961b5ac 100644 --- a/tools/configure/environment.h +++ b/tools/configure/environment.h @@ -50,19 +50,10 @@ class Environment public: static Compiler detectCompiler(); static QString detectQMakeSpec(); - static Compiler compilerFromQMakeSpec(const QString &qmakeSpec); - static QString gccVersion(); static int execute(QStringList arguments, const QStringList &additionalEnv, const QStringList &removeEnv); static QString execute(const QString &command, int *returnCode = 0); - static QString findFileInPaths(const QString &fileName, const QStringList &paths); - static QStringList path(); - - static QString detectDirectXSdk(); - static QStringList headerPaths(Compiler compiler); - static QStringList libraryPaths(Compiler compiler); - private: static Compiler detectedCompiler; diff --git a/tools/configure/main.cpp b/tools/configure/main.cpp index 426cdbd294..ac521f42e4 100644 --- a/tools/configure/main.cpp +++ b/tools/configure/main.cpp @@ -75,29 +75,12 @@ int runConfigure( int argc, char** argv ) if (!app.isOk()) return 3; - // Auto-detect modules and settings. - app.autoDetection(); - - // After reading all command-line arguments, and doing all the - // auto-detection, it's time to do some last minute validation. - // If the validation fails, we cannot continue. - if (!app.verifyConfiguration()) + // run qmake based configure + app.configure(); + if (!app.isOk()) return 3; - app.generateOutputVars(); - - if( !app.isDone() ) - app.generateCachefile(); - if( !app.isDone() ) - app.generateConfigfiles(); - if (!app.isDone()) - app.generateQConfigPri(); - if (!app.isDone()) - app.displayConfig(); - if( !app.isDone() ) - app.generateMakefiles(); - if( !app.isDone() ) - app.showSummary(); + app.generateMakefiles(); if( !app.isOk() ) return 2; -- cgit v1.2.3