如何有条件地将文件添加到 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 ;
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 ;