QmlDump: Ensure that qmldump is found in QtSDK

We ship a precompiled qmldump in the Qt SDK because the Qt versions
don't have private headers. However, the logic in buildablehelperlibrary
by default rejects any build that is older than the latest changes to the
qmldump source code files; allow Qt Creator to pick up the (maybe
outdated) qmldump nevertheless if no private headers are installed.

Reviewed-by: ckamm
Task-number: QTCREATORBUG-4578
This commit is contained in:
Kai Koehne
2011-04-18 14:13:18 +02:00
committed by con
parent bf511a2bcb
commit f86c9b6572
8 changed files with 39 additions and 21 deletions

View File

@@ -297,20 +297,24 @@ bool BuildableHelperLibrary::getHelperFileInfoFor(const QStringList &validBinary
QString BuildableHelperLibrary::byInstallDataHelper(const QString &sourcePath, QString BuildableHelperLibrary::byInstallDataHelper(const QString &sourcePath,
const QStringList &sourceFileNames, const QStringList &sourceFileNames,
const QStringList &installDirectories, const QStringList &installDirectories,
const QStringList &validBinaryFilenames) const QStringList &validBinaryFilenames,
bool acceptOutdatedHelper)
{ {
// find the latest change to the sources // find the latest change to the sources
QDateTime sourcesModified; QDateTime sourcesModified;
foreach (const QString &sourceFileName, sourceFileNames) { if (!acceptOutdatedHelper) {
const QDateTime fileModified = QFileInfo(sourcePath + sourceFileName).lastModified(); foreach (const QString &sourceFileName, sourceFileNames) {
if (fileModified.isValid() && (!sourcesModified.isValid() || fileModified > sourcesModified)) const QDateTime fileModified = QFileInfo(sourcePath + sourceFileName).lastModified();
sourcesModified = fileModified; if (fileModified.isValid() && (!sourcesModified.isValid() || fileModified > sourcesModified))
sourcesModified = fileModified;
}
} }
// We pretend that the lastmodified of gdbmacros.cpp is 5 minutes before what the file system says // We pretend that the lastmodified of gdbmacros.cpp is 5 minutes before what the file system says
// Because afer a installation from the package the modified dates of gdbmacros.cpp // Because afer a installation from the package the modified dates of gdbmacros.cpp
// and the actual library are close to each other, but not deterministic in one direction // and the actual library are close to each other, but not deterministic in one direction
sourcesModified = sourcesModified.addSecs(-300); if (sourcesModified.isValid())
sourcesModified = sourcesModified.addSecs(-300);
// look for the newest helper library in the different locations // look for the newest helper library in the different locations
QString newestHelper; QString newestHelper;
@@ -318,7 +322,8 @@ QString BuildableHelperLibrary::byInstallDataHelper(const QString &sourcePath,
QFileInfo fileInfo; QFileInfo fileInfo;
foreach(const QString &installDirectory, installDirectories) { foreach(const QString &installDirectory, installDirectories) {
if (getHelperFileInfoFor(validBinaryFilenames, installDirectory, &fileInfo)) { if (getHelperFileInfoFor(validBinaryFilenames, installDirectory, &fileInfo)) {
if (fileInfo.lastModified() > newestHelperModified) { if (!newestHelperModified.isValid()
|| (fileInfo.lastModified() > newestHelperModified)) {
newestHelper = fileInfo.filePath(); newestHelper = fileInfo.filePath();
newestHelperModified = fileInfo.lastModified(); newestHelperModified = fileInfo.lastModified();
} }

View File

@@ -61,7 +61,8 @@ public:
static QString byInstallDataHelper(const QString &sourcePath, static QString byInstallDataHelper(const QString &sourcePath,
const QStringList &sourceFileNames, const QStringList &sourceFileNames,
const QStringList &installDirectories, const QStringList &installDirectories,
const QStringList &validBinaryFilenames); const QStringList &validBinaryFilenames,
bool acceptOutdatedHelper);
static bool copyFiles(const QString &sourcePath, const QStringList &files, static bool copyFiles(const QString &sourcePath, const QStringList &files,
const QString &targetDirectory, QString *errorMessage); const QString &targetDirectory, QString *errorMessage);

View File

@@ -101,7 +101,7 @@ QString DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(const QStrin
const QStringList directories = DebuggingHelperLibrary::debuggingHelperLibraryDirectories(qtInstallData); const QStringList directories = DebuggingHelperLibrary::debuggingHelperLibraryDirectories(qtInstallData);
const QStringList binFilenames = validBinaryFilenames(); const QStringList binFilenames = validBinaryFilenames();
return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames); return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
} }
QString DebuggingHelperLibrary::copy(const QString &qtInstallData, QString DebuggingHelperLibrary::copy(const QString &qtInstallData,

View File

@@ -62,7 +62,7 @@ QString QmlDebuggingLibrary::libraryByInstallData(const QString &qtInstallData,
} }
binFilenames << QLatin1String("libQmlJSDebugger.a"); binFilenames << QLatin1String("libQmlJSDebugger.a");
return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames); return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
} }
bool QmlDebuggingLibrary::canBuild(const QtVersion *qtVersion) bool QmlDebuggingLibrary::canBuild(const QtVersion *qtVersion)

View File

@@ -175,14 +175,20 @@ static inline QStringList validBinaryFilenames(bool debugBuild)
return list; return list;
} }
static bool hasPrivateHeaders(const QString &qtInstallHeaders) {
const QString header = qtInstallHeaders
+ QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
return QFile::exists(header);
}
bool QmlDumpTool::canBuild(const QtVersion *qtVersion) bool QmlDumpTool::canBuild(const QtVersion *qtVersion)
{ {
const QString installHeaders = qtVersion->versionInfo().value("QT_INSTALL_HEADERS"); const QString installHeaders = qtVersion->versionInfo().value("QT_INSTALL_HEADERS");
const QString header = installHeaders + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
return (qtVersion->supportsTargetId(Constants::DESKTOP_TARGET_ID) return (qtVersion->supportsTargetId(Constants::DESKTOP_TARGET_ID)
|| (qtVersion->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID) || (qtVersion->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID)
&& (qtVersion->qtVersion() > QtVersionNumber(4, 7, 1)))) && (qtVersion->qtVersion() > QtVersionNumber(4, 7, 1))))
&& QFile::exists(header); && hasPrivateHeaders(installHeaders);
} }
static QtVersion *qtVersionForProject(ProjectExplorer::Project *project) static QtVersion *qtVersionForProject(ProjectExplorer::Project *project)
@@ -234,7 +240,8 @@ QString QmlDumpTool::toolForProject(ProjectExplorer::Project *project, bool debu
QtVersion *version = qtVersionForProject(project); QtVersion *version = qtVersionForProject(project);
if (version) { if (version) {
QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA"); QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA");
QString toolPath = toolByInstallData(qtInstallData, debugDump); QString qtInstallHeaders = version->versionInfo().value("QT_INSTALL_HEADERS");
QString toolPath = toolByInstallData(qtInstallData, qtInstallHeaders, debugDump);
return toolPath; return toolPath;
} }
@@ -258,17 +265,17 @@ static QStringList sourceFileNames()
return files; return files;
} }
QString QmlDumpTool::toolByInstallData(const QString &qtInstallData, bool debugDump) QString QmlDumpTool::toolByInstallData(const QString &qtInstallData, const QString &qtInstallHeaders,
bool debugDump)
{ {
if (!Core::ICore::instance()) if (!Core::ICore::instance())
return QString(); return QString();
const QString mainFilename = Core::ICore::instance()->resourcePath()
+ QLatin1String("/qml/qmldump/main.cpp");
const QStringList directories = installDirectories(qtInstallData); const QStringList directories = installDirectories(qtInstallData);
const QStringList binFilenames = validBinaryFilenames(debugDump); const QStringList binFilenames = validBinaryFilenames(debugDump);
return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames); return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames,
!hasPrivateHeaders(qtInstallHeaders));
} }
QStringList QmlDumpTool::locationsByInstallData(const QString &qtInstallData, bool debugDump) QStringList QmlDumpTool::locationsByInstallData(const QString &qtInstallData, bool debugDump)

View File

@@ -53,7 +53,8 @@ class QT4PROJECTMANAGER_EXPORT QmlDumpTool : public Utils::BuildableHelperLibrar
public: public:
static bool canBuild(const QtVersion *qtVersion); static bool canBuild(const QtVersion *qtVersion);
static QString toolForProject(ProjectExplorer::Project *project, bool debugDump); static QString toolForProject(ProjectExplorer::Project *project, bool debugDump);
static QString toolByInstallData(const QString &qtInstallData, bool debugDump); static QString toolByInstallData(const QString &qtInstallData, const QString &qtInstallHeaders,
bool debugDump);
static QStringList locationsByInstallData(const QString &qtInstallData, bool debugDump); static QStringList locationsByInstallData(const QString &qtInstallData, bool debugDump);
// Build the helpers and return the output log/errormessage. // Build the helpers and return the output log/errormessage.

View File

@@ -86,7 +86,7 @@ QString QmlObserverTool::toolByInstallData(const QString &qtInstallData)
const QStringList directories = installDirectories(qtInstallData); const QStringList directories = installDirectories(qtInstallData);
const QStringList binFilenames = validBinaryFilenames(); const QStringList binFilenames = validBinaryFilenames();
return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames); return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
} }
QStringList QmlObserverTool::locationsByInstallData(const QString &qtInstallData) QStringList QmlObserverTool::locationsByInstallData(const QString &qtInstallData)

View File

@@ -1271,11 +1271,14 @@ void QtVersion::updateVersionInfo() const
if (m_versionInfo.contains("QT_INSTALL_DATA")) { if (m_versionInfo.contains("QT_INSTALL_DATA")) {
QString qtInstallData = m_versionInfo.value("QT_INSTALL_DATA"); QString qtInstallData = m_versionInfo.value("QT_INSTALL_DATA");
QString qtHeaderData = m_versionInfo.value("QT_INSTALL_HEADERS");
m_versionInfo.insert("QMAKE_MKSPECS", QDir::cleanPath(qtInstallData+"/mkspecs")); m_versionInfo.insert("QMAKE_MKSPECS", QDir::cleanPath(qtInstallData+"/mkspecs"));
if (!qtInstallData.isEmpty()) { if (!qtInstallData.isEmpty()) {
m_hasDebuggingHelper = !DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(qtInstallData).isEmpty(); m_hasDebuggingHelper = !DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(qtInstallData).isEmpty();
m_hasQmlDump = !QmlDumpTool::toolByInstallData(qtInstallData, false).isEmpty() || !QmlDumpTool::toolByInstallData(qtInstallData, true).isEmpty(); m_hasQmlDump
= !QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, false).isEmpty()
|| !QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, true).isEmpty();
m_hasQmlDebuggingLibrary m_hasQmlDebuggingLibrary
= !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, false).isEmpty() = !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, false).isEmpty()
|| !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, true).isEmpty(); || !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, true).isEmpty();
@@ -1975,9 +1978,10 @@ QString QtVersion::gdbDebuggingHelperLibrary() const
QString QtVersion::qmlDumpTool(bool debugVersion) const QString QtVersion::qmlDumpTool(bool debugVersion) const
{ {
QString qtInstallData = versionInfo().value("QT_INSTALL_DATA"); QString qtInstallData = versionInfo().value("QT_INSTALL_DATA");
QString qtHeaderData = versionInfo().value("QT_INSTALL_HEADERS");
if (qtInstallData.isEmpty()) if (qtInstallData.isEmpty())
return QString(); return QString();
return QmlDumpTool::toolByInstallData(qtInstallData, debugVersion); return QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, debugVersion);
} }
QString QtVersion::qmlDebuggingHelperLibrary(bool debugVersion) const QString QtVersion::qmlDebuggingHelperLibrary(bool debugVersion) const