QUrl MakeJob::workingDirectory() const { ProjectBaseItem* it = item(); if(!it) return QUrl(); KDevelop::IBuildSystemManager *bldMan = it->project()->buildSystemManager(); if( bldMan ) return bldMan->buildDirectory( it ).toUrl(); // the correct build dir else { // Just build in-source, where the build directory equals the one with particular target/source. for( ProjectBaseItem* item = it; item; item = item->parent() ) { switch( item->type() ) { case KDevelop::ProjectBaseItem::Folder: case KDevelop::ProjectBaseItem::BuildFolder: return static_cast<KDevelop::ProjectFolderItem*>(item)->path().toUrl(); break; case KDevelop::ProjectBaseItem::Target: case KDevelop::ProjectBaseItem::File: break; } } return QUrl(); } }
/** * Find sub-project represented by @param item in the projects DOM document. * This will return the root-node (i.e. documentElement) if sub-project * is not found. * @param item - the ProjectFolderItem representing the sub-project * @param name - the value of the name attribute of the element to look for * @return a QDomElement representing @param item in the DOM document or the document element */ QDomElement findElementInDocument( ProjectBaseItem *item, const QString &name ) { QStack<QString> domPath; domPath.push( name ); #if KDEV_PLUGIN_VERSION >= 10 if (!item->parent()) { //this must be the project root return projectDomDocument.documentElement(); } ProjectBaseItem *wItem = item; while ((wItem = wItem->parent())){ if (wItem->folder()) domPath.push( wItem->folder()->folderName() ); }; //remove last element, because it’s the root element, we don’t want to find that domPath.pop(); #else // for older kdevplatform versions //TODO: can this be done without dynamic_cast? ProjectFolderItem *wItem = dynamic_cast<ProjectFolderItem*>( item->parent() ); if (!wItem) { //this must be the project root return projectDomDocument.documentElement(); } while (!wItem->isProjectRoot()){ domPath.push( wItem->folderName() ); //TODO: can this be done without dynamic_cast? wItem = dynamic_cast<ProjectFolderItem*>( wItem->parent() ); }; #endif QDomElement child = projectDomDocument.documentElement(); while ( !domPath.isEmpty() ){ QString nextFolder = domPath.pop(); QDomElement d = child.firstChildElement("item"); while (!d.isNull() && d.attribute("name") != nextFolder){ if (d.attribute("name") == ""){ kWarning() << "no, this shouldn't happen"; return QDomElement(); } d = d.nextSiblingElement("item"); } child = d; } return child; }