void CMakeCbpParser::parseUnit() { //qDebug()<<stream.attributes().value("filename"); FileName fileName = FileName::fromUserInput(attributes().value(QLatin1String("filename")).toString()); CMakeTool *tool = CMakeKitInformation::cmakeTool(m_kit); if (tool) { QString mappedFile = tool->mapAllPaths(m_kit, fileName.toString()); fileName = FileName::fromUserInput(mappedFile); } m_parsingCmakeUnit = false; m_unitTarget.clear(); while (!atEnd()) { readNext(); if (isEndElement()) { if (!fileName.endsWith(QLatin1String(".rule")) && !m_processedUnits.contains(fileName)) { // Now check whether we found a virtual element beneath if (m_parsingCmakeUnit) { m_cmakeFileList.append( new ProjectExplorer::FileNode(fileName, ProjectExplorer::ProjectFileType, false)); } else { bool generated = false; QString onlyFileName = fileName.fileName(); if ( (onlyFileName.startsWith(QLatin1String("moc_")) && onlyFileName.endsWith(QLatin1String(".cxx"))) || (onlyFileName.startsWith(QLatin1String("ui_")) && onlyFileName.endsWith(QLatin1String(".h"))) || (onlyFileName.startsWith(QLatin1String("qrc_")) && onlyFileName.endsWith(QLatin1String(".cxx")))) generated = true; if (fileName.endsWith(QLatin1String(".qrc"))) m_fileList.append( new ProjectExplorer::FileNode(fileName, ProjectExplorer::ResourceType, generated)); else m_fileList.append( new ProjectExplorer::FileNode(fileName, ProjectExplorer::SourceType, generated)); } if (!m_unitTarget.isEmpty()) m_unitTargetMap.insert(fileName, m_unitTarget); m_processedUnits.insert(fileName); } return; } else if (name() == QLatin1String("Option")) { parseUnitOption(); } else if (isStartElement()) { parseUnknownElement(); } } }
void CMakeCbpParser::parseBuildTargetClean() { if (attributes().hasAttribute(QLatin1String("command"))) { m_buildTarget.makeCleanCommand = attributes().value(QLatin1String("command")).toString(); CMakeTool *tool = CMakeKitInformation::cmakeTool(m_kit); if (tool) m_buildTarget.makeCleanCommand = tool->mapAllPaths(m_kit, m_buildTarget.makeCleanCommand); } while (!atEnd()) { readNext(); if (isEndElement()) return; else if (isStartElement()) parseUnknownElement(); } }
void CMakeCbpParser::parseBuildTargetOption() { if (attributes().hasAttribute(QLatin1String("output"))) { m_buildTarget.executable = attributes().value(QLatin1String("output")).toString(); CMakeTool *tool = CMakeKitInformation::cmakeTool(m_kit); if (tool) m_buildTarget.executable = tool->mapAllPaths(m_kit, m_buildTarget.executable); } else if (attributes().hasAttribute(QLatin1String("type"))) { const QStringRef value = attributes().value(QLatin1String("type")); if (value == QLatin1String("2") || value == QLatin1String("3")) m_buildTarget.targetType = TargetType(value.toInt()); } else if (attributes().hasAttribute(QLatin1String("working_dir"))) { m_buildTarget.workingDirectory = attributes().value(QLatin1String("working_dir")).toString(); QFile cmakeSourceInfoFile(m_buildTarget.workingDirectory + QStringLiteral("/CMakeFiles/CMakeDirectoryInformation.cmake")); if (cmakeSourceInfoFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream(&cmakeSourceInfoFile); const QLatin1String searchSource("SET(CMAKE_RELATIVE_PATH_TOP_SOURCE \""); while (!stream.atEnd()) { const QString lineTopSource = stream.readLine().trimmed(); if (lineTopSource.startsWith(searchSource)) { m_buildTarget.sourceDirectory = lineTopSource.mid(searchSource.size()); m_buildTarget.sourceDirectory.chop(2); // cut off ") break; } } } if (m_buildTarget.sourceDirectory.isEmpty()) { QDir dir(m_buildDirectory); const QString relative = dir.relativeFilePath(m_buildTarget.workingDirectory); m_buildTarget.sourceDirectory = FileName::fromString(m_sourceDirectory).appendPath(relative).toString(); } } while (!atEnd()) { readNext(); if (isEndElement()) return; else if (isStartElement()) parseUnknownElement(); } }
void CMakeCbpParser::parseAdd() { // CMake only supports <Add option=\> and <Add directory=\> const QXmlStreamAttributes addAttributes = attributes(); QString includeDirectory = addAttributes.value(QLatin1String("directory")).toString(); CMakeTool *tool = CMakeKitInformation::cmakeTool(m_kit); if (tool) includeDirectory = tool->mapAllPaths(m_kit, includeDirectory); // allow adding multiple times because order happens if (!includeDirectory.isEmpty()) m_buildTarget.includeFiles.append(includeDirectory); QString compilerOption = addAttributes.value(QLatin1String("option")).toString(); // defining multiple times a macro to the same value makes no sense if (!compilerOption.isEmpty() && !m_buildTarget.compilerOptions.contains(compilerOption)) { m_buildTarget.compilerOptions.append(compilerOption); int macroNameIndex = compilerOption.indexOf(QLatin1String("-D")) + 2; if (macroNameIndex != 1) { int assignIndex = compilerOption.indexOf(QLatin1Char('='), macroNameIndex); if (assignIndex != -1) compilerOption[assignIndex] = ' '; m_buildTarget.defines.append("#define "); m_buildTarget.defines.append(compilerOption.mid(macroNameIndex).toUtf8()); m_buildTarget.defines.append('\n'); } } while (!atEnd()) { readNext(); if (isEndElement()) return; else if (isStartElement()) parseUnknownElement(); } }