如何有条件地将文件添加到 boost.build 中的源?

How do you conditionally add a file to sources in boost.build?

build.jam:

project : usage-requirements <include>. ;

alias PUB : : : : <use>/ProjectA//PUB
                  <use>/ProjectB//PUB ;

lib LIB : [ glob *.c : feature.c ]
        : <link>static
          <use>/ProjectA//PUB
          <use>/ProjectB//PUB ;

我想添加一个目标,它将 feature.c 添加到源并定义 USE_FEATURE。我尝试了一些不同的方法,但 none 似乎如我所愿。

alias LIB_WITH_FEAT : LIB feature.c : <define>USE_FEATURE ;

alias LIB_WITH_FEAT : LIB : <source>feature.c <define>USE_FEATURE ;

不会将 feature.c 或 USE_FEATURE 添加到构建中。但没有给出错误或警告。它只是构建 LIB。

lib LIB_WITH_FEAT : feature.c LIB : <define>USE_FEATURE ;

给出"warn: Unable to construct LIB_WITH_FEAT"。虽然如果它有效,我不认为它会是我想要的,因为它会尝试单独构建 LIB,并且 LIB 需要 USE_FEATURE 才能与 feature.c.

一起正常工作

您的关键问题是 <define> 是一项免费功能。因此,不会导致构建内容的差异化。要执行您想要的操作,您需要创建一个新功能来描述您正在使用的构建选项 select(参见 feature documentation)。例如:

import feature : feature ;
feature with-feat : no yes : optional propagated ;

然后您可以根据该特征的值在目标上定义您想要的任何内容。例如定义符号或添加源:

lib LIB
    : [ glob *.c : feature.c ]
    : <link>static
      <use>/ProjectA//PUB
      <use>/ProjectB//PUB
      <with-feat>yes:<define>USE_FEATURE
      <with-feat>yes:<source>feature.c
    ;

或者您可以使用 conditional 规则 shorthand 如果您有许多额外的要求要添加:

lib LIB
    : [ glob *.c : feature.c ]
    : <link>static
      <use>/ProjectA//PUB
      <use>/ProjectB//PUB
      [ conditional <with-feat>yes :
        <define>USE_FEATURE
        <source>feature.c ]
    ;

对于 select 来自另一个目标的 LIB 的特定变体,您在目标参考中指定了功能要求:

exe my-feat-exe : source.cpp LIB/<with-feat>yes ;