Files
FreeCADWasmDev/docs/dependency-closure.md
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

109 lines
6.8 KiB
Markdown

# FreeCAD Web Dependency Closure
This report is generated from the current FreeCAD checkout. It is an evidence inventory for the Web kernel P0 slice; it does not claim that the targets already compile under Emscripten or that Web behavior is feature-complete.
- Schema: `freecad-web-dependency-closure/v1`
- Generated: `2026-08-18T09:57:43+00:00`
- Source HEAD: `4f4e9244e613ea2df06e70027074a562695048cb`
- FreeCAD package version: `1.2.0`
- CMake: `cmake version 3.28.3`; minimum `3.22.0`
- Emscripten: `emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.6 ()`
## Target Inventory
| Target | CMake source root | Files | Direct internal targets |
|---|---|---:|---|
| `FreeCADBase` | `src/Base` | 166 | - |
| `FreeCADApp` | `src/App` | 203 | `FreeCADBase` |
| `Materials` | `src/Mod/Material/App` | 72 | `FreeCADApp` |
| `Part` | `src/Mod/Part/App` | 373 | `FreeCADApp`, `Materials` |
| `PartDesign` | `src/Mod/PartDesign/App` | 77 | `FreeCADApp`, `Part` |
| `Sketcher` | `src/Mod/Sketcher/App` | 67 | `FreeCADApp`, `Part` |
## Root Dependency Closure
### `FreeCADBase`
- Targets: `FreeCADBase`
- External packages: `Boost`, `ICU`, `POSIX libutil/libdl`, `PyCXX`, `Python3`, `Qt5::Core or Qt6::Core`, `Xerces-C`, `Zipios++`, `fmt`, `libfastsignals`, `zlib`
### `FreeCADApp`
- Targets: `FreeCADApp`, `FreeCADBase`
- External packages: `Boost`, `ICU`, `POSIX libutil/libdl`, `PyCXX`, `Python3`, `Qt5::Core or Qt6::Core`, `Qt5::Xml or Qt6::Xml`, `Xerces-C`, `Zipios++`, `fmt`, `libfastsignals`, `zlib`
### `Part`
- Targets: `Part`, `FreeCADApp`, `FreeCADBase`, `Materials`
- External packages: `Boost`, `FreeType`, `HarfBuzz`, `ICU`, `OpenCASCADE`, `POSIX libutil/libdl`, `PyCXX`, `Python3`, `Qt5::Concurrent or Qt6::Concurrent`, `Qt5::Core or Qt6::Core`, `Qt5::Xml or Qt6::Xml`, `Xerces-C`, `Zipios++`, `fmt`, `libfastsignals`, `yaml-cpp`, `zlib`
### `PartDesign`
- Targets: `PartDesign`, `Part`, `FreeCADApp`, `FreeCADBase`, `Materials`
- External packages: `Boost`, `FreeType`, `HarfBuzz`, `ICU`, `OpenCASCADE`, `POSIX libutil/libdl`, `PyCXX`, `Python3`, `Qt5::Concurrent or Qt6::Concurrent`, `Qt5::Core or Qt6::Core`, `Qt5::Xml or Qt6::Xml`, `Xerces-C`, `Zipios++`, `fmt`, `libfastsignals`, `nlohmann-json`, `yaml-cpp`, `zlib`
### `Sketcher`
- Targets: `Sketcher`, `Part`, `FreeCADApp`, `FreeCADBase`, `Materials`
- External packages: `Boost`, `Eigen3`, `FreeType`, `HarfBuzz`, `ICU`, `OpenCASCADE`, `POSIX libutil/libdl`, `PyCXX`, `Python3`, `Qt5::Concurrent or Qt6::Concurrent`, `Qt5::Core or Qt6::Core`, `Qt5::Xml or Qt6::Xml`, `Xerces-C`, `Zipios++`, `fmt`, `libfastsignals`, `nlohmann-json`, `yaml-cpp`, `zlib`
`Materials` is included because `Part` links it, even though it is outside the five requested root targets.
## External Package Closure
| Package | Used by | Locked source | Conditions / caveat |
|---|---|---|---|
| `Boost` | `FreeCADApp`, `FreeCADBase` | 1.83.0 (`boost1.83_1.83.0.orig.tar.xz`) | always |
| `Eigen3` | `Sketcher` | 3.4.0 (`eigen-3.4.0.tar.gz`) | EIGEN3_FOUND |
| `FreeType` | `Part` | 2.13.2 (`freetype-2.13.2.tar.xz`) | FREETYPE_FOUND |
| `HarfBuzz` | `Part` | not in sources.lock.tsv | FREETYPE_FOUND |
| `ICU` | `FreeCADBase` | not in sources.lock.tsv | always |
| `OpenCASCADE` | `Part`, `PartDesign` | V7_6_3 (`occt-7.6.3.tar.gz`) | always |
| `POSIX libutil/libdl` | `FreeCADBase` | not in sources.lock.tsv | CMAKE_SYSTEM_NAME == Linux |
| `PyCXX` | `FreeCADBase` | r464 (`-`) | always; source/include |
| `Python3` | `FreeCADBase` | 3.12.3 (`Python-3.12.3.tgz`) | BUILD_DYNAMIC_LINK_PYTHON |
| `Qt5::Concurrent or Qt6::Concurrent` | `Materials` | 5.15.13 (`qt-everywhere-opensource-src-5.15.13.tar.xz`) | always |
| `Qt5::Core or Qt6::Core` | `FreeCADApp`, `FreeCADBase` | 5.15.13 (`qt-everywhere-opensource-src-5.15.13.tar.xz`) | always |
| `Qt5::Xml or Qt6::Xml` | `FreeCADApp` | 5.15.13 (`qt-everywhere-opensource-src-5.15.13.tar.xz`) | always |
| `Xerces-C` | `FreeCADBase` | 3.2.4 (`xerces-c-3.2.4.tar.gz`) | always |
| `Zipios++` | `FreeCADBase` | 2.2.6 (`zipios-2.2.6.tar.gz`) | FREECAD_USE_EXTERNAL_ZIPIOS selects link vs in-tree |
| `fmt` | `FreeCADApp`, `FreeCADBase` | not in sources.lock.tsv | always |
| `libfastsignals` | `FreeCADBase` | not in sources.lock.tsv | always; in-tree |
| `nlohmann-json` | `PartDesign`, `Sketcher` | not in sources.lock.tsv | header-only; always |
| `yaml-cpp` | `Materials` | not in sources.lock.tsv | always |
| `zlib` | `FreeCADBase` | v1.3 (`zlib-1.3.tar.gz`) | always |
## Source Include Evidence
The JSON report contains the full file lists and per-file include family evidence. The aggregate counts below show which external families are visible in the target source trees.
- `FreeCADBase`: `Boost`=21, `ICU`=4, `PyCXX`=11, `Python`=5, `Qt`=48, `Xerces-C`=48, `Zipios++`=10, `fmt`=8, `unresolved quoted header`=42, `unresolved system header`=402
- `FreeCADApp`: `Boost`=83, `PyCXX`=11, `Python`=3, `Qt`=49, `Xerces-C`=21, `Zipios++`=12, `fmt`=4, `unresolved quoted header`=62, `unresolved system header`=726
- `Materials`: `PyCXX`=9, `Python`=1, `Qt`=102, `unresolved quoted header`=53, `unresolved system header`=139, `yaml-cpp`=2
- `Part`: `Boost`=24, `OpenCASCADE`=1527, `PyCXX`=1, `Qt`=10, `unresolved quoted header`=299, `unresolved system header`=1343
- `PartDesign`: `Boost`=3, `OpenCASCADE`=171, `Qt`=1, `nlohmann-json`=1, `unresolved quoted header`=11, `unresolved system header`=284
- `Sketcher`: `Boost`=34, `Eigen3`=6, `OpenCASCADE`=89, `PyCXX`=1, `Qt`=3, `fmt`=1, `nlohmann-json`=1, `unresolved quoted header`=26, `unresolved system header`=281
## Conditions and Limits
- `FreeCADBase`: BUILD_GUI is not required by this target; Python bindings are compiled in this target.
- `FreeCADApp`: FreeCADBase must be built; Python bindings are compiled in this target.
- `Materials`: Built when BUILD_MATERIAL is enabled; Material external manager is optional.
- `Part`: BUILD_PART; Materials target must be available.
- `PartDesign`: BUILD_PART_DESIGN; Part target must be available.
- `Sketcher`: BUILD_SKETCHER; EIGEN3_FOUND is required by src/Mod/CMakeLists.txt; Part target must be available.
- CMake conditionals, imported targets, generated sources, and platform-specific link resolution are not evaluated by this static scan.
- The source lock has no checksum column; archive_sha256 is null unless --hash-archives is used.
- A dependency in this report is not Web-compatible until an Emscripten configure/build probe succeeds.
- The report is tied to the recorded git checkout and must be regenerated after source or build-option changes.
## Reproduction
```bash
python3 FreeCAD/tools/generate_web_dependency_closure.py
python3 FreeCAD/tools/generate_web_dependency_closure.py --hash-archives
```
The second command is the full checkpoint command. It reads the existing local archives and does not download anything. The first command is a faster inventory refresh that leaves archive checksums null.