Autotools、CMake和SCons有什么区别?
Autotools、CMake和SCons有什么区别?
有很多项目放弃了qmake、Autotools等工具,并转向CMake,这其中有原因。到目前为止,我可以干净地预期基于CMake的项目可以轻松地适用于跨编译环境或Visual Studio设置,或者只需要进行少量的清理,因为该项目没有考虑到仅限于Windows或OSX代码库的部分。我真的不能指望在基于SCons的项目中做到这一点——而我完全预料到三分之一或更多的Autotools项目会出现某些问题,导致除主机构建环境或Scratchbox2环境外无法正确构建。
asciidoc
或 help2man
或 doxygen
,或者更重要的是正确的 autotools 组合。这已经成为 autotools 的一个巨大营销问题。用户错误地认为他们需要安装 autoconf,因为他们不理解发行包和版本控制系统之间的区别。 - William Pursell这不是关于GNU编码规范的问题。
目前,使用autotools(特别是与automake一起使用)的好处在于它们与Linux发行版的构建非常相容。
例如,在使用cmake时,你总是会问自己:“我需要-DCMAKE_CFLAGS还是-DCMAKE_C_FLAGS?”其实都不是,正确的是“-DCMAKE_C_FLAGS_RELEASE”或“-DCMAKE_C_FLAGS_DEBUG”。这很令人困惑。而在autoconf中,只需简单地运行“./configure CFLAGS="-O0 -ggdb3"”即可。
在构建基础设施集成方面,scons的问题在于你无法使用“make %{?_smp_mflags}”,其中“_smp_mflags”是一个RPM宏,大致展开为(管理员可以设置)系统能力。人们会通过环境变量将像-jNCPUS这样的东西放到这里。但是,对于使用scons的包来说,这个方法行不通,因此它们只能按顺序在发行版中进行构建。
./configure --enable-debug
的软件包中,使用 ./configure CFLAGS=-O0
通常会失败,因为它们覆盖了 makefile 中的 CFLAGS。例如,tmux。 - William Pursell关于 Autotools,需要知道的重要信息是它们不是通用的构建系统 - 它们实现 GNU 编码标准,没有其他功能。如果你想制作符合所有 GNU 标准的软件包,那么 Autotools 是完成此任务的绝佳工具。如果不需要符合这些标准,建议使用 Scons 或 CMake。(例如,请参见此问题) 这种常见误解就是大多数人对 Autotools 感到沮丧的原因。
Makefile.am
中使用 AUTOMAKE_OPTIONS = -foreign
(或在 autogen.sh
中使用 -foreign
)可以禁用 Automake 中的 GNU 标准。我认为几乎每个人都会使用这个选项。 - Dietrich Eppinstallcheck
和distclean
等规则。如果您尝试在仍然使用Autotools的情况下更改这种行为,那么您只是在浪费时间。 - ptomato从开发者的角度来看,对于现在来说,CMake是最易于使用的,但从用户的角度来看,Autotools有一个大优势。
Autotools生成一个单一的配置脚本文件,并且生成它所需的所有文件都随着分发一起提供。可以轻松地使用grep/sed/awk/vi等工具进行理解和修复。相比之下,CMake中有许多文件位于/usr/share/cmak*/Modules,除非用户具备管理员权限,否则无法修复。
因此,如果某些东西不太正常,通常可以通过使用标准Unix工具(grep/sed/awk/vi等)以榔头方式“修复”而无需了解构建系统来解决问题。
你是否曾经挖掘过你的CMake构建目录,以找出问题所在?与可以从上到下阅读的简单shell脚本相比,跟踪生成的CMake文件以找出问题会更加困难。此外,使用CMake调整FindFoo.cmake文件不仅需要了解CMake语言,还可能需要超级用户权限。