如何在bjam中创建一个新变种

时间:2010-04-26 16:30:47

标签: bjam boost-build

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

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

1 个答案:

答案 0 :(得分:7)

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

一个。您总是希望使用定义的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-onsteves-feature-off的目录下。)

此功能可以像上一节中项目规则中使用的<define>功能一样使用。 (您甚至可以将其添加到项目规则的default-build部分。)

请注意,您还可以从命令行设置功能:bjam steves-feature=on

℃。你想要一个完整的变体。我认为这个想法是,如果你有一些常见的构建配置,其中包含一些应该设置在一起的不同功能。好吧,如果您已经创建了上述功能,现在很容易。

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

此变体与debug变体相同,但附加功能<steves-feature>on

我从未使用variant规则,因此可能需要从某处导入。此外,您可以做到

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

但我不知道bjam是否会创建目录结构。 (它可能会。)