--- src\tools\moc\moc.cpp 2014-04-10 21:37:12.000000000 +0400 +++ src\tools\moc\moc.cpp 2015-06-03 20:34:11.775340800 +0400 @@ -48,6 +48,9 @@ // for normalizeTypeInternal #include +#include +#include + QT_BEGIN_NAMESPACE // only moc needs this function @@ -764,7 +767,7 @@ } } -void Moc::generate(FILE *out) +void Moc::generate(FILE *out, const QByteArray & output) { QByteArray fn = filename; int i = filename.length()-1; @@ -778,17 +781,46 @@ fprintf(out, "** WARNING! All changes made in this file will be lost!\n" "*****************************************************************************/\n\n"); + QFileInfo fi; + fi.setFile(QString::fromLocal8Bit(output)); + QString absOutput = fi.absolutePath(); if (!noInclude) { if (includePath.size() && !includePath.endsWith('/')) includePath += '/'; for (int i = 0; i < includeFiles.size(); ++i) { QByteArray inc = includeFiles.at(i); + fprintf(stderr, "current=%s\nincludePath=%s\ninc=%s\noutput=%s\n", + QDir::current().path().toUtf8().constData(), QString::fromLocal8Bit(includePath).toUtf8().constData(), + QString::fromLocal8Bit(inc).toUtf8().constData(), absOutput.toUtf8().constData()); if (inc[0] != '<' && inc[0] != '"') { - if (includePath.size() && includePath != "./") - inc.prepend(includePath); - inc = '\"' + inc + '\"'; + if (includePath.size()) { + fi.setFile(QString::fromLocal8Bit(includePath)); + if (fi.isAbsolute()) { + fi.setFile(QString::fromLocal8Bit(includePath), QString::fromLocal8Bit(inc)); + } + else { + fi.setFile(QString::fromLocal8Bit(includePath), fi.filePath()); + // Visual Studio nmake compatibility: at first relative to output file + fi.setFile(absOutput, fi.filePath()); + if (!fi.exists()) { + // relative to current directory + fi.setFile(QDir::current(), fi.filePath()); + } + } + } + else { + fi.setFile(QString::fromLocal8Bit(inc)); + // Visual Studio nmake compatibility: at first relative to output file + fi.setFile(absOutput, fi.filePath()); + if (!fi.exists()) { + // relative to current directory + fi.setFile(QDir::current(), fi.filePath()); + } + } + inc = '\"' + fi.canonicalFilePath().toLocal8Bit() + '\"'; } + fprintf(stderr, "result=%s\n", QString::fromLocal8Bit(inc).toUtf8().constData()); fprintf(out, "#include %s\n", inc.constData()); } }