Как указать встроенные функции Boost.build в jam-файле (user-config.jam), который будет использоваться для сборки библиотеки Boost? Например, я могу использовать b2 из командной строки VS для создания boost, используя
b2 link=shared threading=multi address-model=64
и мне нужно, чтобы те же функции были включены через конфигурацию .jam.
Я знаю, что система Boost.build может использовать user-config.jam из локального каталога, но я не совсем понимаю синтаксис. Я пробовал это:
using msvc : 11.0;
<address-model>64;
Но это, похоже, не влияет на процесс сборки.
Короче — не стоит этого делать. Конфигурация набора инструментов не предназначена для аппаратного кодирования (например, <address-model>
) для всех целей, созданных с помощью этого набора инструментов. Правильный способ состоит в том, чтобы установить эту функцию на все основные цели, которые строятся.
exe myexe : a.cpp : <address-model>64 ;
Это также может быть сделано путем установки значения функции на цели проекта.
project my-project : requirements <address-model>64 ;
# Same as above, project requirements are applied to
# all targets in the project.
exe myexe : a.cpp ;
По сути, это то, что Boost.Build делает с функциями, указанными в командной строке. Они анализируются и применяются ко всем целям высшего уровня в качестве требований.
Если вы действительно хотите использовать user-config.jam
чтобы убедиться, что все цели имеют <address-model>64
Вы можете использовать следующий трюк:
# In user-config.jam
import feature
feature.feature build-64 : on : composite ;
feature.compose <build-64>on : <address-model>64 ;
Это определяет новую функцию. Эта функция не является обязательной, поэтому Boost.Build будет использовать ее для всех создаваемых целей. Значение по умолчанию — это первое (и единственное) значение (‘on’), и оно является составным, который указывает <address-model>64
, так что это применяется к каждой цели.
При сборке Boost — вы можете переписать командную строку, используя user-config.jam. Если вам нужно указать, какие библиотеки собираются, я считаю, что это единственный путь.
# Un user-config.jam
local argv = [ modules.peek : ARGV ] ;
ECHO Old command line is '$(argv)' ;
modules.poke : ARGV : $(argv) --with-thread address-model=64 ;
argv = [ modules.peek : ARGV ] ;
ECHO New command line is '$(argv)' ;
Но кажется более уместным передать правильную командную строку, используя сценарий оболочки, вместо того, чтобы переписывать его в user-config.jam
,
Других решений пока нет …