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

c-u*_*hin 5 boost-build bjam

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

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

AFo*_*lia 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
  ;
Run Code Online (Sandbox Code Playgroud)

如果您需要始终定义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 ;
Run Code Online (Sandbox Code Playgroud)

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 ;
Run Code Online (Sandbox Code Playgroud)

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

我从未使用过该variant规则,因此可能需要从某个地方导入.此外,您可以做到

variant steves-debug : debug : <define>SOMEMACRO ;
Run Code Online (Sandbox Code Playgroud)

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