C++. Сборник рецептов.

1.10. Сборка сложного приложения с помощью BoostBuild.

Проблема.

Вы хотите использовать Boost.Build для сборки исполняемого файла, зависящего от нескольких статических и динамических библиотек.

Решение.

Выполните следующие шаги.

1. Для каждой библиотеки, от которой зависит исполняемый файл, — при условии, что она не распространяется в виде готового бинарного файла, — создайте Jam-файл, как описано в рецептах 1.8 и 1.9.

2. В директории, где вы хотите создать исполняемый файл, создайте файл Jamroot.

3. В файле Jamroot вызовите правило exe, объявляющее целевой исполняемый файл. Укажите свои файлы .cpp и цели библиотек, от которых исполняемый файл зависит как от источников. Также, если требуется, добавьте свойства вида <include>путь, чтобы сказать компилятору, где искать заголовочные файлы библиотек.

4. В файле Jamroot вызовите правило install, определяющее в качестве требований свойства <install-dependencies>on, <install-type>EXE и <install-type>SHARED_LIB.

5. В директории, содержащей Jamroot, запустите bjam, как описано в рецепте 1.7.

6. Например, чтобы собрать из исходных файлов, перечисленных в примере 1.3, исполняемый файл, создайте в директории hellobeatles файл с именем Jamroot, показанный в примере 1.13.

Пример 1.13. Jam-файл для сборки исполняемого файла hellobeatles.exe или hellobeatles.

# Jamfile для проекта hellobeatles.

Exe hellobeatles.

 : # исходники.

  ../johnpaul//libjohnpaul.

  ../georgeringo//libgeorgeringo.

  hellobeatles.cpp.

 ;

Install dist.

 : # исходники.

  hellobeatles.

 : # требования.

  <install-dependencies>on.

  <install-type>EXE.

  <install-type>SHARED_LIB.

  <location>.

 ;

Теперь введите:

> bjam hellobeatles.

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

> bjam dist.

В результате исполняемый файл hellobeatles и динамическая библиотека georgeringo будут скопированы в директорию, содержащую файл hellobeatles.cpp.

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

Обсуждение.

Цели библиотек.

Цели библиотек, от которых зависит данная цель, указываются как источники с помощью записи path//target-name. В рецептах 1.8 и 1.9 я показал, как объявлять цель для сборки библиотеки из исходного кода с помощью Boost.Build Однако если библиотека доступна в виде готового двоичного файла, вы можете объявить цель для нее следующим образом.

Lib имя-цели.

 :

 : <file>имя-файла.

 ;

Как объяснялось в рецепте 1.7, большая часть основных целей соответствует не одному файлу, а набору связанных файлов, таких как отладочная и окончательная сборка исполняемого файла. Чтобы объявить цель для готовой библиотеки, у которой есть несколько вариантов, используйте следующую запись.

Lib имя цели.

 :

 : <file>имя-файла требования.

 ;

Lib имя-цели.

 : <file>другое-имя-файла другие-требования.

 ;

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

Lib cryptolib.

 :

 : <file> ../libraries/cryptolib/cryptolib_debug.lib.

  <variant>debug.

 ;

 lib cryptolib.

 : <file> ../libraries/cryptolib/cryptolib.lib.

  <variant>release.

 ;

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

Lib имя-цели.

 : <name>имя-библиотеки.

 ;

Здесь имя-библиотеки — это имя, которое должно быть передано компоновщику и которое может отличаться от реального имени файла, как обсуждалось в рецепте 1.5. Чтобы дать указание компоновщику искать в определенной директории, напишите.

Lib имя-цели.

 : <name>имя-библиотеки.

 <search>путь-к-библиотеке.

 ;

Установка.

Сложное приложение может требовать установки вместе с несколькими дополнительными исполняемыми файлами и динамическими библиотеками, от которых оно зависит. Вместо того чтобы указывать эти файлы по отдельности, используйте функцию install-dependencies, которая позволяет вам указать только главный исполняемый файл и тип зависимостей, которые должны быть установлены. В примере 1.13 требование <install-dependencies>on включает функцию install-dependencies, а требования <install-type>EXE и <install-type>SHARED_LIB говорят BoostBuild установить все зависимости, которые являются исполняемыми файлами или динамическими библиотеками. Другие возможные значения функции install-type включают LIB и IMPORT_LIB.

Организация проекта.

Все три Jam-файла, используемые при сборке исполняемого файла hellobeatles, называются Jamroot. Это хорошо для такого простого проекта, но обычно следует организовывать набор Jam-файлов в иерархию с единственным высшим Jam-файлом, определяющим корень проекта. Организация проектов подобным образом позволяет использовать некоторые из более сложных функций Boost.Build's, таких как наследование свойств дочерними проектами. Одним из способов сделать такую организацию в нашем случае является изменение имен Jam-файлов в директориях johnpaul, georgeringo и hellobeatles с Jamroot на Jamfile и добавление файла Jamroot со следующим содержимым в родительскую директорию.

# jamfile для примера приложения.

Build-project hellobeatles ;

Правило build-project просто говорит bjam собрать данный проект, который может быть указан либо по пути, либо с помощью символьного идентификатора. Если вы перейдете в директорию, содержащую Jamroot, и запустите bjam, то будут собраны три дочерних проекта.

Смотри также.

Рецепты 1.5, 1.13 и 1.18.