Re: Including bjam code based on the address_model

Edward Diener via Boost-build <[email protected]> Wed, 10 Jul 2019 03:42:38 -0400
Newsgroups gmane.comp.lib.boost.build
Message-ID <[email protected]>
On 7/9/2019 10:01 PM, Rene Rivera via Boost-build wrote:
> On Tue, Jul 9, 2019 at 7:58 PM Edward Diener via Boost-build 
> <[email protected] <mailto:[email protected]>> wrote:
> 
>     On 7/9/2019 11:30 AM, Edward Diener via Boost-build wrote:
>      > On 7/9/2019 8:47 AM, Edward Diener via Boost-build wrote:
>      >> I would like to include different bjam code, using the 'include'
>     rule,
>      >> into a jamfile based on the address-model used when b2 is
>     invoked. Is
>      >> this doable, and if so how ? Would it make any difference if the
>      >> jamfile involved were 'user-config.jam' ?
>      >>
>      >> Essentially I need to use different toolset definitions
>     depending on
>      >> whether the compile is for 32 bit or 64-bit code and I thought the
>      >> easiest way to do this would be just to include different toolset
>      >> definitions into my user-config.jam depending on the address
>     model. If
>      >> there is a better way to do this within bjam I would love to
>     know what
>      >> it is. Most of the toolsets involved are compilers but some are
>     just
>      >> other tools such as zip libraries like bzip2 and there is also the
>      >> python toolset.
>      >>
>      >> My current method of doing this is to link a 32-bit user-config to
>      >> user-config.jam when I do 32-bit compile and a 64-bit
>     user-config to
>      >> user-config.jam when I do a 64-bit compile, but this has always
>     seemed
>      >> to me to be kludgy even if it does work, and I am hoping that
>     bjam has
>      >> the ability to solve this without my kludge.
>      >
>      > Solved ! Evidently with 'using' rule for the various compilers
>     and tools
>      > I can add target alternatives in the requirements section and so can
>      > have <address-model>32 and <address-model>64 to achieve my goal.
> 
>     I spoke too soon. Using the <address-model>32 and <address-model>64 as
>     target alternatives in toolset 'using' statements does not work to
>     distinguish 'using' statements with the same name and version.
>     Instead I
>     get from Boost Build the error of:
> 
>     error: duplicate initialization of xxx with the following parameters
>     etc.
> 
>     for toolset 'xxx', as in
> 
>     using xxx : nnn : some_command : <address-model>32 ;
>     using xxx : nnn : some_other_command : <address-model>64 ;
> 
>     I guess I must go back to my original kludge as there seems to be no
>     way
>     to have Boost Build pick out the correct toolset based on whether I am
>     compiling with a 32-bit or 64-bit address model.
> 
> 
> You can add a global toolset requirement to do that selection. Some 
> toolsets initializations take those extra arguments and apply it. For 
> example:
> 
> using gcc : : c++ -fx32 : : <address-model>32 ;
> 
> But the common ones don't have that, yet. Instead you can go the post 
> init route:
> 
> using toolset ;
> using clang : 9.1 : g++ ;
> toolset.add-requirements 
> <toolset>clang,<address-model>32:<toolset-clang:version>9.1 ;
> 
> The syntax for that long requirements might need some tweaking for your 
> use case.

I think you meant to write above

import toolset ;

instead of

using toolset ;

or am I wrong ?

Also the syntax in your example for the add-requirements looks strange 
considering it is trying to add <address-model>32 to the clang toolset 
with version 9.1. Is it really correct as you specified it ? I would 
have guessed logically, without actually knowing the syntax, the order 
of the parameter would be:

<toolset>clang,<toolset-clang:version>9.1:<address-model>32 ;

in order to say that for toolset clang with version 9.1 add the 
requirement for a 32-bit address model. But what do I know ? Is there 
any doc on what a 'requirement', in the toolset add-requirements rule, 
is supposed to look like ?

Also if I have, using my OP examples above:

using xxx : nnn : some_command ;
using xxx : nnn : some_other_command ;

where both the toolset name and version are the same, and I want to add 
the requirement <address-model>32 to the first and the <address-model>64 
to the second, do I achieve this by invoking toolset.add-requirements 
with each different address model directly after each one, as in:

using xxx : nnn : some_command ;
toolset.add-requirements with <address-model>32 etc.
using xxx : nnn : some_other_command ;
toolset.add-requirements with <address-model>64 etc.

Thanks very much for your help !

_______________________________________________
Unsubscribe & other changes: https://lists.boost.org/mailman/listinfo.cgi/boost-build