Eclipse projects: created one linked resource for each subproject

Now a virtual folder "Subprojects" is created, and in this virtual folder
is a linked resource for each project().
This can be considered a fix for #11657

Alex
This commit is contained in:
Alex Neundorf 2011-02-13 01:15:11 +01:00
parent 79e13af195
commit e8a97e075a
1 changed files with 53 additions and 20 deletions

View File

@ -102,7 +102,7 @@ void cmExtraEclipseCDT4Generator::CreateSourceProjectFile() const
fout << fout <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<projectDescription>\n" "<projectDescription>\n"
"\t<name>" << name << "</name>\n" "\t<name>" << this->EscapeForXML(name) << "</name>\n"
"\t<comment></comment>\n" "\t<comment></comment>\n"
"\t<projects>\n" "\t<projects>\n"
"\t</projects>\n" "\t</projects>\n"
@ -376,11 +376,10 @@ void cmExtraEclipseCDT4Generator::CreateProjectFile()
"\t</natures>\n" "\t</natures>\n"
; ;
// TODO: refactor this fout << "\t<linkedResources>\n";
// create linked resources // create linked resources
if (this->IsOutOfSourceBuild) if (this->IsOutOfSourceBuild)
{ {
fout << "\t<linkedResources>\n";
// create a linked resource to CMAKE_SOURCE_DIR // create a linked resource to CMAKE_SOURCE_DIR
// (this is not done anymore for each project because of // (this is not done anymore for each project because of
// http://public.kitware.com/Bug/view.php?id=9978 and because I found it // http://public.kitware.com/Bug/view.php?id=9978 and because I found it
@ -399,18 +398,48 @@ void cmExtraEclipseCDT4Generator::CreateProjectFile()
this->SrcLinkedResources.push_back(sourceLinkedResourceName); this->SrcLinkedResources.push_back(sourceLinkedResourceName);
} }
// for EXECUTABLE_OUTPUT_PATH when not in binary dir
this->AppendOutLinkedResource(fout,
mf->GetSafeDefinition("CMAKE_RUNTIME_OUTPUT_DIRECTORY"),
mf->GetSafeDefinition("EXECUTABLE_OUTPUT_PATH"));
// for LIBRARY_OUTPUT_PATH when not in binary dir
this->AppendOutLinkedResource(fout,
mf->GetSafeDefinition("CMAKE_LIBRARY_OUTPUT_DIRECTORY"),
mf->GetSafeDefinition("LIBRARY_OUTPUT_PATH"));
fout << "\t</linkedResources>\n";
} }
// for each sub project create a linked resource to the source dir
// - only if it is an out-of-source build
this->AppendLinkedResource(fout, "[Subprojects]",
"virtual:/virtual");
for (std::map<cmStdString, std::vector<cmLocalGenerator*> >::const_iterator
it = this->GlobalGenerator->GetProjectMap().begin();
it != this->GlobalGenerator->GetProjectMap().end();
++it)
{
std::string linkSourceDirectory = this->GetEclipsePath(
it->second[0]->GetMakefile()->GetStartDirectory());
// a linked resource must not point to a parent directory of .project or
// .project itself
if ((this->HomeOutputDirectory != linkSourceDirectory) &&
!cmSystemTools::IsSubDirectory(this->HomeOutputDirectory.c_str(),
linkSourceDirectory.c_str()))
{
std::string linkName = "[Subprojects]/";
linkName += it->first;
this->AppendLinkedResource(fout, linkName,
this->GetEclipsePath(linkSourceDirectory));
this->SrcLinkedResources.push_back(it->first);
}
}
// I'm not sure this makes too much sense. There can be different
// output directories in different subdirs, so we would need more of them.
// for EXECUTABLE_OUTPUT_PATH when not in binary dir
this->AppendOutLinkedResource(fout,
mf->GetSafeDefinition("CMAKE_RUNTIME_OUTPUT_DIRECTORY"),
mf->GetSafeDefinition("EXECUTABLE_OUTPUT_PATH"));
// for LIBRARY_OUTPUT_PATH when not in binary dir
this->AppendOutLinkedResource(fout,
mf->GetSafeDefinition("CMAKE_LIBRARY_OUTPUT_DIRECTORY"),
mf->GetSafeDefinition("LIBRARY_OUTPUT_PATH"));
fout << "\t</linkedResources>\n";
fout << "</projectDescription>\n"; fout << "</projectDescription>\n";
} }
@ -551,14 +580,15 @@ void cmExtraEclipseCDT4Generator::CreateCProjectFile() const
it != this->SrcLinkedResources.end(); it != this->SrcLinkedResources.end();
++it) ++it)
{ {
fout << "<pathentry kind=\"src\" path=\"" << *it << "\"/>\n"; fout << "<pathentry kind=\"src\" path=\"" << this->EscapeForXML(*it)
<< "\"/>\n";
// exlude source directory from output search path // exlude source directory from output search path
// - only if not named the same as an output directory // - only if not named the same as an output directory
if (!cmSystemTools::FileIsDirectory( if (!cmSystemTools::FileIsDirectory(
std::string(this->HomeOutputDirectory + "/" + *it).c_str())) std::string(this->HomeOutputDirectory + "/" + *it).c_str()))
{ {
excludeFromOut += *it + "/|"; excludeFromOut += this->EscapeForXML(*it) + "/|";
} }
} }
excludeFromOut += "**/CMakeFiles/"; excludeFromOut += "**/CMakeFiles/";
@ -573,7 +603,8 @@ void cmExtraEclipseCDT4Generator::CreateCProjectFile() const
it != this->OutLinkedResources.end(); it != this->OutLinkedResources.end();
++it) ++it)
{ {
fout << "<pathentry kind=\"out\" path=\"" << *it << "\"/>\n"; fout << "<pathentry kind=\"out\" path=\"" << this->EscapeForXML(*it)
<< "\"/>\n";
} }
// add pre-processor definitions to allow eclipse to gray out sections // add pre-processor definitions to allow eclipse to gray out sections
@ -1055,11 +1086,13 @@ void cmExtraEclipseCDT4Generator
{ {
fout << fout <<
"\t\t<link>\n" "\t\t<link>\n"
"\t\t\t<name>" << name << "</name>\n" "\t\t\t<name>"
<< cmExtraEclipseCDT4Generator::EscapeForXML(name)
<< "</name>\n"
"\t\t\t<type>2</type>\n" "\t\t\t<type>2</type>\n"
"\t\t\t<location>" "\t\t\t<locationURI>"
<< path << cmExtraEclipseCDT4Generator::EscapeForXML(path)
<< "</location>\n" << "</locationURI>\n"
"\t\t</link>\n" "\t\t</link>\n"
; ;
} }