2015-12-28 675 views
3

buildem_cmake_recipe.cmake,我看到了一個表達:

externalproject_add_step(${_name} BuildOtherConfig 
         COMMAND ${CMAKE_COMMAND} --build ${BINARY_DIR} --config "$<$<CONFIG:Debug>:Release>$<$<CONFIG:Release>:Debug>" --target INSTALL 
         DEPENDEES install 
         ) 

什麼是$<$<CONFIG:Debug>:Release>$<$<CONFIG:Release>:Debug>這裏的意思?

回答

9

這是一個CMake generator expression。您可以按照鏈接進行關於這些是什麼以及他們可以做什麼的全面討論。簡而言之,它是CMake在生成時評估的一段文本(當它完成解析所有CMakeLists並生成構建系統時);它可以爲每個配置評估不同的值。

你有沒有意思大致是這樣的(僞代碼)的一個:

if current_configuration == "Debug" 
    output "Release" 
if current_configureation == "Release" 
    output "Debug" 

因此,如果當前的配置調試,整個表達式會Release。如果當前配置的發佈,它將評估爲Debug。注意被添加的步驟被稱爲「BuildOtherConfig」,所以這個反轉的邏輯是有意義的。


它是如何工作的,在更詳細一點:

$<CONFIG:Debug> 

這將計算爲1如果當前的配置是Debug,併爲0否則。

$<1:X> 

評價爲X

$<0:X> 

評估爲空字符串(無值)。

把它放在一起,我們有$<$<CONFIG:Debug>:Release>。如果當前的配置是Debug,它的計算結果是這樣的:

$<$<CONFIG:Debug>:Release> 
$<1:Release> 
Release 

如果當前的配置是不是Debug,它的計算結果是這樣的:

$<$<CONFIG:Debug>:Release> 
$<0:Release> 
+0

如果我問了調試,它給了我釋放..你也介意評論這個邏輯......大聲笑。謝謝〜 – davidshen84

+0

@ davidshen84擴大了,都是爲了解釋倒置,並且說明擴展好一點。 – Angew

0

$<...>這樣的表達式是在CMake 2.8中引入的generator exressions。這些表達式的主要特徵是它們在構建時進行評估,而不是在配置時進行評估,就像正常的CMake變量一樣。

您的特定表達

$<$<CONFIG:Debug>:Release> 

擴展爲 「釋放」 如果Debug配置使用。