2013-04-02 69 views
5

在配置階段完成之前,CMake(版本> = 2.8.7)以某種方式執行宏或命令作爲最後步驟嗎?在'配置'步驟完成前執行CMake中的命令或宏

以下幾行代碼顯示在屏幕上之前,功能應該被執行:

-- Configuring done 
-- Generating done 

到現在爲止我沒能找到這可以作爲一個依賴與add_custom_command來實現這一目標的CMake add_custom_targetadd_dependencies

編輯: 我們有一個庫導出幾個CMake宏,並且在所有其他CMake命令運行後,必須在每個CMakeLists.txt文件的末尾執行一些宏。 理想情況下,可以通過在CMakeLists.txt文件中包含文件macros.cmake來實現期望的行爲,而無需在此CMakeLists.txt文件末尾添加額外的命令。

也可以通過收集一個宏中的所有功能來實現這一點,這需要在CMakeLists.txt的末尾明確地調用。 但是,已經有幾個依賴庫需要進行調整,解決這個問題時會省略這些額外的工作。 此外,添加宏可以被遺忘,或者它是最後一條語句的要求很容易被違反。

macros.cmake

macro(FINAL_MACRO) 
    message(STATUS "Last step before finishing Configure phase") 
endmacro() 

# HERE: something like add_custom_target(final_steps) 
# followed by something like add_dependencies(final_steps cmake_configure_finished) 

例頂級CMakeLists.txt

cmake_minimum_required(VERSION 2.8.7) 
include(macros.cmake) 

add_subdirectory(source) 
add_subdirectory(interfaces) 

# here FINAL_MACRO should get executed without explicitely writing it down 

如果沒有其他的選擇,我們將不得不要求每一個用戶在其CMakeLists.txt文件的末尾調用一個特殊的宏。

回答

2

好的 - 這個答案感覺有點脆弱,因爲它使用了無證的CMake行爲。但是,它似乎工作。

在配置過程結束時,在處理完CMakeLists.txt文件中的所有命令後,CMake會檢查CMAKE_BACKWARDS_COMPATIBILITY的值。如果通過variable_watch命令正在監視此變量,則會在此處觸發該變量。

所以,你可以用這個功能集成到一對夫婦的功能:

function(EOFHook Variable Access) 
    if(${Variable} STREQUAL CMAKE_BACKWARDS_COMPATIBILITY AND 
    (${Access} STREQUAL UNKNOWN_READ_ACCESS OR ${Access} STREQUAL READ_ACCESS)) 
    execute_process(COMMAND ${CMAKE_COMMAND} -E echo "In EOF hook command") 
    ... do whatever else is required ... 
    endif() 
endfunction() 

function(SetupEOFHook) 
    variable_watch(CMAKE_BACKWARDS_COMPATIBILITY EOFHook) 
endfunction() 

在任何CMakeLists文件中使用此,只需撥打SetupEOFHook()文件中的任何地方。

這有點危險;如果變量也在CMakeLists.txt的其他地方讀取,例如通過

message(${CMAKE_BACKWARDS_COMPATIBILITY}) 

那就在這裏末觸發EOFHook功能。您可以通過添加一個計數器並檢查它只被調用一次或者發出一個message(FATAL_ERROR ...)

+0

非常感謝你這個有趣的發現。這確實達到了預期的行爲。但我同意它肯定感覺有點脆弱。所以,也許這是最好的解決方案,要求明確執行最終的函數/宏,直到CMake提供一種官方的方式來做這樣的事情。 – MKroehnert

+0

@MKroehnert - 是的,如果是我,我肯定會在每個CMakeLists.txt的末尾添加一個函數/宏調用。您仍然可以嘗試執行它的使用。使關閉功能取消預設處理器定義,停止構建工作。有點「哈克」,但不像取決於隱藏的CMake內部過程那麼糟糕? – Fraser

+0

好的,謝謝你的建議。 – MKroehnert

1

CMake命令execute_process將在配置階段執行,而不是在構建階段執行,所以如果你把它放在CMakeLists.txt文件的末尾,它會被最後執行。

+0

感謝您的答案,以增加功能的複雜性。但是,我正在尋找一些有點不同的東西。不幸的是,這並沒有在第一個問題中說明(見編輯)。 – MKroehnert

+0

對不起 - 我還是不明白。這聽起來像你要求'include(macros.cmake)'通過主CMakeLists文件的一部分,並讓它在該CMakeLists文件的末尾執行一個'macro'或'function',但不顯式調用'macro' /'函數'在文件的末尾?你可以嘗試多解釋一下,甚至可以描述你的用例嗎? – Fraser

+0

我用更多的細節和例子更新了這個問題。 – MKroehnert

0

沒有我知道的(而且我很努力地搜索過)。儘管如此,我很樂意被證明是錯誤的。

相關問題