2016-05-27 53 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,我猜! –