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

Michael Jackson mike.jackson at bluequartz.net
Mon Dec 7 12:26:32 EST 2009


Please keep on list so that others may benefit/help

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?

  I guess I might try setting the
# Set what boost libraries will be built
BUILD_PROJECTS=file_system;system

# Configure the Boost CMake distribution to build
add_subdirectory(boost-cmake0 ${PROJECT_BINARY_DIR}/Boost-Cmake0)

# look at <http://sodium.resophonic.com/boost-cmake/current-docs/exported_targets.html 
 > for
# more details about the included file. Assuming it is already  
generated by the time cmake
# hits this point.
include (  ${PROJECT_BINARY_DIR}/Boost-Cmake0/lib/Exports.cmake )

# Create your executable
add_executable(my_exe ${my_exe_sources} )
# Have your executable link to the boost-file_system library (and  
probably the boost-system library)
# Note that the 'boost_file_system' is the actual name of a target  
from the Boost-cmake0 sub project.
#  See the web page linked above for more details
target_link_libraries ( my_exe boost_file_system)

I have not tried this at all, but this would be my first attempt. The  
'target_link_libraries()' command will take care of all the  
dependencies for 'my_exe', thus making sure boost-file_system is built  
first before building the 'my_exe' executable.

Maybe someone else can comment..

_________________________________________________________
Mike Jackson                  mike.jackson at bluequartz.net
BlueQuartz Software                    www.bluequartz.net
Principal Software Engineer                  Dayton, Ohio

On Dec 7, 2009, at 11:47 AM, Brian Davis wrote:

> Yes this looks like an option.  Thanks for the lead.  It is not  
> quite what I was expecting.
>
> This seems specific to Boost Libraries.  Which brings up 2 questions:
>
> Is there a generic way do this for any third party source tree?
> Is there going to be CMAKE variable name resolution clash potential  
> without namespace resolution within CMake (or is there already this  
> problem or have I missed something)?
>
> What I would like to do is set (please bear with me as I am a  
> complete nube to CMake)
>
> BUILD_PROJECTS=none
>
> Then do
>
> add_subdirectory(boost_source_dir)
>
> project( my_exe )
> add_executable( my_exe mysource.cpp )
> add_library( boost_filesystem   SHARED)
> #An IMPORTED library target references a library file located  
> outside the project. No rules are generated to build it. <- Too bad  
> about this last statement
>
> or
>
> add_dependencies( my_exe boost_filesystem )
>
>
> Is there any mechanism for project level resolution of third party  
> source targets such as in bjam boost//boost_filesystem
>
> project
>     : requirements <library>../build//boost_filesystem
>       <library>/boost/system//boost_system
>       <hardcode-dll-paths>true
>     ;
>
>
> project boost/filesystem
>     : source-location ../src
>     : usage-requirements # pass these requirement to dependents  
> (i.e. users)
>       <link>shared:<define>BOOST_FILESYSTEM_DYN_LINK=1
>       <link>static:<define>BOOST_FILESYSTEM_STATIC_LINK=1
>     ;
>
> And boost_filesystem's use:
>
> project
>     : requirements
>       <library>/boost/filesystem//boost_filesystem
>       <toolset>msvc:<asynch-exceptions>on
>     ;
>
> where some syntax like:
>
> add_subdirectory(boost_source_dir PROJECT boost )
>
> add_dependencies( my_exe boost//boost_filesystem )
>
> or
>
> add_library( boost//boost_filesystem   SHARED)
>
>
> allowing the specification and namespace resolution of the 3rdParty  
> (boost) library
>
> I know above does not exist as my example question shows, but if it  
> does in some other form what is it?
>
> Brian
>
> On Sat, Dec 5, 2009 at 3:45 PM, Mike Jackson <mike.jackson at bluequartz.net 
> > wrote:
> I _think_ you _might_ be able to set the BUILD_PROJECTS to
> "file_system;system" then do the "add_subdirectory()".
>  Give it a shot and see what happens.
>
> _________________________________________________________
> Mike Jackson                  mike.jackson at bluequartz.net
> BlueQuartz Software                    www.bluequartz.net
> Principal Software Engineer                  Dayton, Ohio
>
>
>
> On Sat, Dec 5, 2009 at 4:15 PM, Brian Davis <bitminer at gmail.com>  
> wrote:
> >
> > I have used boost jam before and there was a mechanism to build  
> only what
> > you need by specifying dependencies within the boost libraries.   
> bjam would
> > then run off calculate deps and build only what I needed. In CMake  
> is there
> > such a feature to specify a third party library and specify only  
> the targets
> > you need to build as dependencies of my build target?
> >
> > i.e. can I use
> >
> > add_subdirectory( lib/3rdParty/Win32/boost-cmake-1_41_0 ./boost )
> >
> > then create a target that only uses say boost_filesystem and only  
> have that
> > built? Or do I need to build the world to get a handful of needed  
> dll's that
> > are actually used in my project?
> >
> > --
> > Brian J. Davis
> >
> >
> > _______________________________________________
> > Powered by www.kitware.com
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Please keep messages on-topic and check the CMake FAQ at:
> > http://www.cmake.org/Wiki/CMake_FAQ
> >
> > Follow this link to subscribe/unsubscribe:
> > http://www.cmake.org/mailman/listinfo/cmake
> >
>
>
>
> -- 
> Brian J. Davis
>



More information about the CMake mailing list