2012-09-10 60 views
10

我在使用CMake來管理我的構建系統方面相當新,所以如果我愚蠢,這是一個壞主意,請告訴我。在CMake中自動使用該目錄作爲項目名稱

我希望能夠建立我的CMakeLists.txt文件,這樣當我做

project(...) 

目錄的名稱將自動成爲該項目的名稱。我想這樣做是因爲我覺得能夠複製一個項目的整個目錄作爲另一個項目的起點很方便。不過,儘管我總是將目錄重命名爲有意義的東西,但我經常忘記更改cmakelists.txt文件的project(name)行,然後最終在我的構建環境中打開了多個項目,並且名稱相同,這令人感到困惑。

理想情況下,如果目錄名稱中有空格,它們將被下劃線替換。

CMake能做到這一點嗎?由於某種原因,我沒有看到這是一個壞主意嗎?

回答

8

您可以通過添加實現這一點下面到你的CMakeLists.txt的開始:

get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME) 
string(REPLACE " " "_" ProjectId ${ProjectId}) 
project(${ProjectId}) 

我看不出有問題,這樣的一次性項目,雖然我猜生產項目通常會有預定義的名字將在project命令中明確設置。

當您提到您「複製一個項目的整個目錄作爲另一個項目的起點」時,我假設您在複製時不包含構建樹? CMake isn't really able to handle the build tree being moved

+0

,如果您有另一個目錄中的目錄overwise你得到一個錯誤,你應該使用$ {} CMAKE_CURRENT_LIST_DIR而不是$ {} CMAKE_SOURCE_DIR。 看看鏈接:http://stackoverflow.com/questions/15662497/in-cmake-what-is-the-difference-between-cmake-current-source-dir-and-cmake-curr – Maks

+0

@Maks - A公平點,儘管['CMAKE_CURRENT_SOURCE_DIR'](https://cmake.org/cmake/help/v3.4/variable/CMAKE_CURRENT_SOURCE_DIR.html)比['CMAKE_CURRENT_LIST_DIR']更合適(https://cmake.org/ cmake/help/v3.4/variable/CMAKE_CURRENT_LIST_DIR.html),因爲它指向包含正在爲當前項目處理的CMakeLists.txt的目錄,而'... LIST_DIR'將隨'include'調用而改變。 – Fraser

+1

當我在不同的工作樹中籤出2-3個不同的分支並希望在QtCreator中切換它們時(例如比較/對比源和執行),這對我很有用。然後它還允許我根據項目名稱以編程方式將構建存放在不同的位置,儘管它們都應該具有相同的項目名稱。在本地,我可能會將官方項目名稱與我的目錄名稱連接起來... – sage

1

我覺得CMAKE_CURRENT_LIST_DIR更適合這種情況下

get_filename_component(ProjectId ${CMAKE_CURRENT_LIST_DIR} NAME) 
string(REPLACE " " "_" ProjectId ${ProjectId}) 
project(${ProjectId} C CXX)