Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Overview

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 45. Boost.Build User Manual

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Overview

Этот раздел предоставит информацию, необходимую для создания ваших собственных проектов с помощью Boost. Строить. Представленная здесь информация относительно высокого уровня, и раздел под названием “Reference”, а также система онлайн-помощи должны быть использованы для получения низкоуровневой документации (см. -помощь).

Подъем. Build имеет две части и #8212; построить двигатель с собственным интерпретированным языком и увеличить. Создайте себя, реализуйте на этом языке. Цепь событий при вводе b2 на командной строке выглядит следующим образом:

  1. The Boost. Создайте исполняемые попытки найти Boost. Создайте модули и загружает модуль верхнего уровня. Точный процесс описан в разделе под названием “Initialization”

  2. Модуль верхнего уровня загружает пользовательские конфигурационные файлы, user-config.jam и site-config.jam, которые определяют доступные наборы инструментов.

  3. The Jamfile в текущем каталоге читается. Это, в свою очередь, может вызвать чтение дальнейших Jamfiles. В результате создается дерево проектов, с целями внутри проектов.

  4. Наконец, используя запрос сборки, указанный на командной строке, Boost. Build решает, какие цели должны быть построены и как. Эта информация возвращается в Boost. Джам, который заботится о том, чтобы фактически управлять запланированными командами действий.

Таким образом, чтобы иметь возможность успешно использовать Boost. Строить, нужно знать только четыре вещи:

Concepts

Подъем. Build имеет несколько уникальных концепций, которые представлены в этом разделе. Лучший способ объяснить концепции - это сравнить с более классическими инструментами построения.

При использовании любого вкуса изготовления вы прямо указываете таргеты и команды, которые используются для их создания из другой цели. Нижеприведенный пример создает a.o из a.c с помощью команды вызова составителя с жестким кодом.

a.o: a.c
    g++ -o a.o -g a.c

Это довольно низкоуровневый механизм описания, и трудно корректировать команды, варианты и наборы созданных целей в зависимости от используемого компилятора и операционной системы.

Для улучшения переносимости, большинство современных систем сборки обеспечивают набор функций более высокого уровня, которые могут быть использованы в создании файлов описания. Рассмотрим этот пример:

add_program ("a", "a.c")

Это функция вызова, который создает цели, необходимые для создания исполняемого файла из исходного файла a.c. В зависимости от настроенных свойств могут использоваться разные командные строки. Однако add_program является более высоким уровнем, но довольно тонким. Все цели создаются сразу же, когда описание сборки выполнено, что делает невозможным выполнение многомерных сборок. Часто изменение любого строящегося свойства требует полной реконфигурации строящегося дерева.

Для поддержки настоящих многовариантных сборок, Boost. Строение вводит понятие metatarget—an object that is created when the build description is parsed and can be called later with specific build properties to generate actual targets. [ORIG_END] -->

Рассмотрим пример:

exe a : a.cpp ;

Когда это заявление вычеркнуто, буст. Build создает метацель, но пока не решает, какие файлы должны быть созданы, или какие команды должны использоваться. После того, как все файлы сооружаются, Boost. Build рассматривает свойства, запрошенные на командной строке. Предположительно, вы ссылались на Boost. Строить с:

b2 toolset=gcc toolset=msvc

В этом случае метацель будет называться дважды, один раз с toolset=gcc и один раз с toolset=msvc. Оба вызова будут производить конкретные цели, которые будут иметь различные расширения и использовать различные командные строки.

Another key concept is build property. A build property is a variable that affects the build process. It can be specified on the command line, and is passed when calling a metatarget. While all build tools have a similar mechanism, Boost.Build differs by requiring that all build properties are declared in advance, and providing a large set of properties with portable semantics.

The final concept is property propagation. Boost.Build does not require that every metatarget is called with the same properties. Instead, the "top-level" metatargets are called with the properties specified on the command line. Each metatarget can elect to augment or override some properties (in particular, using the requirements mechanism, see the section called “Requirements”). Then, the dependency metatargets are called with the modified properties and produce concrete targets that are then used in the build process. Of course, dependency metatargets maybe in turn modify build properties and have dependencies of their own.

Для более глубокого лечения требований и концепций вы можете обратиться к SYRCoSE 2009 Boost. Строить статью.

Boost.Jam Language

В этом разделе будут описаны основы Boost. Jam language—просто достаточно для написания Jamfiles. Дополнительные сведения см. в разделе Боост. Jam документация.

Boost.Jam имеет интерпретированный, процедурный язык. На самом низком уровне программа Boost.Jam состоит из переменных и правила (термин Джама для функций). Они сгруппированы в модули— есть один глобальный модуль и ряд названных модулей. Кроме того, программа Boost.Jam содержит классы и классные экземпляры.

Синтантически, программа Boost.Jam состоит из двух типов элементов—ключевые слова (которые имеют особое значение для Boost.Jam) и литералов. Рассмотрим этот код:

a = b ;

который присваивает значение b переменной a . Здесь = и ; являются ключевыми словами, в то время как a и b являются литературными.

[Warning]Warning

Все синтаксические элементы, даже ключевые слова, должны быть разделены пробелами. Например, опускание пространственного персонажа до ; приведет к синтаксической ошибке.

Если вы хотите использовать буквальное значение, которое является таким же, как и какое-то ключевое слово, значение может быть процитировано:

a = "=" ;

Все переменные в Boost.Jam имеют один и тот же тип— список строк. Определение переменной присваивает ей значение, как в предыдущем примере. Неопределенная переменная такая же, как переменная с пустым значением. К переменным можно получить доступ с помощью синтаксиса $(измеримой). Например:

a = $(b) $(c) ;

Правила определяются путем указания названия правила, названий параметров и допустимого размера списка значений для каждого параметра.

rule example
 (
     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]Warning

Заявление возврат не выходит из правила. Например:

rule test ( )
{
   if 1 = 1
   {
      return "reasonable" ;
   }
   return "strange" ;
}

вернет strange, а не разумный.

import module ;
import module : 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”.

Configuration

На старте, Boost. Создайте поиск и прочитает два файла конфигурации: site-config.jam и user-config.jam. Первый обычно устанавливается и поддерживается системным администратором, а второй - для пользователя. Вы можете отредактировать тот, который находится в директории верхнего уровня вашего Boost. Создайте установку или создайте копию в вашем домашнем каталоге и редактируйте копию. Следующая таблица объясняет, где оба файла находятся в поиске.

Table 45.1. Search paths for configuration files

 site-config.jamuser-config.jam
Linux

/etc

$HOME

$BOOST_BUILD_PATH

$HOME

$BOOST_BUILD_PATH

Windows

%SystemRoot%

%HOMEDRIVE%%HOMEPATH%

%HOME%

%BOOST_BUILD_PATH%

%HOMEDRIVE%%HOMEPATH%

%HOME%

%BOOST_BUILD_PATH%


[Tip]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]Warning

Хотя синтаксис, используемый для указания вариантов набора инструментов, очень похож на синтаксис, используемый для указания требований в Jamfiles, варианты набора инструментов не такие, как функции. Не пытайтесь указать значение функции в инициализации инструментария.

Invocation

Чтобы вызвать Boost.Build, введите b2 на командной строке. Принимаются три вида токенов командной строки в любом порядке:

options

Варианты начинаются с одного или двух дашей. Стандартные варианты перечислены ниже, и каждый проект может добавить дополнительные варианты

properties

Свойства определяют детали того, что вы хотите построить (например, отладка или вариант выхода). Синтактически все токены командной строки с одинаковым знаком в них считаются заданными свойствами. В простейшем виде собственность выглядит как feature= value

target

Все токены, которые не являются ни опциями, ни свойствами, определяют, какие цели следует строить. Доступные цели полностью зависят от проекта, который вы строите.

Examples

Чтобы построить все цели, определенные в Jamfile в текущем каталоге со свойствами по умолчанию, запустите:

b2

Для построения конкретных целей укажите их на командной строке:

b2 lib1 subproject//lib2

Чтобы запросить определенное значение для некоторого имущества, добавить владение= значение к командной строке:

b2 toolset=gcc variant=debug optimization=space

Options

Подъем. 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. Цены:

  1. Покажите действия, предпринятые для построения целей, поскольку они выполнены (по умолчанию).
  2. Показывать «тихие» действия и отображать весь текст действия, как они выполняются.
  3. Показывать анализ зависимостей, а также мишень/источник тайм-стамп/паты.
  4. Показывать аргументы и пугать призывы к оболочке.
  5. Показать ссылки на правила и переменные расширения.
  6. Показать папку/заголовок/архивное сканирование и попытки привязки к целям.
  7. Показать переменные настройки.
  8. Показать переменные отрывки, переменные расширения и оценку «если» выражений.
  9. Показать переменные манипуляции, сканеры и использование памяти.
  10. Показать информацию профиля для правил, как время, так и память.
  11. Показывать прогресс Джамфилса.
  12. Показать график зависимостей цели.
  13. Показать изменение целевого статуса (fate).

-d +N

Включить уровень отладки N.

-o file

Напишите действия по обновлению на указанный файл вместо их запуска.

-s var=value

Установить переменную var на value в глобальном масштабе интерпретатора языка джема, перекрывая переменные, импортируемые из окружающей среды.

Properties

В простейшем случае сборка выполняется с одним набором свойств, которые вы указываете на командной строке с элементами в форме feature= value. Полный список функций можно найти в разделе под названием “Буилтин функции”. Наиболее распространенные функции кратко излагаются ниже.

Table 45.2. 

FeatureAllowed valuesNotes
вариант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

не лечится специально.

Targets

Все элементы командной строки, которые не являются ни вариантами, ни свойствами, являются названиями целей для построения. См. секцию под названием “Target и идентификаторы и ссылки”. Если цель не указана, проект в текущем каталоге построен.

Declaring Targets

A Main target - это определяемое пользователем юридическое лицо, которое может быть построено, например, исполняемый файл. Определение основной цели обычно выполняется с использованием одного из основных правил, описанных в разделе под названием “Буилтин правила”. Пользователь также может объявить пользовательские основные целевые правила, как показано в разделе под названием “ Основные целевые правила”.

Большинство основных целевых правил в Boost. Build имеет одну и ту же общую подпись:

rule rule-name (
     main-target-name :
     sources + :
     requirements * :
     default-build * :
     usage-requirements * )
  • main-target-name - это имя, используемое для запроса цели на командной строке и использования ее из других основных целей. Основное имя цели может содержать буквенно-цифровые символы, даши (‘-’) и подчеркивания (‘_’).
  • sources - это список исходных файлов и других основных целей, которые должны быть объединены.
  • запросы - это список свойств, которые всегда должны присутствовать при построении этой основной цели.
  • по умолчанию-build - это список свойств, которые будут использоваться, если не указано какое-либо другое значение той же функции, например, на командной строке или путем распространения от зависимой цели.
  • usage-requirements - это список свойств, которые будут распространяться на все основные цели, которые используют этот, т.е. на всех его зависимых.

Некоторые основные целевые правила имеют разный перечень параметров, как прямо указано в их документации.

Фактические требования, предъявляемые к цели, определяются путем уточнения требований проекта, в соответствии с которым указан целевой показатель с четко определенными требованиями. То же самое относится и к потребностям использования. Более подробную информацию можно найти в разделе под названием “Уточнение продукции”

Name

Название основной цели имеет две цели. Во-первых, он используется для обозначения этой цели из других целей и из командной строки. Во-вторых, он используется для вычисления имен сгенерированных файлов. Как правило, имена файлов получают из основного целевого имени путем добавления системно-зависимых суффиксов и префиксов.

Название основной цели может содержать буквенно-цифровые символы, даши, недескоры и точки. Все название имеет важное значение при решении ссылок с других целей. Для определения имен файлов, только часть перед первой точкой принимается. Например:

obj test.release : test.cpp : <variant>release ;
obj test.debug : test.cpp : <variant>debug ;

будет генерировать два файла под названием test.obj (в двух разных каталогах), а не два файла под названием test.release.obj и test.debug.obj.

Sources

В списке источников указывается, что должно быть обработано для достижения поставленных целей. В большинстве случаев это просто список файлов. Иногда вы захотите автоматически составить список исходных файлов, а не писать его вручную, в этом случае вы можете использовать правило 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, NETWORK_LIB_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

Параметр default-build - это набор свойств, которые должны использоваться, если запрос на сборку не указывает значения для функций в наборе. Например:

exe hello : hello.cpp : : <threading>multi ;

будет построен многопоточный целевой показатель, если пользователь явно не запрашивает однопоточную версию. Различие между требованиями и импульсом по умолчанию заключается в том, что требования не могут быть отменены каким-либо образом.

Additional Information

Способы построения цели могут быть настолько разными, что их описание с использованием условных требований будет трудным. Например, представьте, что библиотека на самом деле использует разные исходные файлы в зависимости от инструментария, используемого для его создания. Мы можем выразить эту ситуацию, используя целевые альтернативы:

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 ;

Projects

Как упоминалось ранее, цели сгруппированы в проекты, и каждый Jamfile - это отдельный проект. Проекты полезны, потому что они позволяют нам группировать связанные с ними цели вместе, определять свойства, общие для всех этих целей, и присваивать символическое название проекту, которое может быть использовано для обозначения его целей.

Проекты называются с использованием правила проект, которое имеет следующий синтаксис:

project id : 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. 

AttributeNameDefault valueHandling by the project rule
Project idниктониктоНазначен с первого параметра правила «проекта». Предполагается, что это означает абсолютный проект id.
Местоположение источникаположение источникаРасположение джемфира для проектаНаборы к пройденному значению
ТребованиятребованияТребования родителейТребования родителя уточняются с принятым требованием, и результат используется в качестве требований проекта.
По умолчаниюпо умолчанию-buildниктоНаборы к пройденному значению
Создание каталогаbuild-dirПусто, если у родителя нет набора каталогов сборки. В противном случае директория по созданию родителя с относительным путем от родителя к текущему проекту приложена к нему.Устанавливает пройденное значение, интерпретируемое как относящееся к расположению проекта.


Помимо определения проектов и основных целей, Jamfiles часто ссылаются на различные правила полезности. Полный список правил, которые могут быть непосредственно использованы в Jamfile, см. раздел под названием “Буилтин правила”.

Каждый подпроект наследует атрибуты, константы и правила от своего родительского проекта, который определяется ближайшим Jamfile в каталоге предков над подпроектом. Проект верхнего уровня объявлен в файле Jamroot, а не Jamfile. При загрузке проекта, Boost. Build ищет Jamroot или Jamfile. Они обрабатываются одинаково, за исключением того, что если файл называется Jamroot, поиск родительского проекта не выполняется.

Даже при построении в каталоге подпроектов, родительские файлы проектов всегда загружаются перед файлами их подпроектов, так что каждое определение, сделанное в родительском проекте, всегда доступно для его детей. Порядок загрузки любых других проектов не указан. Даже если один проект относится к другому через use-project или целевую ссылку, не следует принимать какой-либо конкретный порядок.

[Note]Note

Предоставление корневому проекту специального названия “Jamroot” гарантирует, что он будет расти. Build не будет неверно истолковывать каталог выше него как корень проекта только потому, что каталог содержит Jamfile.

The Build Process

Когда вы описали свои цели, вы хотите увеличить. Создайте, чтобы запустить правильные инструменты и создать необходимые цели. В этом разделе будут описаны две вещи: как вы указываете, что строить, и как основные цели фактически построены.

Самое главное, что нужно отметить, это в Boost. Создайте, в отличие от других инструментов построения, цели, которые вы объявляете, не соответствуют конкретным файлам. То, что вы заявляете в Jamfile, больше похоже на “metatarget.” В зависимости от свойств, которые вы указываете на командной строке, каждый метацель будет производить набор реальных целей, соответствующих запрашиваемым свойствам. Вполне возможно, что один и тот же метацель построен несколько раз с различными свойствами, производя разные файлы.

[Tip]Tip

Это означает, что для Boost. Строить, вы не можете напрямую получить вариант сборки из Jamfile. Может быть несколько вариантов, запрашиваемых пользователем, и каждая цель может быть построена с различными свойствами.

Build Request

Командная линия определяет, какие цели построить и с какими свойствами. Например:

b2 app1 lib1//lib1 toolset=gcc variant=debug optimization=full

построят две цели: «app1» и «lib1//lib1» с указанными свойствами. Вы можете обратиться к любым целям, используя target id и указать произвольные свойства. Некоторые свойства очень распространены, и для них название свойства может быть опущено. Например, вышеперечисленное может быть написано как:

b2 app1 lib1//lib1 gcc debug optimization=full

Полный синтаксис, который имеет некоторые дополнительные ярлыки, описан в разделе под названием “Призыв”.

Building a main target

Когда вы запрашиваете, прямо или косвенно, создание основной цели с конкретными требованиями, выполняются следующие шаги. Предлагается некоторое краткое объяснение, и более подробная информация приведена в разделе , который называется “Build process”.

  1. Применить сборку по умолчанию. Если в свойстве объекта по умолчанию указывается значение функции, которая не присутствует в запросе на сборку, это значение добавляется.

  2. Выбор основной целевой альтернативы использования. Для каждой альтернативы мы смотрим, сколько свойств присутствует как в альтернативных требованиях, так и в сборке запроса. Выбрана альтернатива с большим количеством соответствующих свойств.

  3. Определение «общих» свойств. Запрос на сборку уточнен с требованиями целевого показателя. Условные свойства в требованиях также обрабатываются. Наконец, добавлены значения параметров по умолчанию.

  4. Создать цели, указанные в списке источников и свойствах зависимостей. Список источников и свойства могут относиться к другой цели, используя целевые ссылки. Для каждой ссылки мы принимаем все свойства пропагандированные, уточняем их явными свойствами, указанными в целевой ссылке, и передаем полученные свойства в качестве сборки запроса на другую цель.

  5. Добавление требований к использованию, производимых при построении зависимостей к «общим» свойствам. Когда зависимости строятся на предыдущем этапе, они возвращают как набор созданных «настоящих» целей, так и требования к использованию. Требования к использованию добавляются к общим свойствам, и соответствующий набор имущества будет использоваться для построения текущего целевого показателя.

  6. Создание цели с использованием генераторов. Чтобы преобразовать источники в желаемый тип, Boost. Build использует «генераторы» - объекты, которые соответствуют таким инструментам, как компиляторы и связующие устройства. Каждый генератор заявляет, какой тип целей он может производить и какой тип источников он требует. Используя эту информацию, Boost. Build определяет, какие генераторы должны быть запущены для производства конкретной цели из конкретных источников. Когда генераторы работают, они возвращают «настоящие» цели.

  7. Вычислить требования к использованию, которые должны быть возвращены. Условные свойства в требованиях к использованию расширяются и результат возвращается.

Building a Project

Часто пользователь строит полный проект, а не только одну основную цель. Фактически, ссылка на b2 без аргументов строит проект, определенный в текущем каталоге.

Когда проект построен, запрос на строительство передается без изменения всех основных целей в этом проекте. Можно предотвратить неявное построение цели в проекте с эксплицитом Правило:

explicit hello_test ;

приведет к тому, что цель hello_test будет построена только в том случае, если она будет специально запрошена пользователем или какой-либо другой целью.

Jamfile для проекта может включать в себя ряд build-project правила требуют, чтобы указать дополнительные проекты, которые должны быть построены.


PrevUpHomeNext

Статья Overview раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 45. Boost.Build User Manual может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 45. Boost.Build User Manual ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:49:47/0.022494077682495/1