diff options
author | Bill Hoffman <bill.hoffman@kitware.com> | 2004-10-21 15:58:07 (GMT) |
---|---|---|
committer | Bill Hoffman <bill.hoffman@kitware.com> | 2004-10-21 15:58:07 (GMT) |
commit | 03be131c063f7d0b1ed566ddbc35e84d3b1d342f (patch) | |
tree | 626c316bf9c00b819cbab94edbc13b07b0054a4a /Source | |
parent | fc459731dbe6d1513a37865913355e596229e0eb (diff) | |
download | CMake-03be131c063f7d0b1ed566ddbc35e84d3b1d342f.zip CMake-03be131c063f7d0b1ed566ddbc35e84d3b1d342f.tar.gz CMake-03be131c063f7d0b1ed566ddbc35e84d3b1d342f.tar.bz2 |
ENH: better support for kdevelop3
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmLocalKdevelopGenerator.cxx | 206 | ||||
-rw-r--r-- | Source/cmLocalKdevelopGenerator.h | 26 |
2 files changed, 134 insertions, 98 deletions
diff --git a/Source/cmLocalKdevelopGenerator.cxx b/Source/cmLocalKdevelopGenerator.cxx index 6632d62..9ad85db8 100644 --- a/Source/cmLocalKdevelopGenerator.cxx +++ b/Source/cmLocalKdevelopGenerator.cxx @@ -26,7 +26,6 @@ #include "cmake.h" #include <cmsys/RegularExpression.hxx> - cmLocalKdevelopGenerator::cmLocalKdevelopGenerator() :cmLocalUnixMakefileGenerator() { @@ -44,69 +43,59 @@ void cmLocalKdevelopGenerator::Generate(bool fromTheTop) { return; } - - bool containsTargets=false; - std::string executable; - cmTargets& targets=m_Makefile->GetTargets(); - for (cmTargets::const_iterator ti = targets.begin(); ti != targets.end(); ti++) - { - switch (ti->second.GetType()) - { - case cmTarget::EXECUTABLE: - executable=ti->first; - case cmTarget::STATIC_LIBRARY: - case cmTarget::SHARED_LIBRARY: - case cmTarget::MODULE_LIBRARY: - case cmTarget::UTILITY: - containsTargets=true; - break; - case cmTarget::INSTALL_FILES: - case cmTarget::INSTALL_PROGRAMS: - default: - break; - } - } - - if (containsTargets) + // Does this local generator contain a PROJECT command + // if so, then generate a kdevelop project for it + if (strcmp(m_Makefile->GetDefinition("PROJECT_BINARY_DIR"), m_Makefile->GetStartOutputDirectory())==0) { - std::string filelistDir=m_Makefile->GetHomeOutputDirectory(); - //build the project name by taking the subdir - std::vector<cmLocalGenerator *> lgs; - m_GlobalGenerator->GetLocalGenerators(lgs); - std::string projectName=lgs[0]->GetMakefile()->GetProjectName(); - + std::string outputDir=m_Makefile->GetStartOutputDirectory(); + std::string projectDir=m_Makefile->GetHomeDirectory(); + std::string projectName=m_Makefile->GetProjectName(); + std::string cmakeFilePattern("CMakeLists.txt;*.cmake;"); - - if (!this->CreateFilelistFile(filelistDir, projectName, cmakeFilePattern)) + + if (!this->CreateFilelistFile(outputDir, projectDir, projectName, cmakeFilePattern)) { return; } - this->CreateProjectFile(filelistDir, projectName, executable, cmakeFilePattern); + //try to find the name of an executable so we have something to run from kdevelop + // for now just pick the first executable found + std::string executable; + cmTargets& targets=m_Makefile->GetTargets(); + for (cmTargets::const_iterator ti = targets.begin(); ti != targets.end(); ti++) + { + if (ti->second.GetType()==cmTarget::EXECUTABLE) + { + executable=ti->first; + break; + } + } + this->CreateProjectFile(outputDir, projectDir, projectName, executable, cmakeFilePattern); } } -void cmLocalKdevelopGenerator::CreateProjectFile(const std::string& dir, +void cmLocalKdevelopGenerator::CreateProjectFile(const std::string& outputDir, + const std::string& projectDir, const std::string& projectname, const std::string& executable, const std::string& cmakeFilePattern) { - std::string filename=m_Makefile->GetStartOutputDirectory(); - filename+="/"; + std::string filename=outputDir+"/"; filename+=projectname+".kdevelop"; if (cmSystemTools::FileExists(filename.c_str())) { - this->MergeProjectFiles(dir, filename, executable, cmakeFilePattern); + this->MergeProjectFiles(outputDir, projectDir, filename, executable, cmakeFilePattern); } else { - this->CreateNewProjectFile(dir, filename, executable, cmakeFilePattern); + this->CreateNewProjectFile(outputDir, projectDir, filename, executable, cmakeFilePattern); } } -void cmLocalKdevelopGenerator::MergeProjectFiles(const std::string& dir, +void cmLocalKdevelopGenerator::MergeProjectFiles(const std::string& outputDir, + const std::string& projectDir, const std::string& filename, const std::string& executable, const std::string& cmakeFilePattern) @@ -114,7 +103,7 @@ void cmLocalKdevelopGenerator::MergeProjectFiles(const std::string& dir, std::ifstream oldProjectFile(filename.c_str()); if (!oldProjectFile) { - this->CreateNewProjectFile(dir, filename, executable, cmakeFilePattern); + this->CreateNewProjectFile(outputDir, projectDir, filename, executable, cmakeFilePattern); return; } @@ -139,36 +128,45 @@ void cmLocalKdevelopGenerator::MergeProjectFiles(const std::string& dir, it!=lines.end(); it++) { const char* line=(*it).c_str(); - + // skip these tags as they are always replaced if ((strstr(line, "<projectdirectory>")!=0) || (strstr(line, "<projectmanagement>")!=0) || (strstr(line, "<absoluteprojectpath>")!=0) + || (strstr(line, "<filelistdirectory>")!=0) || (strstr(line, "<buildtool>")!=0) || (strstr(line, "<builddir>")!=0)) { continue; } + // output the line from the file if it is not one of the above tags fout<<*it<<"\n"; - + // if this is the <general> tag output the stuff that goes in the general tag if (strstr(line, "<general>")) { fout<<" <projectmanagement>KDevCustomProject</projectmanagement>\n"; - fout<<" <projectdirectory>"<<dir.c_str()<<"</projectdirectory>\n"; //this one is important - fout<<" <absoluteprojectpath>true</absoluteprojectpath>\n"; //and this one + fout<<" <projectdirectory>"<<projectDir.c_str()<<"</projectdirectory>\n"; //this one is important + fout<<" <absoluteprojectpath>true</absoluteprojectpath>\n"; //and this one } - + // inside kdevcustomproject the <filelistdirectory> must be put + if (strstr(line, "<kdevcustomproject>")) + { + fout<<" <filelistdirectory>"<<outputDir.c_str()<<"</filelistdirectory>\n"; + } + // buildtool and builddir go inside <build> if (strstr(line, "<build>")) { - fout<<" <buildtool>make</buildtool>\n"; //this one is important - fout<<" <builddir>"<<m_Makefile->GetStartOutputDirectory()<<"</builddir>\n"; //and this one - + fout<<" <buildtool>make</buildtool>\n"; //this one is important + fout<<" <builddir>"<<outputDir.c_str()<<"</builddir>\n"; //and this one } } } -void cmLocalKdevelopGenerator::CreateNewProjectFile(const std::string& dir, const std::string& filename, - const std::string& executable, const std::string& cmakeFilePattern) +void cmLocalKdevelopGenerator::CreateNewProjectFile(const std::string& outputDir, + const std::string& projectDir, + const std::string& filename, + const std::string& executable, + const std::string& cmakeFilePattern) { cmGeneratedFileStream tempFile(filename.c_str()); @@ -190,15 +188,16 @@ void cmLocalKdevelopGenerator::CreateNewProjectFile(const std::string& dir, cons fout<<" <projectmanagement>KDevCustomProject</projectmanagement>\n"; fout<<" <primarylanguage>C++</primarylanguage>\n"; fout<<" <ignoreparts/>\n"; - fout<<" <projectdirectory>"<<dir.c_str()<<"</projectdirectory>\n"; //this one is important + fout<<" <projectdirectory>"<<projectDir.c_str()<<"</projectdirectory>\n"; //this one is important fout<<" <absoluteprojectpath>true</absoluteprojectpath>\n"; //and this one fout<<" <secondaryLanguages>\n"; fout<<" <language>C</language>\n"; fout<<" </secondaryLanguages>\n"; fout<<" </general>\n"; fout<<" <kdevcustomproject>\n"; + fout<<" <filelistdirectory>"<<outputDir.c_str()<<"</filelistdirectory>\n"; fout<<" <run>\n"; - fout<<" <mainprogram>"<<m_Makefile->GetStartOutputDirectory()<<"/"<<executable.c_str()<<"</mainprogram>\n"; + fout<<" <mainprogram>"<<outputDir.c_str()<<"/"<<executable.c_str()<<"</mainprogram>\n"; fout<<" <directoryradio>custom</directoryradio>\n"; fout<<" <customdirectory>/</customdirectory>\n"; fout<<" <programargs></programargs>\n"; @@ -208,7 +207,7 @@ void cmLocalKdevelopGenerator::CreateNewProjectFile(const std::string& dir, cons fout<<" </run>\n"; fout<<" <build>\n"; fout<<" <buildtool>make</buildtool>\n"; //this one is important - fout<<" <builddir>"<<m_Makefile->GetStartOutputDirectory()<<"</builddir>\n"; //and this one + fout<<" <builddir>"<<outputDir.c_str()<<"</builddir>\n"; //and this one fout<<" </build>\n"; fout<<" <make>\n"; fout<<" <abortonerror>false</abortonerror>\n"; @@ -275,55 +274,77 @@ void cmLocalKdevelopGenerator::CreateNewProjectFile(const std::string& dir, cons fout<<" </tree>\n"; fout<<" </kdevfileview>\n"; fout<<"</kdevelop>\n"; + } -bool cmLocalKdevelopGenerator::CreateFilelistFile(const std::string& _dir, +bool cmLocalKdevelopGenerator::CreateFilelistFile(const std::string& outputDir, const std::string& _projectDir, const std::string& projectname, std::string& cmakeFilePattern) { - std::string filelistDir=_dir+"/"; - std::string filename=filelistDir+projectname+".kdevelop.filelist"; + std::string projectDir=_projectDir+"/"; + std::string filename=outputDir+"/"+projectname+".kdevelop.filelist"; std::set<cmStdString> files; - - //get all cmake files std::string tmp; - const std::vector<std::string>& listFiles=m_Makefile->GetListFiles(); - for (std::vector<std::string>::const_iterator it=listFiles.begin(); it!=listFiles.end(); it++) + + // loop over all local generators in the entire project + // This should be moved into the global generator + // FIXME + std::vector<cmLocalGenerator *> lgs; + m_GlobalGenerator->GetLocalGenerators(lgs); + for (std::vector<cmLocalGenerator*>::const_iterator it=lgs.begin(); it!=lgs.end(); it++) { - tmp=*it; - cmSystemTools::ReplaceString(tmp, filelistDir.c_str(), ""); - if (tmp[0]!='/') + cmMakefile* makefile=(*it)->GetMakefile(); + // if the makefile GetStartOutputDirectory is not a substring of the outputDir + // then skip it + if (strstr(makefile->GetStartOutputDirectory(), outputDir.c_str())==0) { - files.insert(tmp); - tmp=cmSystemTools::GetFilenameName(tmp); - //add all files which dont match the default */CMakeLists.txt;*cmake; to the file pattern - if ((tmp!="CMakeLists.txt") - && (strstr(tmp.c_str(), ".cmake")==0)) + continue; + } + // This means the makefile is a sub-makefile of the current project + //get all cmake files + const std::vector<std::string>& listFiles=makefile->GetListFiles(); + for (std::vector<std::string>::const_iterator it=listFiles.begin(); it!=listFiles.end(); it++) + { + tmp=*it; + cmSystemTools::ReplaceString(tmp, projectDir.c_str(), ""); + // make sure the file is part of this source tree + if (tmp[0]!='/') { - cmakeFilePattern+=tmp+";"; + files.insert(tmp); + tmp=cmSystemTools::GetFilenameName(tmp); + //add all files which dont match the default */CMakeLists.txt;*cmake; to the file pattern + if ((tmp!="CMakeLists.txt") + && (strstr(tmp.c_str(), ".cmake")==0)) + { + cmakeFilePattern+=tmp+";"; + } } } - } - //get all sources - cmTargets& targets=m_Makefile->GetTargets(); - for (cmTargets::const_iterator ti = targets.begin(); ti != targets.end(); ti++) - { - const std::vector<cmSourceFile*>& sources=ti->second.GetSourceFiles(); - for (std::vector<cmSourceFile*>::const_iterator it=sources.begin(); - it!=sources.end(); it++) - { - files.insert((*it)->GetFullPath()); - } - for (std::vector<std::string>::const_iterator it=listFiles.begin(); - it!=listFiles.end(); it++) + //get all sources + cmTargets& targets=makefile->GetTargets(); + for (cmTargets::const_iterator ti = targets.begin(); ti != targets.end(); ti++) { - files.insert(it->c_str()); + const std::vector<cmSourceFile*>& sources=ti->second.GetSourceFiles(); + for (std::vector<cmSourceFile*>::const_iterator it=sources.begin(); + it!=sources.end(); it++) + { + files.insert((*it)->GetFullPath()); + } + for (std::vector<std::string>::const_iterator it=listFiles.begin(); + it!=listFiles.end(); it++) + { + tmp=*it; + cmSystemTools::ReplaceString(tmp, projectDir.c_str(), ""); + if (tmp[0]!='/') + { + files.insert(tmp.c_str()); + } + } } } - //check if the output file already exists and read it //insert all files which exist into the set of files std::ifstream oldFilelist(filename.c_str()); @@ -335,7 +356,7 @@ bool cmLocalKdevelopGenerator::CreateFilelistFile(const std::string& _dir, { continue; } - std::string completePath=filelistDir+tmp; + std::string completePath=projectDir+tmp; if (cmSystemTools::FileExists(completePath.c_str())) { files.insert(tmp); @@ -343,7 +364,6 @@ bool cmLocalKdevelopGenerator::CreateFilelistFile(const std::string& _dir, } oldFilelist.close(); } - cmGeneratedFileStream tempFile(filename.c_str()); tempFile.SetAlwaysCopy(true); @@ -356,9 +376,15 @@ bool cmLocalKdevelopGenerator::CreateFilelistFile(const std::string& _dir, for (std::set<cmStdString>::const_iterator it=files.begin(); it!=files.end(); it++) { - fout<< cmSystemTools::RelativePath(_dir.c_str(), it->c_str())<<"\n"; + // get the full path to the file + tmp=cmSystemTools::CollapseFullPath(it->c_str()); + // make it relative to the project dir + cmSystemTools::ReplaceString(tmp, projectDir.c_str(), ""); + // only put relative paths + if (tmp.size() && tmp[0] != '/') + { + fout << tmp.c_str() <<"\n"; + } } return true; } - - diff --git a/Source/cmLocalKdevelopGenerator.h b/Source/cmLocalKdevelopGenerator.h index e6d59e2..03eaeee 100644 --- a/Source/cmLocalKdevelopGenerator.h +++ b/Source/cmLocalKdevelopGenerator.h @@ -48,14 +48,24 @@ public: */ virtual void Generate(bool fromTheTop); protected: - ///Create the foo.kdevelop file. This one calls MergeProjectFiles() if it already exists, otherwise createNewProjectFile() - void CreateProjectFile(const std::string& dir, const std::string& projectname, const std::string& executable, const std::string& cmakeFilePattern); - /// Create the foo.kdevelop.filelist file, return false if it doesn't succeed - bool CreateFilelistFile(const std::string& dir, const std::string& projectname, std::string& cmakeFilePattern); - ///Reads the old foo.kdevelop line by line and only replaces the "important" lines - void MergeProjectFiles(const std::string& dir, const std::string& filename, const std::string& executable, const std::string& cmakeFilePattern); - ///Creates a new foo.kdevelop file - void CreateNewProjectFile(const std::string& dir, const std::string& filename, const std::string& executable, const std::string& cmakeFilePattern); + /** + Create the foo.kdevelop file. This one calls MergeProjectFiles() + if it already exists, otherwise createNewProjectFile() + */ + void CreateProjectFile(const std::string& outputDir, const std::string& projectDir, + const std::string& projectname, const std::string& executable, + const std::string& cmakeFilePattern); + ///! Create the foo.kdevelop.filelist file, return false if it doesn't succeed + bool CreateFilelistFile(const std::string& outputDir, const std::string& projectDir, + const std::string& projectname, std::string& cmakeFilePattern); + ///! Reads the old foo.kdevelop line by line and only replaces the "important" lines + void MergeProjectFiles(const std::string& outputDir, const std::string& projectDir, + const std::string& filename, const std::string& executable, + const std::string& cmakeFilePattern); + ///! Creates a new foo.kdevelop file + void CreateNewProjectFile(const std::string& outputDir, const std::string& projectDir, + const std::string& filename, const std::string& executable, + const std::string& cmakeFilePattern); }; |