# acadrust MPL-2.0 — 의무 사항과 조치 내역 | 항목 | 내용 | |------|------| | 작성 목적 | 파서(acadrust, MPL-2.0)를 담은 wasm 을 공개 배포하면서 지켜야 할 의무를 확정하고 조치 내역 기록 | | 대상 배포물 | `https://dwg-dxf-viewer-sample.pages.dev/` (Cloudflare Pages, 공개) | | 검토일 | 2026-08-04 | | 상태 | **조치 완료** — 고지 파일·MPL 원문·패치 동봉, 사이트에서 링크 | --- ## 0. 결론 (세 줄) 1. **이번 lineweight 작업은 MPL 파일을 건드리지 않았다.** 수정한 `dwg-wasm/src/lib.rs` 는 우리 MIT 코드다. → MPL 의무가 *새로* 생기지 않았다. 2. 그러나 **이전부터** acadrust 를 한 파일 패치해서 wasm 에 컴파일해 공개 배포 중이었고, 그 상태가 **MPL-2.0 §3.2 위반**이었다. 라이선스 원문도 고지도 소스 입수 경로도 없었다. 3. **upstream(hakanaktt/acadrust)에 PR 을 올릴 의무는 없다.** MPL 은 기여 강제가 아니다. **배포물에 고지 + 소스 입수 경로만 넣으면 된다.** ← 이번에 그렇게 조치했다. --- ## 1. 무엇이 MPL 이고 무엇이 우리 것인가 | 코드 | 위치 | 라이선스 | 이번 세션에서 수정? | |------|------|----------|---------------------| | **acadrust 0.4.1** (DWG 파서 본체) | `hmwebviewer/rust/acadrust/` | **MPL-2.0** | **아니오** | | dwg-wasm (wasm-bindgen 래퍼 + JSON 직렬화) | `hmwebviewer/rust/dwg-wasm/src/lib.rs` | MIT (우리 코드) | 예 (lineWeight 필드 추가) | | Viewer2D 외 프론트엔드 | `src/` | MIT | 예 | MPL-2.0 은 **파일 단위(file-level) 카피레프트**다. GPL 처럼 프로젝트 전체로 번지지 않는다. MPL 파일을 고쳤으면 **그 파일만** MPL 로 유지하고 소스를 공개하면 되고, MPL 파일을 호출·링크하는 우리 코드(§3.3 의 "Larger Work")는 우리가 원하는 라이선스로 배포할 수 있다. → **`lib.rs` 에 필드 세 개 추가한 것은 MPL 전염 사유가 아니다.** ## 2. 그럼에도 의무가 있는 이유 — 이미 한 파일을 고쳤다 vendored acadrust 를 crates.io 원본과 diff 하면 **정확히 한 파일**이 다르다. ```bash diff -rq ~/.cargo/registry/src/index.crates.io-*/acadrust-0.4.1/src \ hmwebviewer/rust/acadrust/src # → src/io/dwg/dwg_stream_readers/object_reader/entities.rs 만 differ ``` `read_mesh` 의 배열 길이를 남은 비트 수로 제한하는 패치다(대형 SubD 메쉬 손상 수정, [`subdmesh-rendering.md`](./subdmesh-rendering.md)). **이 파일은 Modified Covered Software** 이고, 그 소스는 MPL 하에 제공되어야 한다. 그리고 `.wasm` 은 acadrust 를 컴파일해 담은 **Executable Form** 이다. 공개 사이트에서 브라우저로 내려보내는 순간 MPL 상 "Distribution" 에 해당한다. ### 적용되는 조항 | 조항 | 요구 | |------|------| | §3.1 | Source Code Form 을 배포하면 MPL 하에 배포하고 라이선스 사본을 동봉 | | **§3.2** | **Executable Form 배포 시**: (a) 해당 Covered Software 의 Source Code Form 을 MPL 하에 제공하고, (b) **수령자에게 그 입수 방법을 알릴 것** (배포 비용 이상 청구 금지) | | §3.3 | Larger Work(우리 앱)는 다른 라이선스로 배포 가능 — 위 (a)(b)를 지키는 한 | | §3.4 | 라이선스·저작권 고지를 제거하지 말 것 | **MPL 에는 upstream 기여 의무 조항이 없다.** §3.2 는 "수령자에게 제공"이지 "원저자에게 반영"이 아니다. ## 3. 위반 상태였던 지점 (조치 전) - 배포 사이트에 MPL-2.0 **원문 없음** - acadrust 를 쓴다는 **고지 없음** (README 표에만 한 줄, 배포물에는 미포함) - 패치된 `entities.rs` 소스를 **얻을 방법 없음** - `hmwebviewer` GitHub 저장소는 비공개(API 404) - 샘플 저장소는 사내 gitea - 즉 공개 배포 대상자가 소스에 접근할 경로가 전무 ## 4. 조치 사항 (완료) ### 4-1. 배포물에 동봉 | 파일 | 배포 URL | 내용 | |------|----------|------| | `public/licenses/acadrust-MPL-2.0.txt` | `/licenses/acadrust-MPL-2.0.txt` | MPL-2.0 원문 (§3.1·§3.4) | | `public/licenses/acadrust-0.4.1-read_mesh.patch` | `/licenses/acadrust-0.4.1-read_mesh.patch` | 우리 수정분 diff (§3.2(a)) | | `public/licenses/THIRD-PARTY-NOTICES.md` | `/licenses/THIRD-PARTY-NOTICES.md` | 컴포넌트·버전·업스트림·수정 여부·복원 절차 (§3.2(b)) | 저장소 루트에도 같은 내용의 [`../THIRD-PARTY-NOTICES.md`](../THIRD-PARTY-NOTICES.md) 를 둔다. ### 4-2. 사이트에서 링크 `index.html` 우측 "Module recipe" 패널 하단에 고지 링크 추가. §3.2(b) 의 "reasonable manner" 요건은 **수령자가 실제로 찾을 수 있는 위치**를 요구한다. ### 4-3. 소스 복원 절차 명시 원본 크레이트 + 패치 조합이면 컴파일된 소스를 바이트 단위로 재현할 수 있다. ```bash curl -O https://crates.io/api/v1/crates/acadrust/0.4.1/download tar xf download && cd acadrust-0.4.1 patch -p1 < acadrust-0.4.1-read_mesh.patch ``` 업스트림 커밋 `f249c2f816acf36ee51cd5533716bdd443c2517e` 도 고지에 적어 뒀다 (크레이트의 `.cargo_vcs_info.json` 값). ## 5. 질문에 대한 답 > **"해당 레포(upstream)에 올려야 하나, 배포시 문서만 추가하면 되나?"** **문서(고지) + 소스 입수 경로만 배포물에 넣으면 된다. upstream PR 은 의무가 아니다.** | 선택지 | MPL 상 필요? | 판단 | |--------|--------------|------| | 배포물에 MPL 원문 + 고지 + 패치 동봉 | **필수** | ✅ 이번에 조치 | | upstream `hakanaktt/acadrust` 에 PR | 아니오 | 선택 — read_mesh 수정은 일반 버그픽스라 올리면 유지보수 부담이 준다 (권장, 의무 아님) | | `hmwebviewer` 저장소 공개 전환 | 아니오 | 불필요 — 패치 동봉으로 §3.2 충족 | | 패치된 acadrust 전체 소스를 이 저장소에 vendoring | 아니오 | 더 엄격한 대안. 189 파일이 샘플 저장소에 들어와 무거워짐. 원본+패치 방식은 배포판(distro) 관행과 동일하고 §3.2 를 충족 | > **"lineweight 작업으로 라이선스 의무가 생겼나?"** **아니오.** 이번에 고친 `dwg-wasm/src/lib.rs` 는 MIT 인 우리 파일이고, MPL 파일은 건드리지 않았다(위 §2 diff 로 확인). 의무는 **이전 read_mesh 패치 + wasm 공개 배포**에서 이미 발생해 있었고, 이번에 뒤늦게 정리한 것이다. ## 6. 앞으로 지킬 것 (체크리스트) - [ ] `rust/acadrust/` 아래 파일을 고치면 → 패치 파일을 다시 뽑아 `public/licenses/` 갱신 - [ ] acadrust 버전을 올리면 → 고지의 버전·커밋·패치를 함께 갱신 - [ ] 새 서드파티를 번들하면 → `THIRD-PARTY-NOTICES.md` 에 행 추가 - [ ] MPL 파일에서 라이선스 헤더 주석을 지우지 말 것 (§3.4) - [ ] 배포 전 `/licenses/` 3개 파일이 실제로 서빙되는지 확인 ## 7. 참고 - MPL-2.0 원문: [`../public/licenses/acadrust-MPL-2.0.txt`](../public/licenses/acadrust-MPL-2.0.txt) - FAQ: https://www.mozilla.org/MPL/2.0/FAQ/ (Q: file-level copyleft, Q: 배포 의무 범위) - 수정 경위: [`subdmesh-rendering.md`](./subdmesh-rendering.md) - 이번 파서 변경(MIT 영역): [`lineweight-rendering.md`](./lineweight-rendering.md) §4-1