2015-02-11 56 views
0

build.jam中:如何有条件地向boost.build中的源添加文件?

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。我尝试了几个不同的东西,但没有一个看起来像我想要的那样工作。

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 ; 

给出“警告:无法构建LIB_WITH_FEAT”。虽然如果它工作,我不认为它会成为我想要的,因为它会尝试单独构建LIB,并且LIB需要USE_FEATURE与feature.c一起正常工作。

+0

您的问题是非常不清楚..你想添加feature.c到什么? – GrafikRobot 2015-02-11 21:50:43

+0

对不起,您可以构建目标LIB来构建库,但是有些项目需要使用Feature X构建库。Feature X的实现位于feature.c中,并且主库中的调用由USE_FEATURE守卫包装。我想添加一个目标来构建库,如LIB目标,但也包括源文件中的feature.c文件并定义USE_FEATURE。 – 2015-02-12 14:31:02

+0

我的答案下面是否做你想要的? – GrafikRobot 2015-02-19 16:59:55

回答

1

你的关键问题是<define>是一个免费的功能。因此,这不会导致要构建的变体的差异。要做你想做的事情,你需要创建一个描述你选择的构建选项的新功能(见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规则的一种简写,如果你有很多额外的要求补充:

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

要选择另一种LIB的一个特定变体目标您指定的目标参考中的功能要求:

exe my-feat-exe : source.cpp LIB/<with-feat>yes ; 
相关问题