feat: add candidate FreeCAD naming SDK and attachment oracles
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:
1
config/boost-emscripten-user-config.jam
Normal file
1
config/boost-emscripten-user-config.jam
Normal file
@@ -0,0 +1 @@
|
||||
using emscripten : 3.1.69 : ./boost-emscripten-compiler-wrapper.sh ;
|
||||
33
config/cmake/boost/BoostConfig.cmake
Normal file
33
config/cmake/boost/BoostConfig.cmake
Normal 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)
|
||||
9
config/cmake/boost/BoostConfigVersion.cmake
Normal file
9
config/cmake/boost/BoostConfigVersion.cmake
Normal 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()
|
||||
17
config/cmake/fmt/fmt-config.cmake
Normal file
17
config/cmake/fmt/fmt-config.cmake
Normal 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)
|
||||
@@ -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"
|
||||
|
||||
13
config/emscripten-freecad-candidate-toolchain.cmake
Normal file
13
config/emscripten-freecad-candidate-toolchain.cmake
Normal 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)
|
||||
2340
config/freecad-attachment-mode-oracle.json
Normal file
2340
config/freecad-attachment-mode-oracle.json
Normal file
File diff suppressed because it is too large
Load Diff
87
config/freecad-naming-next-tasks.json
Normal file
87
config/freecad-naming-next-tasks.json
Normal 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": []
|
||||
}
|
||||
}
|
||||
}
|
||||
277
config/freecad-naming-sdk-plan.json
Normal file
277
config/freecad-naming-sdk-plan.json
Normal 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
|
||||
}
|
||||
}
|
||||
346
config/freecad-partdesign-structure-oracle.json
Normal file
346
config/freecad-partdesign-structure-oracle.json
Normal 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
|
||||
}
|
||||
106
config/freecad-private-naming-source-readiness.json
Normal file
106
config/freecad-private-naming-source-readiness.json
Normal 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
|
||||
}
|
||||
}
|
||||
38
config/freecad-wasm-sdk-bootstrap.cmake
Normal file
38
config/freecad-wasm-sdk-bootstrap.cmake
Normal 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()
|
||||
112
config/freecad-wasm-sdk-build-plan.json
Normal file
112
config/freecad-wasm-sdk-build-plan.json
Normal 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": []
|
||||
}
|
||||
}
|
||||
11
config/freecad-wasm-sdk-compat.h
Normal file
11
config/freecad-wasm-sdk-compat.h
Normal 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
|
||||
@@ -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"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
|
||||
7
config/wasm-compat/execinfo.h
Normal file
7
config/wasm-compat/execinfo.h
Normal 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
|
||||
Reference in New Issue
Block a user