2017-08-09 178 views
0

我有一個相當大的項目文件結構,我需要轉換成多平臺cmake項目。現在它接近cmake需要永遠單個cpp文件單獨添加到可執行文件。但有沒有一個腳本可以自動執行此操作?那通過文件結構窺探,並且只是自動添加每個源文件?由於該項目可能會獲得更多的源文件,我可能無法手動添加每一個。CMake遞歸地將目錄的所有子目錄內的所有源文件添加到可執行文件?

+0

'file(GLOB ...)'是你的朋友。 – arrowd

+0

謝謝,我會研究它 – user1510024

+1

Unfortunatley他們在維基中明確聲明它不應該用於搜索源文件,因爲如果沒有cmake文件發生更改,cmake不會重新生成makefiles。但我可能會這樣做,並創建一個shell腳本,強制cmake每次向項目中添加一個文件時重建。感謝您的幫助 – user1510024

回答

0

你可以使用execute_process()cmake -P腳本,它使用通配符遞歸掃描其寫入一個文件包含在你的CMakeLists.txt即像源文件:

「的CMakeLists.txt」:

execute_process(COMMAND ${CMAKE_COMMAND} 
    -D "RDIR=${CMAKE_CURRENT_SOURCE_DIR}" 
    -P "scansources.cmake" 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") 
include("sources.cmake") 
add_executable(myexe ${sources}) 

「scansources.cmake」(產生 「sources.cmake」):

file(GLOB_RECURSE sourcelist 
    *.c 
    *.cc 
    *.cpp 
    *.cxx) 
string(REGEX REPLACE "${RDIR}/" "" relative_sources "${sourcelist}") 
string(REPLACE ";" "\n" sources_string "${relative_sources}") 
set(sources_string "set(sources\n${sources_string})") 
file(WRITE sources.cmake "${sources_string}") 

之所以這樣,工程是因爲execute_process()發生在配置時間。

您當然可以通過其他工具或IDE生成sources.cmake,那麼您不需要scansources.cmakeexecute_process()

+0

所以基本上建立一個腳本,每次我想要編譯我的程序,然後make -j4執行cmake,然後重新掃描這些文件。我知道,cmake不會自動搜索它們,如果你只是自己重新創建,對源文件進行匹配,但這實際上可以解決這個問題,謝謝 – user1510024

相關問題