首页
/ Godot 仓库内置 libjpeg-turbo 的许可证结构:IJG/BSD 双许可解析与合规义务详解

Godot 仓库内置 libjpeg-turbo 的许可证结构:IJG/BSD 双许可解析与合规义务详解

2026-09-04 18:39:40作者:农烁颖Land

本文以 thirdparty/libjpeg-turbo/LICENSE.md 为核心文档,完整解读 Godot 引擎所内置 libjpeg-turbo 的“IJG 许可 + Modified BSD 许可(含 zlib 许可)”双许可证结构、逐条聚合后的分发合规义务,以及“为什么要用两个许可证”的设计考量;同时结合仓库中 modules/jpg/SCsubSConstruct 等构建系统源码,说明这些许可证条款如何实际作用于 Godot 的编译流程与产物分发。读完后你将能够准确判断:使用或再分发 Godot 中内置的 libjpeg-turbo 时,需要保留哪些版权声明、在文档中附加哪些归属声明,以及源码级实现(8/12 位深度双编译、补丁裁剪)与许可证条款之间的关系。

组件背景:libjpeg-turbo 在 Godot 仓库中的位置

libjpeg-turbo 是以 IJG(Independent JPEG Group,独立 JPEG 小组)JPEG 库为基础、增加 SIMD 优化的 JPEG 编解码库。在 Godot 仓库中,它以第三方依赖的形式完整内置于 thirdparty/libjpeg-turbo/ 目录下,其源码目录 thirdparty/libjpeg-turbo/src/ 包含 jcapistd.cjdapistd.cturbojpeg.cjpeglib.h 等完整的 IJG 风格 C 源码,同时目录内还带有 README.ijg(IJG 许可文本载体)与一组补丁文件 thirdparty/libjpeg-turbo/patches/

从源码结构看,该依赖主要服务于仓库中的 JPEG 图像模块 modules/jpg/modules/jpg/SCsub 直接按文件名将 jaricom.cjcarith.cturbojpeg.c 等 libjpeg-turbo 源文件编入模块目标文件;modules/svg/SCsub 中也引用了同一内置库。构建入口 SConstruct 提供了布尔选项:

opts.Add(BoolVariable("builtin_libjpeg_turbo", "Use the built-in libjpeg-turbo library", True))

builtin_libjpeg_turbo 默认为 True,Godot 默认直接使用内置 libjpeg-turbo 而非外部系统库。正因如此,理解 LICENSE.md 所定义的许可条款,直接关系到 Godot 引擎本身作为“静态链接 libjpeg-turbo 的产物”时的合规义务。

双许可结构:IJG 许可与 Modified BSD 许可(含 zlib 许可)

thirdparty/libjpeg-turbo/LICENSE.md 开篇即点明核心事实:libjpeg-turbo 受两个相互兼容的 BSD 风格开源许可证覆盖。原文档对两者的适用范围界定得非常精确,这是理解整个许可结构的关键:

  • IJG(Independent JPEG Group)许可,完整文本列于 README.ijg 中。
    • 适用范围:libjpeg API 库及其关联程序,包括从 libjpeg 继承的任何代码,以及对该代码所做的任何修改。
    • 一个重要的许可“包含”(subsume)关系:libjpeg-turbo 的 SIMD 源代码本身受 zlib License(zlib 许可)约束,但在整个 libjpeg API 库的语境下,zlib 许可的条款被 IJG 许可的条款所包含/吸收。
  • Modified (3-clause) BSD 许可,全文见下文“Modified BSD 许可全文”一节。
    • 适用范围:TurboJPEG API 库及其关联程序,以及构建系统(build system)。
    • 另一层“包含”关系:TurboJPEG API 库本身是对 libjpeg API 库的封装(wrap),因此在整个 TurboJPEG API 库的语境下,IJG 许可与 Modified BSD 许可两者的条款同时适用

README.ijg 文件开头有一段 libjpeg-turbo 项目自己的说明:该文件已由 The libjpeg-turbo Project 修改过,仅保留与 libjpeg-turbo 相关的信息,并移除了 libjpeg v8 README 中不恰当(impolitic)的措辞,仅为满足 IJG 许可“分发源码时必须附带此 README 文件”的要求而包含在内。其中 LEGAL ISSUES 一节保留了 IJG 许可的原始法律文本:

  1. 我们不保证这个软件能正常工作。
  2. 你可以把这个软件用于任何目的,不需要付钱。
  3. 你不得假装这个软件是你写的。如果你在你的程序里使用了它,必须在你的文档中某个地方说明你使用了 IJG 代码。

其法律条文要点为:作者不作出任何明示或暗示的保证("AS IS" 提供);源码分发时必须原样附带 README 文件及其版权/免责声明,且对原始文件的增删改必须在随附文档中明确标注;仅分发可执行代码时,随附文档必须声明 “this software is based in part on the work of the Independent JPEG Group”;用户自行承担全部后果,作者不承担任何损害责任;不允许将任何 IJG 作者或其公司名用于广告或宣传。

合规义务聚合说明(Complying with the libjpeg-turbo Licenses)

原文档最有实战价值的部分,是把三个许可证(IJG、Modified BSD、zlib)中分散的条款聚合成一份按场景组织的义务清单,并注明每条义务的条款出处。文档特别声明:该聚合只是澄清性汇总(a roll-up for clarification),其本身不是一份新的许可证。以下是完整继承的四条义务:

1. 分发 libjpeg-turbo 的修改版源码时

  1. 不得删改源码中任何已有的版权或许可声明。
    • 条款出处:IJG 许可第 1 条;Modified BSD 许可第 1 条;zlib 许可第 1、3 条。
  2. 必须在你修改过的每个源文件头部加上你自己的版权声明,使他人能够看出该文件被你修改过。(如果该文件原本没有版权头,则可以直接加一条“你修改了此文件”的声明。)
    • 条款出处:IJG 许可第 1 条;zlib 许可第 2 条。
  3. 必须包含 IJG 的 README 文件,且不得改动该文件中的任何版权或许可文本。
    • 条款出处:IJG 许可第 1 条。

Godot 仓库对此有现成示范:thirdparty/libjpeg-turbo/README.ijg 被原样保留在内置目录中,并在文件头部加上了一段 “libjpeg-turbo note” 说明本文件被 libjpeg-turbo 项目修改过、修改了什么——这正是 IJG 许可第 1 条“对原始文件的改动必须明确标注”义务的落地实践。而 thirdparty/libjpeg-turbo/patches/ 目录中的 0001-cmake-generated-headers.patch0002-disable-16bitlossless.patch0003-remove-bmp-ppm-support.patch 三个补丁文件,表明 Godot 对内置源码的裁剪(按文件名可推断:移除构建生成的头文件、禁用 16 位无损模式、移除 BMP/PPM 支持)是以独立补丁形式记录的,便于追溯修改内容。

2. 仅分发二进制、或不带源码地分发静态链接了 libjpeg-turbo 的应用时

  1. 你的产品文档必须包含如下声明:

    This software is based in part on the work of the Independent JPEG Group.

    • 条款出处:IJG 许可第 2 条。
  2. 如果你的二进制发行版包含或使用了 TurboJPEG API,你的产品文档必须包含 Modified BSD 许可的全文(即下文“Modified BSD 许可全文”一节的完整文本)。

    • 条款出处:Modified BSD 许可第 2 条。

这一条对 Godot 有直接现实意义:由于 modules/jpg/SCsubbuiltin_libjpeg_turbo 为真(默认值)时把 libjpeg-turbo 的 C 源码直接编译进引擎目标文件(静态链接),并经由 modules/jpg/image_loader_libjpeg_turbo.cpp 实现 JPEG 图像加载、经由 modules/jpg/movie_writer_mjpeg.cpp 提供 MJPEG 电影写出,因此在分发不含源码的 Godot 引擎二进制时,上述 IJG 归属声明义务即被触发。

3. 命名与宣传限制

不得使用 IJG 或 The libjpeg-turbo Project 及其贡献者的名称进行广告、宣传等活动。

  • 条款出处:IJG 许可;Modified BSD 许可第 3 条。

4. 免责声明

IJG 与 The libjpeg-turbo Project 不保证 libjpeg-turbo 无缺陷,也不接受因使用该软件导致的不良后果所产生的任何责任。

  • 条款出处:IJG 许可;Modified BSD 许可;zlib 许可。

Modified (3-clause) BSD 许可全文

thirdparty/libjpeg-turbo/LICENSE.md 内嵌了该许可的完整法律文本(版权年份为 2009-2025 D. R. Commander 与 2015 Viktor Szathmáry),全文如下:

Copyright (C) 2009-2025 D. R. Commander. All Rights Reserved. Copyright (C) 2015 Viktor Szathmáry. All Rights Reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of the libjpeg-turbo Project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

三个条件可概括为:源码再分发须保留版权头、条件列表与免责声明;二进制再分发须在文档或随附材料中复现同样内容;未经书面许可不得以项目或贡献者名义为衍生产品背书或做宣传。

为什么使用两个许可证?

原文档最后一节 “Why Two Licenses?” 解释了双许可并非随意选择,而是一个有明确动机的设计:

  • 理论上完全可以用 zlib License 替代 Modified (3-clause) BSD License——因为 IJG 许可实际上已经“包含”了 zlib 许可的分发条件,若这样做,libjpeg-turbo 的二进制分发实际上就落在 IJG 许可之下;
  • 但是 IJG 许可的条款只针对 Independent JPEG Group 本身,并没有把“归属保护(attribution)”和“反背书保护(endorsement protection)”延伸到其他实体;
  • 因此项目方希望为新写的代码选择一份能给予 libjpeg-turbo 项目方同等保护的许可证——正如当年 IJG 为基于其软件的衍生代码所获得的那种保护。Modified BSD 许可的三条条款恰好提供了这种对等的归属与背书约束。

仓库佐证:许可条款与 Godot 构建系统的对应关系

从源码结构看,Godot 构建系统与许可证文档之间存在几处可以直接相互印证的事实:

  • 内置库开关与默认值SConstructbuiltin_libjpeg_turbo 默认 True,即默认构建走内置的 thirdparty/libjpeg-turbo 源码,许可义务随引擎二进制静态链接而产生(见上文第 2 条义务场景)。
  • 8/12 位深度双编译modules/jpg/SCsub 将 libjpeg-turbo 源码分为 thirdparty_sources_common(与位深无关,如 turbojpeg.cjmemmgr.c)和 thirdparty_sources_bit_dependent(与位深相关,如 jcdctmgr.cjdhuff.c)两组,然后对 BITS_IN_JSAMPLE=8BITS_IN_JSAMPLE=12 各编译一遍,并用 OBJSUFFIX_8_12)后缀区分目标文件以避免符号冲突。这说明 Godot 同时支持 8 位与 12 位 JPEG 采样深度的解码路径,而所有被编译的源文件均落在 IJG 许可覆盖的“libjpeg API 库及其修改”范围内。
  • 源码与补丁分离thirdparty/libjpeg-turbo/src/ 内保留完整源码,修改以 patches 下的补丁文件记录,这与 IJG 许可第 1 条要求的“改动必须可被识别、README 不得篡改”在工程上是一致的设计取向。
  • 跨模块复用modules/svg/SCsub 同样引用 builtin_libjpeg_turbo 选项,即 SVG 模块与 JPG 模块共享同一内置库实例,进一步确认该第三方组件是整个引擎图像链路的公共依赖。

小结:一份可执行的合规检查清单

thirdparty/libjpeg-turbo/LICENSE.md 的聚合条款为基准,结合 Godot 仓库的实际使用方式,可归纳如下检查清单:

  1. 保留声明:内置目录中 README.ijgLICENSE.md 的版权/许可文本不可删改;对源码的修改应像仓库 patches 那样可追溯标注。
  2. 源码分发:若分发修改后的 libjpeg-turbo 源码,须附带 IJG README 原文,并在每个修改过的文件头部加自己的版权/修改声明。
  3. 二进制分发(Godot 引擎二进制的典型场景):产品文档中加入 “This software is based in part on the work of the Independent JPEG Group.”;若使用了 TurboJPEG API,另需附上 Modified BSD 许可全文。
  4. 宣传限制:不得以 IJG 或 libjpeg-turbo 项目及其贡献者名义为产品背书或做广告。
  5. 责任边界:三个许可证均不保证无缺陷、不承担一切使用后果的责任。

需要强调的是,LICENSE.md 自身明确声明其“合规聚合”部分仅为澄清性汇总,不构成独立许可证;最终权利与义务仍以 IJG 许可(README.ijg)、Modified BSD 许可(LICENSE.md 内嵌全文)及 zlib 许可的原始文本为准。

登录后查看全文
热门项目推荐
相关项目推荐