【问题标题】:how to create a new variant in bjam如何在 bjam 中创建新变体
【发布时间】:2010-04-26 16:30:47
【问题描述】:

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

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

【问题讨论】:

    标签: bjam boost-build


    【解决方案1】:

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

    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,您可以删除 &lt;variant&gt;debug: 条件。如果需要设置其他标志,可以酌情使用&lt;cflags&gt;&lt;cxxflags&gt;&lt;linkflags&gt;

    B.您想要一个快速开关来打开您的标志/定义,也许是默认情况下,也许不是,并且打开它的构建与关闭它的构建不兼容。在这种情况下,您需要一个功能。

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

    feature.feature 规则定义了一个名为&lt;steves-feature&gt; 的功能,它具有两个可能的值和三个属性。 composite 表示它是由其他特征组成的特征(在本例中为 &lt;define&gt;SOMEMACRO)。 propagated 表示包含具有此功能集的目标的任何目标也将具有此功能集。而link-incompatible 表示&lt;steves-feature&gt;on 的目标不能与&lt;steves-feature&gt;off 的目标组合。 (因此,如果任何目标设置了此功能,bjam 会将创建的文件放在名为 steves-feature-onsteves-feature-off 的目录下。)

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

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

    C.你想要一个完整的变体。我认为这个想法是,如果您有一些常见的构建配置以及应该一起设置的一堆不同的功能。好吧,如果您已经创建了上述功能,那么现在就很容易了。

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

    此变体将与 debug 变体相同,但具有附加功能 &lt;steves-feature&gt;on

    我从未使用过variant 规则,因此它可能需要从某个地方导入。另外,你也许可以做

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

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

    【讨论】:

    • 谢谢,案例 B 或者 C 是我正在寻找的,我会先尝试 B,因为它最简单。感谢您提供非常详细的解释。
    • 如果可行,您应该单击答案旁边的复选标记将其标记为已回答。这样其他人就知道问题得到了回答。我得到了一些信任。 :-)(您之前的问题也没有接受过答案。)
    • 抱歉,我现在选择了它,我还在习惯协议。
    • 如果可以在一行中总结 steves-variant 行为,你知道是否有办法在 single 目标上定义它吗?所以我不必为我的“构建变体”复制/粘贴多个目标?像lib steveslib_on : ...files... : &lt;linker stuff&gt; &lt;steves-variant&gt; on ...whatever.. ; 这样我需要为每个变体提供 2 个库,这可能是冗长的
    猜你喜欢
    • 2017-01-02
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2012-12-20
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多