你推荐使用哪个GNU make替代品?

10

想象一下,你可以选择一个像GNU make这样的工具来进行新的C++项目。你会选择什么?是否有可用的替代品?

它应该具备/是:

  • 命令行界面
  • 易于理解
  • 易于为默认C++项目设置
  • 支持像Java一样的src/bin分离
  • 不能添加太多依赖于其他软件/库
  • 平台无关(新增
  • 功能:
    • 构建规则/模板,类似于make,但以人类可读的方式编写
    • 递归地遍历目录,并在没有其他“Makefile”时应用规则
    • 通过异常进行配置

注意:

GNU make并没有什么问题,我只是不喜欢它的语法,所有随着时间推移而增长的内容以及愚蠢的递归make问题。我已经使用gmake多年了。


抱歉,我必须澄清我的问题。但是我已经暗示了太多的内容,我应该告诉你。 - tuergeist
可能需要将此社区设为维基。我认为询问或回答这个问题并不能反映出多少客观知识,只是一个人有哪些构建系统的经验而已。 - jalf
递归的make不应该被使用,正如你所发现的。顶层的makefile应该包含其他的文件而不是调用它们。 - Joshua
为什么在Python或Java上添加依赖关系是一个问题?我可以理解想要避免对晦涩或昂贵产品的依赖,但编程语言虚拟机,特别是像Python和Java这样常用的,已经成为一种标准。 - Imagist
@Imagist:比如Python已经将语法改变到3.1版本——如果我为任何原因更新Python,构建系统可能会在此之后出现问题。对于Java,我会接受依赖关系,因为它更加稳定。 - tuergeist
为什么要改变?学会使用它 - dsnk
9个回答

19

我使用CMake,很高兴我做出了这个选择。

编辑

功能列表如维基百科文章中所示:

  • 配置文件是CMake脚本,使用专门用于软件构建的编程语言
  • 内置自动依赖项分析,适用于C、C++、Fortran和Java
  • 通过CMake脚本语言支持SWIG、Qt等
  • 内置对包括版本6、7、7.1、8.0和9.0的Microsoft Visual Studio在内的多个版本的支持
  • 生成Eclipse CDT(C/C++开发工具)的构建文件
  • 使用传统时间戳检测文件内容更改
  • 支持并行构建
  • 交叉编译
  • CMake通过输出Graphviz图表提供所有依赖项的全局视图
  • 支持跨平台构建,并可在以下系统上使用
    • Linux和其他POSIX系统(包括AIX、* BSD系统、HP-UX、IRIX / SGI和Solaris)
    • Mac OS X
    • Windows 95/98/NT/2000/XP、Windows Vista和MinGW/MSYS
  • 与DART(软件)、CDash、CTest和CPack集成,这是一组用于软件测试和发布的工具

但说实话:几乎任何东西都比GNU构建系统更好。


另一个优点是易于跨平台的安装/打包命令。 - thekidder
我其实很喜欢gmake,并且已经准备了一堆特殊的makefile多年了。但是最近我转到cmake,它简化了跨平台开发(Linux、OS X、Windows),因此cmake成为我的新项目的默认选择。 - Larry Gritz
我认为cmake更像是自动化构建工具automake/conf和gmake的完整替代品。而且,我同意cmake比有些晦涩难懂的m4宏要容易使用得多;此外,对于大型项目,cmake比gmake快得多。 - Gunther Piez
2
CMake是唯一一个能够生成真正的Visual Studio项目的工具,即不需要调用外部工具的makefile项目。 - JesperE
1
另一个优点是易于跨平台安装/打包命令。我认为 ./configure --host=arm-linux-gnueabi./configure --host=i586-mingw32msvc 已经足够简单了? - Artyom

9

SConswaf是很好的构建系统,仅依赖于Python。(在我看来是这样的)


嗯,好的。但是正如你所说,waf会给Python带来依赖关系 :( - tuergeist
1
+1 for SCons。Python依赖不是问题 - 我们可以在Mac、Win和Linux上构建。 - i_am_jorf
我喜欢waf比scons更好,但我无法理解如何扩展它们。最终,我更喜欢make,因为它非常容易添加新的规则/目标类型,并且启动速度非常快。Scons在大型项目上的性能令人沮丧。 - Bklyn

8

“gnu make”怎么样?

你没有给出任何迹象表明你需要哪些特性,而这些特性并不受gnu make支持。


抱歉,我编辑了我的问题。我的目的不是为了限制你的想法。 - tuergeist

8

Boost.Jam

这个工具具备以下特点:

  • 命令行接口;
  • 易于使用;
  • 它来自于C++库集合Boost,因此对C++有良好的支持(也不仅限于C++);
  • 根据您的构建请求,将可执行文件存储在bin目录下的不同位置。如果您使用gcc 4.3.2,则可以在以下位置获取可执行文件:
    • bin/gcc-4.3.2/debug -- 执行bjam
    • bin/gcc-4.3.2/release -- 执行bjam release
    • bin/gcc-4.3.2/release/inlining-off/threading-multi -- 执行bjam release inlining=off threading=multi
    • bin/gcc-4.3.2/release/threading-multi -- 对于bjam release inlining=full threading=multi,因为inlining=full是release的默认设置。
  • 它不需要完整的Boost库集合,只需Boost.Build和Boost.Jam即可;
  • 跨平台;
  • Jamfile语法简单但功能强大;
  • 您可以将构建配置分成许多子目录中的Jamfile。

不太确定这个“容易”啊 :-) - Chris Huang-Leaver

7

CMake应该能够满足您的大部分需求,如果不是全部的话。

  • 它将为您生成Makefiles。

  • 它具有良好的领域特定原语,以及一个简单的语言,用于在需要执行特殊操作时使用。

  • 它解决了大多数递归make的问题(请参见递归make被认为是有害的论文)。

  • 它使用外部构建,因此您可以拥有bin/src分离。

我发现它易于编写,易于维护,并且构建速度快。

... 另外:

  • 它是跨平台的。

  • 借助CText和CDash,它具备设置持续集成服务所需的功能。

另请参见这个回答关于递归Make-朋友还是敌人?


5

3

你好,

我同意之前几个回答建议使用gmake的意见。

在阅读Robert Mecklenburg的优秀书籍《Managing Projects with GNU Make》(经过消毒的亚马逊链接)的前几章节后,再重新查看一下。

或者更好的是,找到之前由Andrew Oram和Steve Talbott编写的名为“Managing Projects With make”的版本。前几章节对(g)make和[Mm]akefile基础知识进行了详细描述。

我还看到你可以从亚马逊以仅0.01美元的价格购买第二版的二手副本!(经过消毒的亚马逊链接

阅读完这个简介后,你甚至会理解make如何进行反向链式处理,这在观察make的行为时有点不直观。

希望对你有所帮助。

祝好,


我认为这个回答并不有帮助,因为它并没有回答我的问题。我没有要求指南推荐。 - tuergeist
1
@tuergeist,我在回答之前考虑了这一点。但是当我开始更深入地理解它的内部工作原理时,我发现我对make有了新的认识。因此,我指出了两个优秀的信息来源。 (-: - Rob Wells

3

Autotools -- autoconf/automake/libtool 是非常强大的构建工具。

开始使用它们可能需要一些时间,但是之后它们会为您提供很好的服务。

更重要的是,它们比它们的替代品(CMake、BJam、SCons等)显著更强大。

它们为什么更强大?

  • 透明支持通过libtool构建静态和共享库。
  • 支持卸载(CMake中没有)
  • 支持标准安装路径--在打包时非常重要。
  • 完全支持和集成gettext。
  • 透明且直观地支持跨平台编译。

许多事情。CMake 可以完成大多数任务,但对于每个任务,您都需要编写冗长的脚本或手动指定许多内容。


它也有很多缺点。首先,它将文件随处放置,并且我不知道是否有内置机制来删除这些文件。当您使用某些版本控制工具时,这可能会引起一些关注。您能否详细说明自动化工具在哪些方面比bjam或CMake更强大? - kriss
首先,它会将文件放置在各个地方,并且我所知道的它没有内置机制来删除这些文件。首先,你可以进行源外构建。这样所有的文件都会存储在其他目录中。 - Artyom
请在如何执行此操作方面添加一些指针。使用 bjam 或 cmake 很容易,但我从未见过使用 autotools 的项目不会在源树中充斥着大量生成的文件。我指的不仅是构建过程本身生成的文件,还包括输入 configure 后立即生成的大量文件。如果有可能的话,我会感到非常惊讶。例如,如果没有生成的 Makefile,常见的三部曲“./configure;make;make install”中的 make 怎么可能工作呢? - kriss
1
在常见的三部曲"./configure; make; make install"的配置部分之后,如何让程序正常工作呢?非常简单:「mkdir build; cd build; ../package-xyz/configure; make; make install」-- 您可以在源码树之外运行 configure。更重要的是,一些软件包(例如 gcc)要求您进行源码树之外的构建,并且不支持“在源码树中”的构建方式。 - Artyom
1
另外,清理也非常简单:运行 make distclean 即可完成工作。 - Artyom

2

gmake有什么问题?

它有哪些问题使你想要使用它。如果另一个工具有与gmake相同的问题,那么推荐另一个工具就没有意义。

我们在构建系统中使用gmake,对其性能、灵活性和功能非常满意。


1
这个东西没有问题。我只是不喜欢它的语法,所有在这些年里增加的东西和愚蠢的递归造成的问题。 我现在已经使用gmake很多年了,但现在我有机会转换到新的东西。所以,我会抓住这个机会并向社区寻求帮助。 ;) - tuergeist
@tuergeist,说得好。我们正在使用带有非递归makefile的gmake,它比传统的递归makefile系统要好得多。唯一的真正缺点是需要大量工作来设置初始的非递归系统。另一方面,非递归make显著减少了我们的构建时间(3000个源文件,约100万行代码编译时间约为6-8分钟),允许很好的依赖跟踪和并行构建。(所有这些你可能可以从其他工具中获得) - Glen
1
@Glen:听起来不错。我的最后一次经历是在双核3GHz PC上等待45分钟,处理的代码和文件量几乎相同 :( (使用递归make文件和三阶段构建系统 - 阶段为idl、libs+objects、二进制文件)。 - tuergeist

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