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

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

最佳答案

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

答:您始终希望使用定义的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

C.您想要一个完整的变体。我认为这个想法是,如果您有一些通用的构建配置,并且应将其设置为一堆不同的功能。好吧,如果您已经按上述方法创建了功能,那么现在就很容易了。
variant steves-debug : debug : <steves-feature>on ;

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

我从未使用过variant规则,因此可能需要从某个地方导入它。另外,您也许可以
variant steves-debug : debug : <define>SOMEMACRO ;

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

关于bjam - 如何在bjam中创建新的变体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2715106/

10-13 09:28