![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
OverviewBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 45. Boost.Build User Manual
|
![]() | Warning |
---|---|
Все синтаксические элементы, даже ключевые слова, должны быть разделены пробелами. Например, опускание пространственного персонажа до |
Если вы хотите использовать буквальное значение, которое является таким же, как и какое-то ключевое слово, значение может быть процитировано:
a = "=" ;
Все переменные в Boost.Jam имеют один и тот же тип— список строк. Определение переменной присваивает ей значение, как в предыдущем примере. Неопределенная переменная такая же, как переменная с пустым значением. К переменным можно получить доступ с помощью синтаксиса $(
. Например:измеримой
)
a = $(b) $(c) ;
Правила определяются путем указания названия правила, названий параметров и допустимого размера списка значений для каждого параметра.
ruleexample
(parameter1
:parameter2 ?
:parameter3 +
:parameter4 *
) { # rule body }
Когда это правило называется, список прошел, как первый аргумент должен иметь ровно одно значение. Список прошел, поскольку второй аргумент может иметь одно значение быть пустым. Два оставшихся аргумента могут быть произвольно длинными, но третий аргумент не может быть пустым.
Обзор Boost.Jam языковые заявления приведен ниже:
helper 1 : 2 : 3 ; x = [ helper 1 : 2 : 3 ] ;
Этот код называет названное правило указанными аргументами. Когда результат вызова должен быть использован внутри некоторого выражения, вам нужно добавить скобки вокруг звонка, как показано на второй строке.
if cond { statements } [ else { statements } ]
Это обычное заявление. Это условие состоит из:
Литералы (правда, если хотя бы одна строка не пуста)
Сравнения: a
где оператор
bоператор
является одним из =
, !=
, <
, >
, <=
или >=
. Сравнение делается попарно между каждой строкой слева и правильными аргументами.
Логические операции: ! a
, a & b
, a || b
Группировка: ( cond)
for var in list { statements }
Исследует заявления для каждого элемента в списке, установив переменную var
на значение элемента.
while cond { statements }
Неоднократно выполнять заявления, в то время как конд остается верным при входе.
return values ;
Это утверждение должно использоваться только внутри правила и присваивать значения
возвратному значению правила.
![]() | Warning |
---|---|
Заявление rule test ( ) { if 1 = 1 { return "reasonable" ; } return "strange" ; } вернет |
importmodule
; importmodule
:rule
;
Первая форма импортирует указанный модуль. Все правила этого модуля доступны с использованием квалифицированного названия:
. Вторая форма импортирует только указанные правила, и их можно назвать неквалифицированными именами. модуль
.правило
Иногда необходимо указать фактические командные строки для использования при создании целей. На языке джема вы используете названные действия для этого. Например:
actions create-file-from-another { create-file-from-another $(<) $(>) }
Это указывает на названное действие, называемое create-file-from-another
. Текст внутри брекетов - это команда для вызова. переменная $(<)
будет расширена до списка сгенерированных файлов, а $(>)
переменная будет расширена до списка исходных файлов.
Чтобы гибко настроить командную строку, вы можете определить правило с тем же названием, что и действие, и принять три параметра—мишени, источники и свойства. Например:
rule create-file-from-another ( targets * : sources * : properties * ) { if <variant>debug in $(properties) { OPTIONS on $(targets) = --debug ; } } actions create-file-from-another { create-file-from-another $(OPTIONS) $(<) $(>) }
В этом примере правило проверяет, указана ли определенная строительная собственность. Если это так, он устанавливает переменную OPTIONS
затем используется внутри действия. Обратите внимание, что переменные, установленные «на цели», будут видны только внутри действий, строящих эту цель, а не глобально. Если бы они были установлены во всем мире, использование переменной по имени OPTIONS
в двух не связанных действий было бы невозможным.
Более подробную информацию можно найти в ссылке Jam, раздел под названием “Rules”.
На старте, Boost. Создайте поиск и прочитает два файла конфигурации: site-config.jam
и user-config.jam
. Первый обычно устанавливается и поддерживается системным администратором, а второй - для пользователя. Вы можете отредактировать тот, который находится в директории верхнего уровня вашего Boost. Создайте установку или создайте копию в вашем домашнем каталоге и редактируйте копию. Следующая таблица объясняет, где оба файла находятся в поиске.
Table 45.1. Search paths for configuration files
site-config.jam | user-config.jam | |
---|---|---|
Linux |
|
|
Windows |
|
|
![]() | Tip |
---|---|
Вы можете использовать опцию --настройка ошибки, чтобы найти, какие файлы конфигурации на самом деле загружены. |
Обычно user-config.jam
просто определяет доступные компиляторы и другие инструменты (см. раздел, называемый “Targets в site-config.jam” для более продвинутого использования). Инструмент настроен с использованием следующего синтаксиса:
using tool-name
: ... ;
Правило с использованием
дается название инструмента и сделает этот инструмент доступным для Boost. Строить. Например,
using gcc ;
сделает GCC компилятор доступным.
Все поддерживаемые инструменты задокументированы в разделе под названием “Builtin tools”, включая конкретные варианты, которые они принимают. Некоторые общие примечания, которые применяются к большинству компиляторов C++, ниже.
Для всех компиляторных инструментов C++, которые увеличиваются. Build поддерживает out-of-the-box, список параметров для использования
одинаков: toolset-name
, версия
, invok-command
и options
.
Если у вас есть один компилятор, а компилятор исполняемый
имеет свое “ обычное имя” и находится в PATH
, или
был установлен в стандарте “ каталог установки” или
можно найти с помощью глобальной системы, такой как реестр Windows.
он может быть настроен просто:
using tool-name
;
Если компилятор установлен в пользовательском каталоге, вы должны предоставить команду, которая вызывает компилятор, например:
using gcc : : g++-3.2 ; using msvc : : "Z:/Programs/Microsoft Visual Studio/vc98/bin/cl" ;
Небольшая потеря. Создание инструментов будет использовать этот путь, чтобы предпринять дополнительные действия, необходимые до обращения к компилятору, такие как вызов сценариев, предлагаемых поставщиками, чтобы настроить свои необходимые переменные среды. Когда компилятор, исполняемый для C и C++, отличается, путь к компилятору C++ должен быть указан. Командой может быть любая команда, разрешенная операционной системой. Например:
using msvc : : echo Compiling && foo/bar/baz/cl ;
будет работать.
Чтобы настроить несколько версий набора инструментов, просто нажмите на правило с использованием
несколько раз:
using gcc : 3.3 ; using gcc : 3.4 : g++-3.4 ; using gcc : 3.2 : g++-3.2 ;
Обратите внимание, что в первом вызове с использованием
будет использоваться компилятор, найденный в PATH
, и нет необходимости четко указывать команду.
Многие инструменты имеют параметр options
для настройки конфигурации. Все, что нужно. Стандартные компиляторные инструменты Build принимают четыре варианта cflags
, cxxflags
, compileflags
и linkflags
как options
, указывая флаги, которые всегда будут передаваться соответствующим инструментам. Значения cflags
передаются непосредственно компилятору C, значения cxxflags
функция передается непосредственно компилятору C++, и значения функции compileflags
передаются обоим. Например, чтобы настроить набор инструментов gcc, чтобы он всегда генерировал 64-битный код, который вы могли бы написать:
using gcc : 3.4 : : <compileflags>-m64 <linkflags>-m64 ;
![]() | Warning |
---|---|
Хотя синтаксис, используемый для указания вариантов набора инструментов, очень похож на синтаксис, используемый для указания требований в Jamfiles, варианты набора инструментов не такие, как функции. Не пытайтесь указать значение функции в инициализации инструментария. |
Чтобы вызвать Boost.Build, введите b2 на командной строке. Принимаются три вида токенов командной строки в любом порядке:
Варианты начинаются с одного или двух дашей. Стандартные варианты перечислены ниже, и каждый проект может добавить дополнительные варианты
Свойства определяют детали того, что вы хотите построить (например, отладка или вариант выхода). Синтактически все токены командной строки с одинаковым знаком в них считаются заданными свойствами. В простейшем виде собственность выглядит как feature
= value
Все токены, которые не являются ни опциями, ни свойствами, определяют, какие цели следует строить. Доступные цели полностью зависят от проекта, который вы строите.
Чтобы построить все цели, определенные в Jamfile в текущем каталоге со свойствами по умолчанию, запустите:
b2
Для построения конкретных целей укажите их на командной строке:
b2 lib1 subproject//lib2
Чтобы запросить определенное значение для некоторого имущества, добавить
к командной строке:владение
= значение
b2 toolset=gcc variant=debug optimization=space
Подъем. Build признает следующие параметры командной строки.
--help
Называется онлайн-система помощи. В нем содержится общая информация о том, как использовать систему помощи с дополнительными вариантами --help*.
--clean
Очищает все цели в текущем каталоге и в любых подпроектах. Обратите внимание, что в отличие от clean
цель в производстве, вы можете использовать -чистую
вместе с целевыми именами для очистки конкретных целей.
--clean-all
Очищает все цели, независимо от того, где они определены. В частности, он будет очищать цели в родительских Jamfiles и цели, определенные в других проектах.
--build-dir
Меняет строительные каталоги для всех построенных корней проекта. Когда указан этот вариант, все файлы Jamroot должны декларировать название проекта. Каталог сборки для корневого проекта будет вычислен путем конкатанизации значения опции -build-dir
, названия проекта, указанного в Jamroot, и закусочного, указанного в Jamroot (или bin
, если не указано).
Опция в первую очередь полезна при построении только для чтения, когда вы не можете изменить Jamroot.
--abbreviate-paths
Сжимает целевые пути путем сокращения каждого компонента. Этот вариант полезен для сохранения путей от того, чтобы стать дольше, чем поддерживает файловая система. Смотрите также раздел, называемый “Target Paths”.
--hash
Сжимает целевые пути, используя хэш MD5. Этот вариант полезен для сохранения путей от того, чтобы стать дольше, чем поддерживает файловая система. Этот вариант дает более короткие пути, чем - аббревиатура - пути, но за счет сделать их менее понятными. Смотрите также раздел, называемый “Target Paths”.
--version
Распечатает информацию о Посте. Строить и наращивать. Джамские версии.
-a
Все файлы должны быть восстановлены.
-n
Не выполняйте команды, только распечатайте их.
-q
Остановитесь при первой ошибке, в отличие от продолжения построения целей, которые не зависят от неудачных.
-j N
Запустите до N
команд параллельно.
--debug-configuration
Производит отладку информации о загрузке Boost. Build and toolset files.
--debug-building
Печатает, какие цели строятся и с какими свойствами.
--debug-generators
Производит отладку от процесса поиска генератора. Полезно для отладки пользовательских генераторов.
-d0
Подавление всех информационных сообщений.
-d N
Включить уровни отладки от 1 до n. Цены:
-d +N
Включить уровень отладки N
.
-o file
Напишите действия по обновлению на указанный файл вместо их запуска.
-s var
=value
Установить переменную var
на value
в глобальном масштабе интерпретатора языка джема, перекрывая переменные, импортируемые из окружающей среды.
В простейшем случае сборка выполняется с одним набором свойств, которые вы указываете на командной строке с элементами в форме feature
= value
. Полный список функций можно найти в разделе под названием “Буилтин функции”. Наиболее распространенные функции кратко излагаются ниже.
Table 45.2.
Feature | Allowed values | Notes |
---|---|---|
вариант | debug,release | |
ссылка | общие, статические | Определяет, будет ли утешение. Создание создает общие или статические библиотеки |
резьба | одноместный, много | Делать произведенные бинарные файлы безопасными. Это требует надлежащей поддержки в самом исходном коде. |
адресная модель | 32,64 | Четко запросите 32-битное или 64-битное поколение кода. Это обычно требует, чтобы ваш компилятор был соответствующим образом настроен. Пожалуйста, обратитесь к разделу “C++ Compilers” и документация компилятора в случае проблем. |
инструментарий | (В зависимости от конфигурации) | C++ компилятор для использования. См. секцию под названием “C++ Compilers” для подробного списка. |
включить | (Арбитражная строка) | Дополнительные включают пути для компиляторов C и C++. |
определение | (Арбитражная строка) | Additional macro definitions for C and C++ compilers. The string should be either
SYMBOL or SYMBOL=VALUE |
cxxflags | (Арбитражная строка) | Пользовательские опции для передачи компилятору C++. |
cflags | (Арбитражная строка) | Пользовательские варианты для передачи компилятору C. |
linkflags | (Арбитражная строка) | Пользовательские опции, чтобы перейти на C++-линкер. |
runtime-link | общие, статические | Определяет, должна ли использоваться общая или статическая версия времени выполнения C и C++. |
Если у вас есть более одной версии данного инструментария C++ (например, настроенного в user-config.jam
или автообнаруженного, как это происходит с msvc), вы можете запросить конкретную версию, пройдя toolset
-версия
как значение функции toolset
, например toolset=msvc-8.0
.
Если функция имеет фиксированный набор значений, она может быть указана более одного раза на командной строке. В этом случае все будет построено несколько раз - один раз для каждого заданного значения функции. Например, если вы используете
b2 link=static link=shared threading=single threading=multi
Затем будет выполнено в общей сложности 4 сборки. Для удобства вместо указания всех запрошенных значений функции в отдельных элементах командной строки вы можете отделить значения с коммами, например:
b2 link=static,shared threading=single,multi
Комма имеет этот особый смысл только в том случае, если функция имеет фиксированный набор значений, так что
b2 include=static,shared
не лечится специально.
Все элементы командной строки, которые не являются ни вариантами, ни свойствами, являются названиями целей для построения. См. секцию под названием “Target и идентификаторы и ссылки”. Если цель не указана, проект в текущем каталоге построен.
A Main target - это определяемое пользователем юридическое лицо, которое может быть построено, например, исполняемый файл. Определение основной цели обычно выполняется с использованием одного из основных правил, описанных в разделе под названием “Буилтин правила”. Пользователь также может объявить пользовательские основные целевые правила, как показано в разделе под названием “ Основные целевые правила”.
Большинство основных целевых правил в Boost. Build имеет одну и ту же общую подпись:
rule rule-name
(
main-target-name :
sources + :
requirements * :
default-build * :
usage-requirements * )
main-target-name
- это имя, используемое для запроса цели на командной строке и использования ее из других основных целей. Основное имя цели может содержать буквенно-цифровые символы, даши (‘-
’) и подчеркивания (‘_
’).sources
- это список исходных файлов и других основных целей, которые должны быть объединены.запросы
- это список свойств, которые всегда должны присутствовать при построении этой основной цели.по умолчанию-build
- это список свойств, которые будут использоваться, если не указано какое-либо другое значение той же функции, например, на командной строке или путем распространения от зависимой цели.usage-requirements
- это список свойств, которые будут распространяться на все основные цели, которые используют этот, т.е. на всех его зависимых.Некоторые основные целевые правила имеют разный перечень параметров, как прямо указано в их документации.
Фактические требования, предъявляемые к цели, определяются путем уточнения требований проекта, в соответствии с которым указан целевой показатель с четко определенными требованиями. То же самое относится и к потребностям использования. Более подробную информацию можно найти в разделе под названием “Уточнение продукции”
Название основной цели имеет две цели. Во-первых, он используется для обозначения этой цели из других целей и из командной строки. Во-вторых, он используется для вычисления имен сгенерированных файлов. Как правило, имена файлов получают из основного целевого имени путем добавления системно-зависимых суффиксов и префиксов.
Название основной цели может содержать буквенно-цифровые символы, даши, недескоры и точки. Все название имеет важное значение при решении ссылок с других целей. Для определения имен файлов, только часть перед первой точкой принимается. Например:
obj test.release : test.cpp : <variant>release ; obj test.debug : test.cpp : <variant>debug ;
будет генерировать два файла под названием test.obj
(в двух разных каталогах), а не два файла под названием test.release.obj
и test.debug.obj
.
В списке источников указывается, что должно быть обработано для достижения поставленных целей. В большинстве случаев это просто список файлов. Иногда вы захотите автоматически составить список исходных файлов, а не писать его вручную, в этом случае вы можете использовать правило glob. Вот два примера:
exe a : a.cpp ; # a.cpp is the only source file exe b : [ glob *.cpp ] ; # all .cpp files in this directory are sources
Если вы не указываете файл с абсолютным путем, имя считается относительно исходного каталога — который обычно является каталогом, где находится Jamfile, но может быть изменен так, как описано в разделе под названием “Проекты”.
Список источников также может относиться к другим основным целям. Цели в одном и том же проекте могут быть указаны по названию, в то время как цели в других проектах должны быть квалифицированы с помощью каталога или символического названия проекта. Название каталога/проекта отделено от целевого имени двойным передним ударом. Нет специального синтаксиса, чтобы отличить имя каталога от названия проекта— часть перед двойным срезом сначала рассматривается как название проекта, а затем как имя каталога. Например:
lib helper : helper.cpp ; exe a : a.cpp helper ; # Since all project ids start with slash, ".." is a directory name. exe b : b.cpp ..//utils ; exe c : c.cpp /boost/program_options//program_options ;
Первый экс использует библиотеку, определенную в том же проекте. Второй использует какую-то цель (скорее всего, библиотеку), определенную Jamfile на один уровень выше. Наконец, третья цель использует библиотеку C++ Boost, ссылаясь на нее с использованием ее абсолютного символического имени. Более подробную информацию о целевых ссылках можно найти в разделе, называемом “Dependent Targets” и разделе, называемом “Target, идентификаторы и ссылки”.
Требования - это свойства, которые всегда должны присутствовать при построении цели. Как правило, они включают и определяют:
exe hello : hello.cpp : <include>/opt/boost <define>MY_DEBUG ;
Существует ряд других функций, перечисленных в разделе раздел, который называется “ Особенности буйлова”. Например, если библиотека может быть построена только статически, или файл не может быть составлен с оптимизацией из-за ошибки компилятора, можно использовать
lib util : util.cpp : <link>static ; obj main : main.cpp : <optimization>off ;
Иногда определенные отношения должны поддерживаться среди объектов цели. Это может быть достигнуто с помощью условных требований. Например, вы можете установить конкретные #defines
когда библиотека построена как общая, или когда вариант целевого release
построен в режиме выпуска.
lib network : network.cpp
: <link>shared:<define>NETWORK_LIB_SHARED
<variant>release:<define>EXTRA_FAST
;
В приведенном выше примере каждый раз, когда сети
построены с shared
,
будут и в своих свойствах.
Вы можете использовать несколько свойств в состоянии, например:
lib network : network.cpp : <toolset>gcc,<optimization>speed:<define>USE_INLINE_ASSEMBLER ;
Более мощным вариантом условных требований является косвенные условные требования. Вы можете предоставить правило, которое будет называться текущими строительными свойствами и может вычислить дополнительные свойства, которые необходимо добавить. Например:
lib network : network.cpp : <conditional>@my-rule ; rule my-rule ( properties * ) { local result ; if <toolset>gcc <optimization>speed in $(properties) { result += <define>USE_INLINE_ASSEMBLER ; } return $(result) ; }
Этот пример эквивалентен предыдущему, но в сложных случаях косвенные условные требования могут быть проще писать и понимать.
Требования, конкретно указанные для цели, обычно сочетаются с требованиями, указанными для проекта, содержащего информацию. Вы можете заставить цель полностью игнорировать конкретное требование проекта, используя синтаксис, добавив знак минус перед свойством, например:
exe main : main.cpp : -<define>UNNECESSARY_DEFINE ;
Этот синтаксис является единственным способом игнорировать свободные свойства, такие как определяет, от родителя. Он также может быть полезен для обычных свойств. Рассмотрим этот пример:
project test : requirements <threading>multi ; exe test1 : test1.cpp ; exe test2 : test2.cpp : <threading>single ; exe test3 : test3.cpp : -<threading>multi ;
Здесь test1
наследует проектные требования и всегда будет построен в многопоточном режиме. test2
мишень определяет требования проекта и всегда будет построен в однонаправленном режиме. В отличие от этого, test3
мишень удаляет свойство от проектных требований и будет построен либо в однопоточном, либо в многослойном режиме в зависимости от того, какой вариант запрашивается пользователем.
Обратите внимание, что удаление требований полностью текстовое: необходимо указать точно одно и то же свойство для его удаления.
Параметр default-build
- это набор свойств, которые должны использоваться, если запрос на сборку не указывает значения для функций в наборе. Например:
exe hello : hello.cpp : : <threading>multi ;
будет построен многопоточный целевой показатель, если пользователь явно не запрашивает однопоточную версию. Различие между требованиями и импульсом по умолчанию заключается в том, что требования не могут быть отменены каким-либо образом.
Способы построения цели могут быть настолько разными, что их описание с использованием условных требований будет трудным. Например, представьте, что библиотека на самом деле использует разные исходные файлы в зависимости от инструментария, используемого для его создания. Мы можем выразить эту ситуацию, используя целевые альтернативы:
lib demangler : dummy_demangler.cpp ; # alternative 1 lib demangler : demangler_gcc.cpp : <toolset>gcc ; # alternative 2 lib demangler : demangler_msvc.cpp : <toolset>msvc ; # alternative 3
В примере выше, при построении с gcc
или msvc
, demangler
будет использовать исходный файл, специфичный для набора инструментов. В противном случае он будет использовать общий исходный файл dummy_demangler.cpp
.
Можно объявлять цель в интерактивном режиме, т.е. параметр «источники» может включать звонки на другие основные правила. Например:
exe hello : hello.cpp [ obj helpers : helpers.cpp : <optimization>off ] ;
Побудит «helpers.cpp» всегда составляться без оптимизации. Когда речь идет об основной цели, ее заявленное имя должно быть префиксировано именем материнской цели и двумя точками. В приведенном выше примере, чтобы построить только помощников, следует запустить b2 Привет..helpers
.
Когда на командной строке не запрашивается цель, все цели в текущем проекте будут установлены. Если цель должна быть построена только по явному запросу, это может быть выражено explicit Правило:
explicit install_programs ;
Как упоминалось ранее, цели сгруппированы в проекты, и каждый Jamfile - это отдельный проект. Проекты полезны, потому что они позволяют нам группировать связанные с ними цели вместе, определять свойства, общие для всех этих целей, и присваивать символическое название проекту, которое может быть использовано для обозначения его целей.
Проекты называются с использованием правила проект
, которое имеет следующий синтаксис:
projectid
:attributes
;
Вот. атрибуты
- это последовательность аргументов правил, каждый из которых начинается с атрибута-имя и сопровождается любым количеством свойств сборки. Список названий атрибутов наряду с их обработкой также показан в таблице ниже. Например, можно написать:
project tennis : requirements <threading>multi : default-build release ;
Возможные атрибуты перечислены ниже.
Проект idProject id is a short way to denote a project, as opposed to the Jamfile's pathname. It is a hierarchical path, unrelated to filesystem, such as "boost/thread". Target references make use of project ids to specify a target.[ORIG_END] -->
Местоположение источника указывает каталог, где источники для проекта находятся.Местоположение источника specifies the directory where sources for the project are located.[ORIG_END] -->
Требования к проекту - это требования, которые применяются ко всем целям в проектах, а также ко всем подпроектам.
По умолчанию - это запрос сборки, который должен быть используется, когда нет запроса на сборку четко указано.По умолчанию is the build request that should be used when no build request is specified explicitly.[ORIG_END] -->
Значение по умолчанию для этих атрибутов приведено в таблице ниже.
Table 45.3.
Attribute | Name | Default value | Handling by the project
rule |
---|---|---|---|
Project id | никто | никто | Назначен с первого параметра правила «проекта». Предполагается, что это означает абсолютный проект id. |
Местоположение источника | положение источника | Расположение джемфира для проекта | Наборы к пройденному значению |
Требования | требования | Требования родителей | Требования родителя уточняются с принятым требованием, и результат используется в качестве требований проекта. |
По умолчанию | по умолчанию-build | никто | Наборы к пройденному значению |
Создание каталога | build-dir | Пусто, если у родителя нет набора каталогов сборки. В противном случае директория по созданию родителя с относительным путем от родителя к текущему проекту приложена к нему. | Устанавливает пройденное значение, интерпретируемое как относящееся к расположению проекта. |
Помимо определения проектов и основных целей, Jamfiles часто ссылаются на различные правила полезности. Полный список правил, которые могут быть непосредственно использованы в Jamfile, см. раздел под названием “Буилтин правила”.
Каждый подпроект наследует атрибуты, константы и правила от своего родительского проекта, который определяется ближайшим Jamfile в каталоге предков над подпроектом. Проект верхнего уровня объявлен в файле Jamroot
, а не Jamfile
. При загрузке проекта, Boost. Build ищет Jamroot
или Jamfile
. Они обрабатываются одинаково, за исключением того, что если файл называется Jamroot
, поиск родительского проекта не выполняется.
Даже при построении в каталоге подпроектов, родительские файлы проектов всегда загружаются перед файлами их подпроектов, так что каждое определение, сделанное в родительском проекте, всегда доступно для его детей. Порядок загрузки любых других проектов не указан. Даже если один проект относится к другому через use-project
или целевую ссылку, не следует принимать какой-либо конкретный порядок.
![]() | Note |
---|---|
Предоставление корневому проекту специального названия “ |
Когда вы описали свои цели, вы хотите увеличить. Создайте, чтобы запустить правильные инструменты и создать необходимые цели. В этом разделе будут описаны две вещи: как вы указываете, что строить, и как основные цели фактически построены.
Самое главное, что нужно отметить, это в Boost. Создайте, в отличие от других инструментов построения, цели, которые вы объявляете, не соответствуют конкретным файлам. То, что вы заявляете в Jamfile, больше похоже на “metatarget.” В зависимости от свойств, которые вы указываете на командной строке, каждый метацель будет производить набор реальных целей, соответствующих запрашиваемым свойствам. Вполне возможно, что один и тот же метацель построен несколько раз с различными свойствами, производя разные файлы.
![]() | Tip |
---|---|
Это означает, что для Boost. Строить, вы не можете напрямую получить вариант сборки из Jamfile. Может быть несколько вариантов, запрашиваемых пользователем, и каждая цель может быть построена с различными свойствами. |
Командная линия определяет, какие цели построить и с какими свойствами. Например:
b2 app1 lib1//lib1 toolset=gcc variant=debug optimization=full
построят две цели: «app1» и «lib1//lib1» с указанными свойствами. Вы можете обратиться к любым целям, используя target id и указать произвольные свойства. Некоторые свойства очень распространены, и для них название свойства может быть опущено. Например, вышеперечисленное может быть написано как:
b2 app1 lib1//lib1 gcc debug optimization=full
Полный синтаксис, который имеет некоторые дополнительные ярлыки, описан в разделе под названием “Призыв”.
Когда вы запрашиваете, прямо или косвенно, создание основной цели с конкретными требованиями, выполняются следующие шаги. Предлагается некоторое краткое объяснение, и более подробная информация приведена в разделе , который называется “Build process”.
Применить сборку по умолчанию. Если в свойстве объекта по умолчанию указывается значение функции, которая не присутствует в запросе на сборку, это значение добавляется.
Выбор основной целевой альтернативы использования. Для каждой альтернативы мы смотрим, сколько свойств присутствует как в альтернативных требованиях, так и в сборке запроса. Выбрана альтернатива с большим количеством соответствующих свойств.
Определение «общих» свойств. Запрос на сборку уточнен с требованиями целевого показателя. Условные свойства в требованиях также обрабатываются. Наконец, добавлены значения параметров по умолчанию.
Создать цели, указанные в списке источников и свойствах зависимостей. Список источников и свойства могут относиться к другой цели, используя целевые ссылки. Для каждой ссылки мы принимаем все свойства пропагандированные, уточняем их явными свойствами, указанными в целевой ссылке, и передаем полученные свойства в качестве сборки запроса на другую цель.
Добавление требований к использованию, производимых при построении зависимостей к «общим» свойствам. Когда зависимости строятся на предыдущем этапе, они возвращают как набор созданных «настоящих» целей, так и требования к использованию. Требования к использованию добавляются к общим свойствам, и соответствующий набор имущества будет использоваться для построения текущего целевого показателя.
Создание цели с использованием генераторов. Чтобы преобразовать источники в желаемый тип, Boost. Build использует «генераторы» - объекты, которые соответствуют таким инструментам, как компиляторы и связующие устройства. Каждый генератор заявляет, какой тип целей он может производить и какой тип источников он требует. Используя эту информацию, Boost. Build определяет, какие генераторы должны быть запущены для производства конкретной цели из конкретных источников. Когда генераторы работают, они возвращают «настоящие» цели.
Вычислить требования к использованию, которые должны быть возвращены. Условные свойства в требованиях к использованию расширяются и результат возвращается.
Часто пользователь строит полный проект, а не только одну основную цель. Фактически, ссылка на b2 без аргументов строит проект, определенный в текущем каталоге.
Когда проект построен, запрос на строительство передается без изменения всех основных целей в этом проекте. Можно предотвратить неявное построение цели в проекте с эксплицитом
Правило:
explicit hello_test ;
приведет к тому, что цель hello_test
будет построена только в том случае, если она будет специально запрошена пользователем или какой-либо другой целью.
Jamfile для проекта может включать в себя ряд build-project
правила требуют, чтобы указать дополнительные проекты, которые должны быть построены.
Статья Overview раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 45. Boost.Build User Manual может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 45. Boost.Build User Manual ::
реклама |