[CMake] Build only what you need in third party libs

troy d. straszheim troy at resophonic.com
Mon Dec 7 14:26:17 EST 2009


Michael Jackson wrote:
> 
> 
> On Dec 7, 2009, at 1:28 PM, troy d. straszheim wrote:
> 
>> Michael Jackson wrote:
>>> So you are wanting to include the Boost sources in your project and 
>>> you just want to build a specific subset of Boost to use with your 
>>> project?
>>
>> Here's what I came up with:
>>
>> http://sodium.resophonic.com/boost-cmake/current-docs/exported_targets.html#with-boost-source-in-a-subdirectory-of-your-source 
>>
>>
>> the EXCLUDE_FROM_ALL option to add_subdirectory makes things 
>> remarkably easy... nice feature.
>>
>> -t
>>
>>
> 
> 
> Nice,
>    Couple of comments though:
> "Setting BUILD_PROJECTS, etc is unnecessary, but if all the extra boost 
> targets bother you you can set it at the commandline as usual:"
> 
> Why can't I set BUILD_PROJECTS in my own CMakeLists.txt file? Wouldn't 
> this get rid of the need to pass this on the command line? Also what 
> about those running CMake-GUI? They don't have a command line to work from?

Yup, you can, it needs to be CACHE STRING FORCE.

>  By using the name of the target (boost_filesystem-mt-shared in your 
> example), will CMake automatically "do the right thing" with respect to 
> Debug and release libraries? Will building my project as a Debug pick up 
> the Debug Boost libraries?

No, boost-cmake doesn't play nice with this kind of thing.  In the 
beginning we were attempting to do things the way bjam does them, 
compiling all variants with one command.  In retrospect I think this was 
a really bad idea.  Now things clash, and it would be major surgery to 
fix... major surgery that I may yet do, but realize that it would break 
a growing amount of code that depends on the way boost-cmake now does 
things.  :(

You could check CMAKE_BUILD_TYPE and tweak the name that you're linking 
against:

if (CMAKE_BUILD_TYPE STREQUAL Debug)
   set(DBG_OR_RELEASE "-debug")
endif()

target_link_libraries(mything boost_filesystem-mt-shared${DBG_OR_RELEASE})

>  I see this as having some issues? I now have to detect when someone 
> wants a "Debug" build then set the "BOOST_ENABLE_DEBUG=ON" before 
> calling the add_subdirectory(boost-src).

If you just let boost.cmake configure all the targets, use 
EXCLUDE_FROM_ALL and tweak the name you link to above, only what you 
need gets built, and your CMAKE_BUILD_TYPE works as you expect it to. 
The same name-tweaking above will work if you use exported targets 
instead of boost-src-in-subdirectory.

>  I say all this without having tried any of this but it _is_ intriguing 
> me currently due to all the problems trying to get Boost built OS X and 
> Windows without memory leaks, compile errors and, ya know, basic stuff 
> like that. If I can have my own patched version of boost in my project 
> this may save some serious head aches in the future.

And on the boost-cmake list we should talk about what those patches 
would be.  You're not the only one doing this, and we have the capacity 
to do point releases of boost asynchronously from upstream.

-t







More information about the CMake mailing list