2017-05-30 40 views
0

依賴我貢獻了自定義功能自定義對象 - 說,我的功能 --to使用CMake和有獨立的來源和生成目錄的項目。 MyFeature由單個二進制文件組成。 (我的功能其實是一個自定義的Simulink庫,所以我必須調用MATLAB來創建它 - 在這裏,重要的是創建該對象不涉及GCC或CMake的默認使用其他標準的構建工具)。所以我有一個特殊的規則來建立對象 - 比方說myRule。我想使運行MyRule的只有(一)我的功能不存在,或(b)在其我的功能取決於一個源文件 - 比如,MYSOURCE --is比當前新 - 存在MyFeature。一個小補充皺紋是我唯一真正需要我的功能在源代碼樹,這是在MyRule的通常會將它。我怎樣才能完成這一切?與CMake的

我不能使用任何add_executableadd_library,據我所知,因爲他們是爲你建立一個使用GCC(或其他已配置)工具鏈的對象狹隘設計。我不能使用add_custom_target,因爲由此產生的目標是總是過時。到目前爲止,我已經使用add_custom_targetadd_custom_command的組合取得了一些進展,具體如下:

add_custom_target(fakeTarget 
    DEPENDS MyFeature) 

add_custom_command(OUTPUT MyFeature 
    COMMAND myRule && touch ${CMAKE_CURRENT_BINARY_DIR}/MyFeature 
    DEPENDS mySource) 

add_dependencies(targetThatAlwaysRuns fakeTarget) 

建立在構建樹空我的功能文件的命令似乎足以假化妝到不重建如果真正我的功能存在(在源代碼樹),它實現了我的目標之一。但是,一旦這種假文件存在,即使我更新MYSOURCE在源代碼樹,使不重建我的功能。這是我卡住的地方。這似乎令人費解尤其是因爲我可以在CMakeFiles看到內臟有用於我的功能確實做列表MYSOURCE目標(用正確的路徑 - 在源代碼樹)作爲一個依賴。如果我嘗試複製以更簡單(玩具)這種情況下的Makefile在同一個目錄,如果我刷新所述目標所依賴的源文件中的一個,即使目標輸出文件已經存在,使會做正確的事情 - 它會從更新的源重建對象,然後重新構建整個目標。那麼爲什麼這種情況下的構建行爲不同?我能做些什麼來實現目標(b)和目標(a)?謝謝!

+0

通過'add_custom_rule'假設您的意思是'add_custom_command',這個方法應該可以工作。嘗試在* DEPENDS *和* OUTPUT *選項中使用絕對路徑。 「額外的小皺紋是我真的只需要源樹中的MyFeature」 - 沒有任何東西阻止你在源碼樹中創建文件。 – Tsyvarev

+0

哎呀!是的,我的意思是add_custom_command - 已經編輯來解決這個問題。沒錯,沒有任何東西阻止我在源碼樹中創建文件;我正在解釋我的黑客將一個空文件放入構建樹的原因。 CMake _does_阻止我在源代碼樹中定義目標,因此,add_custom_command中的輸出文件也不能位於源代碼樹中。 –

+0

在add_custom_command中將絕對路徑添加到* DEPENDS *選項!謝謝! –

回答

0

由於Tsyvarev在他的評論中建議,所有我所要做的就是指定DEPENDS依賴絕對路徑:

add_custom_target(fakeTarget 
    DEPENDS MyFeature) 

add_custom_command(OUTPUT MyFeature 
    COMMAND myRule && touch ${CMAKE_CURRENT_BINARY_DIR}/MyFeature 
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/mySource) 

add_dependencies(targetThatAlwaysRuns fakeTarget) 

不過,現在假設一個用戶從刪除的真正我的功能然後運行再次製作製作將不會再生MyFeature,因爲假的MyFeature仍存在於構建樹中。我怎樣才能克服這個問題?