[CMake] Eclipse CDT 4 Generator crashes reproducable in case of out-of-source-builds

Thomas Veith veith.th at googlemail.com
Thu Sep 25 08:03:46 EDT 2008


Hi *,

with cmake 2.6.1 using the Eclipse CDT Generator I get reproducable crashes:

    std::string outputPath = mf->GetDefinition("EXECUTABLE_OUTPUT_PATH");

in the function void cmExtraEclipseCDT4Generator::CreateProjectFile():

...
  // TODO: refactor this
  // create linked resources
  if (this->IsOutOfSourceBuild)
    {
    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
    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());
      // .project dir can't be subdir of a linked resource dir
      if (!cmSystemTools::IsSubDirectory(this->HomeOutputDirectory.c_str(),
                                         linkSourceDirectory.c_str()))
        {
        this->AppendLinkedResource(fout, it->first,
                                   this->GetEclipsePath(linkSourceDirectory));
        this->SrcLinkedResources.push_back(it->first);
        }
      }
    // for EXECUTABLE_OUTPUT_PATH when not in binary dir
>>>>>>
    std::string outputPath = mf->GetDefinition("EXECUTABLE_OUTPUT_PATH");
>>>>>>
    if (!outputPath.empty() && !cmSystemTools::IsSubDirectory(
                        outputPath.c_str(), this->HomeOutputDirectory.c_str()))
      {
      std::string name = this->GetPathBasename(outputPath);

      // make sure linked resource name is unique
      while (this->GlobalGenerator->GetProjectMap().find(name)
             != this->GlobalGenerator->GetProjectMap().end())
        {
        name += "_";
        }
        this->AppendLinkedResource(fout, name,
                                   this->GetEclipsePath(outputPath));
        this->OutLinkedResources.push_back(name);
      }
...

Stacktrace:
 	msvcp90d.dll!104ed4c3() 	
 	[Frames below may be incorrect and/or missing, no symbols loaded for
msvcp90d.dll]
 	msvcp90d.dll!104ebfbd() 	
 	msvcp90d.dll!10488d7c() 	
 	msvcp90d.dll!1048816c() 	
>	cmake.exe!cmExtraEclipseCDT4Generator::CreateProjectFile()  Line 354 + 0x1c bytes	
 	cmake.exe!cmExtraEclipseCDT4Generator::Generate()  Line 100	
 	cmake.exe!cmGlobalGenerator::Generate()  Line 893 + 0x1b bytes	
 	cmake.exe!cmGlobalUnixMakefileGenerator3::Generate()  Line 143	
 	cmake.exe!cmake::Generate()  Line 2325 + 0x1b bytes	
 	cmake.exe!cmake::Run(const
std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > > & args=[4]("\cmake\bin\cmake.exe","-G","Eclipse CDT4 - MinGW
Makefiles","..\inforate\packages"), bool noconfigure=false)  Line 2305
+ 0x8 bytes
 	cmake.exe!do_cmake(int ac=4, char * * av=0x01825a48)  Line 481 + 0x1a bytes	
 	cmake.exe!main(int ac=4, char * * av=0x01825a48)  Line 294 + 0xd bytes	
 	cmake.exe!__tmainCRTStartup()  Line 586 + 0x19 bytes	
 	cmake.exe!mainCRTStartup()  Line 403	
 	kernel32.dll!7c816fd7() 	

Local variables:
+		outputPath	""	std::basic_string<char,std::char_traits<char>,std::allocator<char>
>
-		this	0x018794e8 {SrcLinkedResources=[1]("INFORATE")
OutLinkedResources=[0]() HomeDirectory="D:/sources/inforate/packages"
...}	cmExtraEclipseCDT4Generator * const
+		cmExternalMakefileProjectGenerator	{SupportedGlobalGenerators=[3]("NMake
Makefiles","MinGW Makefiles","Unix Makefiles")
GlobalGenerator=0x018796f0 }	cmExternalMakefileProjectGenerator
+		SrcLinkedResources	[1]("INFORATE")	std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > >
		OutLinkedResources	[0]()	std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > >
+		HomeDirectory	"D:/sources/inforate/packages"	std::basic_string<char,std::char_traits<char>,std::allocator<char>
>
+		HomeOutputDirectory	"D:/sources/b2"	std::basic_string<char,std::char_traits<char>,std::allocator<char>
>
		IsOutOfSourceBuild	true	bool
		GenerateSourceProject	false	bool
-		fout	{...}	cmGeneratedFileStream
+		cmGeneratedFileStreamBase	{Name="D:/sources/b2/.project"
TempName="D:/sources/b2/.project.tmp" CopyIfDifferent=false
...}	cmGeneratedFileStreamBase
+		std::basic_ofstream<char,std::char_traits<char>
>	{_Filebuffer={...} }	std::basic_ofstream<char,std::char_traits<char>
>
+		filename	"D:/sources/b2/.project"	std::basic_string<char,std::char_traits<char>,std::allocator<char>
>
+		make	"C:/mingw/bin/mingw32-make.exe"	std::basic_string<char,std::char_traits<char>,std::allocator<char>
>
+		mf	0x018766b0 {Prefix="" AuxSourceDirectories=[0]()
cmStartDirectory="D:/sources/inforate/packages" ...}	const cmMakefile
*


Is there a known work-around / patch?

Best regards,

Thomas


More information about the CMake mailing list