--- a/ApiExtractor/clangparser/compilersupport.cpp +++ b/ApiExtractor/clangparser/compilersupport.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -341,6 +342,13 @@ QByteArrayList emulatedCompilerOptions() { QByteArrayList result; HeaderPaths headerPaths; + + bool isNixDebug = qgetenv("NIX_DEBUG").toInt() > 0; + // examples: + // /nix/store/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-qtsensors-6.4.2-dev/include + // /nix/store/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-qtbase-6.4.2-dev/include + QRegularExpression qtHeaderRegex(uR"(/[0-9a-z]{32}-qt[a-z0-9]+-)"_s); + switch (compiler()) { case Compiler::Msvc: result.append(QByteArrayLiteral("-fms-compatibility-version=19.26.28806")); @@ -352,9 +360,30 @@ QByteArrayList emulatedCompilerOptions() appendClangBuiltinIncludes(&headerPaths); break; case Compiler::Clang: - headerPaths.append(gppInternalIncludePaths(compilerFromCMake(u"clang++"_s))); + // fix: error: cannot jump from switch statement to this case label: case Compiler::Gpp + // note: jump bypasses variable initialization: const HeaderPaths clangPaths = + { + //headerPaths.append(gppInternalIncludePaths(compilerFromCMake(u"clang++"_s))); + // fix: qt.shiboken: x is specified in typesystem, but not defined. This could potentially lead to compilation errors. + // PySide requires that Qt headers are not -isystem + // https://bugreports.qt.io/browse/PYSIDE-787 + const HeaderPaths clangPaths = gppInternalIncludePaths(compilerFromCMake(u"clang++"_qs)); + for (const HeaderPath &h : clangPaths) { + auto match = qtHeaderRegex.match(QString::fromUtf8(h.path)); + if (!match.hasMatch()) { + if (isNixDebug) + qDebug() << "shiboken compilersupport.cpp: found non-qt header: " << h.path; + // add using -isystem + headerPaths.append(h); + } else { + if (isNixDebug) + qDebug() << "shiboken compilersupport.cpp: found qt header: " << h.path; + headerPaths.append({h.path, HeaderType::Standard}); + } + } result.append(noStandardIncludeOption()); break; + } case Compiler::Gpp: if (needsClangBuiltinIncludes()) appendClangBuiltinIncludes(&headerPaths); @@ -363,8 +392,20 @@ QByteArrayList emulatedCompilerOptions() // etc (g++ 11.3). const HeaderPaths gppPaths = gppInternalIncludePaths(compilerFromCMake(u"g++"_qs)); for (const HeaderPath &h : gppPaths) { - if (h.path.contains("c++") || h.path.contains("sysroot")) + // fix: qt.shiboken: x is specified in typesystem, but not defined. This could potentially lead to compilation errors. + // PySide requires that Qt headers are not -isystem + // https://bugreports.qt.io/browse/PYSIDE-787 + auto match = qtHeaderRegex.match(QString::fromUtf8(h.path)); + if (!match.hasMatch()) { + if (isNixDebug) + qDebug() << "shiboken compilersupport.cpp: found non-qt header: " << h.path; + // add using -isystem headerPaths.append(h); + } else { + if (isNixDebug) + qDebug() << "shiboken compilersupport.cpp: found qt header: " << h.path; + headerPaths.append({h.path, HeaderType::Standard}); + } } break; } -- 2.39.0