как создать новый вариант в bjam - PullRequest
5 голосов
/ 26 апреля 2010

Я попытался прочитать документацию, но она довольно непроницаема, поэтому я надеюсь, что у кого-то может быть простой ответ. Я хочу определить новый «вариант», основанный на «отладке», который просто добавляет некоторые определения макросов в командную строку компилятора, например, «-DSOMEMACRO». Я думаю, что я могу сделать это как «подвариант» отладки, или просто определить новый вариант, копирующий «отладку», но я даже не уверен, где это сделать. Похоже, что здесь может быть файл feature.jam в $ BOOST_BUILD_DIR / build. Возможно, что я действительно хочу, это просто новая «функция», но мне до сих пор не ясно, что именно мне нужно делать и где, и я не знаю, позволяет ли «функция» направлять продукты сборки в другой каталог в отладочную сборку.

Любые предложения будут оценены. (Если вам интересно, я должен использовать bjam, поскольку он принят в качестве нашего корпоративного стандарта.)

1 Ответ

7 голосов
/ 26 апреля 2010

Я не совсем уверен, что вы хотите, но есть ряд возможностей.

A. Вы всегда хотите компилировать с определенным макросом SOMEMACRO. В этом случае в Jamfile для вашего проекта добавьте

project
  : requirements # These are requirements for this project
      # If compiling debug, define SOMEMACRO
      <variant>debug:<define>SOMEMACRO
  : usage-requirements
      # These are requirements projects using this project must have
      <variant>debug:<define>SOMEMACRO
  ;

Если вам нужно всегда определять SOMEMACRO, вы можете удалить условие <variant>debug:. Если вам нужно установить другие флаги, вы можете использовать <cflags>, <cxxflags> и <linkflags> в зависимости от ситуации.

B. Вы хотите, чтобы быстрое переключение включало ваши флаги / определения, возможно, по умолчанию, возможно, нет, и сборки с ним не совместимы с сборками без него. В этом случае вы хотите функцию.

import feature ;
feature.feature steves-feature : off on
  : composite propagated link-incompatible ;
feature.compose <steves-feature>on : <define>SOMEMACRO ;

Правило feature.feature определяет функцию с именем <steves-feature> с двумя возможными значениями и тремя свойствами. composite означает, что это функция, состоящая из других функций (в данном случае <define>SOMEMACRO). propagated означает, что любые цели, которые включают цель с этим набором функций, также будут иметь этот набор функций. и link-incompatible означает, что цели с <steves-feature>on нельзя комбинировать с целями с <steves-feature>off. (В результате bjam поместит созданные файлы в каталог с именем steves-feature-on или steves-feature-off, если эта функция установлена ​​какой-либо целью.)

Эта функция может использоваться точно так же, как и функция <define>, используемая в правиле проекта в предыдущем разделе. (Вы даже можете добавить его в раздел default-build правила проекта.)

Обратите внимание, что вы также можете установить функции из командной строки: bjam steves-feature=on.

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

variant steves-debug : debug : <steves-feature>on ;

Этот вариант будет таким же, как вариант debug, но с дополнительной функцией <steves-feature>on.

Я никогда не использовал правило variant, поэтому его, возможно, придется импортировать откуда-то. Кроме того, вы могли бы сделать

variant steves-debug : debug : <define>SOMEMACRO ;

но я не знаю, создаст ли bjam структуру каталогов или нет. (Это, вероятно, будет.)

...