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

William A. Hoffman billlist at nycap.rr.com
Wed Oct 11 17:30:15 EDT 2006


At 05:11 PM 10/11/2006, Eran Guendelman wrote:
>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.

So, we should fix the crash of course.

However, if you change the target name to xerces-c_2D_cmake and leave the 
target_link_libraries at xerces-c_2D it should work.  You can use add_dependency 
to make the custom target depend on other targets.   I am not sure this was really
working for you with cmake 2.2.   It may have been working by luck.   Since this
is not really a cmake target linking to it does not make sense.   I am assuming that
the library name is xerces-c_2D?

-Bill



More information about the CMake mailing list