2010-04-26 50 views
5

我試過閱讀文檔,但它非常難以穿透,所以我希望有人可能有一個簡單的答案。我想根據「調試」定義一個新的「變體」,它只是將一些宏定義添加到編譯器命令行中,例如「-DSOMEMACRO」。我想我可以將它作爲調試的「子變量」來完成,否則只需定義一個新的變量複製「調試」,但我甚至不知道該在哪裏做。它看起來像$ BOOST_BUILD_DIR/build中的feature.jam可能就是這個地方。也許我真正想要的僅僅是一個新的「功能」,但我仍然不清楚我需要做什麼以及在哪裏,而且我不知道一個「功能」是否允許我將構建產品指向不同的目錄到「調試」構建。如何在bjam中創建新變體

任何建議,將不勝感激。 (如果你想知道,我必須使用bjam,因爲它已被採納爲我們的企業標準。)

回答

7

我不太清楚你想要什麼,但有很多可能性。

答:您總是希望用定義的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>和。

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-onsteves-feature-off目錄下。)

此功能可用於就像在上述項目中的規則中使用的<define>功能部分。 (您甚至可以將它添加到項目規則的default-build部分。)

請注意,您還可以從命令行設置功能:bjam steves-feature=on。你想要一個完整的變體。我認爲這個想法是,如果你有一些共同的構建配置與一堆應該設置在一起的不同功能。那麼,如果你已經創建了上述功能,現在這很簡單。

variant steves-debug : debug : <steves-feature>on ; 

這種變異將是一樣的debug變異,但與附加功能<steves-feature>on

我從來沒有使用variant規則,所以它可能需要從某處導入。此外,你也許可以做

variant steves-debug : debug : <define>SOMEMACRO ; 

但我不知道如果bjam會創建目錄結構或不。 (它可能會。)

+0

謝謝,案例B或C可能是我正在尋找的,我會先嚐試B,因爲它是最簡單的。感謝您的詳細解釋。 – 2010-04-27 01:02:40

+0

如果這可行,您應該點擊答案旁邊的複選標記將其標記爲已回答。這樣其他人知道這個問題得到了回答。我得到一些信用。 :-)(你在前面的問題上還沒有接受過答案。) – AFoglia 2010-04-27 15:13:03

+0

道歉,我現在選擇了它,我還是習慣了這個協議。 – 2010-07-11 03:28:45