7

我试过阅读文档,但它相当难以理解,所以我希望有人可能有一个简单的答案。我想基于“调试”定义一个新的“变体”,它只是将一些宏定义添加到编译器命令行,例如“-DSOMEMACRO”。我认为我可以将其作为调试的“子变体”来执行,或者只是定义一个复制“调试”的新变体,但我什至不确定在哪里执行此操作。看起来 $BOOST_BUILD_DIR/build 中的 feature.jam 可能是这个地方。也许我真正想要的只是一个新的“功能”,但我仍然不清楚我需要做什么以及在哪里做,而且我不知道“功能”是否允许我将构建产品定向到不同的目录到“调试”构建。

任何建议将不胜感激。(如果您想知道,我必须使用 bjam,因为它已被采纳为我们的公司标准。)

4

1 回答 1

7

我不太确定你想要什么,但有很多可能性。

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 是否会创建目录结构。(它可能会。)

于 2010-04-26T18:01:38.110 回答