1.7. Сборка простого приложения «Hello, World» с помощью Boost.Build
1.7. Сборка простого приложения «Hello, World» с помощью Boost.Build
Проблема
Вы хотите собрать простую программу «Hello, World», подобную приведенной в примере 1.4, с помощью BoostBuild.
Решение
В директории, где вы хотите создать исполняемый файл и все создаваемые при этом промежуточные файлы, создайте текстовый файл с именем Jamroot. В файле Jamroot укажите два правила, приведенных далее. Во-первых, укажите правило exe, объявляющее целевой исполняемый файл и исходные файлы .cpp. Далее укажите правило install, определяющее имя целевого исполняемого файла и директорию, в которую его следует устанавливать. Наконец, запустите bjam, чтобы собрать программу.
Например, чтобы собрать исполняемый файл hello или hello.exe из файла hello.cpp из примера 1.4, создайте в директории, содержащей файл hello.cpp, файл с именем Jamroot с содержимым, показанным в примере 1.8.
Пример 1.8. Jamfile для проекта hello
# jamfile для проекта hello
exe hello : hello.cpp ;
install dist : hello : <location>. ;
Далее перейдите в директорию, содержащую hello.cpp и Jamroot, и введите следующую команду.
> bjam hello
Эта команда собирает исполняемый файл hello или hello.exe в поддиректории текущей директории. Наконец, введите команду:
> bjam dist
Эта команда копирует исполняемый файл в директорию, указанную в свойстве location, которое в нашем случае равно текущей директории.
В момент сдачи этой книги в печать разработчики Boost.Build готовят официальный релиз BoostBuild версии 2. К моменту, когда вы будете это читать, версия 2 уже, возможно, будет выпущена. Если нет, вы можете задействовать поведение, описанное в этой главе, передав в bjam опцию командной строки --v2. Например, вместо ввода bjam hello введите bjam --v2 hello.
Обсуждение
Файл Jamroot является примером файла Jamfile. В то время как для управления небольшим набором исходных файлов C++ можно использовать один Jam-файл, большой набор файлов обычно требует нескольких Jam-файлов с иерархической организацией. Каждый Jam-файл находится в отдельной директории и соответствует отдельному проекту. Большая часть Jam-файлов просто называется Jamfile, но самый верхний Jam-файл — Jam-файл, который расположен в директории, родительской по отношению ко всем другим директориям, содержащим остальные Jam-файлы, — называется Jamroot. Проект, определяемый этим верхним Jam- файлом, называется корнем проекта. Каждый проект, за исключением корня проекта, имеет родительский проект определяемый проектом, расположенным в ближайшей к нему родительской директории, содержащей Jam-файл.
Эта иерархическая организация обладает большими преимуществами: например, она облегчает применение к проекту и всем его дочерним проектам требований, таких как поддержка потоков.
Каждый проект — это набор целей. Цели объявляются с помощью вызова правил, таких как правило exe и правило install. Большая часть целей соответствует двоичным файлам или, более точно, набору связанных двоичных файлов, таких как отладочная и финальная (релиз) сборки приложения.
Правило exe используется для объявления исполняемой цели. Вызов этого правила имеет вид, показанный в примере 1.9.
Пример 1.9. Вызов правила exe
exe имя-целевого-файла
: исходные-файлы
: требования
: сборка-по-умолчанию
: требования-к-использованию
;
Здесь имя-целевого-файла определяет имя исполняемого файла, исходные-файлы определяет список исходных файлов и библиотек, требования определяет свойства, которые должны применяться к цели независимо от каких-либо дополнительных свойств, указанных в командной строке или унаследованных от другого проекта, сборка-по-умолчанию определяет свойства, которые будут применены к цели, если не явно запрошено другое значение свойства, и требования-к-использованию определяет свойства, которые будут переданы всем остальным целям, зависящим от данной цели.
Свойства указываются в виде <функция>значение. Например, чтобы объявить исполняемый файл, который будет всегда собираться с поддержкой потоков, вы должны написать:
exe hello
: hello.cpp
: <threading>multi
;
От вас не требуется писать двоеточия, разделяющие последовательные аргументы правила Boost.Build, если вы не указываете значения этих аргументов.
Некоторые часто используемые функции и их возможные значения перечислены в табл. 1.15.
Табл. 1.15. Часто используемые функции Boost.Build
Функция Значение Эффект include Path Определяет путь для поиска заголовочных файлов define name=[value] Определяет макрос threading multi или single Включает или отключает поддержку потоков runtime-link static или shared Определяет тип компоновки с библиотекой времени выполнения? variant debug или release Запрашивает отладочную или окончательную сборку? См. рецепт 1.23.
Когда собирается целевой исполняемый файл, или цель, соответствующая статической или динамической библиотеке, файл, соответствующий этой цели, создается в директории, дочерней по отношению к директории, содержащей Jam-файл. Относительным путь этой директории зависит от инструментария и конфигурации сборки, но он всегда начинается с bin. Например, исполняемый файл из примера 1.8 может быть создан в директории bin/msvc/debug.
Для простоты я попросил вас создать Jam-файл из примера 1.8 в той же директории, в которой находится исходный файл hello.cpp. Однако в реальных проектах вам часто придется хранить исходные и двоичные файлы в различных директориях. В примере 1.8 Jam-файл можно поместить в любое место при условии, что вы укажете путь hello.cpp так, что он будет указывать на реальный файл hello.cpp.
Правило install указывает Boost.Build скопировать один или несколько файлов, указанных как имена файлов или как имена главных целей, в указанное место. Вызов этого правила имеет вид, показанный в примере 1.10.
Пример 1.10. Вызов правила install
install имя-цели
: файлы
: требования
: сборка-по-умолчанию
: требования-к-использованию
;
Здесь имя-цели — это имя объявляемой цели, а файлы — это список из одного или более файлов или целей, которые требуется скопировать. Остальные аргументы — требования, сборка-по-умолчанию и требования-к-использованию — имеют такие же значения, как и в примере 1.9.
Место, куда файлы должны быть скопированы, может указываться либо как имя цели, либо как значение свойства location требований цели. Например, в примере 1.8 можно написать цель install следующим образом.
install . : hello ;
Затем установка исполняемого файла выполняется так:
> bjam .
Однако метод, использованный в примере 1.8, предпочтителен, так как проще запомнить именованную цель, чем путь файла.
Наконец, давайте быстро взглянем на синтаксис командной строки bjam. Чтобы собрать цель xxx, используя инструментарий по умолчанию, введите команду:
> bjam xxx
Чтобы собрать цель xxx, используя инструментарий yyy, введите команду:
> bjam xxx toolset=yyy
Чтобы собрать цель xxx, используя версию vvv инструментария yyy, введите команду:
> bjam хххtoolset=yyy-vvv
Чтобы в командной строке указать использовать при сборке стандартную библиотеку zzz, используйте синтаксис:
> bjam xxx stdlib=zzz
Чтобы собрать несколько целей одновременно, введите в командной строке несколько имен целей, а чтобы собрать все цели данного проекта, не указывайте целей. Следовательно, чтобы собрать и установить исполняемый файл из примера 1.9, просто введите:
> bjam
Чтобы удалить все файлы, созданные в процессе сборки, включая исполняемый файл, введите:
> bjam --clean
Свойство в виде <функция>значение может быть указано в командной строке как функция=значение.
Смотри также
Рецепты 1.2 и 1.15.