我正在使用cmake,它似乎会生成递归的makefile。这意味着在一个大型项目中,空构建可能需要大约5秒钟,这实在是不可接受。
我还没有找到使用cmake生成非递归makefile的方法。有可能吗?
答案 0 :(得分:3)
使用CMake是不可能的。
有可能通过修改CMake的来源......但我不确定这样的任务会是多么小或大,简单或复杂。
不过确定它需要的时间超过5秒。甚至在未来几年内你将要完成的所有空构建中成倍增加。
如果您的空构建无法接受5秒,那么可接受的阈值是多少? 1秒? 0.25秒?只是好奇 - 尽可能地减少大型项目的空建时间已经做了很多工作。
答案 1 :(得分:3)
虽然Makefiles的答案仍然相同,但最新版本(2012年8月9日发布的CMake 2.8.9)包括默认启用的Ninja生成器。在一个相对较大的C ++代码库(Torque3D - 大约有241个目录 1 的大约40M的源文件)中,Ninja平均需要(从10次运行)0.14秒来决定没有什么可做的,它需要平均而言(再次,从十次运行)2.55秒(基于已经完全构建的项目的时间,没有任何事情要做。)
所以,CMake&如果你发现Make太慢,忍者可能是一个不错的选择。你在答复中提到了Tup。 Ninja似乎与Tup有类似的目标。
find Torque3D/Engine -iname ".c" -or -iname ".cpp" -or -iname "*.h" | xargs dirname | sort -u | wc -l
答案 2 :(得分:2)
CMake使用递归make因为它必须。 CMake是一种通用工具,必须即时生成依赖信息。为了与make(不仅仅是gmake)兼容,你必须使用递归make才能做到这一点。 CMake还支持多级代码生成器。有人可能会为CMake编写一个tup生成器。为CMake和忍者做了一些工作。然而,使用普通的make生成器没有办法做CMake没有一定程度的递归制作。
“我不相信CMake'必须'使用递归'”如果你可以创建一个非递归的makefile并且可以使用gmake以上,并且可以动态计算依赖信息,那么它会证明它是错误的。我们花了很多时间试图让它不是递归的。它曾经是“较少”的递归。
Brad King创建了一个FAQ条目,描述了在CMake中使用make的方式:
http://www.cmake.org/Wiki/CMake_FAQ#Why_does_CMake_generate_recursive_Makefiles.3F