[CMake] add_subdirectory and eclipse project

Andrea Galeazzi galeazzi at korg.it
Mon Jun 20 06:11:49 EDT 2011


Il 12/02/2011 19.58, Alexander Neundorf ha scritto:
> 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
> _______________________________________________
> 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 tested the 2.8.5-rc2 in my project just now and I noticed two problem 
related to the above issue:
1 - My projects are all "out-of-source" but  the linked resources refers 
to the binary directories so it's still impossible to see the sources in 
the projects.
2 - When a source file it's outside of the source directory it's not 
included in the project:
     -Dir1
         *CMakeLists.txt
    -Dir2
         *Source.cpp
I hope it could be fixed in 2.8.5!
Andrea



More information about the CMake mailing list