我不太确定你想要什么,但有很多可能性。
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,则可以删除该<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
.
C. 你想要一个完整的变体。我认为这个想法是,如果您有一些常见的构建配置以及应该一起设置的一堆不同的功能。好吧,如果您已经创建了上述功能,那么现在很容易。
variant steves-debug : debug : <steves-feature>on ;
此变体将与debug
变体相同,但具有附加功能<steves-feature>on
。
我从来没有使用过这个variant
规则,所以它可能需要从某个地方导入。另外,你也许可以做
variant steves-debug : debug : <define>SOMEMACRO ;
但我不知道 bjam 是否会创建目录结构。(它可能会。)