2012-09-10 63 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)