Boost logo

Boost-Build :

Subject: [Boost-build] --layout=system for *nix vendors
From: Steve M. Robbins (steve_at_[hidden])
Date: 2008-11-02 23:00:29


On Wed, Oct 29, 2008 at 07:27:59PM +0300, Vladimir Prus wrote:
> On Wednesday 29 October 2008 18:03:32 Philipp Thomas wrote:

> > Using layout=system isn't an option as that also results in sonames that
> > aren't really usable.

> I presume you actually want version in soname. Look how it's done in versioned branch:
>
> result = $(result).$(BOOST_VERSION) ;
>
> If you replicate this, you'll get:
>
> libboost_whatever.so.1.36.1
>
> or something -- which seems about right.

That seems about right, except that the multithreaded variant will be
named libboost_whatever. On the other hand, the default Boost
installation (i.e. using --layout=versioned) includes <threading> so
that the single threaded variant (if built) is named libboost_whatever
while the multithreaded one is named libboost_whatever-mt.

This seems likely to cause confusion with Jamfiles, autoconf macros
and CMake macros that attempt to find the right library name. On
some systems -lboost_whatever is single-threaded while on others
it is multithreaded.

How about the following change, which retains <base> <threading>
<runtime> for --layout=system but also appends $(BOOST_VERSION) when
appropriate?

I'm putting the entire rule here, since the diff is actually larger
(and harder to read):

# This rule is called by Boost.Build to determine the name of target. We use it
# to encode the build variant, compiler name and boost version in the target
# name.
#
rule tag ( name : type ? : property-set )
{
    if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB
    {
        local result = [ common.format-name
            <base> <threading> <runtime> -$(BUILD_ID)
            : $(name) : $(type) : $(property-set) ] ;

        if $(layout) = versioned
        {
            result = [ common.format-name
                <base> <toolset> <threading> <runtime> -$(BOOST_VERSION_TAG)
                -$(BUILD_ID)
                : $(name) : $(type) : $(property-set) ] ;
        }

        # Optionally add version suffix. On NT, library with version suffix
        # will not be recognized by linkers. On CYGWIN, we get strage
        # duplicate symbol errors when library is generated with version
        # suffix. On OSX, version suffix is not needed -- the linker expects
        # the libFoo.1.2.3.dylib format. AIX linkers do not accept version
        # suffixes either. Pgi compilers can not accept library with version
        # suffix.
        if $(type) = SHARED_LIB &&
          ( ! ( [ $(property-set).get <target-os> ] in windows cygwin darwin aix ) &&
            ! ( [ $(property-set).get <toolset> ] in pgi ) )
        {
            result = $(result).$(BOOST_VERSION) ;
        }

        return $(result) ;
    }
}




Boost-Build list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk