feat: add candidate FreeCAD naming SDK and attachment oracles
Some checks failed
real-verification / chrome (push) Has been cancelled
real-verification / freecad-oracle (push) Has been cancelled
real-verification / wasm (push) Has been cancelled

Build and verify the candidate-only FreeCAD naming bridge and OCCT worker path, including three-stage StringHasher restoration. Add Datum, ShapeBinder, attachment-mode, and PartDesign structure oracles plus offline SDK build plans and CI boundary checks.
This commit is contained in:
2026-08-13 17:16:07 -04:00
parent 58c0807219
commit f97eae4153
79 changed files with 7936 additions and 77 deletions

View File

@@ -0,0 +1 @@
using emscripten : 3.1.69 : ./boost-emscripten-compiler-wrapper.sh ;

View File

@@ -0,0 +1,33 @@
set(Boost_VERSION 108300)
set(Boost_VERSION_STRING "1.83.0")
set(Boost_INCLUDE_DIRS "${BOOST_WASM_ROOT}/include")
set(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIRS}")
set(Boost_LIBRARIES "")
foreach(component IN LISTS Boost_FIND_COMPONENTS)
string(TOLOWER "${component}" component_lower)
set(archive "${BOOST_WASM_ROOT}/lib/libboost_${component_lower}.a")
if(NOT EXISTS "${archive}")
set(Boost_${component}_FOUND FALSE)
set(Boost_FOUND FALSE)
if(Boost_FIND_REQUIRED_${component})
message(FATAL_ERROR "Missing Boost wasm component ${component}: ${archive}")
endif()
continue()
endif()
if(NOT TARGET Boost::${component})
add_library(Boost::${component} STATIC IMPORTED)
set_target_properties(Boost::${component} PROPERTIES
IMPORTED_LOCATION "${archive}"
INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
)
if(component_lower STREQUAL "thread")
set_property(TARGET Boost::${component} APPEND PROPERTY INTERFACE_LINK_LIBRARIES
"${BOOST_WASM_ROOT}/lib/libboost_atomic.a")
endif()
endif()
set(Boost_${component}_FOUND TRUE)
list(APPEND Boost_LIBRARIES Boost::${component})
endforeach()
set(Boost_FOUND TRUE)

View File

@@ -0,0 +1,9 @@
set(PACKAGE_VERSION "1.83.0")
if(PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
set(PACKAGE_VERSION_COMPATIBLE TRUE)
if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_EXACT TRUE)
endif()
endif()

View File

@@ -0,0 +1,17 @@
if(NOT FREECAD_WASM_OFFLINE_SYSROOT)
message(FATAL_ERROR "FREECAD_WASM_OFFLINE_SYSROOT is required by the candidate fmt package")
endif()
set(_freecad_wasm_fmt_include "${FREECAD_WASM_OFFLINE_SYSROOT}/fmt-10.1.1/include")
if(NOT EXISTS "${_freecad_wasm_fmt_include}/fmt/format.h")
message(FATAL_ERROR "Offline fmt headers are missing: ${_freecad_wasm_fmt_include}/fmt/format.h")
endif()
if(NOT TARGET fmt)
add_library(fmt INTERFACE)
target_include_directories(fmt INTERFACE "${_freecad_wasm_fmt_include}")
target_compile_definitions(fmt INTERFACE FMT_HEADER_ONLY=1)
endif()
if(NOT TARGET fmt::fmt)
add_library(fmt::fmt ALIAS fmt)
endif()
set(fmt_FOUND TRUE)
set(fmt_VERSION 10.1.1)

View File

@@ -102,7 +102,8 @@
},
"freecadNamingBuild": {
"status": "contract-only",
"prerequisiteStatus": "qt6-wasm-core-and-locked-mapped-name-source-probe-pass",
"prerequisiteStatus": "real-isolated-freecad-private-naming-bridge-pass",
"sdkReadinessStatus": "candidate-complete",
"sdkEnvironment": "FREECAD_WASM_SDK_DIR",
"requiredManifest": "manifest.json",
"requiredCallbacks": ["freecadNamingAbiVersion", "freecadNamingCapabilitiesJson", "freecadNamingEvidenceJson"],
@@ -111,8 +112,21 @@
"requiredEmscriptenVersion": "3.1.69",
"buildCommand": "./npmw run build:freecad-naming-worker",
"qtCoreBuildCommand": "./npmw run build:qt6-wasm-core",
"qtFreecadSdkBuildCommand": "./npmw run build:qt6-freecad-wasm",
"yamlCppBuildCommand": "./npmw run build:yaml-cpp-wasm",
"icuBuildCommand": "./npmw run build:icu-wasm",
"pythonBuildCommand": "./npmw run build:cpython-wasm",
"xercesBuildCommand": "./npmw run build:xerces-c-wasm",
"boostBuildCommand": "./npmw run build:boost-wasm",
"sourceProbeBuildCommand": "./npmw run build:freecad-naming-source-probe",
"sourceProbeTestCommand": "./npmw run test:freecad-naming-source-probe",
"sdkReadinessCommand": "./npmw run check:freecad-naming-sdk-readiness",
"sdkManifestCommand": "./npmw run generate:freecad-naming-sdk-manifest",
"isolatedBridgeBuildCommand": "./npmw run build:freecad-naming-bridge-candidate",
"isolatedBridgeTestCommand": "./npmw run test:freecad-naming-bridge-candidate",
"candidateWorkerTestCommand": "./npmw run test:freecad-naming-worker-candidate",
"candidateChromeRunCommand": "./npmw run test:chrome-freecad-naming-worker-candidate",
"candidateChromeCheckCommand": "./npmw run check:chrome-freecad-naming-worker-candidate",
"boundaryCheckCommand": "./npmw run check:freecad-private-naming-boundary",
"checkCommand": "./npmw run check:freecad-naming-sdk",
"statusBoundary": "Missing SDK or callback probe keeps EX-TSN-02=in_progress and systemExact=false"

View File

@@ -0,0 +1,13 @@
# Candidate-only wrapper around the pinned Emscripten 3.1.69 platform file.
include("/usr/share/emscripten/cmake/Modules/Platform/Emscripten.cmake")
# FreeCAD declares Base/App/Part as SHARED. For this candidate, collect their
# wasm object files as static archives and link shared dependencies separately.
set(CMAKE_SHARED_LIBRARY_SUFFIX ".a")
set(CMAKE_C_CREATE_SHARED_LIBRARY "<CMAKE_AR> rcs <TARGET> <OBJECTS>")
set(CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_AR> rcs <TARGET> <OBJECTS>")
# FreeCAD's native compiler setup uses the CMake UNIX boolean to add
# --undefined,dynamic_lookup. Emscripten emits SHARED as a relocatable object,
# so that native-only linker branch must stay disabled for this candidate.
set(UNIX FALSE)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,87 @@
{
"schemaVersion": 1,
"scope": "freecad-private-naming-and-parameter-followup",
"orderedTasks": [
{
"id": "SDK-01",
"title": "Lock candidate FreeCAD wasm SDK baseline and build boundary",
"status": "completed",
"dependencies": [],
"deliverables": ["Pinned source/toolchain plan", "Candidate-only build-plan checker"],
"acceptance": ["FreeCAD commit and Emscripten version are verified", "Production publication remains false"],
"evidence": ["check:freecad-wasm-sdk-build-plan"]
},
{
"id": "SDK-02A",
"title": "Build the Qt wasm modules required by FreeCAD",
"status": "completed",
"dependencies": ["SDK-01"],
"deliverables": ["Qt Core/Concurrent/Network/Xml archives", "Qt bundled Pcre2/ZLIB archives"],
"acceptance": ["Every archive contains only wasm32 objects", "Thread support is enabled for QtConcurrent"],
"evidence": ["check:freecad-naming-sdk-readiness"]
},
{
"id": "SDK-02B",
"title": "Build remaining wasm dependencies and FreeCADBase/App/Part archives",
"status": "completed",
"dependencies": ["SDK-02A"],
"deliverables": ["Python/ICU/Xerces/yaml-cpp/fmt wasm dependencies", "FreeCADBase/FreeCADApp/Part static archives"],
"acceptance": ["No host ELF member is present", "CMake configuration performs no implicit network fetch"],
"evidence": ["build:freecad-naming-sdk-candidate", "check:freecad-naming-sdk-readiness"]
},
{
"id": "SDK-04",
"title": "Implement an isolated real FreeCAD private naming bridge",
"status": "completed",
"dependencies": ["SDK-02B"],
"deliverables": ["Three versioned callback implementations", "MappedNameRef/StringHasher/ElementMap2 runtime evidence"],
"acceptance": ["Candidate bridge passes strict Web validation", "Candidate is not published to the production Worker"],
"evidence": ["build:freecad-naming-bridge-candidate", "test:freecad-naming-bridge-candidate", "check:freecad-naming-bridge-candidate", "check:freecad-private-naming-boundary"]
},
{
"id": "SDK-03",
"title": "Generate and verify the complete SDK manifest",
"status": "completed",
"dependencies": ["SDK-02B", "SDK-04"],
"deliverables": ["Hashed manifest", "Private header and symbol audit"],
"acceptance": ["Manifest generator completes without missing inputs", "Complete SDK checker passes"],
"evidence": ["generate:freecad-naming-sdk-manifest", "check:freecad-naming-sdk"]
},
{
"id": "SDK-05",
"title": "Link and probe a candidate OCCT Worker",
"status": "completed",
"dependencies": ["SDK-03", "SDK-04"],
"deliverables": ["Candidate Worker artifact", "Real Chrome callback and builder-history evidence"],
"acceptance": ["All three callbacks are exported together", "Invalid or incomplete evidence fails closed"],
"evidence": ["build:freecad-naming-worker", "test:freecad-naming-worker-candidate", "test:chrome-freecad-naming-worker-candidate", "check:chrome-freecad-naming-worker-candidate"]
},
{
"id": "PAR-01",
"title": "Expand Datum/Attachment/ShapeBinder, multi-Body and parameter combinations",
"status": "in_progress",
"dependencies": ["SDK-05"],
"deliverables": ["Native oracle corpus", "Edit/recompute/recovery/FCStd round-trip matrix"],
"acceptance": ["Every family has success and failure evidence", "Support/Tip/references survive mutation without silent rebinding"],
"evidence": ["check:freecad-sketcher-partdesign-abi", "check:freecad-partdesign-structure", "check:freecad-attachment-modes", "check:chrome-partdesign-lifecycle"]
},
{
"id": "QA-01",
"title": "Close CI, offline-resource and browser matrix for the new production path",
"status": "pending",
"dependencies": ["PAR-01"],
"deliverables": ["Execute/check-separated CI lanes", "Offline SDK resources", "Chrome/Firefox/WebKit reports"],
"acceptance": ["Static reports cannot substitute for live harnesses", "A clean offline restore can rebuild and verify the candidate"],
"evidence": ["ci:real:chrome", "ci:check:chrome", "offline:smoke", "check:browser-matrix"]
}
],
"boundary": {
"freecadNamingBuildStatus": "contract-only",
"exTsn02": "in_progress",
"systemExact": false,
"productionWorker": {
"availability": "unavailable",
"callbacks": []
}
}
}

View File

@@ -0,0 +1,277 @@
{
"schemaVersion": 1,
"scope": "pre-production-sdk-readiness",
"baseline": {
"freecadVersion": "1.1.1",
"sourceCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d",
"emscriptenVersion": "3.1.69",
"qtVersion": "6.8.2",
"target": "wasm32-emscripten"
},
"includeDirs": [
{
"name": "FreeCAD",
"path": ".cache/toolchains/freecad-naming-sdk/source-occt8/src",
"requiredHeaders": [
"App/StringHasher.h",
"App/MappedName.h",
"App/MappedElement.h",
"App/ElementMap.h"
]
},
{
"name": "FreeCADBuild",
"path": ".cache/toolchains/freecad-naming-sdk/build-wasm/src",
"requiredHeaders": ["Base/PersistencePy.h", "Build/Version.h"]
},
{
"name": "PyCXX",
"path": ".cache/toolchains/freecad-naming-sdk/source-occt8/src/3rdParty/PyCXX",
"requiredHeaders": ["CXX/Objects.hxx", "CXX/Extensions.hxx"]
},
{
"name": "OCCT",
"path": ".cache/bitbybit/occt-history-build-offline/include/opencascade",
"requiredHeaders": ["Standard.hxx", "TopoDS_Shape.hxx"]
},
{
"name": "OCCTDeprecatedAliases",
"path": ".cache/occt/occt/src/Deprecated/NCollectionAliases",
"requiredHeaders": ["TopTools_ListOfShape.hxx", "TopTools_HSequenceOfShape.hxx"]
},
{
"name": "QtCore",
"path": ".cache/toolchains/qt6/install-wasm-freecad/include",
"requiredHeaders": [
"QtCore/QByteArray",
"QtCore/QJsonDocument",
"QtConcurrent/QtConcurrent",
"QtNetwork/QNetworkAccessManager",
"QtXml/QDomDocument"
]
},
{
"name": "QtCoreModule",
"path": ".cache/toolchains/qt6/install-wasm-freecad/include/QtCore",
"requiredHeaders": ["QString", "QJsonDocument", "QProcessEnvironment"]
},
{
"name": "Python",
"path": ".cache/toolchains/python/install-wasm/include/python3.13",
"requiredHeaders": ["Python.h", "pyconfig.h"]
},
{
"name": "XercesC",
"path": ".cache/toolchains/xerces-c/install-wasm/include",
"requiredHeaders": ["xercesc/util/XercesVersion.hpp"]
},
{
"name": "ICU",
"path": ".cache/toolchains/icu/install-wasm/include",
"requiredHeaders": ["unicode/uversion.h"]
},
{
"name": "YamlCpp",
"path": ".cache/toolchains/yaml-cpp/install-wasm/include",
"requiredHeaders": ["yaml-cpp/yaml.h"]
},
{
"name": "OfflineSysroot",
"path": ".cache/offline-sysroot/include",
"requiredHeaders": ["boost/signals2.hpp", "fmt/format.h", "eigen3/Eigen/Core"]
}
],
"libraries": [
{
"name": "FreeCADBase",
"path": ".cache/toolchains/freecad-naming-sdk/lib/libFreeCADBase.a",
"required": true,
"expectedSha256": "df02d5527285750a5a34012bb04a177e97719290f4704e8a20110207367698d6"
},
{
"name": "FreeCADApp",
"path": ".cache/toolchains/freecad-naming-sdk/lib/libFreeCADApp.a",
"required": true,
"expectedSha256": "b81c3cb67934b6add3a810a0885baeb9b459cf370b460cb3906d1b20fbe0a500"
},
{
"name": "Part",
"path": ".cache/toolchains/freecad-naming-sdk/lib/libPart.a",
"required": true,
"expectedSha256": "a5d0f1eabd8a3e7e3ad37807ca7cab90810d2fcfe50c2956020485a37bf27d69"
},
{
"name": "QtCore",
"path": ".cache/toolchains/qt6/install-wasm-freecad/lib/libQt6Core.a",
"required": true,
"expectedSha256": "7cf42203ae54fc4706a5dba69a179b340d1a5bf27ce9db881f11d57c66fd3828"
},
{
"name": "Python",
"path": ".cache/toolchains/python/install-wasm/lib/libpython3.13.a",
"required": true,
"expectedSha256": "2e332bc1141eeea51c94510ecc8f237e1f50ff9b3bc03df9cfc6142cd0489bd0"
}
],
"linkDependencies": [
{
"name": "QtConcurrent",
"path": ".cache/toolchains/qt6/install-wasm-freecad/lib/libQt6Concurrent.a",
"required": true,
"expectedSha256": "52a8ddbc72a420a7cd93593328f2e252cfd696a37b878c623f0ecfe5cb5ade81"
},
{
"name": "QtNetwork",
"path": ".cache/toolchains/qt6/install-wasm-freecad/lib/libQt6Network.a",
"required": true,
"expectedSha256": "1c06acc8b5a18447951b3a53f36f555d80544d804eb9ff920fcac20d9ced019c"
},
{
"name": "QtXml",
"path": ".cache/toolchains/qt6/install-wasm-freecad/lib/libQt6Xml.a",
"required": true,
"expectedSha256": "8694057ac1ac468b3cd40da3bd16312662e434ba4b485780eb7a31ea44381f88"
},
{
"name": "QtBundledPcre2",
"path": ".cache/toolchains/qt6/install-wasm-freecad/lib/libQt6BundledPcre2.a",
"required": true,
"expectedSha256": "9dc72f77f02b13ae7f7de4bcd579a6f04acd6d72cd76d348db1cbfaf6d6d777b"
},
{
"name": "QtBundledZLIB",
"path": ".cache/toolchains/qt6/install-wasm-freecad/lib/libQt6BundledZLIB.a",
"required": true,
"expectedSha256": "bf3c4d7a52c706abec70d83c94e32f0bf920e978aba9bb39fd87f94efcd2201f"
},
{
"name": "yaml-cpp",
"path": ".cache/toolchains/yaml-cpp/install-wasm/lib/libyaml-cpp.a",
"required": true,
"expectedSha256": "213acb389e7e7ff6677e8170b8651a5285af1f8c5c8bf1dfc42591559f253fe5"
},
{
"name": "ICUCommon",
"path": ".cache/toolchains/icu/install-wasm/lib/libicuuc.a",
"required": true,
"expectedSha256": "3cbe58215f7dc0596dacea9e8ac10974e8b8302b9472ff854f35e2e8c21fe7a2"
},
{
"name": "ICUI18N",
"path": ".cache/toolchains/icu/install-wasm/lib/libicui18n.a",
"required": true,
"expectedSha256": "627169cfa4637fe02c5cd5d8358e3faf92f933191049f80f3381c3ab7d7719d7"
},
{
"name": "ICUData",
"path": ".cache/toolchains/icu/install-wasm/lib/libicudata.a",
"required": true,
"expectedSha256": "b146f462e94d061862c27bb11fed116a1e4678f172f6e7551f3a57fedfd17822"
},
{
"name": "XercesC",
"path": ".cache/toolchains/xerces-c/install-wasm/lib/libxerces-c.a",
"required": true,
"expectedSha256": "86fe0646cd7d2cb528708627527ce32cd963cf6b2510178f36c96c0ffa0b89ab"
},
{
"name": "BoostProgramOptions",
"path": ".cache/toolchains/boost/install-wasm/lib/libboost_program_options.a",
"required": true,
"expectedSha256": "5c900c12f5323122d08b696ab095bcfe1b4b636c5a7ccb353962c4c956e11a24"
},
{
"name": "BoostRegex",
"path": ".cache/toolchains/boost/install-wasm/lib/libboost_regex.a",
"required": true,
"expectedSha256": "8fa066fba93dcb06a7e71f21338b288598a1fc4880d8799aaa4934c2239f1f3f"
},
{
"name": "BoostThread",
"path": ".cache/toolchains/boost/install-wasm/lib/libboost_thread.a",
"required": true,
"expectedSha256": "584dbdd2a186ec905d390b62ff3d24c81e4fb18d6b7f101e136ac760e8e4927c"
},
{
"name": "BoostDateTime",
"path": ".cache/toolchains/boost/install-wasm/lib/libboost_date_time.a",
"required": true,
"expectedSha256": "859ed6fa84a44e4dc15dd95b5306d4b2f7c37d4057aa3301edf9804edb83bf29"
},
{
"name": "BoostAtomic",
"path": ".cache/toolchains/boost/install-wasm/lib/libboost_atomic.a",
"required": true,
"expectedSha256": "e7e7b22bb8b380f2ea2ac083136f040908c7f9abcb758dbebf729ec23dc92432"
},
{
"name": "PythonMpdecimal",
"path": ".cache/toolchains/python/install-wasm/lib/python-deps/libmpdec.a",
"required": true,
"expectedSha256": "d69dac9933119c1eafb9d9a1f5e5a81c7e8ef51f0367c55b5349b2b014a07849"
},
{
"name": "PythonExpat",
"path": ".cache/toolchains/python/install-wasm/lib/python-deps/libexpat.a",
"required": true,
"expectedSha256": "6bfc695a31ee252a836e60ba34192dcf047ee4c7fe6a7b68c527e5fbcb714b66"
},
{
"name": "PythonHaclSha2",
"path": ".cache/toolchains/python/install-wasm/lib/python-deps/libHacl_Hash_SHA2.a",
"required": true,
"expectedSha256": "1e622af13d53951c4992f74d2af211dd75c59ec14f2a9d3a3eb3c39b2d9899a4"
},
{
"name": "PythonZlib",
"path": ".cache/toolchains/python/install-wasm/lib/python-deps/libz.a",
"required": true,
"expectedSha256": "42acf281029e51e07d468d2f323055c7c5558e5d6d78738ec1e1571acd4afd67"
},
{
"name": "PythonBzip2",
"path": ".cache/toolchains/python/install-wasm/lib/python-deps/libbz2.a",
"required": true,
"expectedSha256": "991ac951c995d3606ebedc74bc070273005ac9ebff26a7cc38518702d5268de9"
},
{
"name": "PythonSqlite3",
"path": ".cache/toolchains/python/install-wasm/lib/python-deps/libsqlite3-mt.a",
"required": true,
"expectedSha256": "738c819dab8f31a97fc7c1104f73969fee9535222b67fd938450474f7b861fd6"
}
],
"namingBridge": {
"path": "native/freecad-naming-bridge/freecad_naming_bridge.cpp",
"hostAdapter": "native/freecad-naming-bridge/pre.js",
"requiredExports": [
"freecadNamingAbiVersion",
"freecadNamingCapabilitiesJson",
"freecadNamingEvidenceJson"
]
},
"compileOptions": {
"cxxStandard": "c++20",
"pthread": true,
"forceInclude": "config/freecad-wasm-sdk-compat.h",
"definitions": ["__linux__=1", "QT_NO_KEYWORDS", "HAVE_CONFIG_H", "PYCXX_6_2_COMPATIBILITY"]
},
"runtimeAssets": [
{
"name": "PythonWasmStdlib",
"path": ".cache/toolchains/python/install-wasm/share/python-wasm-stdlib",
"preloadTo": "/usr/local",
"requiredFiles": ["lib/python313.zip", "lib/python3.13/os.py"],
"expectedSha256": {
"lib/python313.zip": "e3fa6e7ceaf68a2f433a682713ac05288631b3c465114284d49e02e094bb0c12",
"lib/python3.13/os.py": "b6b68783d438ff044c096fd0c3d1dfc9479a9b632e0a450a376be6c01655aafe"
}
}
],
"productionPublication": false,
"boundary": {
"freecadNamingBuildStatus": "contract-only",
"exTsn02": "in_progress",
"systemExact": false
}
}

View File

@@ -0,0 +1,346 @@
{
"baselineId": "freecad-1.1.1-partdesign-structure-oracle",
"crossDocument": {
"deleted": {
"shapeBinderShapeNull": true,
"shapeBinderState": [
"Up-to-date"
],
"shapeBinderStatus": "Valid",
"shapeBinderSupport": [],
"subShapeBinderCachedArea": 48,
"subShapeBinderShapeNull": false,
"subShapeBinderState": [
"Up-to-date"
],
"subShapeBinderStatus": "Valid",
"subShapeBinderSupport": []
},
"edited": {
"shapeBinderShapeNull": true,
"shapeBinderState": [
"Up-to-date"
],
"sourceFaceArea": 48,
"sourceVolume": 192,
"subShapeBinderArea": 48,
"subShapeBinderState": [
"Up-to-date"
]
},
"initial": {
"shapeBinderExternalLink": {
"accepted": false,
"error": "PropertyLinkSubList does not support external object",
"errorType": "ValueError"
},
"shapeBinderShapeNull": true,
"shapeBinderSupport": [],
"shapeBinderSupportType": "App::PropertyLinkSubListGlobal",
"shapeBodyTip": null,
"sourceFaceArea": 30,
"sourceVolume": 120,
"subBodyTip": null,
"subShapeBinderArea": 30,
"subShapeBinderSourceDocument": "PartDesignExternalSource",
"subShapeBinderSupport": [
{
"object": "ExternalBox",
"subElements": [
"Face1"
]
}
],
"subShapeBinderSupportType": "App::PropertyXLinkSubList"
},
"roundtrip": {
"shapeBinderShapeNull": true,
"shapeBinderSupport": [],
"shapeBodyTip": null,
"sourceFaceArea": 30,
"sourceVolume": 120,
"subBodyTip": null,
"subShapeBinderArea": 30,
"subShapeBinderSourceDocument": "PartDesignExternalSource",
"subShapeBinderSupport": [
{
"object": "ExternalBox",
"subElements": [
"Face1"
]
}
]
}
},
"edited": {
"bodyTips": {
"BinderBody": null,
"DatumBody": null,
"SourceBody": "SourceBox",
"SubBinderBody": null
},
"datumPlaneAttachmentOffset": {
"angleDegrees": 45,
"axis": [
0,
0,
1
],
"position": [
0,
0,
7
]
},
"datumPlanePlacement": {
"angleDegrees": 45.00000000000001,
"axis": [
0,
0,
1
],
"position": [
0,
0,
7
]
},
"shapeBinderVolume": 672,
"sourceVolume": 672,
"subShapeBinderLength": 28
},
"freecadVersion": "1.1.1",
"gitCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d",
"initial": {
"bodyGroups": {
"BinderBody": [
"ShapeBinder"
],
"DatumBody": [
"DatumPlane",
"DatumLine",
"DatumPoint"
],
"SourceBody": [
"SourceBox"
],
"SubBinderBody": [
"SubShapeBinder"
]
},
"bodyTips": {
"BinderBody": null,
"DatumBody": null,
"SourceBody": "SourceBox",
"SubBinderBody": null
},
"datumLine": {
"mapMode": "ObjectX",
"state": [
"Up-to-date"
],
"support": [
{
"object": "XY_Plane",
"subElements": []
}
]
},
"datumPlane": {
"attachmentOffset": {
"angleDegrees": 29.999999999999996,
"axis": [
0,
0,
1
],
"position": [
0,
0,
5
]
},
"mapMode": "FlatFace",
"placement": {
"angleDegrees": 29.999999999999993,
"axis": [
0,
0,
1
],
"position": [
0,
0,
5
]
},
"state": [
"Up-to-date"
],
"support": [
{
"object": "XY_Plane",
"subElements": []
}
]
},
"datumPoint": {
"attachmentOffset": {
"angleDegrees": 0,
"axis": [
0,
0,
1
],
"position": [
1,
2,
3
]
},
"mapMode": "ObjectOrigin",
"placement": {
"angleDegrees": 0,
"axis": [
0,
0,
1
],
"position": [
1,
2,
3
]
},
"state": [
"Up-to-date"
],
"support": [
{
"object": "XY_Plane",
"subElements": []
}
]
},
"shapeBinder": {
"state": [
"Up-to-date"
],
"support": [
{
"object": "SourceBox",
"subElements": []
}
],
"traceSupport": true
},
"shapeBinderVolume": 480,
"sourceVolume": 480,
"subShapeBinder": {
"state": [
"Up-to-date"
],
"support": [
{
"object": "SourceBox",
"subElements": [
"Edge1",
"Edge2",
"Edge3",
"Edge4"
]
}
]
},
"subShapeBinderLength": 28
},
"invalidSupport": {
"state": [
"Touched",
"Invalid"
],
"status": "AttachEngine3D: subshape not found SourceBox.Face999",
"support": [
{
"object": "SourceBox",
"subElements": [
"Face999"
]
}
],
"typeId": "PartDesign::Plane"
},
"roundtrip": {
"bodyGroups": {
"BinderBody": [
"ShapeBinder"
],
"DatumBody": [
"DatumPlane",
"DatumLine",
"DatumPoint",
"InvalidDatumPlane"
],
"SourceBody": [
"SourceBox"
],
"SubBinderBody": [
"SubShapeBinder"
]
},
"bodyTips": {
"BinderBody": null,
"DatumBody": null,
"SourceBody": "SourceBox",
"SubBinderBody": null
},
"datumPlaneAttachmentOffset": {
"angleDegrees": 45,
"axis": [
0,
0,
1
],
"position": [
0,
0,
7
]
},
"datumPlaneMapMode": "FlatFace",
"datumPlaneSupport": [
{
"object": "XY_Plane",
"subElements": []
}
],
"invalidDatumState": [
"Touched",
"Invalid"
],
"invalidDatumStatus": "AttachEngine3D: subshape not found SourceBox.Face999",
"shapeBinderSupport": [
{
"object": "SourceBox",
"subElements": []
}
],
"shapeBinderVolume": 672,
"sourceVolume": 672,
"subShapeBinderLength": 28,
"subShapeBinderSupport": [
{
"object": "SourceBox",
"subElements": [
"Edge1",
"Edge2",
"Edge3",
"Edge4"
]
}
]
},
"schemaVersion": 1,
"status": "pass",
"tolerance": 1e-7
}

View File

@@ -0,0 +1,106 @@
{
"schemaVersion": 1,
"scope": "standalone-wasm-source-prerequisite",
"baseline": {
"freecadVersion": "1.1.1",
"sourceCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d",
"emscriptenVersion": "3.1.69",
"qtVersion": "6.8.2"
},
"linkedOriginalSources": [
{
"path": "src/App/IndexedName.cpp",
"sha256": "73e0e60a9d6ee06851252e2071ebdd58698f8f99733903232529b3a194164435"
},
{
"path": "src/App/MappedName.cpp",
"sha256": "90173aba5f331ac9453589833f7e5fc63c5c80a35f1600dbc71211606b1c9dbc"
},
{
"path": "src/App/StringHasher.cpp",
"sha256": "fd32f35c9c2a0c21a60fa634ec37ec594d6f331924c5bba7fdbbcb351c3b612c"
},
{
"path": "src/App/MappedElement.cpp",
"sha256": "f5448d9de693e319460d5e3ef52c63a54e0948963e4b92786aac38c77bdcd7a5"
},
{
"path": "src/App/ElementNamingUtils.cpp",
"sha256": "fc3223857ca6d2990d2b48f437f75841cdf23e1e79fa18ef18296f40acd3cdc3"
},
{
"path": "src/App/ElementMap.cpp",
"sha256": "e1ceaedb624688ddffa6a834c1b32539e8ba5bbdc0ec31401ea087e6a9c3eb52"
},
{
"path": "src/Base/Handle.cpp",
"sha256": "8f02d27a8b672e9a56764f85e394265b4fcf023aba097f040b03dcb38bc393d2"
}
],
"runtimeAssertions": [
"IndexedName parsing",
"MappedName postfix tag parsing",
"StringHasher duplicate identity",
"StringHasher SHA-1 threshold",
"StringHasher mapped indexed-name references",
"ElementMap StringHasher encoding",
"ElementMap bidirectional lookup",
"ElementMap history tracing",
"ElementMap save and restore",
"MappedElement stable ordering",
"seven-object wasm static archive linkage"
],
"hostAdapterScope": [
"Base persistence streams",
"Base type-system declarations",
"Python wrapper objects",
"logging",
"Application and Document lifecycle hooks"
],
"isolatedSourceArchive": {
"path": "native/freecad-naming-probe/dist/libFreeCADPrivateNamingProbe.a",
"target": "wasm32-emscripten",
"expectedObjectMembers": 7,
"hostAdapterBound": true,
"productionEligible": false
},
"notLinkedProductionComponents": [
"FreeCADBase static library",
"FreeCADApp static library",
"Part static library",
"Python static library",
"real Application and Document integration",
"FreeCAD private naming Worker bridge"
],
"candidateAbi": {
"scope": "isolated-non-production",
"exports": [
"freecadNamingCandidateAbiVersion",
"freecadNamingCandidateCapabilitiesJson",
"freecadNamingCandidateEvidenceJson"
],
"strictWebValidator": "pass",
"nativeResources": [
"MappedNameRef",
"StringHasher",
"ElementMap2"
],
"occtBuilderContext": false,
"publishToWorker": false
},
"production": {
"workerArtifact": "native/occt-history/dist/bitbybit-occt-history.wasm",
"workerLinked": false,
"exportedCallbacks": [],
"requiredCallbacks": [
"freecadNamingAbiVersion",
"freecadNamingCapabilitiesJson",
"freecadNamingEvidenceJson"
]
},
"boundary": {
"freecadNamingBuildStatus": "contract-only",
"exTsn02": "in_progress",
"systemExact": false
}
}

View File

@@ -0,0 +1,38 @@
# Candidate-only cross-build helpers. Keep the locked FreeCAD source tree clean
# and forbid its fallback FetchContent path from reaching the network.
set(FETCHCONTENT_FULLY_DISCONNECTED ON CACHE BOOL "Disable network fallback" FORCE)
set(fmt_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake/fmt" CACHE PATH "Candidate header-only fmt package" FORCE)
# FreeCAD 1.1.1 has no dedicated Emscripten branch in FCConfig.h. Emscripten's
# POSIX layer follows the Linux code paths for this headless candidate.
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
if(NOT FREECAD_WASM_OCCT_COMPAT_INCLUDE
OR NOT EXISTS "${FREECAD_WASM_OCCT_COMPAT_INCLUDE}/TopTools_ListOfShape.hxx")
message(FATAL_ERROR
"FREECAD_WASM_OCCT_COMPAT_INCLUDE must point to OCCT's Deprecated/NCollectionAliases directory")
endif()
add_compile_definitions(__linux__=1)
include_directories(BEFORE "${CMAKE_CURRENT_LIST_DIR}/wasm-compat")
include_directories(BEFORE SYSTEM "${FREECAD_WASM_OCCT_COMPAT_INCLUDE}")
# FreeCAD's native UNIX branch adds --undefined,dynamic_lookup, which is
# incompatible with Emscripten's relocatable-object emulation of SHARED.
set(UNIX FALSE)
# Qt disables its timezone backend on WASM. FreeCAD calls systemTimeZone()
# only when formatting diagnostic timestamps, so use deterministic UTC.
add_compile_options(
"$<$<COMPILE_LANGUAGE:CXX>:-include${CMAKE_CURRENT_LIST_DIR}/freecad-wasm-sdk-compat.h>"
"$<$<COMPILE_LANGUAGE:CXX>:-Wno-deprecated-declarations>"
)
endif()
# The headless SDK does not ship Qt LinguistTools, while FreeCAD Base/App invoke
# qt_add_translation unconditionally. Keep their resource targets valid without
# pulling host-generated .qm files into the wasm candidate.
set(FREECAD_WASM_EMBED_TRANSLATIONS OFF CACHE BOOL "Embed FreeCAD translations in the candidate wasm SDK")
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten"
AND NOT FREECAD_WASM_EMBED_TRANSLATIONS
AND NOT COMMAND qt_add_translation)
function(qt_add_translation output_variable)
set(${output_variable} "" PARENT_SCOPE)
endfunction()
endif()

View File

@@ -0,0 +1,112 @@
{
"schemaVersion": 1,
"scope": "candidate-only-freecad-wasm-sdk-build",
"baseline": {
"freecadVersion": "1.1.1",
"sourceCommit": "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d",
"emscriptenVersion": "3.1.69",
"qtVersion": "6.8.2",
"target": "wasm32-emscripten"
},
"source": {
"path": ".cache/freecad/FreeCAD",
"mode": "detached-pinned-commit",
"requiredClean": true
},
"sourceOverlay": {
"path": ".cache/toolchains/freecad-naming-sdk/source-occt8",
"command": "npm run prepare:freecad-occt8-overlay",
"migration": "OCCT 8 migrate_raise_to_throw.py and replace_typedefs.py",
"productionPublication": false
},
"toolchain": {
"emscriptenRoot": "EMSDK",
"qtPrefix": ".cache/toolchains/qt6/install-wasm-freecad",
"cmakeGenerator": "Ninja"
},
"dependencyBuilds": [
{
"name": "Qt6",
"version": "6.8.2",
"command": "npm run build:qt6-freecad-wasm",
"targetArchives": ["QtCore", "QtConcurrent", "QtNetwork", "QtXml"]
},
{
"name": "yaml-cpp",
"version": "0.8.0",
"sourceCommit": "f7320141120f720aecc4c32be25586e7da9eb978",
"command": "npm run build:yaml-cpp-wasm",
"targetArchives": ["yaml-cpp"]
},
{
"name": "ICU",
"version": "68.2",
"sourceSha256": "c79193dee3907a2199b8296a93b52c5cb74332c26f3d167269487680d479d625",
"command": "npm run build:icu-wasm",
"targetArchives": ["icuuc", "icui18n", "icudata"]
},
{
"name": "CPython",
"version": "3.13.5",
"sourceSha256": "93e583f243454e6e9e4588ca2c2662206ad961659863277afcdb96801647d640",
"command": "npm run build:cpython-wasm",
"targetArchives": ["python3.13"]
},
{
"name": "Xerces-C",
"version": "3.2.4",
"sourceSha256": "075bc57940da0f9be6dd183c550c8ce0b9833e4550dc382048377a1a5e3b2bd9",
"command": "npm run build:xerces-c-wasm",
"targetArchives": ["xerces-c"]
},
{
"name": "Boost",
"version": "1.83.0",
"sourceSha256": "6478edfe2f3305127cffe8caf73ea0176c53769f4bf1585be237eb30798c3b8e",
"command": "npm run build:boost-wasm",
"targetArchives": ["boost_program_options", "boost_regex", "boost_thread", "boost_date_time", "boost_atomic"]
}
],
"configuration": {
"buildDirectory": ".cache/toolchains/freecad-naming-sdk/build-wasm",
"installDirectory": ".cache/toolchains/freecad-naming-sdk/install-wasm",
"buildType": "Release",
"buildGui": false,
"developerTests": false,
"python": "required",
"modules": ["Part"],
"productionPublication": false
},
"requiredArchives": [
"FreeCADBase",
"FreeCADApp",
"Part",
"Python"
],
"knownConfigurationLimits": [
"Qt Core/Concurrent/Network/Xml wasm archives are built locally with thread support for the candidate SDK.",
"yaml-cpp 0.8.0 is built as a wasm static archive for the required Material module.",
"CPython 3.13.5 development headers and its pthread-enabled wasm static archive are staged for the candidate SDK.",
"Xerces-C 3.2.4 is built as a wasm static archive against the staged ICU libraries.",
"The headless candidate omits Base/App Qt translation resources because Qt LinguistTools is not part of the target SDK.",
"Qt disables its timezone backend on WebAssembly; the candidate formats FreeCAD diagnostic timestamps in deterministic UTC.",
"FreeCAD's disabled Linux backtrace block still includes execinfo.h; a candidate-only empty header satisfies that unused include without exposing backtrace APIs.",
"OCCT 8.0 keeps FreeCAD 1.1.1's TopTools collection typedefs under Deprecated/NCollectionAliases; the candidate includes that pinned source compatibility directory explicitly.",
"OCCT 8.0 removed Standard_*::Raise; a disposable FreeCAD worktree overlay applies the pinned OCCT migrate_raise_to_throw.py phase without modifying the locked source checkout.",
"OCCT 8.0 folds legacy iterator typedefs into collection headers; the disposable overlay maps six removed include-only iterator headers after the official typedef migration.",
"OCCT 8.0 removes Standard_Failure RTTI; the disposable overlay replaces exception-only DynamicType calls with the documented ExceptionType API.",
"OCCT 8.0 removes BRepLProp_CurveTool; its parameter forwarding calls are mapped to BRepAdaptor_Curve's inherited FirstParameter and LastParameter methods.",
"OCCT 8.0 consolidates Geom2dLProp into GeomLProp; the overlay maps Geom2dLProp_CLProps2d to the signature-compatible GeomLProp_CLProps2d specialization.",
"OCCT 8.0 adds NCollection_List initializer-list construction; three ShapeMapper calls explicitly retain FreeCAD's original std::vector<TopoShape> overload.",
"OCCT 8.0 makes Standard_Failure a std::exception; three identical trailing handlers are removed after their std::exception handler to avoid unreachable exception paths.",
"FreeCAD declares Base/App/Part as SHARED; the candidate toolchain archives their wasm objects with emar and links dependencies separately.",
"The upstream FreeCAD CMake project currently creates shared libraries and requires a full wasm dependency graph; this plan does not treat a host build as a wasm SDK."
],
"boundary": {
"freecadNamingBuildStatus": "contract-only",
"exTsn02": "in_progress",
"systemExact": false,
"workerLinked": false,
"callbacks": []
}
}

View File

@@ -0,0 +1,11 @@
#pragma once
#ifdef __EMSCRIPTEN__
#if __has_include(<Standard_Macro.hxx>)
#include <TopTools_HSequenceOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#endif
// QTimeZone::UTC remains available when Qt's WASM timezone backend is off.
#define systemTimeZone() UTC
#endif

View File

@@ -56,7 +56,7 @@
{ "id": "EX-SK-02", "title": "Match Sketcher editing tools, autoconstraints, virtual space and UI lifecycle", "priority": "P0", "status": "in_progress", "dependencies": ["EX-SK-01", "EX-UI-03"], "deliverables": ["Pointer and keyboard editor oracle", "All editing tools", "Task and focus lifecycle"], "acceptance": ["Every tool supports success, failure, cancel, undo and redo with matching selection"], "evidence": ["check:freecad-sketcher-editor", "check:chrome-sketcher-bspline"], "exactBlockedBy": ["The full GUI tool and focus matrix is incomplete"] },
{ "id": "EX-PART-01", "title": "Complete all Part primitives, builders, booleans, healing and inspection", "priority": "P0", "status": "in_progress", "dependencies": ["EX-KER-01", "EX-TSN-04"], "deliverables": ["All Part commands and parameters", "Healing and tolerance tools", "Native history for local operations"], "acceptance": ["Success and failure outputs match native Shape, history and diagnostics"], "evidence": ["check:chrome-part-primitives", "check:freecad-golden-fixtures"], "exactBlockedBy": ["Current golden corpus does not enumerate every Part command and option"] },
{ "id": "EX-PD-01", "title": "Complete all PartDesign features, parameters and additive/subtractive combinations", "priority": "P0", "status": "in_progress", "dependencies": ["EX-PART-01", "EX-TSN-04"], "deliverables": ["Complete PartDesign feature matrix", "Body Tip and feature-list semantics", "Per-feature native history and naming"], "acceptance": ["Every feature edit, failure recovery and save-reopen matches FreeCAD"], "evidence": ["check:partdesign-closure", "check:freecad-sketcher-partdesign-abi", "check:chrome-partdesign-lifecycle"], "exactBlockedBy": ["The parameter contract covers the supported Facade subset, not every registered PartDesign TypeId or cross-product"] },
{ "id": "EX-PD-02", "title": "Complete attachment, datum, ShapeBinder, SubShapeBinder and body workflows", "priority": "P0", "status": "pending", "dependencies": ["EX-PD-01", "EX-DOC-04"], "deliverables": ["All map modes and support rules", "Datum and binder lifecycle", "Multi-body and cross-document corpus"], "acceptance": ["Support migration, visibility, Tip and references remain exact through mutation"], "evidence": ["check:chrome-partdesign-lifecycle", "check:freecad-fcstd-roundtrip"], "exactBlockedBy": ["Complete datum/binder and multi-body oracle is absent"] }
{ "id": "EX-PD-02", "title": "Complete attachment, datum, ShapeBinder, SubShapeBinder and body workflows", "priority": "P0", "status": "pending", "dependencies": ["EX-PD-01", "EX-DOC-04"], "deliverables": ["All map modes and support rules", "Datum and binder lifecycle", "Multi-body and cross-document corpus"], "acceptance": ["Support migration, visibility, Tip and references remain exact through mutation"], "evidence": ["check:chrome-partdesign-lifecycle", "check:freecad-fcstd-roundtrip", "check:freecad-partdesign-structure", "check:freecad-attachment-modes"], "exactBlockedBy": ["Native same-document, first cross-document SubShapeBinder cases, and the 55-mode registry/engine partition pass; executable geometry for every implemented mode/reference combination, other XLink modes, relink recovery and Web Chrome replay remain incomplete"] }
]
},
{

View File

@@ -167,6 +167,126 @@
"libraryPath": "build-caches/qt6-wasm-core-build.tar.zst",
"required": false
},
{
"id": "qt6-wasm-freecad-sdk",
"source": ".cache/toolchains/qt6/install-wasm-freecad",
"restore": ".cache/toolchains/qt6/install-wasm-freecad",
"libraryPath": "toolchains/qt6-wasm-freecad-6.8.2.tar.zst",
"required": true
},
{
"id": "qt6-wasm-freecad-build",
"source": ".cache/toolchains/qt6/build-wasm-freecad",
"restore": ".cache/toolchains/qt6/build-wasm-freecad",
"libraryPath": "build-caches/qt6-wasm-freecad-build.tar.zst",
"required": false
},
{
"id": "yaml-cpp-source",
"source": ".cache/toolchains/yaml-cpp/src",
"restore": ".cache/toolchains/yaml-cpp/src",
"libraryPath": "sources/yaml-cpp-0.8.0-f7320141.tar.zst",
"revision": "f7320141120f720aecc4c32be25586e7da9eb978",
"required": true
},
{
"id": "yaml-cpp-wasm-sdk",
"source": ".cache/toolchains/yaml-cpp/install-wasm",
"restore": ".cache/toolchains/yaml-cpp/install-wasm",
"libraryPath": "toolchains/yaml-cpp-wasm-0.8.0.tar.zst",
"required": true
},
{
"id": "yaml-cpp-wasm-build",
"source": ".cache/toolchains/yaml-cpp/build-wasm",
"restore": ".cache/toolchains/yaml-cpp/build-wasm",
"libraryPath": "build-caches/yaml-cpp-wasm-build.tar.zst",
"required": false
},
{
"id": "icu-68.2-download",
"source": ".cache/toolchains/icu/downloads",
"restore": ".cache/toolchains/icu/downloads",
"libraryPath": "sources/icu-68.2-download.tar.zst",
"required": true
},
{
"id": "icu-wasm-sdk",
"source": ".cache/toolchains/icu/install-wasm",
"restore": ".cache/toolchains/icu/install-wasm",
"libraryPath": "toolchains/icu-wasm-68.2.tar.zst",
"required": true
},
{
"id": "emscripten-freecad-cache",
"source": ".cache/toolchains/emscripten-freecad-cache",
"restore": ".cache/toolchains/emscripten-freecad-cache",
"libraryPath": "build-caches/emscripten-freecad-cache.tar.zst",
"required": false
},
{
"id": "cpython-3.13.5-download",
"source": ".cache/toolchains/python/downloads",
"restore": ".cache/toolchains/python/downloads",
"libraryPath": "sources/cpython-3.13.5-download.tar.zst",
"required": true
},
{
"id": "cpython-wasm-sdk",
"source": ".cache/toolchains/python/install-wasm",
"restore": ".cache/toolchains/python/install-wasm",
"libraryPath": "toolchains/cpython-wasm-3.13.5.tar.zst",
"required": true
},
{
"id": "cpython-wasm-build",
"source": ".cache/toolchains/python/build-wasm",
"restore": ".cache/toolchains/python/build-wasm",
"libraryPath": "build-caches/cpython-wasm-build.tar.zst",
"required": false
},
{
"id": "xerces-c-3.2.4-download",
"source": ".cache/toolchains/xerces-c/downloads",
"restore": ".cache/toolchains/xerces-c/downloads",
"libraryPath": "sources/xerces-c-3.2.4-download.tar.zst",
"required": true
},
{
"id": "xerces-c-wasm-sdk",
"source": ".cache/toolchains/xerces-c/install-wasm",
"restore": ".cache/toolchains/xerces-c/install-wasm",
"libraryPath": "toolchains/xerces-c-wasm-3.2.4.tar.zst",
"required": true
},
{
"id": "xerces-c-wasm-build",
"source": ".cache/toolchains/xerces-c/build-wasm",
"restore": ".cache/toolchains/xerces-c/build-wasm",
"libraryPath": "build-caches/xerces-c-wasm-build.tar.zst",
"required": false
},
{
"id": "boost-1.83.0-download",
"source": ".cache/toolchains/boost/downloads",
"restore": ".cache/toolchains/boost/downloads",
"libraryPath": "sources/boost-1.83.0-download.tar.zst",
"required": true
},
{
"id": "boost-wasm-sdk",
"source": ".cache/toolchains/boost/install-wasm",
"restore": ".cache/toolchains/boost/install-wasm",
"libraryPath": "toolchains/boost-wasm-1.83.0.tar.zst",
"required": true
},
{
"id": "boost-wasm-build",
"source": ".cache/toolchains/boost/src",
"restore": ".cache/toolchains/boost/src",
"libraryPath": "build-caches/boost-wasm-build.tar.zst",
"required": false
},
{
"id": "opencamlib-build",
"source": ".cache/opencamlib-wasm",
@@ -210,6 +330,15 @@
"restore": ".cache/offline-sysroot/include/eigen3",
"required": true
},
{
"id": "fmt-headers",
"sourceCandidates": [
"/usr/include/fmt"
],
"libraryPath": "system/headers/fmt-10.1.1",
"restore": ".cache/offline-sysroot/fmt-10.1.1/include/fmt",
"required": true
},
{
"id": "debian-package-cache",
"sourceCandidates": [

View File

@@ -0,0 +1,7 @@
#pragma once
// FreeCAD includes this header on its Linux path even when its configure
// check has disabled HAVE_BACKTRACE_SYMBOLS. No backtrace API is declared.
#if !defined(__EMSCRIPTEN__)
#error "This compatibility header is only valid for the Emscripten candidate"
#endif