[CMake] Crash in ComputeLinkInformation: cmTarget::GetDirectory returns NULL for UTILITY type

Eran Guendelman erang at stanford.edu
Wed Oct 11 17:11:33 EDT 2006


Hi, we are trying to track down why cmake 2.4 is crashing when 
generating the VisualStudio 7 build files whereas cmake 2.2 worked fine. 
  I built a debug version of cmake and narrowed it down to the following 
issue:

In cmLocalGenerator::ComputeLinkInformation it goes through the 
libraries and tries to add their information to the linkLibraries 
vector.  It gets to a library called xerces-c_2D.  It checks whether 
this is a cmake target (using FindTarget), and indeed finds that it is. 
  So it then has the line
std::string linkItem = tgt->GetDirectory(0)

This is where the crash occurs, and the cause is as follows.  In our 
build environment, xerces-c_2D is built as a custom target (see below 
for why), so its cmTarget::TargetType is UTILITY, and 
cmTarget::GetDirectory returns 0 in this case.  Hence trying to assign 0 
to an std::string causes the crash.

Looking at cmTarget::GetDirectory, my instinct for "fixing" this is to 
change

default:
return 0;

to

default:
this->Directory = "";

so that the subsequent check of if(this->Directory.empty()) will take 
care of this case.  But then again, I don't really know anything about 
how this code is supposed to work so this was just a guess (that at 
least did fix the crash and succeeded in generating project files -- 
though I haven't tried to build them).

Anyway, as for why we use ADD_CUSTOM_TARGET to build xerces-c_2D, it's 
because this is a third party library we are trying to build as part of 
our build system, and since the library came with a VC7 .sln file but no 
CMakeLists.txt files we basically made its CMakeLists.txt look something 
like:

ADD_CUSTOM_TARGET(xerces-c_2 ALL devenv 
${OpenSim_SOURCE_DIR}/Vendors/xerces-c-src2_4_0/Projects/Win32/VC7/xerces-all/xerces-all.sln 
/build Release)

i.e. we build the library by essentially making a system call to visual 
studio and passing it their supplied .sln.

So basically:
- If you think GetDirectory could be fixed in a way that correctly 
handles the UTILITY target type then hopefully that should resolve 
things and we'll be able to upgrade to cmake 2.4.
- But if you think one should never try to link to a UTILITY target then 
we'll need to come up with a different way to incorporate building this 
third party library as part of our regular build and any pointers to 
doing this nicer would be appreciated.

Thank you very much.

BTW Please CC my email address on replies.  Thanks.


More information about the CMake mailing list