Чтобы параллельное построение было успешным, зависимости между файлами должны быть правильно прописаны, поскольку цели, как правило, строятся в самом быстром порядке. Кроме того, остерегайтесь непараллельных команд, которые сбрасывают файлы с фиксированным именем в текущий каталог, как это делает<yacc(1)>.
Этот раздел основан на официальной документации Jam и опыте использования и чтения правил Jambase. Мы повторяем информацию здесь в основном потому, что это важно для понимания и использования Jam, но не консолидируется в одном месте. Некоторые из них вообще отсутствуют в официальной документации. Мы надеемся, что это будет полезно для тех, кто хочет познакомиться с системой JAM и Boost.
Жам «<rules>» на самом деле простые процедурные сущности. Думайте о них как о функциях. Аргументы разделяются колонками.
Джемцельявляется абстрактной сущностью, идентифицированной произвольной строкой. Встроенное<DEPENDS>правило создает связь в графе зависимостей между названными целями.
Обратите внимание, что оригинальная документация Jam для встроенного правила<INCLUDES>неверна:<INCLUDEStargets1:
targets2>заставляет все, что зависит от членацелей1, зависеть от всех членовцелей2. Он делает это странным образом, прикрепляяцели2к специальной хвостовой части в списке зависимостей всегоцели1. Кажется нормальным создавать круговые зависимости таким образом; на самом деле, кажется, что это «правильная вещь», когда одно действие сборки создает какцели1, так ицели2.
При вызове правила, если<actions>объявлено с тем же названием, что и правило, действия добавляются к действиям обновления для цели, идентифицированной первым аргументом правила. Фактически можно ссылаться на необъявленное правило, если объявляются соответствующие действия: правило считается пустым.
Цели (кроме<NOTFILE>) связаны с путями в файловой системе посредством процесса, называемого связыванием. Связывание - это процесс поиска файла с тем же именем, что и целевая (sans grist), на основе настроек целевых<SEARCH>и<LOCATE>переменных.
В дополнение к локальным и глобальным переменным, джем позволяет установить переменную<on>. Целевые переменные значения обычно не могут быть прочитаны и вступают в силу только в следующих контекстах:
При актуализации действий переменные значения сначала просматриваются вверх<on>мишенью, названной первым аргументом (цель обновляется). Поскольку Jam строит все свое дерево зависимостей перед выполнением действий, правила Jam создают параметры переменных для конкретной цели.
Связывание контролируетсяполностьюзаданной установкой<SEARCH>и<LOCATE>переменных, как описано здесь.
В специальном правиле, используемом для сканирования файла заголовка, переменные значения сначала просматриваются<on>по цели, названной первым аргументом правила (сканируемый исходный файл).
«Связанное значение» переменной — это путь, связанный с целью, названной переменной. При построении действий первые два аргумента автоматически заменяются связанными значениями. Целевые переменные могут быть выборочно заменены их связанными значениями с использованием модификатора действия<bind>.
Обратите внимание, что термин «связывание», используемый в документации Jam, указывает на фазу обработки, которая включает три подфазы:связывание(да!), определение обновления и сканирование файла заголовка. Повторение термина «связывание» может привести к некоторой путанице. В частности, раздел Модификации Обязательства в документации Jam, вероятно, должен называться «Модифицирование определения обновления».
«Grist» — это просто струнный префикс формы<символов>. Он используется для создания уникальных целевых имен на основе более простых имен. Например, имя файла "<test.exe>" может использоваться мишенями в отдельных подпроектах или для отладки и выпуска вариантов "одной и той же" абстрактной цели. Каждая отдельная цель, связанная с файлом под названием «test.exe», имеет свой собственный уникальный префикс. Система сборки Boost также в полной мере использует способность Jam делить струны на границах решётки, иногда сцепляя несколько нарезанных элементов в начале струны. Грист используется вместо идентификации целей абсолютными путями по двум причинам:
Расположение целей не всегда может быть получено исключительно из того, что пользователь помещает в Jamfile, но иногда также зависит от процесса связывания. По-прежнему необходим какой-то механизм для четкой идентификации целей с тем же названием.
Grist позволяет использовать единый абстрактный идентификатор для каждой встроенной цели, независимо от местоположения целевого файла (как это разрешено установкой ALL_LOCATE_TARGET).
Когда крапиву извлекают из имени с $(var:G), результат включает в себя ведущие и задающие угол скобки. При добавлении grist к имени с $(var:G=expr), существующий grist сначала удаляется. Затем, если expr не пуст, добавляются ведущиеs, если это необходимо, чтобы сформировать выражение формы;.
При вызове Jam он импортирует все настройки переменной среды в соответствующие переменные Jam, за которыми следуют все настройки переменной командной строки (-s...). Переменные, имя которых заканчивается в PATH, Path или Path, разделены на строковые списки в границах разделителя списка путей для ОС (например, «:» для UNIX и «;» для Windows). Все остальные переменные разделены на пространственные ("") границы. Boost Jam изменяет это поведение, позволяя цитировать переменные.
Переменная, значение которой является пустым списком или полностью состоит из пустых строк, имеет отрицательное логическое значение. Таким образом, например, код, подобный следующему, допускает разумный непустый по умолчанию, который может быть легко преодолен пользователем:<
>Если пользователь хочет получить конкретное сообщение, он вызывает варенье<"-sMESSAGE=message
text">. Если же он не хочет, то он вызывает варенье<-sMESSAGE=>и ничего не печатается.
Разбор вариантов командной строки в Jam может быть довольно нелогичным в отношении того, как другие программы Unix принимают опции. Есть два варианта, принятые как действительные для варианта:
<-xvalue>, и
<-x value>.
Статья Miscellaneous раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 46. Boost.Jam : 3.1.19 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.