2015-02-11 54 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 ; 
相關問題