SVN commit 856474 by apol: Let CMake work with subprojects. This is a very usual use case and a place where many people found "buggy" the way to work because when importing a subproject made KDevelop to mess up because of the non-parsed CMakeLists.txt files placed in parent directories. Now KDevelop looks if there are and it parses them too. **Warning** it will always look for it, it is not yet configurable in the project file (it is configurable in the .kdev4/project.kdev4 file, should be moved) Now it is possible to parse a cmake subproject without parsing the other subdirectories below or in the same level. It can be useful when you are working on a large project and you don't need the whole to be supported by KDevelop (for instance, when I'm working on KAlgebra in KDE-Edu, I don't need, let's say, the Marble buildtool information). CCMAIL: kdevelop-devel@kdevelop.org M +1 -0 cmakeconfig.kcfg M +36 -13 cmakemanager.cpp M +1 -0 cmakemanager.h M +4 -2 cmakepreferences.cpp --- trunk/KDE/kdevelop/buildtools/managers/cmake/cmakeconfig.kcfg #856473:856474 @@ -3,6 +3,7 @@ + --- trunk/KDE/kdevelop/buildtools/managers/cmake/cmakemanager.cpp #856473:856474 @@ -175,7 +175,7 @@ KSharedConfig::Ptr cfg = item->project()->projectConfiguration(); KConfigGroup group(cfg.data(), "CMake"); KUrl path = group.readEntry("CurrentBuildDir"); - KUrl projectPath = item->project()->folder(); + KUrl projectPath = m_realRoot[item->project()]; ProjectFolderItem *fi=dynamic_cast(item); for(; !fi && item; ) @@ -244,6 +244,25 @@ } else { + KSharedConfig::Ptr cfg = project->projectConfiguration(); + KConfigGroup group(cfg.data(), "CMake"); + m_subprojectRoot[project] = folderUrl; + + if(group.hasKey("ProjectRoot")) + { + folderUrl=group.readEntry("ProjectRoot"); + } + else + { + KUrl aux=folderUrl; + for(; QFile::exists(aux.toLocalFile()+"/CMakeLists.txt"); aux=aux.upUrl()) + { + kDebug() << "checking" << aux; + folderUrl=aux; + } + group.writeEntry("ProjectRoot", folderUrl); + } + m_realRoot[project] = folderUrl; m_watchers[project] = new KDirWatch(project); m_modulePathPerProject[project]=m_modulePathDef; @@ -375,21 +394,25 @@ folder->setText(v.projectName()); } - foreach (const QString& subf, v.subdirectories() ) + KUrl subroot=m_subprojectRoot[item->project()]; + foreach (const QString& subf, v.subdirectories()) { - if( entries.contains( subf ) ) + KUrl path(folder->url()); + path.addPath(subf); + + kDebug(9042) << "Found subdir " << path << "which should be into" << subroot; + if(subroot.isParentOf(path) || path.isParentOf(subroot)) { - entries.removeAll( subf ); + if(entries.contains(subf)) + { + entries.removeAll(subf); + } + + CMakeFolderItem* a = new CMakeFolderItem( item->project(), subf, folder ); + a->setUrl(path); + a->setDefinitions(v.definitions()); + folderList.append( a ); } - - - KUrl path(folder->url()); - path.addPath(subf); - - CMakeFolderItem* a = new CMakeFolderItem( item->project(), subf, folder ); - a->setUrl(path); - a->setDefinitions(v.definitions()); - folderList.append( a ); } QString folderUrl= folder->url().toLocalFile(KUrl::RemoveTrailingSlash); --- trunk/KDE/kdevelop/buildtools/managers/cmake/cmakemanager.h #856473:856474 @@ -141,6 +141,7 @@ QMap m_watchers; QMap m_projectCache; QMap m_realRoot; + QMap m_subprojectRoot; QMap m_folderPerUrl; --- trunk/KDE/kdevelop/buildtools/managers/cmake/cmakepreferences.cpp #856473:856474 @@ -68,8 +68,8 @@ connect(m_prefsUi->showAdvanced, SIGNAL(toggled(bool)), this, SLOT(showAdvanced(bool))); showInternal(m_prefsUi->showInternal->checkState()); - m_srcFolder=KUrl(args[1].toString()); - m_srcFolder=m_srcFolder.upUrl(); +// m_srcFolder=KUrl(args[1].toString()).upUrl(); + kDebug(9042) << "Source folder: " << m_srcFolder << args[1].toString(); // foreach(const QVariant &v, args) // { @@ -93,6 +93,8 @@ m_prefsUi->buildDirs->clear(); m_prefsUi->buildDirs->addItems(CMakeSettings::buildDirs()); m_prefsUi->buildDirs->setCurrentIndex( m_prefsUi->buildDirs->findText( CMakeSettings::currentBuildDir().toLocalFile() ) ); + + m_srcFolder=CMakeSettings::projectRoot(); if(m_prefsUi->buildDirs->count()==0) { _______________________________________________ KDevelop-devel mailing list KDevelop-devel@kdevelop.org https://barney.cs.uni-potsdam.de/mailman/listinfo/kdevelop-devel