Boost logo

Boost-Build :

Subject: Re: [Boost-build] shared (prebuilt) libraries question
From: George Georgiev (george.georgiev.sf_at_[hidden])
Date: 2012-03-17 17:34:39


Thank you Steven,

This looks great.

Thanks,
George

On Sat, Mar 17, 2012 at 2:02 PM, Steven Watanabe <watanabesj_at_[hidden]> wrote:
> AMDG
>
> On 03/17/2012 11:59 AM, George Georgiev wrote:
>> I am relatively new to the Boost Build.
>>
>> I have a prebuilt library that I need to link against in my projects.
>>
>> To accomplish this I created a rule that defines the library. Then in
>> the beginning of every jamfile where this library will be used I call
>> this rule.
>>
>> There are several things that concerns me and I hope you guys will
>> give me ideas how to do this better.
>>
>> 1. Is it possible I to avoid the need of calling the rule for every
>> project. Somehow to define the library in the root and it to become
>> visible for every project.
>
> Yes.  In Jamroot:
>
> project /myproject ;
> lib mylib ;
>
> In other Jamfiles, you can refer to the library
> as /myproject//mylib.
>
>
>> 2. With adding more and more platforms to the project the rule becomes
>> uglier and uglier. There is a lot of repeating requirements, see
>> following the rule:
>>
>> <snip>
>>
>> I wish there is a way I to be able to structure this:
>>
>>
>> rule xercesDefines
>> {
>>    lib prebuilt_xerces
>>     # for all
>>        <include>$(ROOT)/xerces/include
>>         <define>XERCES_STATIC_LIBRARY
>>      ;
>>
>>
>>    if NT
>>    {
>>        lib advapi32
>>          :
>>          : <name>advapi32
>>          ;
>>    }
>>
>>    lib prebuilt_xerces
>>      :
>>      : # for <toolset>msvc
>>      :
>>      :
>>        <library>advapi32
>>      ;
>>
>>
>>    if MACOSX
>>    {
>>        lib curl
>>          :
>>          : <name>curl
>>          ;
>>    }
>>
>>    lib prebuilt_xerces
>>      :
>>      : # for <toolset>darwin
>>      :
>>      :
>>        <framework>CoreServices
>>        <library>curl
>>        <cxxflags>-fvisibility-inlines-hidden
>>        <cflags>-mmacosx-version-min=10.5
>>      ;
>>
>
> This is fairly easy using project requirements
> and aliases.
>
> project
>  : usage-requirements
>      <include>$(ROOT)/xerces/include
>      <define>XERCES_STATIC_LIBRARY
>  ;
>
> lib advapi32 : : <name>advapi32 ;
> lib curl : : <name>curl ;
>
> alias prebuilt_xerces_requirements :
>  <target-os>windows : <library>advapi ;
> alias prebuilt_xerces_requirements :
>  <target-os>darwin : <library>curl ;
>
> alias prebuilt_xerces
>  : prebuilt_xerces_requirements
>    prebuilt_xerces_lib
>  ;
>
> # Use prebuilt_xerces_lib to select the library
>
>> <snip>
>>
>> }
>>
>> 3. How I can avoid listing all combination per every prebuilt library.
>> For example  lib/linuxx86_64/gcc44libc211/dyn this part of the path is
>> going to be the same for all prebuilt libraries. I wish there was a
>> way I to say:
>>
>>    lib prebuilt_xerces
>>      :
>>      : <file>$(ROOT)/xerces/$(libsubdirectory)/libxerces-c.a
>>      ;
>>
>> And libsubdirectory to be different based on the toolset, version,
>> variant, address-model etc.
>>
>
> Well, clearly you have to start by defining
> a rule that computes the correct path.
>
> rule xerces-file ( properties * )
> {
>  local address-model =
>    [ property.select <address-model> : $(properties) ] ;
>  # ...
>  return <file>$(ROOT)/xerces/... ;
> }
>
> Then use an indirect conditional to compute the file name:
>
> searched-lib prebuilt_xerces : : <conditional>@xerces-file ;
>
> In Christ,
> Steven Watanabe
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost-build


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