ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SketchCAD 第三方依赖与许可声明(Third-Party Notices)

SketchCAD 第三方依赖与许可声明(Third-Party Notices) SketchCAD 第三方依赖与许可声明Third-Party Notices摘要本文档记录 SketchCAD 在文件格式升级 P0-01 中对第三方内核的评估过程、许可约束、合规判定与工程决策。为降低 GPL 传染风险、商业授权风险与供应链不确定性本文提出“许可传染边界模型License Contagion Boundary, LCB”“依赖许可风险评分Dependency License Risk Score, DLRS”与“产物依赖闭包Product Dependency Closure, PDC”三个工程化判定工具并据此论证 SketchCAD 采用“零第三方几何/解析库、自研 DXF/DWG 路径”的合理性。结论为LibreDWG、libdxfrw、dxflib 等 GPL 依赖禁止引入ODA Drawings SDK 当前不接入R2000 以自研 DXFASCII 二进制容器交付既有 Qt 6 LGPL 动态链接与 GCC/MinGW 工具链不触发 GPL 传染。关键词第三方依赖许可合规GPLLGPLcopyleftDXFDWG零依赖SBOM供应链安全免责声明本文档为工程合规记录不构成法律意见。许可证的最终解释以许可证原文、项目法律顾问意见及适用司法辖区法律为准。1 目的与范围本文件用于记录 SketchCAD 在文件格式DXF/DWG实现过程中对第三方内核的评估结论与许可约束。依据 P0-01 改动边界硬约束不得引入 GPL 许可依赖第三方内核需确认许可并显式声明新增第三方解析/几何库必须在合入前更新本文件并复核许可。本文档覆盖范围包括P0-01 文件格式第三方内核评估既有第三方依赖的许可边界动态链接、静态链接与工具链的传染性判定未来扩展 R2000 DWG 的许可前置条件合规决策函数与工程实践。2 术语与许可分类2.1 许可类型许可类型代表许可证传染性闭源商用典型义务宽松许可MIT、BSD、Apache-2.0低允许保留版权与许可声明弱 copyleftLGPL-2.1、LGPL-3.0中动态链接下通常允许可替换共享库、声明、修改回馈强 copyleftGPL-2.0、GPL-3.0高通常不允许衍生作品须以 GPL 兼容许可发布商业授权ODA、专有 SDK由合同定义需签约授权范围、版本、分发限制自定义/混合libdxfrw 等不确定需逐案审查以具体声明为准2.2 传染性形式化设项目产物为PPP候选依赖为LLL。定义依赖图G(V,E) G (V, E)G(V,E)其中VVV为组件集合EEE表示链接、嵌入、调用或随产物分发关系。产物依赖闭包定义为Clprod(P){v∈V∣v 被链接、嵌入或随产物分发} \mathrm{Cl}_{\mathrm{prod}}(P) \{ v \in V \mid v \text{ 被链接、嵌入或随产物分发} \}Clprod​(P){v∈V∣v被链接、嵌入或随产物分发}若VGPLV_{\mathrm{GPL}}VGPL​表示 GPL 节点集合则合规性必要条件可写为Compliant(P) ⟺ Clprod(P)∩VGPL∅ \mathrm{Compliant}(P) \iff \mathrm{Cl}_{\mathrm{prod}}(P) \cap V_{\mathrm{GPL}} \varnothingCompliant(P)⟺Clprod​(P)∩VGPL​∅该式表达一个工程底线只要产物依赖闭包包含 GPL 节点就不能直接认定合规。若项目整体不采用 GPL 兼容许可则应禁止引入。3 P0-01 文件格式第三方内核评估3.1 候选库矩阵候选库许可写 DWG读 DWG写 DXF读 DXF风险等级本项目结论GNU LibreDWG (libredwg)GPL-3.0强 copyleft✅✅✅✅高❌ 禁止引入ODA Drawings SDK (Teigha)商业授权需签约✅✅✅✅中高商业/授权❌ 当前环境未接入libdxfrwGPL-2.1 / 自定义❌✅✅✅高❌ 许可受限且不满足写 DWGdxflib (QCAD)GPL-2.0❌❌✅❌高❌ 许可受限自研实现项目许可仅 R12✅✅✅可控✅ 采用3.2 逐项评估3.2.1 GNU LibreDWGLibreDWG 采用GPL-3.0属于强 Copyleft。若以链接、嵌入或随产物分发方式引入将触发 GPL 兼容性要求与本项目“不得引入 GPL 依赖”的硬约束冲突。因此明确排除。形式化地若LLibreDWG∈VGPL L_{\mathrm{LibreDWG}} \in V_{\mathrm{GPL}}LLibreDWG​∈VGPL​且LLibreDWG∈Clprod(P) L_{\mathrm{LibreDWG}} \in \mathrm{Cl}_{\mathrm{prod}}(P)LLibreDWG​∈Clprod​(P)则Compliant(P)false \mathrm{Compliant}(P) \mathrm{false}Compliant(P)false故禁止引入。3.2.2 ODA Drawings SDKODA Drawings SDK 为商业授权需与 ODA 签约。其优势是原生 DWG 读写能力强但引入商业 SDK 超出 P0-01 当前范围且会增加授权成本、版本绑定与分发合规审查。当前结论为不接入。3.2.3 libdxfrwlibdxfrw 许可为 GPL-2.1/自定义且仅能读 DWG、写 DXF不满足“写 DWG”诉求。许可与能力双重不匹配排除。3.2.4 dxflibdxflib 采用 GPL-2.0且主要面向 DXF 写入不满足 DWG 需求。许可受限排除。4 评估方法与决策模型4.1 许可传染边界模型LCB定义许可传染边界为LCB(P)Clprod(P)∩Vcopyleft \mathrm{LCB}(P) \mathrm{Cl}_{\mathrm{prod}}(P) \cap V_{\mathrm{copyleft}}LCB(P)Clprod​(P)∩Vcopyleft​其中VcopyleftV_{\mathrm{copyleft}}Vcopyleft​包括 GPL、AGPL 等强 Copyleft 节点。若LCB(P)≠∅ \mathrm{LCB}(P) \neq \varnothingLCB(P)∅则必须进行人工法律审查在本项目约束下默认禁止。4.2 依赖许可风险评分DLRS为量化风险定义依赖许可风险评分DLRSR(L)wcC(L)wlB(L)wsS(L)wmM(L) R(L) w_c C(L) w_l B(L) w_s S(L) w_m M(L)R(L)wc​C(L)wl​B(L)ws​S(L)wm​M(L)其中C(L)C(L)C(L)copyleft 强度B(L)B(L)B(L)链接方式风险S(L)S(L)S(L)静态嵌入风险M(L)M(L)M(L)修改与分发风险wcwlwswm1w_c w_l w_s w_m 1wc​wl​ws​wm​1。若R(L)Rmax⁡ R(L) R_{\max}R(L)Rmax​则候选依赖禁止引入。对 GPL 强 copyleft 库C(L)C(L)C(L)与S(L)S(L)S(L)均取高值通常直接超过阈值。4.3 合规决策函数定义合规决策函数D(L){Allow,R(L)≤Rmax⁡∧Compliant(P∪{L})Conditional,R(L)≤Rmax⁡∧ObligationSatisfiable(L)Deny,otherwise D(L) \begin{cases} \mathrm{Allow}, R(L) \le R_{\max} \land \mathrm{Compliant}(P \cup \{L\}) \\ \mathrm{Conditional}, R(L) \le R_{\max} \land \mathrm{ObligationSatisfiable}(L) \\ \mathrm{Deny}, \mathrm{otherwise} \end{cases}D(L)⎩⎨⎧​Allow,Conditional,Deny,​R(L)≤Rmax​∧Compliant(P∪{L})R(L)≤Rmax​∧ObligationSatisfiable(L)otherwise​该函数将“是否引入”转化为可复核的工程判定避免仅凭主观经验决策。5 最终决策自研零依赖最终决策文件格式相关能力包括 R2000 DXF 读写、二进制 DXF 容器、R12 原生 DWG全部自研实现零第三方几何/解析库。具体交付边界为R2000 以 DXFASCII 二进制容器形态交付原生.dwg仅覆盖 R12AC1009不引入 GPL 污染不引入商业 SDK 授权风险不为单一格式能力绑定外部内核。该决策满足Clprod(P)∩VGPL∅ \mathrm{Cl}_{\mathrm{prod}}(P) \cap V_{\mathrm{GPL}} \varnothingClprod​(P)∩VGPL​∅并且Rformat(P)≤Rmax⁡ R_{\mathrm{format}}(P) \le R_{\max}Rformat​(P)≤Rmax​其中Rformat(P)R_{\mathrm{format}}(P)Rformat​(P)表示文件格式相关依赖的许可风险评分。6 既有第三方依赖本产品运行时依赖以动态链接 Qt 6LGPL与编译器/构建工具链MinGW/GCC为主。二者均不触发 GPL 传染性。6.1 Qt 6 与 LGPL 动态链接边界Qt 6 采用 LGPL允许闭源商用但需满足若干条件以动态链接方式使用 Qt 共享库用户能够替换 Qt 共享库保留版权与许可声明随产物提供许可证副本对 Qt 本身的修改需按 LGPL 回馈。形式化地LGPL 合规条件可写为LGPLOK(P,Q) ⟺ LinkMode(P,Q)dynamic∧Replaceable(Q)∧Notices(P,Q) \mathrm{LGPLOK}(P, Q) \iff \mathrm{LinkMode}(P,Q)\mathrm{dynamic} \land \mathrm{Replaceable}(Q) \land \mathrm{Notices}(P,Q)LGPLOK(P,Q)⟺LinkMode(P,Q)dynamic∧Replaceable(Q)∧Notices(P,Q)其中QQQ表示 Qt。SketchCAD 采用动态链接 Qt 6且不静态嵌入 Qt因此满足 LGPL 边界要求。6.2 GCC/MinGW 工具链非派生作品GCC/MinGW 属于构建工具链而非产物运行时依赖。设工具链节点为ttt则t∉Clprod(P) t \notin \mathrm{Cl}_{\mathrm{prod}}(P)t∈/Clprod​(P)因此工具链的 GPL 许可不传染至 SketchCAD 产物。GCC 运行时库例外GCC Runtime Library Exception进一步降低了运行时链接风险。DWG/DXF 解析层不链接任何 CAD 专用库。7 合规策略与工程实践7.1 依赖准入流程function is_compliant(product P, candidate L): if L.license in {GPL-2.0, GPL-3.0, AGPL} and links_to(P, L): return false if L.license LGPL and link_mode(P, L) static: return false if L.license LGPL and link_mode(P, L) dynamic: require replaceable_shared_lib(P, L) require notices(P, L) return true if L.license Commercial: require signed_license(P, L) return true return manual_review(L)7.2 工程实践清单维护 SBOMSoftware Bill of Materials合入前执行许可扫描禁止静态链接 GPL/LGPL 库对 LGPL 库保持动态链接与可替换性新增依赖必须更新本文件对商业 SDK 登记授权范围与版本对自定义许可逐案审查。7.3 风险与缓解风险触发条件缓解措施GPL 污染链接/嵌入 GPL 库禁止引入依赖闭包检查LGPL 静态链接风险静态嵌入 LGPL 库改为动态链接商业授权超范围未签约或超版本分发签约登记、版本锁定工具链误解将 GCC 视为产物依赖明确工具链不在产物闭包供应链不透明无 SBOM、无许可记录SBOM 准入流程文档滞后新增依赖未登记合入前强制更新本文件8 未来扩展评估如需支持原生 R2000.dwg二进制需重新评估以下路径8.1 ODA Drawings SDK商业授权须与 ODA 签约。接入前应登记授权范围授权版本分发限制费用与期限合规义务。8.2 LibreDWG仅在项目整体转为 GPL 兼容许可时才可考虑。当前明确排除。形式化地若LLibreDWG∈VGPL L_{\mathrm{LibreDWG}} \in V_{\mathrm{GPL}}LLibreDWG​∈VGPL​则只有在License(P)∈LGPL−compatible \mathrm{License}(P) \in \mathcal{L}_{\mathrm{GPL-compatible}}License(P)∈LGPL−compatible​时才可能满足Compliant(P∪{LLibreDWG})true \mathrm{Compliant}(P \cup \{L_{\mathrm{LibreDWG}}\}) \mathrm{true}Compliant(P∪{LLibreDWG​})true当前项目许可不属于该集合因此禁止。9 结论SketchCAD 在 P0-01 文件格式升级中的核心结论如下坚持零第三方几何/解析库文件格式相关能力全部自研实现在工程上保持可控在许可上保持清晰GPL 依赖一律禁止引入通过许可传染边界模型、依赖许可风险评分与产物依赖闭包判定明确排除 LibreDWG、libdxfrw、dxflib 等 GPL 依赖ODA 商业 SDK 暂缓接入当前不引入避免授权成本、版本绑定与分发合规审查后续扩展时再评估R2000 以自研 DXF 交付采用 ASCII 二进制容器形态原生 DWG 仅覆盖 R12不绑定外部内核Qt 6 LGPL 动态链接合规既有 Qt 6 LGPL 动态链接与 GCC/MinGW 工具链不触发 GPL 传染满足 LGPL 边界要求。附录 A 许可兼容性判定伪代码function license_risk(L): score 0 if L.license in {GPL-2.0, GPL-3.0, AGPL}: score 0.6 if L.link_mode static: score 0.2 if L.modified: score 0.1 if L.distributed: score 0.1 return score function can_include(P, L): if license_risk(L) R_MAX: return false if L.license in {GPL-2.0, GPL-3.0, AGPL}: return false if L.license LGPL and L.link_mode dynamic: return replaceable(L) and notices(P, L) if L.license Commercial: return signed(P, L) return manual_review(L)附录 B 变更记录版本日期变更内容责任人v1.0P0-01 初始记录文件格式、第三方内核评估文件格式组v1.1P0-01 优化增加 LCB、DLRS、PDC 模型与合规决策函数合规与架构组附录 C 合规检查清单是否存在 GPL/AGPL 依赖进入产物依赖闭包LGPL 依赖是否采用动态链接是否提供许可证副本与版权声明是否允许用户替换 LGPL 共享库商业 SDK 是否已签约并登记授权范围新增依赖是否已更新third-party-notices.md是否生成并维护 SBOM是否禁止静态链接 GPL/LGPL 库最终声明任何新增第三方解析/几何库必须在合入前更新本文件并复核许可避免 GPL 污染与商业授权风险。
返回列表