如果你不注意,你< em > < / em >混乱的交叉编译能力(它
应该清楚地注意到,诺基亚提出了Scratchbox/Scratchbox2,以避开< em > < / em >高破碎的Maemo/Meego的自动工具构建设置。)如果出于某种原因,在测试中使用固定的静态路径,那么就会破坏交叉编译支持,因为它不符合sysroot规范,而且它会从宿主系统中取出一些东西。如果您破坏了交叉编译支持,它会使您的代码在以下情况下无法使用
OpenEmbedded,使发行版尝试在交叉编译器上而不是在目标上构建它们的版本变得“有趣”
在这个时代,< em > < / em >没人目前在几乎所有产品中使用的旧的、坏的编译器进行了大量的测试。除非你是在真正的< em > < / em >古代版本的Solaris、AIX或类似版本上构建glibc、libstdc++或GCC之类的东西,否则这些测试是浪费时间的,而且是上面提到的许多潜在破坏的来源。
当它崩溃时,你将花费< < em >小时/ em >来追踪你的尾巴,试图整理那些编写脚本的人错误的东西,以整理你的构建(事实上,这就是我正在尝试做的事情(或者,更确切地说,完全删除Autotools -我怀疑这个月剩下的时间是否有足够的时间来整理混乱……)Apache Thrift有一个不会交叉编译的< em >破< / em >构建系统。)
“正常”用户实际上是不< em > < / em >只做“./configure”;make”-对于很多事情,他们会提取某人提供的包,比如PPA或他们的分销供应商。“正常”用户不是开发人员,在很多情况下不会抓取tarball。这对每个人来说都是势利的,因为他们认为情况会是这样。tarball的典型用户是开发人员,所以他们会因为它的损坏而受到冲击。
它的工作原理……大多数时候……这就是你对Autotools的全部看法。它是一个解决了几个真正与GNU项目有关的问题的系统……它们的基础、核心工具链代码。(编辑(05/24/2014):应该注意的是,这种类型的担忧是一种潜在的坏< em > < / em >需要担心的事情- Heartbleed部分源于这种想法,在正确的现代系统中,你真的< em > < / em >没有任何业务处理Autotools更正的大部分内容。GNU可能需要对代码库做一个简单的移除,根据发生在Heartbleed的事情)你可以使用它来做你的项目,它可能会很好地工作在一个小项目上,你不期望在任何地方工作,除了Linux或GNU工具链清楚地正确工作。它“与Linux很好地集成”的说法是< em >是< / em >,粗体的说法,相当< em > < / em >不正确。它很好地集成了GNU工具套件,并解决了It在实现其目标时遇到的问题。
这并不是说本文讨论的其他选项没有问题。
SCons更像是Make/GMake等的替代品。从各方面来看,看起来都很不错。
它仍然只是一个POSIX工具。你可能更容易让MinGW用它来构建Windows的东西,但它仍然更适合做POSIX的东西,你需要安装Python < em >和< / em > SCons来使用它。
它在进行交叉编译时存在问题,除非您使用的是Scratchbox2之类的东西。
无可否认,从他们自己的比较来看,比CMake慢和不稳定。他们提出了半心半意的(POSIX方面需要make/gmake来构建…)CMake与SCons相比的负面意见。(顺便说一句,如果你需要< em > < / em >比其他解决方案更大的可扩展性,你应该问问自己你的项目是否太复杂了…)
在这个线程中给出的CMake的例子有点假。
然而……
你需要学习一门新的语言。
如果你习惯了Make、SCons或Autotools,就会有一些反直觉的事情。
您需要在正在构建的系统上安装CMake。
如果没有预先构建的二进制文件,则需要一个可靠的c++编译器。
事实上,你的目标应该决定你在这里的选择。
你需要处理破碎工具链的< em > < / em >很多来产生有效的工作二进制文件吗?如果是的话,你可能会考虑使用Autotools,要知道我上面提到的缺点。CMake可以处理很多这样的问题,但是它比Autotools担心的要少。可以扩展SCons来担心这个问题,但它并不是一个开箱即用的答案。
你需要担心交叉编译(通用应用程序/库,像谷歌Protobufs, Apache Thrift等。< em > < / em >应该关心这个…)?如果是这样,Autotools < em > < / em >可能为你工作,只要你不需要担心Windows,但你将花费大量的时间来维护你的配置系统,因为事情发生了变化。SCons目前几乎是不可能的,除非你使用Scratchbox2——它真的不能处理交叉编译,你将需要使用这种可扩展性,并以与Automake相同的方式维护它。如果是这样,你可能会考虑使用CMake,因为它支持交叉编译,而不用担心从沙盒中泄露出来,并且可以使用/不使用Scratchbox2这样的东西,并将很好地< em > < / em >与OpenEmbedded这样的东西集成在一起。
这是很多很多项目抛弃qmake、Autotools等而转向CMake的原因。到目前为止,我可以清楚地看到一个基于CMake的项目要么陷入交叉编译的情况,要么进入VisualStudio设置,或者只需要少量的清理,因为该项目不考虑代码库中仅支持windows或仅支持osx的部分。我真的不能指望基于SCons的项目能做到这一点——而且我完全希望1/3或更多的Autotools项目都犯了< em > < / em >的东西错误,这就排除了它在任何上下文上的正确构建,除非主机构建一个或Scratchbox2一个。