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:
@@ -20,6 +20,7 @@ if [[ -z "${OCCT_BUILD_DIR:-}" ]]; then
|
||||
fi
|
||||
DIST_DIR="${OCCT_HISTORY_DIST_DIR:-${ROOT_DIR}/native/occt-history/dist}"
|
||||
PUBLIC_DIR="${OCCT_HISTORY_PUBLIC_DIR:-${ROOT_DIR}/public/native/occt-history}"
|
||||
PUBLISH_ARTIFACT="${OCCT_HISTORY_PUBLISH:-1}"
|
||||
JOBS="${JOBS:-$(nproc)}"
|
||||
FREECAD_WASM_SDK_DIR="${FREECAD_WASM_SDK_DIR:-}"
|
||||
|
||||
@@ -40,11 +41,18 @@ if ! command -v emcmake >/dev/null || ! command -v em++ >/dev/null; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
OCCT_CXX_FLAGS="-fexceptions"
|
||||
OCCT_CXX_RELEASE_FLAGS="-O0 -DNDEBUG -fexceptions"
|
||||
if [[ -n "${FREECAD_WASM_SDK_DIR}" ]]; then
|
||||
OCCT_CXX_FLAGS+=" -pthread"
|
||||
OCCT_CXX_RELEASE_FLAGS+=" -pthread"
|
||||
fi
|
||||
|
||||
emcmake cmake -S "${OCCT_SOURCE_DIR}" -B "${OCCT_BUILD_DIR}" -G Ninja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_MAKE_PROGRAM="$(command -v ninja)" \
|
||||
-DCMAKE_CXX_FLAGS="-fexceptions" \
|
||||
-DCMAKE_CXX_FLAGS_RELEASE="-O0 -DNDEBUG -fexceptions" \
|
||||
-DCMAKE_CXX_FLAGS="${OCCT_CXX_FLAGS}" \
|
||||
-DCMAKE_CXX_FLAGS_RELEASE="${OCCT_CXX_RELEASE_FLAGS}" \
|
||||
-DBUILD_RELEASE_DISABLE_EXCEPTIONS=OFF \
|
||||
-DBUILD_LIBRARY_TYPE=Static \
|
||||
-DBUILD_MODULE_FoundationClasses=ON \
|
||||
@@ -74,18 +82,29 @@ SOURCES=("${ROOT_DIR}/native/occt-history/occt_history.cpp")
|
||||
INCLUDES=("-I${OCCT_BUILD_DIR}/include/opencascade" "-I${OCCT_SOURCE_DIR}/src")
|
||||
DEFINES=()
|
||||
FREECAD_LIBRARIES=()
|
||||
FREECAD_LINK_OPTIONS=()
|
||||
if [[ -n "${FREECAD_WASM_SDK_DIR}" ]]; then
|
||||
BRIDGE_SOURCE="$(node -e 'const fs=require("node:fs"); const p=require("node:path"); const m=JSON.parse(fs.readFileSync(p.resolve(process.argv[1],"manifest.json"),"utf8")); console.log(p.isAbsolute(m.namingBridge.source) ? m.namingBridge.source : p.resolve(process.argv[1],m.namingBridge.source))' "${FREECAD_WASM_SDK_DIR}")"
|
||||
SOURCES+=("${BRIDGE_SOURCE}")
|
||||
while IFS= read -r include_dir; do INCLUDES+=("-I${include_dir}"); done < <(node -e 'const fs=require("node:fs"); const p=require("node:path"); const root=p.resolve(process.argv[1]); const m=JSON.parse(fs.readFileSync(p.resolve(root,"manifest.json"),"utf8")); for (const d of m.includeDirs) console.log(p.isAbsolute(d) ? d : p.resolve(root,d))' "${FREECAD_WASM_SDK_DIR}")
|
||||
while IFS= read -r library; do FREECAD_LIBRARIES+=("${library}"); done < <(node -e 'const fs=require("node:fs"); const p=require("node:path"); const root=p.resolve(process.argv[1]); const m=JSON.parse(fs.readFileSync(p.resolve(root,"manifest.json"),"utf8")); for (const l of m.libraries) console.log(p.isAbsolute(l.path) ? l.path : p.resolve(root,l.path))' "${FREECAD_WASM_SDK_DIR}")
|
||||
while IFS= read -r definition; do DEFINES+=("-D${definition}"); done < <(node -e 'const fs=require("node:fs"); const p=require("node:path"); const m=JSON.parse(fs.readFileSync(p.resolve(process.argv[1],"manifest.json"),"utf8")); for (const d of m.compileOptions.definitions) console.log(d)' "${FREECAD_WASM_SDK_DIR}")
|
||||
CXX_STANDARD="$(node -e 'const fs=require("node:fs"); const p=require("node:path"); const m=JSON.parse(fs.readFileSync(p.resolve(process.argv[1],"manifest.json"),"utf8")); console.log(m.compileOptions.cxxStandard)' "${FREECAD_WASM_SDK_DIR}")"
|
||||
FORCE_INCLUDE="$(node -e 'const fs=require("node:fs"); const p=require("node:path"); const root=p.resolve(process.argv[1]); const m=JSON.parse(fs.readFileSync(p.resolve(root,"manifest.json"),"utf8")); const v=m.compileOptions.forceInclude; console.log(p.isAbsolute(v) ? v : p.resolve(root,v))' "${FREECAD_WASM_SDK_DIR}")"
|
||||
HOST_ADAPTER="$(node -e 'const fs=require("node:fs"); const p=require("node:path"); const root=p.resolve(process.argv[1]); const m=JSON.parse(fs.readFileSync(p.resolve(root,"manifest.json"),"utf8")); const v=m.namingBridge.hostAdapter; console.log(p.isAbsolute(v) ? v : p.resolve(root,v))' "${FREECAD_WASM_SDK_DIR}")"
|
||||
FREECAD_LINK_OPTIONS+=("-include" "${FORCE_INCLUDE}" "-pthread" "--pre-js" "${HOST_ADAPTER}" "-sPTHREAD_POOL_SIZE=2")
|
||||
while IFS=$'\t' read -r asset_path preload_to; do
|
||||
FREECAD_LINK_OPTIONS+=("--preload-file" "${asset_path}@${preload_to}")
|
||||
done < <(node -e 'const fs=require("node:fs"); const p=require("node:path"); const root=p.resolve(process.argv[1]); const m=JSON.parse(fs.readFileSync(p.resolve(root,"manifest.json"),"utf8")); for (const a of m.runtimeAssets) { const v=p.isAbsolute(a.path) ? a.path : p.resolve(root,a.path); console.log(`${v}\t${a.preloadTo}`) }' "${FREECAD_WASM_SDK_DIR}")
|
||||
DEFINES+=("-DBITBYBIT_FREECAD_NAMING_LINKED=1")
|
||||
else
|
||||
CXX_STANDARD="c++17"
|
||||
fi
|
||||
|
||||
em++ "${SOURCES[@]}" "${INCLUDES[@]}" "${DEFINES[@]}" \
|
||||
em++ "${SOURCES[@]}" "${INCLUDES[@]}" "${DEFINES[@]}" "${FREECAD_LINK_OPTIONS[@]}" \
|
||||
-I"${OCCT_BUILD_DIR}/include/opencascade" \
|
||||
-I"${OCCT_SOURCE_DIR}/src" \
|
||||
-std=c++17 -O2 -fexceptions --bind \
|
||||
-std="${CXX_STANDARD}" -O2 -fexceptions --bind \
|
||||
-Wl,--start-group \
|
||||
"${OCCT_BUILD_DIR}/lin32/clang/lib/libTKBO.a" \
|
||||
"${OCCT_BUILD_DIR}/lin32/clang/lib/libTKFillet.a" \
|
||||
@@ -112,7 +131,13 @@ em++ "${SOURCES[@]}" "${INCLUDES[@]}" "${DEFINES[@]}" \
|
||||
-o "${DIST_DIR}/bitbybit-occt-history.js"
|
||||
|
||||
cp "${ROOT_DIR}/native/occt-history/package.json" "${DIST_DIR}/package.json"
|
||||
mkdir -p "${PUBLIC_DIR}"
|
||||
cp "${DIST_DIR}/bitbybit-occt-history.js" "${PUBLIC_DIR}/bitbybit-occt-history.js"
|
||||
cp "${DIST_DIR}/bitbybit-occt-history.wasm" "${PUBLIC_DIR}/bitbybit-occt-history.wasm"
|
||||
sha256sum "${DIST_DIR}/bitbybit-occt-history.js" "${DIST_DIR}/bitbybit-occt-history.wasm"
|
||||
if [[ "${PUBLISH_ARTIFACT}" == "1" ]]; then
|
||||
mkdir -p "${PUBLIC_DIR}"
|
||||
for artifact in "${DIST_DIR}"/bitbybit-occt-history.{js,wasm,data,worker.js}; do
|
||||
[[ -f "${artifact}" ]] && cp "${artifact}" "${PUBLIC_DIR}/$(basename "${artifact}")"
|
||||
done
|
||||
elif [[ "${PUBLISH_ARTIFACT}" != "0" ]]; then
|
||||
echo "OCCT_HISTORY_PUBLISH must be 0 or 1." >&2
|
||||
exit 1
|
||||
fi
|
||||
sha256sum "${DIST_DIR}"/bitbybit-occt-history.{js,wasm,data} 2>/dev/null || sha256sum "${DIST_DIR}/bitbybit-occt-history.js" "${DIST_DIR}/bitbybit-occt-history.wasm"
|
||||
|
||||
Reference in New Issue
Block a user