2014-04-22 25 views
3

我現在遇到的問題是,我只是想通過抓取所有東西來管理我的源文件列表,並刪除我不需要的幾個幾何和結尾。我希望Cmake爲此提供了很好的內置工具。CMake:管理源文件列表

所以我可能會開始:

file(GLOB A "Application/*.cpp") 

我覺得我要創建的文件被刪除的另一份名單,我想告訴CMake的:從在列表B.

清單項目A刪除

如果這是Python的我可能會做這樣的事情:

C = [f for f in A if f not in B] 

我可能搞砸這種語法了,如果有內置的支持,更的文件管理這些名單,但我想知道優雅的方式?

即使我可以做類似Python例子的事情,A是絕對路徑列表,所以構造B是笨重的。

爲什麼絕對路徑呢?看起來這將會在您重新定位源代碼後立即破壞您的構建。

+0

爲什麼A是絕對路徑列表?使用相對的。另外不要忘記,您不必輸入路徑來製作硬編碼列表。只要做一些事情:ls >> CMakeLists.txt,然後用你最喜歡的編輯器重新排列。 – Peter

回答

4

如果您喜歡Python,可以使用execute_process生成源文件列表。也有可能與lists合作。

但我會建議你「硬編碼」你的源文件列表。 File command documentation狀態:

我們不建議使用GLOB收集源文件的列表,從你的源代碼樹。如果在添加或刪除源時未更改CMakeLists.txt文件,則生成的生成系統無法知道何時要求CMake重新生成。

6

你可以通過使用list command與REMOVE_ITEM選項:

list(REMOVE_ITEM <list> <value> [<value> ...]) 

看一看:

file(GLOB FOO *) 
set (ITEMS_TO_REMOVE "item;item2;item3") 
message(STATUS "FOO is ${FOO}") 
list(REMOVE_ITEM FOO ${ITEMS_TO_REMOVE}) 
message(STATUS "FOO is now ${FOO}") 

請記住,由file(GLOB)返回的路徑是絕對的,你可能希望通過將${CMAKE_CURRENT_LIST_DIR}加入其中的每一個來建立要刪除的項目列表:

set (ITEMS_TO_REMOVE "${CMAKE_CURRENT_LIST_DIR}/item; 
         ${CMAKE_CURRENT_LIST_DIR}/item2; 
         ${CMAKE_CURRENT_LIST_DIR}/item3") 
+1

在官方cmake文檔中並不明顯可以將多個值作爲分號傳遞給'REMOVE_ITEM'這樣的分號。感謝您的解釋。 – tresf