From a6fa179a230a0bc921c97c3adee038f7ac8f1b03 Mon Sep 17 00:00:00 2001 From: Marius Storm-Olsen Date: Thu, 11 Nov 2010 09:35:09 -0600 Subject: Expose source and build directories for QtBase Also expose moc, uic, rcc, qdbusxml2cpp, include and lib --- configure | 69 +++++++++++++++---------- mkspecs/features/qt_module.prf | 16 ++++++ tools/configure/configureapp.cpp | 106 +++++++++++++++++++++++---------------- 3 files changed, 121 insertions(+), 70 deletions(-) create mode 100644 mkspecs/features/qt_module.prf diff --git a/configure b/configure index 5e3e40fab1..f2ee5f409e 100755 --- a/configure +++ b/configure @@ -8299,10 +8299,10 @@ else ln -s "$outpath/src/corelib/global/qconfig.h" "$conf" done fi + #------------------------------------------------------------------------------- # save configuration into qconfig.pri #------------------------------------------------------------------------------- - QTCONFIG="$outpath/mkspecs/qconfig.pri" QTCONFIG_CONFIG="$QTCONFIG_CONFIG no_mocdepend" [ -f "$QTCONFIG.tmp" ] && rm -f "$QTCONFIG.tmp" @@ -8402,23 +8402,19 @@ else fi #------------------------------------------------------------------------------- -# save configuration into .qmake.cache +# save configuration into qmodule.pri #------------------------------------------------------------------------------- +QTMODULE="$outpath/mkspecs/qmodule.pri" -CACHEFILE="$outpath/.qmake.cache" -[ -f "$CACHEFILE.tmp" ] && rm -f "$CACHEFILE.tmp" -cat >>"$CACHEFILE.tmp" <>"$QTMODULE.tmp" <> "$CACHEFILE.tmp" + echo "QMAKE_LFLAGS = -Wl,-rpath-link,\$\$QT_BUILD_TREE/lib \$\$QMAKE_LFLAGS" >> "$QTMODULE.tmp" fi if [ -n "$QT_CFLAGS_PSQL" ]; then - echo "QT_CFLAGS_PSQL = $QT_CFLAGS_PSQL" >> "$CACHEFILE.tmp" + echo "QT_CFLAGS_PSQL = $QT_CFLAGS_PSQL" >> "$QTMODULE.tmp" fi if [ -n "$QT_LFLAGS_PSQL" ]; then - echo "QT_LFLAGS_PSQL = $QT_LFLAGS_PSQL" >> "$CACHEFILE.tmp" + echo "QT_LFLAGS_PSQL = $QT_LFLAGS_PSQL" >> "$QTMODULE.tmp" fi if [ -n "$QT_CFLAGS_MYSQL" ]; then - echo "QT_CFLAGS_MYSQL = $QT_CFLAGS_MYSQL" >> "$CACHEFILE.tmp" + echo "QT_CFLAGS_MYSQL = $QT_CFLAGS_MYSQL" >> "$QTMODULE.tmp" fi if [ -n "$QT_LFLAGS_MYSQL" ]; then - echo "QT_LFLAGS_MYSQL = $QT_LFLAGS_MYSQL" >> "$CACHEFILE.tmp" + echo "QT_LFLAGS_MYSQL = $QT_LFLAGS_MYSQL" >> "$QTMODULE.tmp" fi if [ -n "$QT_CFLAGS_SQLITE" ]; then - echo "QT_CFLAGS_SQLITE = $QT_CFLAGS_SQLITE" >> "$CACHEFILE.tmp" + echo "QT_CFLAGS_SQLITE = $QT_CFLAGS_SQLITE" >> "$QTMODULE.tmp" fi if [ -n "$QT_LFLAGS_SQLITE" ]; then - echo "QT_LFLAGS_SQLITE = $QT_LFLAGS_SQLITE" >> "$CACHEFILE.tmp" + echo "QT_LFLAGS_SQLITE = $QT_LFLAGS_SQLITE" >> "$QTMODULE.tmp" fi if [ -n "$QT_LFLAGS_ODBC" ]; then - echo "QT_LFLAGS_ODBC = $QT_LFLAGS_ODBC" >> "$CACHEFILE.tmp" + echo "QT_LFLAGS_ODBC = $QT_LFLAGS_ODBC" >> "$QTMODULE.tmp" fi if [ -n "$QT_LFLAGS_TDS" ]; then - echo "QT_LFLAGS_TDS = $QT_LFLAGS_TDS" >> "$CACHEFILE.tmp" + echo "QT_LFLAGS_TDS = $QT_LFLAGS_TDS" >> "$QTMODULE.tmp" fi if [ "$QT_EDITION" != "QT_EDITION_OPENSOURCE" ]; then - echo "DEFINES *= QT_EDITION=QT_EDITION_DESKTOP" >> "$CACHEFILE.tmp" + echo "DEFINES *= QT_EDITION=QT_EDITION_DESKTOP" >> "$QTMODULE.tmp" fi #dump in the OPENSSL_LIBS info if [ '!' -z "$OPENSSL_LIBS" ]; then - echo "OPENSSL_LIBS = $OPENSSL_LIBS" >> "$CACHEFILE.tmp" + echo "OPENSSL_LIBS = $OPENSSL_LIBS" >> "$QTMODULE.tmp" elif [ "$CFG_OPENSSL" = "linked" ]; then - echo "OPENSSL_LIBS = -lssl -lcrypto" >> "$CACHEFILE.tmp" + echo "OPENSSL_LIBS = -lssl -lcrypto" >> "$QTMODULE.tmp" fi #dump in the SDK info if [ '!' -z "$CFG_SDK" ]; then - echo "QMAKE_MAC_SDK = $CFG_SDK" >> "$CACHEFILE.tmp" + echo "QMAKE_MAC_SDK = $CFG_SDK" >> "$QTMODULE.tmp" fi # mac gcc -Xarch support if [ "$CFG_MAC_XARCH" = "no" ]; then - echo "QMAKE_MAC_XARCH = no" >> "$CACHEFILE.tmp" + echo "QMAKE_MAC_XARCH = no" >> "$QTMODULE.tmp" fi #dump the qmake spec if [ -d "$outpath/mkspecs/$XPLATFORM" ]; then - echo "QMAKESPEC = \$\$QT_BUILD_TREE/mkspecs/$XPLATFORM" >> "$CACHEFILE.tmp" + echo "QMAKESPEC = \$\$QT_BUILD_TREE/mkspecs/$XPLATFORM" >> "$QTMODULE.tmp" else - echo "QMAKESPEC = $XPLATFORM" >> "$CACHEFILE.tmp" + echo "QMAKESPEC = $XPLATFORM" >> "$QTMODULE.tmp" fi # cmdline args -cat "$QMAKE_VARS_FILE" >> "$CACHEFILE.tmp" +cat "$QMAKE_VARS_FILE" >> "$QTMODULE.tmp" rm -f "$QMAKE_VARS_FILE" 2>/dev/null +# replace qmodule.pri if it differs from the newly created temp file +if cmp -s "$QTMODULE.tmp" "$QTMODULE"; then + rm -f "$QTMODULE.tmp" +else + mv -f "$QTMODULE.tmp" "$QTMODULE" +fi + +#------------------------------------------------------------------------------- +# save configuration into .qmake.cache +#------------------------------------------------------------------------------- + +CACHEFILE="$outpath/.qmake.cache" +[ -f "$CACHEFILE.tmp" ] && rm -f "$CACHEFILE.tmp" +cat >>"$CACHEFILE.tmp" </dev/null 2>&1 && [ "$CFG_DEV" = "yes" ] && CFG_INCREMENTAL="yes" diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf new file mode 100644 index 0000000000..9fe20c76cb --- /dev/null +++ b/mkspecs/features/qt_module.prf @@ -0,0 +1,16 @@ +# This file is loaded on-demand, before any .qmake.cache (sometimes *in* .qmake.cache), to loaded +# important settings for modules, such as paths to QtBase and other modules. +# Consequently, we have to do some stunts to figure out where to find qmodule.pri. + +isEmpty(QMAKE_QT_MODULE)|!exists($$QMAKE_QT_MODULE) { + exists($$_QMAKE_CACHE_/mkspecs/qmodule.pri):QMAKE_QT_MODULE = $$_QMAKE_CACHE_/mkspecs/qmodule.pri + else:exists($$_QMAKE_CACHE_/qtbase/mkspecs/qmodule.pri):QMAKE_QT_MODULE = $$_QMAKE_CACHE_/qtbase/mkspecs/qmodule.pri + else:if(!isEmpty(QT_BUILD_TREE) & exists($$QT_BUILD_TREE/mkspecs/qmodule.pri)):QMAKE_QT_MODULE = $$QT_BUILD_TREE/mkspecs/qmodule.pri + else:exists($$[QT_INSTALL_DATA]/mkspecs/qmodule.pri):QMAKE_QT_MODULE = $$[QT_INSTALL_DATA]/mkspecs/qmodule.pri +} + +!exists($$QMAKE_QT_MODULE)|!include($$QMAKE_QT_MODULE, "", true) { + error("Cannot load qmodule.pri!") +} else { + debug(1, "Loaded qmodule.pri from ($$QMAKE_QT_MODULE)") +} diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index c6819db8b1..46f1a87ac9 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -2911,63 +2911,101 @@ void Configure::generateCachefile() QFile cacheFile(buildPath + "/.qmake.cache"); if (cacheFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file. QTextStream cacheStream(&cacheFile); + + cacheStream << "include($$PWD/mkspecs/qmodule.pri)" << endl; + for (QStringList::Iterator var = qmakeVars.begin(); var != qmakeVars.end(); ++var) { cacheStream << (*var) << endl; } cacheStream << "CONFIG += " << qmakeConfig.join(" ") << " incremental msvc_mp create_prl link_prl depend_includepath QTDIR_build" << endl; + cacheStream.flush(); + cacheFile.close(); + } + + // Generate qmodule.pri + QFile configFile(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qmodule.pri"); + if (configFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file. + QTextStream configStream(&configFile); + + configStream << "#paths" << endl; + configStream << "QT_BUILD_TREE = " << fixSeparators(dictionary[ "QT_BUILD_TREE" ], true) << endl; + configStream << "QT_SOURCE_TREE = " << fixSeparators(dictionary[ "QT_SOURCE_TREE" ], true) << endl; QStringList buildParts; buildParts << "libs" << "tools" << "examples" << "demos" << "docs" << "translations"; foreach (const QString &item, disabledBuildParts) { buildParts.removeAll(item); } - cacheStream << "QT_BUILD_PARTS = " << buildParts.join(" ") << endl; + configStream << "QT_BUILD_PARTS = " << buildParts.join(" ") << endl << endl; + + //so that we can build without an install first (which would be impossible) + configStream << "#local paths that cannot be queried from the QT_INSTALL_* properties while building QTDIR" << endl; + configStream << "QMAKE_MOC = $$QT_BUILD_TREE" << fixSeparators("/bin/moc.exe", true) << endl; + configStream << "QMAKE_UIC = $$QT_BUILD_TREE" << fixSeparators("/bin/uic.exe", true) << endl; + configStream << "QMAKE_RCC = $$QT_BUILD_TREE" << fixSeparators("/bin/rcc.exe", true) << endl; + configStream << "QMAKE_DUMPCPP = $$QT_BUILD_TREE" << fixSeparators("/bin/dumpcpp.exe", true) << endl; + configStream << "QMAKE_INCDIR_QT = $$QT_BUILD_TREE" << fixSeparators("/include", true) << endl; + configStream << "QMAKE_LIBDIR_QT = $$QT_BUILD_TREE" << fixSeparators("/lib", true) << endl; + QString targetSpec = dictionary.contains("XQMAKESPEC") ? dictionary[ "XQMAKESPEC" ] : dictionary[ "QMAKESPEC" ]; QString mkspec_path = fixSeparators(sourcePath + "/mkspecs/" + targetSpec); if (QFile::exists(mkspec_path)) - cacheStream << "QMAKESPEC = " << escapeSeparators(mkspec_path) << endl; + configStream << "QMAKESPEC = " << escapeSeparators(mkspec_path) << endl; else - cacheStream << "QMAKESPEC = " << fixSeparators(targetSpec, true) << endl; - cacheStream << "ARCH = " << dictionary[ "ARCHITECTURE" ] << endl; - cacheStream << "QT_BUILD_TREE = " << fixSeparators(dictionary[ "QT_BUILD_TREE" ], true) << endl; - cacheStream << "QT_SOURCE_TREE = " << fixSeparators(dictionary[ "QT_SOURCE_TREE" ], true) << endl; + configStream << "QMAKESPEC = " << fixSeparators(targetSpec, true) << endl; + configStream << "ARCH = " << dictionary[ "ARCHITECTURE" ] << endl; if (dictionary["QT_EDITION"] != "QT_EDITION_OPENSOURCE") - cacheStream << "DEFINES *= QT_EDITION=QT_EDITION_DESKTOP" << endl; + configStream << "DEFINES *= QT_EDITION=QT_EDITION_DESKTOP" << endl; - //so that we can build without an install first (which would be impossible) - cacheStream << "QMAKE_MOC = $$QT_BUILD_TREE" << fixSeparators("/bin/moc.exe", true) << endl; - cacheStream << "QMAKE_UIC = $$QT_BUILD_TREE" << fixSeparators("/bin/uic.exe", true) << endl; - cacheStream << "QMAKE_UIC3 = $$QT_BUILD_TREE" << fixSeparators("/bin/uic3.exe", true) << endl; - cacheStream << "QMAKE_RCC = $$QT_BUILD_TREE" << fixSeparators("/bin/rcc.exe", true) << endl; - cacheStream << "QMAKE_DUMPCPP = $$QT_BUILD_TREE" << fixSeparators("/bin/dumpcpp.exe", true) << endl; - cacheStream << "QMAKE_INCDIR_QT = $$QT_BUILD_TREE" << fixSeparators("/include", true) << endl; - cacheStream << "QMAKE_LIBDIR_QT = $$QT_BUILD_TREE" << fixSeparators("/lib", true) << endl; if (dictionary["CETEST"] == "yes") { - cacheStream << "QT_CE_RAPI_INC = " << fixSeparators(dictionary[ "QT_CE_RAPI_INC" ], true) << endl; - cacheStream << "QT_CE_RAPI_LIB = " << fixSeparators(dictionary[ "QT_CE_RAPI_LIB" ], true) << endl; + configStream << "QT_CE_RAPI_INC = " << fixSeparators(dictionary[ "QT_CE_RAPI_INC" ], true) << endl; + configStream << "QT_CE_RAPI_LIB = " << fixSeparators(dictionary[ "QT_CE_RAPI_LIB" ], true) << endl; + } + + configStream << "#Qt for Windows CE c-runtime deployment" << endl + << "QT_CE_C_RUNTIME = " << fixSeparators(dictionary[ "CE_CRT" ], true) << endl; + + if (dictionary["CE_SIGNATURE"] != QLatin1String("no")) + configStream << "DEFAULT_SIGNATURE=" << dictionary["CE_SIGNATURE"] << endl; + + if (!dictionary["QMAKE_RPATHDIR"].isEmpty()) + configStream << "QMAKE_RPATHDIR += " << dictionary["QMAKE_RPATHDIR"] << endl; + + if (!dictionary["QT_LIBINFIX"].isEmpty()) + configStream << "QT_LIBINFIX = " << dictionary["QT_LIBINFIX"] << endl; + + configStream << "#Qt for Symbian FPU settings" << endl; + if (!dictionary["ARM_FPU_TYPE"].isEmpty()) { + configStream<<"MMP_RULES += \"ARMFPU "<< dictionary["ARM_FPU_TYPE"]<< "\""; + } + if (!dictionary["QT_NAMESPACE"].isEmpty()) { + configStream << "#namespaces" << endl << "QT_NAMESPACE = " << dictionary["QT_NAMESPACE"] << endl; } // embedded if (!dictionary["KBD_DRIVERS"].isEmpty()) - cacheStream << "kbd-drivers += "<< dictionary["KBD_DRIVERS"]<