【问题标题】:What is Boost Jam and is Jam worth migrating to?什么是 Boost Jam,Jam 是否值得迁移?
【发布时间】:2010-10-05 11:03:58
【问题描述】:

什么是 Boost Jam,Jam 是否值得迁移?

我知道 jam 是 perforce 构建的构建系统,但是我不确定 boost jam 和常规 jam 有何不同。

我也希望 SO 社区中有人使用它,也许可以突出一些差异和/或好处。

【问题讨论】:

    标签: migration build-system jam bjam


    【解决方案1】:

    我使用 Boost Jam 进行跨平台 C++ 开发。我选择它是因为

    • 我希望我的代码可以在 Boost 构建的任何地方构建,
    • 它使用一种相对简单的声明性语言来指定如何构建目标,并且
    • 它可以在一次调用中构建所有不同风格的二进制文件(例如,调试与发布、32 位与 64 位、msvc 与 gcc),并且构建中与风格相关的异常最少声明。

    您可以使用特定于风味的设置来优化通用规则,而不是为每个风味排列编写单独的规则。语法并不完全是我会选择的,但习惯起来并不难。

    本文将 Boost Jam 与 CMake、SCons 和 Eclipse CDT 进行比较:http://syrcose.ispras.ru/2009/files/04_paper.pdf

    我的理解是 Boost Jam 是由 Boost 社区维护的 Perforce Jam 的一个分支,并且 Perforce Jam 不再被积极维护(release notes 最后一次更新是在 2003 年 4 月)。

    当然,如果您不关心跨平台开发,还有更简单的方法,正如其他人在这里提到的那样。就个人而言,我一直想重温 Eclipse CDT; 5 年前它似乎不可用,但我听说它已经走了很长一段路。

    【讨论】:

    • 由于这个答案仍然偶尔会得到投票,我想指出我的后续工作切换到 CMake。虽然它并不完美,但我今天推荐 CMake 而不是 Boost Jam,因为它的 IDE 支持和受欢迎程度/“知名度”。 Eclipse CDT 作为 IDE 非常有用,但不提供构建系统。
    【解决方案2】:

    正如您所说,Boost Jam 是一个构建系统,可以独立于任何其他 boost 库使用。我对 Perforce Jam 一无所知,但据我了解,Boost jam 非常相似,而且大多兼容。

    主要区别在于 Boost Jam 通常带有 Boost Build,这是一组为常见任务设计的 jam 规则,例如编译库、运行单元测试、创建 doxygen 文档等。

    与其他构建系统相比,Boost Jam/Boost Build 旨在轻松编译不同的变体。因此,如果您想将编译设置从调试更改为发布,或将单线程更改为多线程,它会自动确定很多更改。

    缺点是语法很挑剔,而且在 boost 网站之外,没有好的文档。但我认为 Perforce Jam 在这方面同样糟糕。

    【讨论】:

    • 同意,语法和整个过程不是那么直观
    【解决方案3】:

    考虑到构建工具的选择,我不会迁移到 jam。那里有更好的构建系统——C/C++ 的 CMake / SCons、Qt 的 qmake、Java 的 Ant、.NET 的 NAnt 和 MSBuild,等等。它们可能在技术上并不优越,但使用起来不会那么痛苦,因为更多的人熟悉它们(另一方面,它们可能在技术上更优越,当然:D)。

    【讨论】:

    • 很抱歉,2009 年 3 月我的时间机器出现故障,否则我会前往 2010 年 8 月,发现任何可伸缩性问题,然后回到 2009 年不包括在内 :) 开玩笑除此之外,如果您的项目变得非常大,SCons 可能会出现问题,但对于大多数中小型项目来说,这完全没问题。编辑:完全披露 - 我使用 CMake :)
    • :-p 可伸缩性问题出现在 2009 年 3 月,只是博客文章中没有。无论如何,评论的动力不是博客文章——我只是把它作为证据。这是前同事对他们在 SCons 构建时间方面的经历的咆哮。
    • Heh :) 无论如何,现在还没有实际意义——例如,我现在使用 premake(参见 industriousone.com/premake)。
    • 在以前的公司(大约 2005 年),我重写了一个构建系统,该系统使用 make(构建需要 14 小时)来阻塞(构建需要 15 分钟)。管理层印象深刻,但个别工程师很难学习新的构建系统,我最终成为了构建工程师。现在是 2016 年,并且有主要的新构建系统,例如 Bazel (bazel.io)。有趣的是,过去 10 年软件工程发生了多大的变化。在 2005 年,大多数人不会在他们的个人工作站上完整构建 1M SLOC,因为它们不够强大。
    【解决方案4】:

    出于我的目的,它只是为您构建 boost 库的东西,我不知道您可以用它做任何其他事情,所以我不明白迁移到它意味着什么。我很抱歉,但我不知道普通果酱是什么。由于没有其他人提供答案,我只提供我对它的理解。

    Boost 是 C++ 的类和函数的集合,可用于各种任务。 boost 的类和函数被分组到库中。一些库的所有代码都在头文件中,您可以通过使用#include 预处理器语句简单地使用它们,而其他库(例如文件系统或正则表达式库)在 .cpp 文件中具有部分实现。

    编译这些 .cpp 文件可能需要很长时间(大约需要 30 分钟,具体取决于您正在编译的内容),如果每次您想重新编译程序都需要半个小时,那将是一个真正的痛苦。所以他们所做的只是对那些部分存储在.cpp文件中的库,您可以将它们预编译成.lib文件,这就是boost jam的目的。这意味着你只需要花半个小时编译它们一次,从那时起你再也不用等半个小时了。

    然而,你可以想象,每个 boost 库都由许多 cpp 文件和许多头文件组成,并且每个都有许多不同的风格(调试版本、发布版本、多线程等),所以它不是一个自己编译 boost 库的简单过程。这就是 boost jam 的用武之地。你给它编译库的命令,然后它为你发出所有命令给编译器,最后,你将拥有一组预编译的 .lib 文件,一个用于每个库的每种不同风味。头文件以某种方式告诉链接器要包含哪些 lib 文件,因此如果您设置了正确的路径,预编译的 .lib 文件的正确风格将自动链接到您的程序,从而为您节省 30 分钟的编译时间。

    您可以通过查看此页面来了解 boost jam 需要编译哪些库以及不需要编译哪些库:http://www.boost.org/doc/libs/1_37_0 - 如果库不需要 lib 文件(因此不需要您搞乱boost jam first),它会说“Build & Link: Header only”,而如果一个库确实需要你预编译一个 lib 文件,它会说“Build & Link: Automatic linking”。

    此外,如果您使用的是 Windows,则可以下载预编译的 .lib 文件,这样您就不必使用 boost jam。要做到这一点,您应该访问 www.boost.org 页面,转到“入门”部分并一直遵循它,以确保您已正确设置所有内容。该页面的 Windows 版本中的一个链接告诉您在哪里可以找到预编译的 .lib 文件。

    【讨论】:

    • 只是想明确一点,我发布这个只是因为我认为它可能有用。我从来没有用过jam,但是已经好几天没有人回答这个家伙了,所以我决定根据我所掌握的一点知识来回答。
    • 其他 cmets(可能稍后添加)告诉我们 Boost Jam 是一个构建系统;所以它超越了 boost 库本身的编译。
    • 这个答案大错特错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多