2016-05-27 76 views
3

我剛剛開始使用cmake,我已經閱讀了一些教程並獲得了基本工作。cmake用* .cpp創建Makefile規則

但是,目前我的CMakesList.txt生成一個Makefile,它具有明確命名的每個.cpp。這意味着,無論何時向我的項目添加新的.cpp,我都需要重新運行cmake。雖然這不是一個大問題,但它仍然有點煩人。

由於Makefiles可以做類似SOURCES=*.cpp的事情,我想可能有辦法告訴cmake用這樣的規則來生成Makefile!

我知道我可以做

cmake_minimum_required(VERSION 2.8) 
file(GLOB SRC 
    "*.h" 
    "*.cpp" 
) 
add_executable(main ${SRC}) 

但我還是要重新運行cmake的。

+0

你爲什麼要加入'* .h' s'來源? –

+1

,因爲任何IDE以這種方式生成的項目文件都會有標題。 – GameDeveloper

+0

對不起,我只是從一些stackoverflow線程複製粘貼。我想我應該添加頭文件的文件夾作爲include_dir,而不是,你是對的。 –

回答

3

就我所知,實現它的方式正如你所說的,缺點是每次添加文件時都必須運行cmake。

我通常會做的,以克服這一點是做一個自定義目標,調用cmake以及。它是這樣的

ADD_CUSTOM_TARGET(update 
    COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR} 
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all 
    COMMENT "Cmake and build" 
) 

有了這個,你可以撥打make update,它會首先調用cmake的捕獲的所有文件,然後啓動構建過程。

+1

謝謝,有點解決方法,但仍然是一個很好的解決方案! –

+0

不客氣。這是我可以爲自己的使用而最好的。這實際上相當不錯。比方說,如果你想在調試和發佈之間切換,你可以通過添加兩個自定義目標來做同樣的事情。 – Ashkan

2

只有當您更改文件時,Cmake必須重新運行,因爲CMake編譯CMakeLists.txt一次,然後生成更高性能的緩存中間格式。 (如果你不添加任何新文件,只需運行make命令即可)。

請注意,CMake無法使用MakeFile的等效功能,因爲否則它會啓動所有文件相關性。 CMake的設計目的不僅僅在於使用Makefiles,它只使用目標構建腳本的一部分功能。

此外,如果您已經直接使用CMake,則不再需要生成makefile,使用CMake,並且只有在需要將項目發佈到具有Makefile而不是CMake的客戶端時才生成makefile。

+0

好的,所以我想要做的事是不可能的,對吧?雖然我有點困惑,但我認爲cmake會生成Makefile,然後我仍然必須使用該文件進行構建。您是說我可以直接使用cmake來構建項目? –

+0

您可以生成Makefile,但make文件不會自動保持更新,如果重要更改(Cmake腳本更改或文件添加到GLOB中),則需要重新生成makefile。當然,「項目」代是爲了compability,你可以直接用'--build'指令直接使用Cmake – GameDeveloper

+1

好的,謝謝。然後我可以讓SublimeText使用cmake --build而不是mingw32-make,我猜! –