When I use boost-build with the Intel compiler, using the built-in "intel" tool, it uses icpc
when compiling source into object files, but uses ar
to make .a
static libraries. Normally this is perfectly fine because Intel's own archiver xiar
is mostly a wrapper for ar
.
However, I'm trying to use Intel's "inter-procedural optimization" (-ipo
) option when I build some (but not all) of my libraries/modules within a large application. I want it to optimize within the library/module, but not between libraries/modules. For that to work, I have to use xiar
or xild -lib
when making the .a
files because ar
doesn't understand the .o
files that are created by icpc -ipo
. It thinks it succeeds, but the .a
it makes will fail in the linking stage.
How can I change what command boost-build will use to create archives away from the default ar
to xiar
?
I've tried throwing in <linker>
(which I see the msvc built-in tool supports) to the using intel
statement in my user-config.jam, but it seems to have been ignored. And I don't know that would affect the archiver choice anyway.
I had to hack into boost-build's internals to make this work. If you need this feature, you can hack it too!
In
/usr/share/boost-build/tools/intel-linux.jam
or perhaps/usr/share/boost-build/src/tools/intel-linux.jam
(which one exists might depend on you boost-build version), add the following to the end of the file:This seems to override the default
archive
(andpiecemeal
?) actions that are defined ingcc.jam
. Here I explicitly usexiar
instead ofar
, and the rest is just copied verbatim.If you aren't using Linux, you could probably move the same logic into
intel-win.jam
.I believe that boost-build is flawed in this assumption to use
ar
even with the intel compiler, so this might become a bug fix request on boost-build soon. I'm not confident I have the best solution, but it's better than nothing.Even better would be to add a
<archiver>
feature. Such a thing is mentioned in google results, but definitely doesn't exist in boost-build (between 2011 and 2014 versions). Obviously boost-build is capable of implementing such things. But I lack the skills in the very confusing jam language to make that happen. Please share if you do have such skills.