我已经尝试过阅读文档,但这是非常难以理解的,所以我希望有人可能会有一个简单的答案。我想基于'debug'定义一个新的'variant',它只是将一些宏定义添加到编译器命令行,例如“-DSOMEMACRO”。我想我可以做这个作为调试的“子变体”,或者只是定义一个复制'debug'的新变种,但我甚至不确定在哪里做这个。看起来$ BOOST_BUILD_DIR / build中的feature.jam可能就是这个地方。也许我真正想要的只是一个新的“功能”,但我仍然不清楚我需要做什么以及在哪里,我不知道'功能'是否允许我将构建产品指向不同的目录到'debug'构建。
任何建议将不胜感激。 (如果您想知道,我必须使用bjam,因为它已被采纳为我们的企业标准。)
答案 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-on
或steves-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是否会创建目录结构。 (它可能会。)