我正在考虑将一个跨平台的项目从Visual C++、XCode和CMake文件中的独立构建管理系统切换到CMake。
我需要的一个基本功能是自动将目录中的所有文件添加到目标。虽然使用make很容易做到这一点,但使用Visual C++和XCode却不容易做到(如果我错了,请纠正我)。有没有可能直接在CMake中做?多么?
发布于 2010-07-08 14:38:42
从CMake 3.1+开始,开发人员强烈建议用户不要使用file(GLOB
或file(GLOB_RECURSE
来收集源文件列表。
注意:我们不建议使用从源树中收集源文件列表。如果在添加或删除源代码时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时要求CMake重新生成。CONFIGURE_DEPENDS标志可能不能在所有生成器上可靠地工作,或者如果将来添加了不支持它的新生成器,使用它的项目将被卡住。即使CONFIGURE_DEPENDS能够可靠地工作,在每次重建时执行检查也是有成本的。
这里有两个答案([1],[2]),所以详细说明了手动列出源文件的原因。
这是可能的。例如,使用file(GLOB
cmake_minimum_required(VERSION 2.8)
file(GLOB helloworld_SRC
"*.h"
"*.cpp"
)
add_executable(helloworld ${helloworld_SRC})
请注意,如果添加或删除了源文件,则需要手动重新运行cmake
,因为生成的构建系统不知道何时要求CMake重新生成,并且在每次构建时都这样做会增加构建时间。
从CMake 3.12开始,您可以将CONFIGURE_DEPENDS
标志传递给file(GLOB
,以便在调用构建时自动检查并重置文件列表。你可以这样写:
cmake_minimum_required(VERSION 3.12)
file(GLOB helloworld_SRC CONFIGURE_DEPENDS "*.h" "*.cpp")
这样至少可以避免每次添加文件时都手动重新运行CMake。
发布于 2012-08-16 23:32:26
Kleist的答案当然是有效的,但有一个重要的警告:
当您手动编写Makefile
时,可以使用一个函数生成一个SRCS
变量来选择所有.cpp
和.h
文件。如果稍后添加了源文件,则重新运行make
将包含该源文件。
但是,CMake (使用类似file(GLOB ...)
的命令)将显式地生成一个文件列表,并将其放入自动生成的Makefile
中。如果您有一个新的源文件,则需要通过重新运行cmake
来重新生成Makefile
。
编辑:不需要删除Makefile。
发布于 2020-01-29 06:19:01
适用于@Kleist answer的扩展
由于CMake 3.12附加选项CONFIGURE_DEPENDS是通过命令file(GLOB)
和file(GLOB_RECURSE)
执行supported的。有了这个选项,没有需要手动在添加/删除目录中的源文件后重新运行CMake - CMake将在下一次构建项目时自动重新运行。
然而,选项CONFIGURE_DEPENDS意味着每次请求构建时都会重新检查相应的目录,因此build进程将比没有CONFIGURE_DEPENDS时消耗更多的时间。
即使有CONFIGURE_DEPENDS选项可用,CMake文档仍然建议不要使用使用file(GLOB)
或file(GLOB_RECURSE)
来收集源代码。
https://stackoverflow.com/questions/3201154
复制相似问题