Re: Including bjam code based on the address_model

Edward Diener via Boost-build <[email protected]> Thu, 11 Jul 2019 01:46:35 -0400
Newsgroups gmane.comp.lib.boost.build
Message-ID <[email protected]>
On 7/10/2019 7:56 PM, Rene Rivera via Boost-build wrote:
> On Wed, Jul 10, 2019 at 8:51 AM Edward Diener via Boost-build 
> <[email protected] <mailto:[email protected]>> wrote:
> 
>     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]>
>     <mailto:[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.
> 
>     Adding a global toolset requirement based on toolset name and version
>     does not help me because I have two toolset definitions with the same
>     toolset name and version. Any global toolset requirement of the kind
>     specified will therefore be applied to both of them, whereas what I
>     actually want is that one of the two have a requirement for
>     <address-model>32 while the other of the two has a requirement for
>     <address-model>64.
> 
> 
> The usual way around that is to specify a decorated version number on 
> init. For example:
> 
> using clang : 9.1~32 : c++ ;

Yes, I have done this in the past, but it not guaranteed to work as I 
understand it so it also seems like a possibly kludgy solution. If the 
toolset actually checks the version number against a compiler's version 
number the decorated version number will not match, unless of course 
there is logic that extracts the version number from the extra 
decoration. I realize that most toolsets do not even check the version 
number in any way, but that does not seem guaranteed for all cases but 
is very toolset specific.

> 
> But I'm curious.. What are you doing that it needs to be this way 
> instead of some other regular feature selection?

How would I do this with feature selection ? Remember that my original 
problem is that if I have:

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

where xxx and nnn are the same in both cases but the commands are 
different, I want to have the first toolset chosen when the invocation is

b2 toolset=xxx-nnn address-model=32

and the second toolset chosen when the invocation is:

b2 toolset=xxx-nnn address-model=64

The reason I need this to happen is that "some_command" sets up the 
32-bit 'compiler/tool' for toolset xxx-nnn while 'some_other_command' 
sets up the 64-bit 'compiler/tool' for toolset xxx-nnn. I realize it 
might be bad form for a compiler or a tool to need separate setups for 
32-bit and 64-bit compilation but there are still a number of these that 
do, with Intel C++ being an obvious example but there are some others 
also. I do understand that the logic for 32-bit versus 64-bit setup may 
already be in a toolset's jamfile, but this is not guaranteed for every 
toolset. Even when it is in the toolset's jamfile it is rarely documented.

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