Boost logo

Boost :

Subject: Re: [boost] [cmake] Pull request announcement
From: James E. King III (jking_at_[hidden])
Date: 2018-09-20 12:42:08


On Thu, Sep 20, 2018 at 4:43 AM Alexander Grund via Boost <
boost_at_[hidden]> wrote:

>
> > Easiest thing to do here is in each project's CMakeLists.txt file, use a
> > standard naming
> > convention to hoist the public include directory up to the
> superproject. I
> > would macro-ize
> > the dependency definition and building of the dependency header list,
> like:
> >
> > in libs/uuid/CMakeLists.txt:
> >
> > boost_depends_on ( serialization throw_exception )
> >
> > Which would in turn set:
> >
> > set ( BOOST_UUID_DEPINCS ${BOOST_SERIALIZATION_HEADERS}
> > ${BOOST_THROW_EXCEPTION_HEADERS} )
> > (and if those had link libraries, which would be identified by another
> > variable of some sort, it would add to the link library list needed)
> >
> > The project itself would set the variable BOOST_UUID_HEADERS as:
> >
> > set ( BOOST_UUID_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include
> > ${BOOST_UUID_DEPINCS} PARENT_SCOPE )
> >
> > This defines BOOST_UUID_HEADERS one level up - in the "libs" project.
> This
> > variable now contains all of the include
> > paths needed build anything that depends on uuid.
> >
> > In each dependent project, adding the following allows for access to the
> > headers:
> >
> > boost_depends_on ( uuid )
> >
> > which as part of the macro would run:
> >
> > include_directories ( ${BOOST_UUID_HEADERS} )
> Definitely NOT. What you describe here is already part of modern CMake:
> You use targets:
>
> add_library(boost_serialization INTERFACE)
> target_include_directories(boost_serialization INTERFACE include) #
> CMAKE_CURRENT_SOURCE_DIR is implicit
>
> and in uuid:
> add_library(boost_uuid src/mysrc.cpp)
> target_include_directories(boost_uuid PUBLIC include)
> target_link_libraries(boost_uuid PUBLIC boost_serialization)
>
> This basically does the same as your macros and stuff but in the modern
> CMake way where CMake resolves all dependencies. For cases where you may
> not have e.g. the boost_serialization target yet one may assume to be
> run as part of the super-boost project and do this instead:
>
> add_library(boost_uuid src/mysrc.cpp)
> target_include_directories(boost_uuid PUBLIC include
> ${CMAKE_SOURCE_DIR}/libs/boost_serialization/include)
>
> Or better: Define the target yourself: if(NOT TARGET
> boost_serialization) add_library(boost_serialization IMPORTED) ...
>
>
Excellent, thanks for that info!

- Jim


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk