[CMake] add_subdirectory and eclipse project
Alexander Neundorf
a.neundorf-work at gmx.net
Sat Feb 12 13:58:13 EST 2011
On Friday 11 February 2011, Andrea Galeazzi wrote:
> Alexander Neundorf ha scritto:
> > On Wednesday 09 February 2011, Andrea Galeazzi wrote:
> >> Il 08/02/2011 17.58, Alexander Neundorf ha scritto:
> >>> On Tuesday 08 February 2011, Andrea Galeazzi wrote:
> >>>> Il 18/01/2011 19.17, Alexander Neundorf ha scritto:
> >>>>> On Tuesday 18 January 2011, Andrea Galeazzi wrote:
> >>>>> ...
> >>>>>
> >>>>>> I just read that wiki page but what I didn't find is how can I see
> >>>>>> the sources referenced by the add_subproject function in the layout
> >>>>>> of eclipse project.
> >>>>>
> >>>>> You mean add_subdirectory(), right ?
> >>>>>
> >>>>>> In other words, CMake generates an eclipse project with a folder
> >>>>>> named [Source directory], containing just only the sources listed in
> >>>>>> the CMakeLists.txt but it doesn't allow to see the sources included
> >>>>>> by add_subproject.
> >>>>>
> >>>>> There should be subdirectories there which you should be able to
> >>>>> open, which should show the files.
> >>>>>
> >>>>> Which exact version of cmake are you using ?
> >>>>>
> >>>>> Alex
> >>>>>
> >>>>> __________ Informazioni da ESET NOD32 Antivirus, versione del
> >>>>> database delle firme digitali 5798 (20110118) __________
> >>>>>
> >>>>> Il messaggio و stato controllato da ESET NOD32 Antivirus.
> >>>>>
> >>>>> www.nod32.it
> >>>>
> >>>> Yes I meant add_subdirectory and I'm using 2.8.3 version.
> >>>> The point is that the path passed as argument to the add_subdirectory
> >>>> function isn't necessary a real filesystem subdirectory of the current
> >>>> CMakeLists.txt so, in this case, it cannot be browsed by the resource
> >>>> view of eclipse.
> >>>> To be more specific don't you think it'd better to generate a .project
> >>>> containing more links than only [Source directory]?
> >>>> i.e.:
> >>>> <linkedResources>
> >>>> <link>
> >>>> <name>[Source directory]</name>
> >>>> <type>2</type>
> >>>> <location>/Project/Prj</location>
> >>>> </link>
> >>>> </linkedResources>
> >>>>
> >>>> vs:
> >>>> <linkedResources>
> >>>> <link>
> >>>> <name>Main Project</name>
> >>>> <type>2</type>
> >>>> <location>/Project/Prj</location>
> >>>> </link>
> >>>> <link>
> >>>> <name>LibName</name>
> >>>> <type>2</type>
> >>>> <location>/Libs/Lib1</location>
> >>>> </link>
> >>>> </linkedResources>
> >>>>
> >>>> where libName is the name declared in the project() statement of
> >>>> CMakeLists.txt of /Libs/Lib1.
> >>>> This behavior should be more similar to the Visual Studio generator.
> >>>> So far I made a workaround writing a script which parse a
> >>>> CMakeLists.txt and invokes CMake to generate one eclipse project for
> >>>> each
> >>>> add_subdirectory entry. Then I import all projects in a workspace.
> >>>> I dislike a such solution but that's the only way to browse all
> >>>> sources that I found.
> >>>> I hope my suggestion will be taken into account for the next
> >>>> releases... and sorry for the late answer!
> >>>> Andrea
> >>>
> >>> I'll have a look.
> >>>
> >>> Alex
> >>>
> >>> __________ Informazioni da ESET NOD32 Antivirus, versione del database
> >>> delle firme digitali 5841 (20110202) __________
> >>>
> >>> Il messaggio و stato controllato da ESET NOD32 Antivirus.
> >>>
> >>> www.nod32.it
> >>
> >> I took the liberty to change a piece of code just in order to test the
> >> idea above. That's the code modified (in
> >> cmExtraEclipseCDT4Generator::CreateProjectFile() )
> >
> > Cool :-)
> > Without having looked at the code in detail, what I'd like to have is to
> > keep the linked resource [SOURCE DIR] pointing to CMAKE_SOURCE_DIR, and
> > additionally a linked resource [PROJECTS], which contains linked
> > resources pointing to the different project directories.
> > This way I hope it should be clear that the one link just takes you to
> > the source directory, while the other links (only visible when the
> > [PROJECTS] resource is opened) take you to the project directories.
> >
> > Alex
> >
> >> if (this->IsOutOfSourceBuild)
> >> {
> >> fout << "\t<linkedResources>\n";
> >> // create a linked resource to CMAKE_SOURCE_DIR
> >> // (this is not done anymore for each project because of
> >> // http://public.kitware.com/Bug/view.php?id=9978 and because I
> >> found it
> >> // actually quite confusing in bigger projects with many directories
> >> and
> >> // projects, Alex
> >> const std::vector<cmLocalGenerator*>& generators =
> >> this->GlobalGenerator->GetLocalGenerators();
> >> std::vector<cmLocalGenerator*>::const_iterator iter =
> >> generators.begin();
> >> for(; iter != generators.end(); ++iter)
> >> {
> >> mf = (*iter)->GetMakefile();
> >> std::string sourceLinkedResourceName = "[";
> >> sourceLinkedResourceName += mf->GetProjectName();
> >> sourceLinkedResourceName += "]";
> >> std::string linkSourceDirectory = this->GetEclipsePath(
> >>
> >> mf->GetStartDirectory());
> >> // .project dir can't be subdir of a linked resource dir
> >> if
> >> (!cmSystemTools::IsSubDirectory(this->HomeOutputDirectory.c_str(),
> >> linkSourceDirectory.c_str())) {
> >> this->AppendLinkedResource(fout, sourceLinkedResourceName,
> >>
> >> this->GetEclipsePath(linkSourceDirectory));
> >> 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";
> >> }
> >>
> >> and it works in my case. Consider this just as a "draft" of a possible
> >> patch. Let me know what do you think about it and if I can be of help in
> >> anyways.
> >> Andrea.
> >> _______________________________________________
> >> Powered by www.kitware.com
> >>
> >> Visit other Kitware open-source projects at
> >> http://www.kitware.com/opensource/opensource.html
> >>
> >> Please keep messages on-topic and check the CMake FAQ at:
> >> http://www.cmake.org/Wiki/CMake_FAQ
> >>
> >> Follow this link to subscribe/unsubscribe:
> >> http://www.cmake.org/mailman/listinfo/cmake
> >
> > _______________________________________________
> > Powered by www.kitware.com
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Please keep messages on-topic and check the CMake FAQ at:
> > http://www.cmake.org/Wiki/CMake_FAQ
> >
> > Follow this link to subscribe/unsubscribe:
> > http://www.cmake.org/mailman/listinfo/cmake
>
> I modified the code in order to achieve what you suggested, now CMake
> generates two Linked Folders: [Sources Directory] pointing to
> CMAKE_SOURCE_DIR and [Dependent Projects] containing all sub projects
> specified in add_subdirectory commands.
>
> const std::vector<cmLocalGenerator*>& generators =
> this->GlobalGenerator->GetLocalGenerators();
> std::vector<cmLocalGenerator*>::const_iterator iter =
> generators.begin();
> std::string sourceLinkedResourceName;
> for(; iter != generators.end(); ++iter)
> {
> std::string rootLinkDirectory;
> mf = (*iter)->GetMakefile();
> if (iter != generators.begin())
> {
> rootLinkDirectory = "[Dependent Projects]";
> sourceLinkedResourceName = rootLinkDirectory;
> sourceLinkedResourceName += "/";
> sourceLinkedResourceName += mf->GetProjectName();
> }
> else
> {
> sourceLinkedResourceName = "[Sources Directory]";
> rootLinkDirectory = sourceLinkedResourceName;
> }
> std::string linkSourceDirectory = this->GetEclipsePath(
>
> mf->GetStartDirectory());
> // .project dir can't be subdir of a linked resource dir
> if (!cmSystemTools::IsSubDirectory(this->HomeOutputDirectory.c_str(),
> linkSourceDirectory.c_str()))
> {
> this->AppendLinkedResource(fout, sourceLinkedResourceName,
>
> this->GetEclipsePath(linkSourceDirectory));
> if (find (this->SrcLinkedResources.begin(),
> this->SrcLinkedResources.end(),
> rootLinkDirectory) == this->SrcLinkedResources.end())
> this->SrcLinkedResources.push_back(rootLinkDirectory);
> }
>
> // 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"));
> }
>
> Please let me know what do you think about it and if this kind of
> "patch" could enter in the main repository.
Thanks :-)
I implemented something a bit different now.
For each project()-call in your project a linked resource will be created.
But I think this won't make it into 2.8.4 anymore.
Alex
More information about the CMake
mailing list