CMake能否生成非递归的Makefile?

12
我正在尝试使用CMake,并且它似乎会生成递归的makefile。这意味着在一个大型项目中,空构建可能需要约5秒钟的时间,这实在是无法接受的。
我还没有找到一种使用CMake生成非递归makefile的方法。这可行吗?
3个回答

3

目前而言,使用CMake是无法实现的。

通过修改CMake源代码可能会有所帮助...但我不确定这个任务会有多么简单或复杂。

即使在未来几年中进行所有空构建的乘积,Pretty sure也需要更长时间超过5秒钟。

如果5秒钟对于您的空构建不可接受,那么什么阈值是可以接受的呢?1秒钟?0.25秒钟?只是好奇--已经进行了大量工作,以尽可能地缩小大型项目的空构建时间。


6
"空构建阈值"是"微不足道的",因此小于一秒钟可能是可以接受的。有一些好的构建工具可以为一个相对大型的项目实现这个目标。即使是简单的非递归make文件也可以做到。一个空构建需要5秒钟时间就太离谱了,我不明白为什么cmake首先要发出递归的make文件(尽管对于小项目来说这是有意义的,但对于小项目来说,你不需要cmake)。可以看看tup,在其中整个Linux发行版的空构建时间少于0.5秒钟。 - Elazar Leibovich

3
虽然Makefile的答案保持不变,但是最近的版本(CMake 2.8.9于2012年8月9日发布)默认启用了Ninja生成器。在一个相对较大的C++代码库(Torque3D - 大约有40M的源文件分布在大约241个目录下1)中,从十次运行的平均值来看,Ninja需要0.14秒才能判断没有剩余工作要做,而make则需要2.55秒的平均时间(基于一个已经完全构建且没有剩余工作要做的项目计算的时间)。
因此,如果您发现Make速度太慢,CMake & Ninja可能是一个不错的选择。您在回复中提到了Tup。Ninja似乎与Tup有类似的目标。
  1. 基于find Torque3D/Engine -iname ".c" -or -iname ".cpp" -or -iname "*.h" | xargs dirname | sort -u | wc -l的最佳猜测。

是的,Ninja非常棒,而且Cmake中确实有对Ninja的实验性支持,但如果我已经在使用Ninja,我可能会自己编写脚本来生成Ninja文件。或者使用gyp。 - Elazar Leibovich

2
CMake使用递归make是因为它必须这样做。CMake是一个通用工具,必须动态生成依赖信息。为了与make(不仅仅是gmake)兼容,必须使用递归make来实现这一点。CMake还支持多级代码生成器。潜在地,有人可以为CMake编写tup生成器。目前正在进行一些关于CMake和ninja的工作。然而,在普通的make生成器中,如果没有某种级别的递归make,就无法实现CMake所做的事情。
“我不相信CMake‘必须’使用递归make”,如果您能够创建一个非递归的makefile,并且可以与不止gmake兼容,并且可以动态计算依赖信息,那么这将证明它是错误的。我们花了很多时间尝试使其不再是递归的。它比以前“少”递归了一些。
Brad King创建了一个FAQ entry,描述了CMake中使用make的方式。

4
你没有说服我。即使只是简单的支持 a.o: a.c;a.exe: a.o b.a;b.o: b.c;b.a: b.o 这个老式的规则,我认为没有理由不能做到。 - Elazar Leibovich
2
我不相信 CMake “必须” 使用递归。我认为他们这样做是因为它更简单易实现。我花了两天时间来使 make 调用一次,查找源并将对象转储到单个外部源位置 - 对于递归 make 调用而言只需要半天时间。 - Oliver
1
阅读CMake FAQ后,它澄清了递归make的含义。它不是传统意义上的递归,即每个子目录都有自己的makefile。而是一个三级递归,似乎在一次递归(第二层)中生成构建依赖项,然后在另一次递归(第三层)中调用实际的构建步骤。如果这不可接受,他们还建议使用ninja代替make。 - jfritz42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接