[CMake] add_subdirectory and eclipse project

Alexander Neundorf a.neundorf-work at gmx.net
Wed Feb 9 11:41:54 EST 2011


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


More information about the CMake mailing list