[CMake] add_subdirectory and eclipse project
Andrea Galeazzi
Galeazzi at korg.it
Wed Feb 9 09:08:50 EST 2011
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() )
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.
More information about the CMake
mailing list